Exemplo n.º 1
0
 /// <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);
 }
Exemplo n.º 2
0
 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());
         }
     }
 }
Exemplo n.º 3
0
        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
        }
Exemplo n.º 4
0
 /// <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();
 }
Exemplo n.º 6
0
 /// <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;
 }
Exemplo n.º 7
0
 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);
     }
 }
Exemplo n.º 8
0
 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;
 }
Exemplo n.º 9
0
 /// <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);
 }