Beispiel #1
0
        private Element CreateNode(XmlNodeResult nd, Element parent)
        {
            string ens;
            if (nd.Prefix != null)
            {
                RemObjects.InternetPack.XMPP.Elements.Attribute at = nd.Attribute.FirstOrDefault(a => a.Prefix == "xmlns" && a.Name == nd.Prefix);
                if (at == null)
                {
                    Element el = parent;
                    ens = string.Empty;
                    while (el != null)
                    {
                        RemObjects.InternetPack.XMPP.Elements.Attribute els = el.Attributes.Where(a => a.Prefix == "xmlns" && a.Name == nd.Prefix).FirstOrDefault();
                        if (els != null)
                        {
                            ens = els.Value;
                            break;
                        }
                        el = el.Parent;
                    }
                }
                else
                    ens = at.Value;
            }
            else
            {
                RemObjects.InternetPack.XMPP.Elements.Attribute at = nd.Attribute.FirstOrDefault(a => a.Prefix == null && a.Name == "xmlns");
                if (at == null)
                    ens = string.Empty;
                else
                    ens = at.Value;
            }
            Element res = null;
            switch (ens)
            {
                case Namespaces.ClientStreamNamespace:
                case Namespaces.ServerStreamNamespace:
                case "":
                    if (ens == null && parent != null && parent.Type == ElementType.IQ && nd.Name == "error")
                        res = new IQError();
                    else
                        switch (nd.Name)
                        {
                            case "iq":
                                res = new IQ();
                                break;
                            case "presence":
                                res = new Presence();
                                break;
                            case "message":
                                res = new Message();
                                break;
                        }
                    break;
                case Namespaces.StreamNamespace:
                    switch (nd.Name)
                    {
                        case "stream":

                            RemObjects.InternetPack.XMPP.Elements.Attribute att = nd.Attribute.FirstOrDefault(a => a.Prefix == null && a.Name == "xmlns");
                            if (att == null || att.Value == Namespaces.ClientStreamNamespace)
                                res = new ClientStream();
                            else
                                res = new ServerStream();
                            break;
                        case "features":
                            res = new StreamFeatures();
                            break;
                        case "error":
                            res = new StreamError();
                            break;
                    }
                    break;
                case Namespaces.StartTLSNamespace:
                    switch (nd.Name)
                    {
                        case "starttls":
                            res = new StartTLS();
                            break;
                        case "failure":
                            res = new StartTLSFailure();
                            break;
                        case "proceed":
                            res = new StartTLSProceed();
                            break;
                    }

                    break;
                case Namespaces.SaslNamespace:
                    switch (nd.Name) {
                        case "mechanisms":
                            res = new Mechanisms();
                            break;
                        case "auth":
                            res = new SaslAuth();
                            break;
                        case "challenge":
                            res = new SaslChallenge();
                            break;
                        case "response":
                            res = new SaslResponse();
                            break;
                        case "abort":
                            res = new SaslAbort();
                            break;
                        case "success":
                            res = new SaslSuccess();
                            break;
                        case "failure":
                            res = new SaslFailure();
                            break;
                    }
                    break;
            }
            if (res == null)
            {
                res = new UnknownElement();
            }
            else
                res.Attributes.Clear(); // default ones shouldn't be here during the reading process
            if (parent != null)
            {
                res.Parent = parent;
                if (parent != fServerRoot)
                    parent.Elements.Add(res);
            }
            res.Prefix = nd.Prefix;
            res.Name = nd.Name;
            foreach (var el in nd.Attribute)
                res.Attributes.Add(el);
            return res;
        }
Beispiel #2
0
 public StreamFeaturesArgs(StreamFeatures features)
 {
     fFeatures = features;
 }
Beispiel #3
0
 protected void OnStreamFeatures(StreamFeatures aFeatures)
 {
     if (StreamFeatures != null)
     {
         StreamFeaturesArgs args = new StreamFeaturesArgs(aFeatures);
         StreamFeatures(this, args);
     }
 }
Beispiel #4
0
        private void GotFeatures(StreamFeatures features)
        {
            EndTimeout();
            OnStreamFeatures(features);
            if (fState == XMPP.State.Authenticated)
            {
                if (BindResource)
                {
                    fState = XMPP.State.BindingResource;

                    SendResourceBinding();
                }
                else
                {
                    fState = XMPP.State.Active; // finally!

                    OnActive();
                }
                return;
            }
            fServerMechanisms = features.AuthenticationMechanisms;
            var starttls = features.StartTLS;
            if (!(fConnection is SslConnection))
            {
                switch (InitTLS)
                {
                    case InitTLSMode.Always:
                        if (starttls == null)
                        {
                            OnError(new TlsRequiredException("TLS required but not supported by server"));
                            Close();
                            return;
                        }
                        StartTLS();
                        break;
                    case InitTLSMode.IfAvailable:
                        StartTLS();
                        break;
                    default:
                        StartAuth();
                        break;
                }
            }
            else
                StartAuth();
        }