public void ReadLoopbackWorldResponse(XmlNode node)
        {
            // WorldResponse response;
            string world_id = null;
            string update_url = null;
            string patcher_url = null;
            string hostname = null;
            int port = 0;
            List<string> world_repositories = new List<string>();
            bool standalone = false;
            string startup_script = null;
            if (node.Attributes["world_id"] == null)
                log.Warn("loopback_world_response element missing world_id attribute");
            else
                world_id = node.Attributes["world_id"].Value;
            LoopbackWorldResponse loopbackWorldResponse = new LoopbackWorldResponse();
            foreach (XmlNode child in node.ChildNodes) {
                switch (child.Name) {
                    case "account":
                        if (child.Attributes["id_token"] != null) {
                            string token = child.Attributes["id_token"].Value;
                            loopbackWorldResponse.idToken = Convert.FromBase64String(token);
                        } else if (child.Attributes["id_number"] != null) {
                            string number = child.Attributes["id_number"].Value;
                            int id = int.Parse(number);

                            // Make an old style token for older servers
                            loopbackWorldResponse.oldToken = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(id));

                            // Build a fake token to send to the login server
                            OutgoingMessage tokenBuilder = new OutgoingMessage();
                            tokenBuilder.Write((byte)1);      // version
                            tokenBuilder.Write((byte)1);      // type
                            tokenBuilder.Write("master");     // issuer
                            tokenBuilder.Write(1L);           // token id
                            tokenBuilder.Write(1L);           // key id
                            tokenBuilder.Write(0L);           // expiry
                            tokenBuilder.Write((byte)24);     // TreeMap type
                            tokenBuilder.Write(1);            // num entries
                            tokenBuilder.Write("account_id"); // entry key
                            tokenBuilder.Write((byte)3);      // int type
                            tokenBuilder.Write(id);           // account_id
                            tokenBuilder.Write((byte)0);      // authenticator
                            loopbackWorldResponse.idToken = tokenBuilder.GetBytes();
                        } else {
                            log.Warn("account element missing multiverse_id attribute");
                        }
                        break;
                    case "update_url":
                        if (child.Attributes["href"] != null)
                            update_url = child.Attributes["href"].Value;
                        else
                            log.Warn("update_url element missing href attribute");
                        break;
                    case "patcher_url":
                        if (child.Attributes["href"] != null)
                            patcher_url = child.Attributes["href"].Value;
                        else
                            log.Warn("patcher_url element missing href attribute");
                        break;
                    case "server":
                        if (child.Attributes["hostname"] != null)
                            hostname = child.Attributes["hostname"].Value;
                        else
                            log.Warn("server element missing hostname attribute");
                        if (child.Attributes["port"] != null) {
                            if (!int.TryParse(child.Attributes["port"].Value, out port))
                                log.Warn("server element has invalid port attribute");
                        } else
                            log.Warn("server element missing port attribute");
                        break;
                    case "world_repository":
                        if (child.Attributes["world_id"] != null)
                            world_repositories.Add(Path.Combine(WorldServerEntry.WorldsFolder, child.Attributes["world_id"].Value));
                        else if (child.Attributes["path"] != null)
                            world_repositories.Add(child.Attributes["path"].Value);
                        else
                            log.Warn("world_repository element missing world_id or path attribute");
                        break;
                    case "standalone":
                        if (child.Attributes["script"] != null) {
                            standalone = true;
                            startup_script = child.Attributes["script"].Value;
                        } else
                            log.Warn("standalone element missing script attribute");
                        break;
                }
            }
            loopbackWorldResponse.worldServerEntry = new WorldServerEntry(world_id, hostname, port, patcher_url, update_url);
            loopbackWorldResponse.worldServerEntry.WorldRepositoryDirectories = world_repositories;
            loopbackWorldResponse.worldServerEntry.Standalone = standalone;
            loopbackWorldResponse.worldServerEntry.StartupScript = startup_script;
            worldServerEntries.Add(loopbackWorldResponse);
        }
Пример #2
0
        public void ReadLoopbackWorldResponse(XmlNode node)
        {
            // WorldResponse response;
            string        world_id           = null;
            string        update_url         = null;
            string        patcher_url        = null;
            string        hostname           = null;
            int           port               = 0;
            List <string> world_repositories = new List <string>();
            bool          standalone         = false;
            string        startup_script     = null;

            if (node.Attributes["world_id"] == null)
            {
                log.Warn("loopback_world_response element missing world_id attribute");
            }
            else
            {
                world_id = node.Attributes["world_id"].Value;
            }
            LoopbackWorldResponse loopbackWorldResponse = new LoopbackWorldResponse();

            foreach (XmlNode child in node.ChildNodes)
            {
                switch (child.Name)
                {
                case "account":
                    if (child.Attributes["id_token"] != null)
                    {
                        string token = child.Attributes["id_token"].Value;
                        loopbackWorldResponse.idToken = Convert.FromBase64String(token);
                    }
                    else if (child.Attributes["id_number"] != null)
                    {
                        string number = child.Attributes["id_number"].Value;
                        int    id     = int.Parse(number);

                        // Make an old style token for older servers
                        loopbackWorldResponse.oldToken = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(id));

                        // Build a fake token to send to the login server
                        OutgoingMessage tokenBuilder = new OutgoingMessage();
                        tokenBuilder.Write((byte)1);          // version
                        tokenBuilder.Write((byte)1);          // type
                        tokenBuilder.Write("master");         // issuer
                        tokenBuilder.Write(1L);               // token id
                        tokenBuilder.Write(1L);               // key id
                        tokenBuilder.Write(0L);               // expiry
                        tokenBuilder.Write((byte)24);         // TreeMap type
                        tokenBuilder.Write(1);                // num entries
                        tokenBuilder.Write("account_id");     // entry key
                        tokenBuilder.Write((byte)3);          // int type
                        tokenBuilder.Write(id);               // account_id
                        tokenBuilder.Write((byte)0);          // authenticator
                        loopbackWorldResponse.idToken = tokenBuilder.GetBytes();
                    }
                    else
                    {
                        log.Warn("account element missing multiverse_id attribute");
                    }
                    break;

                case "update_url":
                    if (child.Attributes["href"] != null)
                    {
                        update_url = child.Attributes["href"].Value;
                    }
                    else
                    {
                        log.Warn("update_url element missing href attribute");
                    }
                    break;

                case "patcher_url":
                    if (child.Attributes["href"] != null)
                    {
                        patcher_url = child.Attributes["href"].Value;
                    }
                    else
                    {
                        log.Warn("patcher_url element missing href attribute");
                    }
                    break;

                case "server":
                    if (child.Attributes["hostname"] != null)
                    {
                        hostname = child.Attributes["hostname"].Value;
                    }
                    else
                    {
                        log.Warn("server element missing hostname attribute");
                    }
                    if (child.Attributes["port"] != null)
                    {
                        if (!int.TryParse(child.Attributes["port"].Value, out port))
                        {
                            log.Warn("server element has invalid port attribute");
                        }
                    }
                    else
                    {
                        log.Warn("server element missing port attribute");
                    }
                    break;

                case "world_repository":
                    if (child.Attributes["world_id"] != null)
                    {
                        world_repositories.Add(Path.Combine(WorldServerEntry.WorldsFolder, child.Attributes["world_id"].Value));
                    }
                    else if (child.Attributes["path"] != null)
                    {
                        world_repositories.Add(child.Attributes["path"].Value);
                    }
                    else
                    {
                        log.Warn("world_repository element missing world_id or path attribute");
                    }
                    break;

                case "standalone":
                    if (child.Attributes["script"] != null)
                    {
                        standalone     = true;
                        startup_script = child.Attributes["script"].Value;
                    }
                    else
                    {
                        log.Warn("standalone element missing script attribute");
                    }
                    break;
                }
            }
            loopbackWorldResponse.worldServerEntry = new WorldServerEntry(world_id, hostname, port, patcher_url, update_url);
            loopbackWorldResponse.worldServerEntry.WorldRepositoryDirectories = world_repositories;
            loopbackWorldResponse.worldServerEntry.Standalone    = standalone;
            loopbackWorldResponse.worldServerEntry.StartupScript = startup_script;
            worldServerEntries.Add(loopbackWorldResponse);
        }