/// <summary> /// Empaqquete un DIscoInfo /// </summary> /// <param name="info">DicoInfo</param> /// <returns>Ampaquetage</returns> public static string DiscoInfoToVersion(DiscoInfo info) { StringBuilder builder = new StringBuilder(256); DiscoIdentity[] identities = info.GetIdentities(); string[] ids = new string[identities.Length]; for (int i = 0; i < identities.Length; i++) { ids[i] = string.Format("{0}/{1}", identities[i].Category, identities[i].Type); } Array.Sort(ids); foreach (string id in ids) { builder.AppendFormat("{0}<", id); } DiscoFeature[] features = info.GetFeatures(); string[] feas = new string[features.Length]; for (int i = 0; i < features.Length; i++) { feas[i] = features[i].Var; } Array.Sort(feas); foreach (string fea in feas) { builder.AppendFormat("{0}<", fea); } SHA1Managed sha1 = new SHA1Managed(); byte[] hash = sha1.ComputeHash(Encoding.Unicode.GetBytes(builder.ToString())); return Convert.ToBase64String(hash); }
public void AddToCache(Capabilities capabilities, DiscoInfo discoInfo) { if (discoInfo.GetFeatures().Length > 0) { lock (_cacheLock) { string caps = GetCapsString(capabilities); _cache[GetCapsString(capabilities)] = discoInfo; Database.SaveCapsCache(caps, discoInfo.ToString()); } } }
private string BuildCapsVersion(DiscoInfo di) { /* 1. Initialize an empty string S. 2. Sort the service discovery identities by category and then by type (if it exists), formatted as 'category' '/' 'type'. 3. For each identity, append the 'category/type' to S, followed by the '<' character. 4. Sort the supported features. 5. For each feature, append the feature to S, followed by the '<' character. 6. Compute ver by hashing S using the SHA-1 algorithm as specified in RFC 3174 [17] (with binary output) and encoding the hash using Base64 as specified in Section 4 of RFC 4648 [18] (note: the Base64 output MUST NOT include whitespace and MUST set padding bits to zero). [19] */ ArrayList features = new ArrayList(); ArrayList identities = new ArrayList(); foreach (DiscoIdentity did in di.GetIdentities()) identities.Add(did.Type == null ? did.Category : did.Category + "/" + did.Type); foreach (DiscoFeature df in di.GetFeatures()) features.Add(df.Var); identities.Sort(); features.Sort(); StringBuilder S = new StringBuilder(); foreach (string s in identities) S.Append(s + "<"); foreach (string s in features) S.Append(s + "<"); byte[] sha1 = util.Hash.Sha1HashBytes(S.ToString()); #if CF return Convert.ToBase64String(sha1, 0, sha1.Length); #else return Convert.ToBase64String(sha1); #endif }
/// <summary> /// Builds and sets the caps ver attribute from a DiscoInfo object /// </summary> /// <param name="di"></param> public void SetVersion(DiscoInfo di) { Version = BuildCapsVersion(di); }
public DiscoInfoIq(IqType type) : this() { this.Type = type; Query = new DiscoInfo(); }
/// <summary> /// Retourne notre DiscoInfo /// </summary> /// <returns>DiscoInfo</returns> public static DiscoInfo getDiscoInfo() { DiscoInfo di = new DiscoInfo(); di.AddIdentity(new DiscoIdentity("pc", "client", "nJim")); di.AddFeature(new DiscoFeature(agsXMPP.Uri.CLIENT)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.DISCO_INFO)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.IQ_AVATAR)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.VCARD)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.VCARD_UPDATE)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.X_AVATAR)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.X_DELAY)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.IQ_VERSION)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.IQ_TIME)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.IQ_LAST)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.PING)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.IQ_PRIVACY)); di.AddFeature(new DiscoFeature(agsXMPP.Uri.STORAGE_BOOKMARKS)); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/mood")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/mood+notify")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/tune")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/tune+notify")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/geoloc")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/geoloc+notify")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/activity")); di.AddFeature(new DiscoFeature("http://jabber.org/protocol/activity+notify")); return di; }
void FindGroupChatsChatInfoParse(Jid jid, DiscoInfo items, List<GroupChatModel> list) { var ident = items.SelectSingleElement<DiscoIdentity>(); string name; if (ident != null && !String.IsNullOrEmpty(ident.Name)) { name = ident.Name + " [" + jid + "]"; } else { name = jid; } var chat = new GroupChatModel(jid, name, null); chat.PersonCount = -1; var x = items.SelectSingleElement<agsXMPP.protocol.x.data.Data>(); if (x != null) { var users_field = x.GetField("muc#roominfo_occupants"); var topic_field = x.GetField("muc#roominfo_subject"); var desc_field = x.GetField("muc#roominfo_description"); if (users_field != null) { chat.PersonCount = int.Parse(users_field.GetValue()); } if (topic_field != null) { chat.Topic = new MessageModel(topic_field.GetValue()); } else if (desc_field != null) { chat.Topic = new MessageModel(desc_field.GetValue()); } } lock (list) { list.Add(chat); } }
void AddCapabilityToResource(Jid jid, DiscoInfo info) { XmppPersonModel contact; if (!Contacts.TryGetValue(jid.Bare, out contact)) { return; } XmppResourceModel res; if (!contact.Resources.TryGetValue(jid.Resource??"", out res)) { return; } res.Disco = info; }
/// <summary> /// Builds and sets the caps ver attribute from a DiscoInfo object /// </summary> /// <param name="di"></param> public void SetVersion(DiscoInfo di) { Hash = "sha-1"; Version = BuildCapsVersion(di); }