Esempio n. 1
0
        private async Task <DbServer> CreateNewServer(RequestPayload requestInfo, int version, ObjectId stateId)
        {
            //Generate a token to use
            string token = SecureStringTool.GenerateSecureString(46);

            while (!await SecureStringTool.CheckStringUniquenessAsync <DbServer>(token, Program.conn.system_servers))
            {
                token = SecureStringTool.GenerateSecureString(46);
            }
            token = "B." + token;

            //Create a server
            var server = new DbServer
            {
                display_name             = requestInfo.name,
                _id                      = MongoDB.Bson.ObjectId.GenerateNewId(),
                image_url                = Program.conn.hosts.master + "/default_server_icon.png",
                token                    = token,
                has_custom_image         = false,
                latest_server_map        = requestInfo.map,
                mods                     = new string[0],
                last_secure_mode_toggled = DateTime.UtcNow,
                flags                    = 0b00000110,
                last_client_version      = version,
                last_connected_time      = DateTime.UtcNow,
                last_pinged_time         = DateTime.UtcNow,
                last_sync_state          = stateId
            };

            //Insert
            await Program.conn.system_servers.InsertOneAsync(server);

            return(server);
        }
Esempio n. 2
0
        public static DeltaConfig NewConfig(string path)
        {
            var cfg = new DeltaConfig(path);

            //Generate secure tokens
            cfg.secrets.steam_token_key        = Convert.ToBase64String(SecureStringTool.GenerateSecureRandomBytes(16));
            cfg.secrets.corenet_encryption_key = Convert.ToBase64String(SecureStringTool.GenerateSecureRandomBytes(256));

            return(cfg);
        }
Esempio n. 3
0
        private async Task <bool> TryAuthenticate()
        {
            //Read form
            LoginForm data = new LoginForm();
            await form.ProcessResponse(data, e);

            //Authenticate
            Framework.Config.DeltaAdminAccount authenticatedUser = null;
            foreach (var u in Program.cfg.admin_credentials)
            {
                if (u.username == data.username)
                {
                    //Check password
                    bool ok = PasswordTool.AuthenticateHashedPassword(data.password, Convert.FromBase64String(u.passwordHash), Convert.FromBase64String(u.passwordSalt));
                    if (ok)
                    {
                        authenticatedUser = u;
                    }
                }
            }

            //Check if passed
            if (authenticatedUser != null)
            {
                //Correct creds! Create a session
                AdminSession session = new AdminSession
                {
                    expiry   = DateTime.UtcNow.AddMinutes(Program.cfg.general.admin_session_expire_time),
                    token    = SecureStringTool.GenerateSecureString(24),
                    username = authenticatedUser.username
                };

                //Set session cookie
                e.Response.Cookies.Append(ACCESS_TOKEN_COOKIE, session.token);

                //Add to sessions
                Program.admin_sessions.Add(session);

                //Redirect back
                string returnTo = "/";
                if (e.Request.Query.ContainsKey("return"))
                {
                    returnTo = e.Request.Query["return"];
                }
                Redirect(returnTo, false);

                return(true);
            }
            else
            {
                //Failed
                return(false);
            }
        }
        public static DeltaManagerServer CreateManagerServer(string label, IPAddress address)
        {
            //Prepare
            DeltaConfigManagerServer configEntry;

            lock (cfg.registered_servers)
            {
                //Create key
                byte[] key = SecureStringTool.GenerateSecureRandomBytes(16);

                //Create ID
                short  id;
                Random rand = new Random();
                do
                {
                    id = (short)rand.Next(257, short.MaxValue - 1);
                } while (cfg.registered_servers.Where(x => x.id == id).Count() != 0);

                //Create config entry
                configEntry = new DeltaConfigManagerServer
                {
                    label   = label,
                    ip_addr = address.ToString(),
                    id      = id,
                    key     = Convert.ToBase64String(key)
                };

                //Add
                cfg.registered_servers.Add(configEntry);
                cfg.Save();
            }

            //Create instance and add it
            DeltaManagerServer server = new DeltaManagerServer(configEntry);

            lock (servers)
                servers.Add(server);

            return(server);
        }
Esempio n. 5
0
        public override async Task OnRequest()
        {
            //Check to see if this is a valid ARK server
            if (!e.Request.Query.ContainsKey("client_version"))
            {
                e.Response.StatusCode = 400;
                await Program.WriteStringToStream(e.Response.Body, "Required information was not sent, this is likely not a valid ARK server.\r\n\r\nIt's likely that you're looking into how things here work. More information: https://github.com/deltawebmap/Docs/blob/master/basics.md \r\n\r\n(C) DeltaWebMap 2020, RomanPort 2020");

                return;
            }

            //Get version
            int clientVersion = int.Parse(e.Request.Query["client_version"]);

            //Read the request data
            var request = await ReadPOSTContentChecked <RequestPayload>();

            if (request == null)
            {
                return;
            }

            //Attempt to authenticate. It's OK of this fails.
            DbServer server = await Program.conn.AuthenticateServerTokenAsync(request.token);

            ObjectId stateId = ObjectId.GenerateNewId();

            if (server == null)
            {
                //Create
                server = await CreateNewServer(request, clientVersion, stateId);
            }
            else
            {
                //Update info
                await server.GetUpdateBuilder(conn)
                .UpdateLastSyncState(stateId)
                .UpdateLastSyncConnectedTime(DateTime.UtcNow)
                .UpdateLastSyncPingedTime(DateTime.UtcNow)
                .UpdateLastSyncClientVersion(clientVersion)
                .Apply();
            }

            //Generate a state token
            string stateToken = SecureStringTool.GenerateSecureString(56);

            while (!await SecureStringTool.CheckStringUniquenessAsync <DbSyncSavedState>(stateToken, Program.conn.system_sync_states))
            {
                stateToken = SecureStringTool.GenerateSecureString(56);
            }

            //Create a state
            DbSyncSavedState state = new DbSyncSavedState
            {
                mod_version     = clientVersion,
                server_id       = server._id,
                system_version  = Program.VERSION_MAJOR,
                time            = DateTime.UtcNow,
                token           = stateToken,
                mod_enviornment = e.Request.Query["client_env"],
                _id             = stateId
            };
            await Program.conn.system_sync_states.InsertOneAsync(state);

            //Create a response
            ResponsePayload response = new ResponsePayload
            {
                refresh_token       = server.token,
                session_token       = state.token,
                is_claimed          = false,
                server_id           = server.id,
                content_server_host = server.game_content_server_hostname
            };

            //Write response
            await Program.WriteStringToStream(e.Response.Body, "D002" + Newtonsoft.Json.JsonConvert.SerializeObject(response));
        }