Beispiel #1
0
        private static IEnumerable <Claim> GetClaims(LussEntity entity)
        {
            List <Claim> claimset = new List <Claim>();

            claimset.Add(new Claim(config.NameClaimType, entity.DeviceId));
            claimset.Add(new Claim(config.RoleClaimType, entity.VirtualRtuId));
            return(claimset);
        }
Beispiel #2
0
        private static string GetEdgeSecurityToken(LussEntity entity)
        {
            List <Claim> claims = new List <Claim>();

            claims.Add(new Claim(config.NameClaimType, entity.DeviceId));
            claims.Add(new Claim(config.RoleClaimType, entity.VirtualRtuId));

            JsonWebToken jwt = new JsonWebToken(config.SymmetricKey, claims, Convert.ToDouble(config.LifetimeMinutes), config.Issuer, config.Audience);

            return(jwt.ToString());
        }
Beispiel #3
0
        private static AuthorizationPolicy CreateCaplPolicy(LussEntity entity, bool publishPolicy, out string policyIdUriString)
        {
            string policyId = publishPolicy ?
                              String.Format("http://www.skunklab.io/policy/{0}/unitid{1}-in", entity.VirtualRtuId, entity.UnitId) :
                              String.Format("http://www.skunklab.io/policy/{0}/unitid{1}-out", entity.VirtualRtuId, entity.UnitId);

            string claimType  = publishPolicy ? config.RoleClaimType : config.NameClaimType;
            string claimValue = publishPolicy ? "vrtu" : String.Format("fieldgateway{0}", entity.UnitId);

            policyIdUriString = policyId;

            return(GetPolicy(policyId, claimType, claimValue));
        }
Beispiel #4
0
        private static async Task <EdgeGatewayConfiguration> ProvisionAsync(string luss)
        {
            LussEntity entity = await LussEntity.LoadAsync(luss, config.LussStorageTableName, config.StorageConnectionString);

            if (entity == null || entity.Success.HasValue || entity.Expires < DateTime.Now)
            {
                return(null);
            }


            //get the security token to call Piraeus mgmt api
            IEnumerable <Claim> claims = GetClaims(entity);
            string accessToken         = GetPiraeusAccessToken();


            //create the CAPL policies
            string publishPolicyId        = null;
            string subscribePolicyId      = null;
            AuthorizationPolicy pubPolicy = CreateCaplPolicy(entity, true, out publishPolicyId);
            AuthorizationPolicy subPolicy = CreateCaplPolicy(entity, false, out subscribePolicyId);

            //add the CAPL policies to Piraeus
            AddCaplPolicy(pubPolicy, accessToken);
            AddCaplPolicy(subPolicy, accessToken);


            //create the pi-system metadata
            string        inputUriString  = GetEventUriString(entity, true);
            string        outputUriString = GetEventUriString(entity, false);
            EventMetadata inputMetadata   = GetEventMetadata(inputUriString, publishPolicyId, subscribePolicyId, (ushort)entity.UnitId, true);
            EventMetadata outputMetadata  = GetEventMetadata(outputUriString, subscribePolicyId, publishPolicyId, (ushort)entity.UnitId, false);

            //add the pi-systems to Piraeus
            AddEventMetadata(inputMetadata, accessToken);
            AddEventMetadata(outputMetadata, accessToken);

            //update the RTU Map
            RtuMap map = RtuMap.LoadFromConnectionStringAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter().GetResult();

            if (map == null)
            {
                map = new RtuMap();
            }
            else
            {
                if (map.HasItem((ushort)entity.UnitId))
                {
                    map.Remove((ushort)entity.UnitId);
                }
            }

            map.Add((ushort)entity.UnitId, inputUriString, outputUriString);
            map.UpdateMapAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter();

            //update the LUSS entity
            entity.Access = DateTime.UtcNow;
            if (!entity.Success.HasValue)
            {
                entity.Success = true;
            }

            await entity.UpdateAsync();

            string edgeSecurityToken = GetEdgeSecurityToken(entity);

            //create the cofiguration to return
            EdgeGatewayConfiguration edgeConfig = new EdgeGatewayConfiguration()
            {
                Hostname          = entity.Hostname,
                ModBusContainer   = entity.ModbusContainer,
                ModBusPort        = entity.ModbusPort,
                ModBusPath        = entity.ModbusPath,
                RtuInputPiSystem  = inputUriString,
                RtuOutputPiSsytem = outputUriString,
                SecurityToken     = edgeSecurityToken,
                UnitId            = entity.UnitId
            };

            return(edgeConfig);
        }
Beispiel #5
0
 private static string GetEventUriString(LussEntity entity, bool inbound)
 {
     return(inbound ? String.Format($"http://{config.PiraeusHostname}/{entity.VirtualRtuId}/unitid{entity.UnitId}-in") :
            String.Format($"http://{config.PiraeusHostname}/{entity.VirtualRtuId}/unitid{entity.UnitId}-out"));
 }