// /** // * File: SessionManager.cs // * Author: haraldwolff // * // * This file and it's content is copyrighted by the Author and / or copyright holder. // * Any use wihtout proper permission is illegal and may lead to legal actions. // * // * // **/ using System; using System.Collections.Generic; using ln.types.net; using ln.types.btree; using ln.radius; using System.Net; using ln.logging; using ln.types.odb; using ln.types.odb.mapped; using skyspot.radius; namespace skyspot.session { public class SessionManager { public RadiusSecretsStore SecretsStore { get; private set; } RadiusServer accountingRadius; RadiusServer locatorRadius; public SessionManager() { InitializeRadius(); } public void Start() { } private void InitializeRadius() { accountingRadius= new RadiusServer(new IPEndPoint(IPAddress.Any,1812)); locatorRadius = new RadiusServer(new IPEndPoint(IPAddress.Any, 1816)); accountingRadius.LookupSecret = (endPoint) => SecretsStore.LookupSecret(endPoint); locatorRadius.LookupSecret = (endPoint) => SecretsStore.LookupSecret(endPoint); locatorRadius.MessageReceived = LocatorMessageReceived; accountingRadius.MessageReceived = AccountingMessageReceived; } /** * Locator Service * **/ void LocatorMessageReceived(RadiusServer radiusServer, RadiusMessage radiusMessage) { Logging.Log(LogLevel.INFO, "Radius Message received: {0}", radiusMessage); switch (radiusMessage.Code) { case RadiusCode.AccessRequest: LocatorAccessRequest(radiusServer, radiusMessage); break; } } void LocatorAccessRequest(RadiusServer radiusServer, RadiusMessage radiusMessage) { } /** * * Accounting Service * **/ void AccountingMessageReceived(RadiusServer radiusServer, RadiusMessage radiusMessage) { Logging.Log(LogLevel.INFO, "Radius Message received: {0}", radiusMessage); switch (radiusMessage.Code) { case RadiusCode.AccessRequest: AccountingAccessRequest(radiusServer, radiusMessage); break; } } void AccountingAccessRequest(RadiusServer radiusServer, RadiusMessage radiusMessage) { RadiusAttribute.UserName userName = radiusMessage.GetAttribute(); RadiusAttribute.UserPassword userPassword = radiusMessage.GetAttribute(); RadiusAttribute.CalledStationID calledStationID = radiusMessage.GetAttribute(); if ((userName == null) || (calledStationID == null)) { Logging.Log(LogLevel.WARNING, "InvalidRequest: UserName={0} CalledStationID={1}",userName,calledStationID); return; } MAC clientMac = new MAC(userName.AsText); String instanceName = calledStationID.AsText; Logging.Log(LogLevel.INFO, "Accounting: Session start for client {0} on Network {1}",clientMac, instanceName); RadiusMessage reply = new RadiusMessage(radiusMessage.EndPoint, RadiusCode.AccessAccept); reply.Identifier = radiusMessage.Identifier; reply.Authenticate(SecretsStore.LookupSecret(reply.EndPoint)); radiusServer.Send(reply); } } }