예제 #1
0
        void HandleSessionStarted(ActionRequest Req)
        {
            Session Data = new Session(Req);

            lock (ActiveSessions)
            {
                ActiveSessions[Data.Requester.GetBareJID() + Data.ID] = Data;
                if (Data.SessionEndsAtUTC < NextSweepNeeded)
                {
                    NextSweepNeeded = Data.SessionEndsAtUTC;
                }
            }
            if (SessionStarted != null)
            {
                SessionStarted.Invoke(Data);
            }

            ActionResponse Resp = new ActionResponse();

            Resp.ID         = Req.ID;
            Resp.Successful = true;
            StanzaMessage RespMessage = new StanzaMessage();

            RespMessage.To = Orchestrator;
            RespMessage.Payload.Add(Resp.GetXML("genericresponse", Req.Name));
            RespMessage.MessageType = StanzaMessage.StanzaMessageType.Normal;
            Uplink.SendStanza(RespMessage);
        }
예제 #2
0
        void Uplink_OnStanzaMessage(StanzaMessage Data)
        {
            if (Data.From.GetBareJID() != DataSourceAddress.GetBareJID())
            {
                return;
            }

            Console.WriteLine("Controller received message stanza");
            XElement LWTSDElement = Data.Payload.Elements().First();

            if (LWTSDElement.Name.Namespace != LWTSD.Namespace)
            {
                return;
            }

            switch (LWTSDElement.Name.LocalName)
            {
            case "subscription-cancelled":
                HandleSubscriptionCancelled(LWTSDElement);
                break;

            case "subscription-triggered":
                HandleSubscriptionTriggered(LWTSDElement);
                break;
            }
        }
예제 #3
0
        void Uplink_OnStanzaMessage(StanzaMessage Data)
        {
            try
            {
                if (Data.From.GetBareJID() != Orchestrator.GetBareJID())
                {
                    return;
                }

                XElement ActEl = Data.Payload.Element(CDO.Namespace + "actionrequest");
                if (ActEl == null)
                {
                    return;
                }

                ActionRequest Req = new ActionRequest(ActEl);

                switch (Req.Name)
                {
                case "sessionstarted":
                    HandleSessionStarted(Req);
                    break;

                case "sessionterminated":
                    HandleSessionTerminated(Req);
                    break;
                }
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("Uncatched exception in on stanzamessage: " + ex.ToString());
            }
        }
예제 #4
0
        public async Task <ActionResponse> Request(string Name, XElement Payload, int TimeoutSeconds = 60)
        {
            if (LastSynchronizedTime < DateTime.UtcNow.AddMinutes(-60))
            {
                await SynchTime();
            }

            ActionRequest Request = new ActionRequest()
            {
                TimesOut    = DateTime.UtcNow.AddSeconds(TimeoutSeconds + TimeDifferenceSeconds),
                AckTimesOut = DateTime.UtcNow.AddSeconds(5 + TimeDifferenceSeconds),
                Name        = Name,
                Payload     = Payload
            };

            TaskCompletionSource <ActionResponse> Signal = new TaskCompletionSource <ActionResponse>();

            ActionResponses[Request.ID] = Signal;

            StanzaMessage Message = new StanzaMessage();

            Message.MessageType = StanzaMessage.StanzaMessageType.Normal;
            Message.To          = Orchestrator;
            Message.Payload.Add(Request.GetXML());
            Uplink.SendStanza(Message);

            if (Signal.Task != await Task.WhenAny(Signal.Task, Task.Delay(TimeoutSeconds * 1000)))
            {
                ActionResponses.TryRemove(Request.ID, out Signal);
                return(new ActionResponse()
                {
                    ID = Request.ID,
                    Successful = false,
                    TimedOut = true
                });
            }

            if (Signal.Task.Result == null)
            {
                throw new Exception("Failed to make request");
            }

            return(Signal.Task.Result);
        }
예제 #5
0
        public void CancelSubscription(string SubscriptionID)
        {
            Subscription Sub;

            if (!Subscriptions.ContainsKey(SubscriptionID))
            {
                return;
            }

            Subscriptions.TryRemove(SubscriptionID, out Sub);

            StanzaMessage Request = new StanzaMessage();

            Request.To = DataSourceAddress;
            XElement Payload = new XElement(LWTSD.Namespace + "cancel-subscription");

            Payload.SetAttributeValue("subscriptionid", Sub.ID);
            Request.Payload.Add(Payload);
            Uplink.SendStanza(Request);
        }
예제 #6
0
        void Uplink_OnStanzaMessage(StanzaMessage Data)
        {
            if (!Data.Payload.HasElements)
            {
                return;
            }

            XElement LWTSDElement = Data.Payload.Elements().First();

            if (LWTSDElement.Name.Namespace != LWTSD.Namespace)
            {
                return;
            }

            switch (LWTSDElement.Name.LocalName)
            {
            case "subscription-cancelled":
                HandleSubscriptionCancelled(Data);
                break;
            }
        }
예제 #7
0
        void HandleSubscriptionCancelled(StanzaMessage Request)
        {
            XElement SubscribeElement = Request.Payload.Elements().First();

            try
            {
                string localsid = SubscribeElement.Attribute("subscriptionid").Value;
                string sid      = GetSafeSubscriptionID(Request.From, localsid);
                if (!Subscribers.ContainsKey(sid))
                {
                    return;
                }

                Subscriber Temp;
                Subscribers.TryRemove(sid, out Temp);
            }
            catch
            {
                // No
            }
        }
예제 #8
0
        void Uplink_OnStanzaMessage(StanzaMessage Data)
        {
            //Console.WriteLine(Data.ToString());

            XElement RespEl = Data.Payload.Element(CDO.Namespace + "actionresponse");

            if (RespEl == null)
            {
                return;
            }

            ActionResponse Response = new ActionResponse(RespEl);

            TaskCompletionSource <ActionResponse> Signal;

            if (!ActionResponses.TryRemove(Response.ID, out Signal))
            {
                return;
            }

            Signal.SetResult(Response);
        }
예제 #9
0
        public void InvalidateData(JID ExcludeJID)
        {
            List <string> SubscriptionsToRemove = new List <string>();

            foreach (string key in Subscribers.Keys)
            {
                Subscriber s = Subscribers[key];
                try
                {
                    if (ExcludeJID != null)
                    {
                        if (s.SubscriberAddress == ExcludeJID)
                        {
                            continue;
                        }
                    }

                    if (s.LastInvalidated > s.LastResubscribed)
                    {
                        continue;
                    }

                    List <ResourceAccess> LimitedAccess = GetAccessRights(s.SubscriberAddress, s.AccessToken);

                    bool Invalidate = false;
                    foreach (ResourceSubscription trigger in s.Triggers)
                    {
                        if (!ResourceAccess.AllowsRead(LimitedAccess, trigger.Path))
                        {
                            throw new AccessViolation();
                        }

                        Resource res = Resources[trigger.Path];
                        if (res.ModifiedAt > s.LastInvalidated)
                        {
                            Invalidate = true;
                            break;
                        }
                    }

                    if (!Invalidate)
                    {
                        continue;
                    }

                    // Invalidate
                    StanzaMessage InvalidateMessage = new StanzaMessage();
                    InvalidateMessage.MessageType = StanzaMessage.StanzaMessageType.Normal;
                    InvalidateMessage.To          = s.SubscriberAddress;
                    s.LastInvalidated             = DateTime.UtcNow;
                    XElement SubscriptionTriggeredElement = new XElement(LWTSD.Namespace + "subscription-triggered");
                    SubscriptionTriggeredElement.SetAttributeValue("subscriptionid", s.SubscriptionID);
                    InvalidateMessage.Payload.Add(SubscriptionTriggeredElement);
                    Uplink.SendStanza(InvalidateMessage);
                }
                catch (AccessViolation Violation)
                {
                    SubscriptionsToRemove.Add(key);
                }
            }
            foreach (string ToRemove in SubscriptionsToRemove)
            {
                Subscriber Temp;
                Subscribers.TryRemove(ToRemove, out Temp);
            }
        }