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); }
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); }
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); }
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)); }