Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
SendSubscriptionAccepted.cs
1using System;
2using System.Collections.Generic;
3using System.Threading.Tasks;
4using System.Xml;
5using Waher.Content;
11using Waher.Script;
14
16{
21 {
26 : base("Xmpp/SendSubscriptionAccepted",
27 new KeyValuePair<Type, Expression>(typeof(Dictionary<string, object>), new Expression(jsonPattern)),
28 new KeyValuePair<Type, Expression>(typeof(XmlDocument), new Expression(xmlPattern)))
29 {
30 }
31
32 private static readonly string jsonPattern = Resources.LoadResourceAsText(typeof(SendSubscriptionAccepted).Namespace + ".JSON.SendSubscriptionAccepted.req");
33 private static readonly string xmlPattern = Resources.LoadResourceAsText(typeof(SendSubscriptionAccepted).Namespace + ".XML.SendSubscriptionAccepted.req");
34
43 public override async Task POST(HttpRequest Request, HttpResponse Response, Dictionary<string, IElement> Parameters)
44 {
46
47 string To = (string)Parameters["PTo"].AssociatedObjectValue;
48
49 if (string.IsNullOrEmpty(To))
50 throw new BadRequestException("Missing recipient JID.");
51
52 if (!IsValidBareJID(To))
53 throw new BadRequestException("Recpient must be a Bare JID.");
54 string Id = (string)Parameters["PId"]?.AssociatedObjectValue;
55
56 if (string.IsNullOrEmpty(Id))
57 Id = Guid.NewGuid().ToString();
58
59 Dictionary<string, object> NewItem;
60 bool Result;
61
62 if (XmppServerModule.Server is null)
63 {
65
66 if (Client is null)
67 {
68 if (Types.TryGetModuleParameter("XMPP", out object Obj) && Obj is XmppClient Client2)
69 Client = Client2;
70 }
71
72 if (Client is null)
73 throw new ServiceUnavailableException("XMPP Client not available.");
74
76 ?? throw new NotFoundException("Presence subscription request not found.");
77
78 Id = e.Id;
79
80 await e.Accept();
81 Result = true;
82
83 Networking.XMPP.RosterItem Item = Client[To];
84
85 NewItem = new Dictionary<string, object>()
86 {
87 { "bareJid", Item?.BareJid ?? To },
88 { "pendingSubscription", (Item?.PendingSubscription ?? PendingSubscription.Subscribe) == PendingSubscription.Subscribe },
89 { "status", Item?.State ?? SubscriptionState.None },
90 { "name", Item?.Name ?? string.Empty },
91 { "Groups", Item?.Groups ?? new string[0] }
92 };
93 }
94 else
95 {
96 PersistenceLayer PersistenceLayer = XmppServerModule.PersistenceLayer ?? new PersistenceLayer();
99
100 switch (State)
101 {
102 case SubscriptionStatus.none:
103 State = SubscriptionStatus.from;
104 break;
105
106 case SubscriptionStatus.to:
107 State = SubscriptionStatus.both;
108 break;
109 }
110
112 Item?.Name ?? string.Empty, State, null, null);
113
114 Result = await XmppServerModule.Server.Presence("subscribed", Id,
115 new XmppAddress(To),
116 new XmppAddress(User.UserName + "@" + XmppServerModule.Server.Domain),
117 string.Empty, string.Empty, XmppServerModule.Server);
118
119 Item = await PersistenceLayer.GetRosterItem(User.UserName, To);
120 NewItem = new Dictionary<string, object>()
121 {
122 { "bareJid", Item.BareJid.Value },
123 { "pendingSubscription", Item.PendingSubscription },
124 { "status", Item.Subscription },
125 { "name", Item.Name },
126 { "Groups", Item.Groups }
127 };
128 }
129
130 await Response.Return(new NamedDictionary<string, object>("SubscriptionAcceptedResult", AgentNamespace)
131 {
132 { "sent", Result },
133 { "id", Id },
134 { "RosterItem", NewItem }
135 });
136 }
137 }
138}
A Named dictionary is a dictionary, with a local name and a namespace. Use it to return content that ...
Static class managing loading of resources stored as embedded resources or in content files.
Definition: Resources.cs:15
static string LoadResourceAsText(string ResourceName)
Loads a text resource from an embedded resource.
Definition: Resources.cs:96
Static class managing the runtime environment of the IoT Gateway.
Definition: Gateway.cs:126
static XmppClient XmppClient
XMPP Client connection of gateway.
Definition: Gateway.cs:3187
The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repe...
Represents an HTTP request.
Definition: HttpRequest.cs:18
Represets a response of an HTTP client request.
Definition: HttpResponse.cs:21
async Task Return(object Object)
Returns an object to the client. This method can only be called once per response,...
The server has not found anything matching the Request-URI. No indication is given of whether the con...
The server is currently unable to handle the request due to a temporary overloading or maintenance of...
Event arguments for presence events.
async Task Accept()
Accepts a subscription or unsubscription request.
string Id
ID attribute of presence stanza.
Maintains information about an item in the roster.
Definition: RosterItem.cs:75
SubscriptionState State
roup Current subscription state.
Definition: RosterItem.cs:268
string[] Groups
Any groups the roster item belongs to.
Definition: RosterItem.cs:186
string BareJid
Bare JID of the roster item.
Definition: RosterItem.cs:276
PendingSubscription PendingSubscription
If there's a pending unanswered presence subscription or unsubscription request made to the contact.
Definition: RosterItem.cs:291
string Name
Name of the roster item.
Definition: RosterItem.cs:282
Contains information about one XMPP address.
Definition: XmppAddress.cs:9
static readonly XmppAddress Empty
Empty address.
Definition: XmppAddress.cs:31
CaseInsensitiveString Domain
Domain name.
Definition: XmppServer.cs:882
async Task< bool > Presence(string Type, string Id, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
Presence stanza.
Definition: XmppServer.cs:2647
Manages an XMPP client connection. Implements XMPP, as defined in https://tools.ietf....
Definition: XmppClient.cs:59
PresenceEventArgs GetSubscriptionRequest(string BareJID)
Gets a presence subscription request
Definition: XmppClient.cs:4710
Static class that dynamically manages types and interfaces available in the runtime environment.
Definition: Types.cs:14
static bool TryGetModuleParameter(string Name, out object Value)
Tries to get a module parameter value.
Definition: Types.cs:583
Class managing a script expression.
Definition: Expression.cs:39
async Task< IRosterItem > GetRosterItem(CaseInsensitiveString UserName, CaseInsensitiveString Jid)
Gets a roster item for an account.
async Task< IRosterItem > SetRosterItem(CaseInsensitiveString UserName, CaseInsensitiveString Jid, string Name, SubscriptionStatus? Subscription, bool? PendingSubscription, string[] Groups)
Sets a roster item in a users roster.
static AccountUser AssertUserAuthenticated(HttpRequest Request)
Makes sure the request is made by an authenticated API user.
const string AgentNamespace
https://waher.se/Schema/BrokerAgent.xsd
Abstract base class for XMPP resources.
static bool IsValidBareJID(string JID)
Checks if a string is a valid Bare JID.
Accepts a presence subscription request made to the XMPP account.
SendSubscriptionAccepted()
Accepts a presence subscription request made to the XMPP account.
override async Task POST(HttpRequest Request, HttpResponse Response, Dictionary< string, IElement > Parameters)
Executes the POST method on the resource.
Service Module hosting the XMPP broker and its components.
Interface for roster items.
Definition: IRosterItem.cs:43
SubscriptionStatus Subscription
Subscription status.
Definition: IRosterItem.cs:72
string Name
Name of roster item.
Definition: IRosterItem.cs:56
SubscriptionStatus
Roster item subscription status enumeration.
Definition: IRosterItem.cs:10
PendingSubscription
Pending subscription states.
Definition: RosterItem.cs:54