public WsnProtocolAdapter(PiraeusConfig config, GraphManager graphManager, IChannel channel, HttpContext context, ILog logger = null) { this.config = config; this.graphManager = graphManager; this.Channel = channel; this.logger = logger; IdentityDecoder decoder = new IdentityDecoder(config.ClientIdentityNameClaimType, context, config.GetClientIndexes()); identity = decoder.Id; localIndexes = decoder.Indexes; MessageUri messageUri = new MessageUri(context.Request); this.contentType = messageUri.ContentType; this.cacheKey = messageUri.CacheKey; this.resource = messageUri.Resource; this.subscriptions = messageUri.Subscriptions != null ? new List <string>(messageUri.Subscriptions) : null; this.indexes = messageUri.Indexes != null ? new List <KeyValuePair <string, string> >(messageUri.Indexes) : null; auditFactory = AuditFactory.CreateSingleton(); if (config.AuditConnectionString != null && config.AuditConnectionString.Contains("DefaultEndpointsProtocol")) { auditFactory.Add(new AzureTableAuditor(config.AuditConnectionString, "messageaudit"), AuditType.Message); auditFactory.Add(new AzureTableAuditor(config.AuditConnectionString, "useraudit"), AuditType.User); } else if (config.AuditConnectionString != null) { auditFactory.Add(new FileAuditor(config.AuditConnectionString), AuditType.Message); auditFactory.Add(new FileAuditor(config.AuditConnectionString), AuditType.User); } messageAuditor = auditFactory.GetAuditor(AuditType.Message); userAuditor = auditFactory.GetAuditor(AuditType.User); }
public RestProtocolAdapter(PiraeusConfig config, GraphManager graphManager, IChannel channel, HttpContext context, ILog logger = null) { this.config = config; this.channel = channel; this.logger = logger; method = context.Request.Method.ToUpperInvariant(); messageUri = new MessageUri(context.Request); IdentityDecoder decoder = new IdentityDecoder(config.ClientIdentityNameClaimType, context, config.GetClientIndexes()); identity = decoder.Id; indexes = decoder.Indexes; adapter = new OrleansAdapter(identity, channel.TypeId, "REST", graphManager, logger); if (method == "GET") { adapter.OnObserve += Adapter_OnObserve; } protocolType = ProtocolType.REST; contentType = messageUri.ContentType; resource = messageUri.Resource; subscriptions = messageUri.Subscriptions; auditFactory = AuditFactory.CreateSingleton(); if (config.AuditConnectionString != null && config.AuditConnectionString.Contains("DefaultEndpointsProtocol")) { auditFactory.Add(new AzureTableAuditor(config.AuditConnectionString, "messageaudit"), AuditType.Message); auditFactory.Add(new AzureTableAuditor(config.AuditConnectionString, "useraudit"), AuditType.User); } else if (config.AuditConnectionString != null) { auditFactory.Add(new FileAuditor(config.AuditConnectionString), AuditType.Message); auditFactory.Add(new FileAuditor(config.AuditConnectionString), AuditType.User); } messageAuditor = auditFactory.GetAuditor(AuditType.Message); userAuditor = auditFactory.GetAuditor(AuditType.User); }
private void Channel_OnOpen(object sender, ChannelOpenEventArgs e) { if (!Channel.IsAuthenticated) //requires channel authentication { OnError?.Invoke(this, new ProtocolAdapterErrorEventArgs(Channel.Id, new SecurityException("Not authenticated."))); Channel.CloseAsync().Ignore(); return; } if (e.Message.Method != HttpMethod.Post && e.Message.Method != HttpMethod.Get) { Channel.CloseAsync().Ignore(); OnError?.Invoke(this, new ProtocolAdapterErrorEventArgs(Channel.Id, new SecurityException("Rest protocol adapter requires GET or POST only."))); } MessageUri uri = new MessageUri(e.Message); IdentityDecoder decoder = new IdentityDecoder(config.ClientIdentityNameClaimType, context, config.GetClientIndexes()); identity = decoder.Id; adapter = new OrleansAdapter(decoder.Id, "HTTP", "REST"); adapter.OnObserve += Adapter_OnObserve; HttpRequestMessage request = (HttpRequestMessage)e.Message; AuditRecord record = new UserAuditRecord(Channel.Id, identity, config.ClientIdentityNameClaimType, Channel.TypeId, String.Format("REST-{0}", request.Method.ToString()), "Granted", DateTime.UtcNow); userAuditor?.WriteAuditRecordAsync(record).Ignore(); if (request.Method == HttpMethod.Get) { foreach (var item in uri.Subscriptions) { Task t = Task.Factory.StartNew(async() => { await SubscribeAsync(item, decoder.Id, decoder.Indexes); }); t.LogExceptions(); } } if (request.Method == HttpMethod.Post) { byte[] buffer = request.Content.ReadAsByteArrayAsync().Result; Task t = Task.Factory.StartNew(async() => { EventMetadata metadata = await GraphManager.GetPiSystemMetadataAsync(uri.Resource); EventMessage message = new EventMessage(uri.ContentType, uri.Resource, ProtocolType.REST, buffer, DateTime.UtcNow, metadata.Audit); if (!string.IsNullOrEmpty(uri.CacheKey)) { message.CacheKey = uri.CacheKey; } List <KeyValuePair <string, string> > indexList = uri.Indexes == null ? null : new List <KeyValuePair <string, string> >(uri.Indexes); await PublishAsync(decoder.Id, message, indexList); await Channel.CloseAsync(); }); t.LogExceptions(); } }