2020-02-22 23:29:33 +00:00
|
|
|
import * as radius from 'radius';
|
|
|
|
import { IAuthentication } from '../types/Authentication';
|
2021-10-24 20:37:16 +00:00
|
|
|
import {IPacket, IPacketHandlerResult, PacketResponseCode} from '../types/PacketHandler';
|
2020-02-22 23:29:33 +00:00
|
|
|
|
2020-02-25 10:54:57 +00:00
|
|
|
import { PacketHandler } from './PacketHandler';
|
2021-10-24 20:37:16 +00:00
|
|
|
import PackageInterface from '../interface';
|
|
|
|
|
|
|
|
const packageInterface = PackageInterface.get();
|
2020-02-24 17:52:21 +00:00
|
|
|
|
2020-02-22 23:29:33 +00:00
|
|
|
export class RadiusService {
|
2020-02-25 10:54:57 +00:00
|
|
|
private packetHandler: PacketHandler;
|
2020-02-22 23:29:33 +00:00
|
|
|
|
2020-02-25 10:54:57 +00:00
|
|
|
constructor(private secret: string, authentication: IAuthentication) {
|
|
|
|
this.packetHandler = new PacketHandler(authentication);
|
2020-02-22 23:29:33 +00:00
|
|
|
}
|
|
|
|
|
2021-10-24 20:37:16 +00:00
|
|
|
defaultDecoder(msg: Buffer): { packet?: radius.RadiusPacket & IPacket; secret: string } {
|
|
|
|
const packet = radius.decode({ packet: msg, secret: this.secret });
|
|
|
|
|
|
|
|
return {
|
|
|
|
packet,
|
|
|
|
secret: this.secret,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2020-02-22 23:29:33 +00:00
|
|
|
async handleMessage(
|
|
|
|
msg: Buffer
|
|
|
|
): Promise<{ data: Buffer; expectAcknowledgment?: boolean } | undefined> {
|
2021-10-24 20:37:16 +00:00
|
|
|
const { packet, secret } = packageInterface.packetDecoder
|
|
|
|
? packageInterface.packetDecoder(msg)
|
|
|
|
: this.defaultDecoder(msg);
|
|
|
|
|
|
|
|
if (!packet) {
|
|
|
|
packageInterface.log('Unable to parse packet from message.');
|
|
|
|
return undefined;
|
|
|
|
}
|
2020-02-22 23:29:33 +00:00
|
|
|
|
|
|
|
if (packet.code !== 'Access-Request') {
|
2021-10-24 20:37:16 +00:00
|
|
|
packageInterface.log('unknown packet type: ', packet.code);
|
2020-02-22 23:29:33 +00:00
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
|
2020-02-25 10:54:57 +00:00
|
|
|
const response: IPacketHandlerResult = await this.packetHandler.handlePacket(packet);
|
2020-02-22 23:29:33 +00:00
|
|
|
|
|
|
|
// still no response, we are done here
|
|
|
|
if (!response || !response.code) {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
// all fine, return radius encoded response
|
|
|
|
return {
|
|
|
|
data: radius.encode_response({
|
|
|
|
packet,
|
|
|
|
code: response.code,
|
2021-10-24 20:37:16 +00:00
|
|
|
secret,
|
2020-05-14 13:02:15 +00:00
|
|
|
attributes: response.attributes,
|
2020-02-22 23:29:33 +00:00
|
|
|
}),
|
|
|
|
// if message is accept or reject, we conside this as final message
|
|
|
|
// this means we do not expect a reponse from the client again (acknowledgement for package)
|
2020-05-14 13:02:15 +00:00
|
|
|
expectAcknowledgment: response.code === PacketResponseCode.AccessChallenge,
|
2020-02-22 23:29:33 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|