public async Task <IEnumerable <Session> > Lookup(SessionLookup lookup) { var db = sessionCache.GetDatabase(); var result = db.HashGet(lookup.sessionKey.ToString(), "guid"); var ret = new List <Session>(); if (!result.HasValue) { return(ret); } var session = new Session(); session.sessionKey = result.ToString(); var profileId = db.HashGet(lookup.sessionKey.ToString(), "profileid"); var userId = db.HashGet(lookup.sessionKey.ToString(), "userid"); var profileLookup = new ProfileLookup(); profileLookup.id = int.Parse(profileId.ToString()); session.profile = (await profileRepository.Lookup(profileLookup)).FirstOrDefault(); var userLookup = new UserLookup(); userLookup.id = int.Parse(userId.ToString()); session.user = (await userRepository.Lookup(userLookup)).FirstOrDefault(); session.appName = db.HashGet(lookup.sessionKey.ToString(), "appName"); ret.Add(session); return(ret); }
public async Task <AuthResponse> PreAuth([FromBody] AuthRequest request) { Dictionary <string, string> dict = await sessionRepository.decodeAuthToken(request.auth_token); if (dict == null) { throw new AuthInvalidCredentialsException(); } var response = new AuthResponse(); ProfileLookup profileLookup = new ProfileLookup(); UserLookup userLookup = new UserLookup(); int profileId; int.TryParse(dict["profileId"], out profileId); profileLookup.id = profileId; User user = null; if (dict.ContainsKey("userId")) { int.TryParse(dict["userId"], out profileId); userLookup.id = profileId; user = (await userRepository.Lookup(userLookup)).First(); } response.profile = (await profileRepository.Lookup(profileLookup)).First(); if (user == null) { userLookup.id = response.profile.Userid; user = (await userRepository.Lookup(userLookup)).First(); } response.user = user; var sesskey = gs_sesskey(request.session_key); string challenge = dict["true_signature"] + sesskey.ToString(); using (MD5 md5 = MD5.Create()) { StringBuilder sBuilder = new StringBuilder(); byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(challenge)); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } challenge = sBuilder.ToString().ToLower(); } if (!challenge.Equals(request.client_response.ToLower())) { throw new AuthInvalidCredentialsException(); } return(response); }
public async Task <PresenceProfileStatus> GetStatus([FromBody] ProfileLookup profileLookup) { PresenceProfileLookup lookup = new PresenceProfileLookup(); lookup.profileLookup = profileLookup; PresenceProfileStatus status = (await profileStatusRepository.Lookup(lookup)).FirstOrDefault(); if (status == null) { throw new NoSuchUserException(); } return(status); }
public async Task <Session> Create(Session model) { Session session = new Session(); var session_key = generateSessionKey(); var db = sessionCache.GetDatabase(); db.HashSet(session_key.ToString(), "guid", session_key.ToString()); db.HashSet(session_key.ToString(), "appName", model.appName); if (model.profile != null && model.profile.Id != 0) { db.HashSet(session_key.ToString(), "profileid", model.profile.Id.ToString()); db.HashSet(session_key.ToString(), "userid", model.profile.Userid.ToString()); } else if (model.user != null) { UserLookup userLookup = new UserLookup(); if (model.user.Id != 0) { userLookup.id = model.user.Id; db.HashSet(session_key.ToString(), "userid", model.user.Id.ToString()); } session.user = (await this.userRepository.Lookup(userLookup)).ToList().First(); } else { throw new ArgumentException(); } if (model.profile != null) { ProfileLookup lookup = new ProfileLookup(); lookup.id = model.profile.Id; session.profile = (await this.profileRepository.Lookup(lookup)).ToList().First(); } session.appName = model.appName; session.expiresIn = model.expiresIn ?? this.defaultTimeSpan; session.expiresAt = DateTime.Now.Add(model.expiresIn ?? this.defaultTimeSpan); session.sessionKey = session_key; db.KeyExpire(session_key.ToString(), model.expiresIn ?? this.defaultTimeSpan); SendLoginEvent(session); return(session); }
public async Task <IEnumerable <Buddy> > Lookup(BuddyLookup lookup) { var query = gameTrackerDb.Buddy as IQueryable <Buddy>; var from_profile = (await this.profileRepository.Lookup(lookup.SourceProfile)).First(); query = query.Where(b => b.FromProfileid == from_profile.Id); var buddies = await query.ToListAsync(); foreach (var buddy in buddies) { if (buddy.ToProfile == null) { ProfileLookup plookup = new ProfileLookup(); plookup.id = buddy.ToProfileid; buddy.ToProfile = (await this.profileRepository.Lookup(plookup)).First(); } } if (lookup.TargetProfile != null) { var to_profile = (await this.profileRepository.Lookup(lookup.TargetProfile)).First(); return(buddies.Where(b => b.ToProfileid == to_profile.Id)); } return(buddies); }
public async Task <Profile> LookupProfileFromCDKey(CdKeyLookup cdKeylookup) { var cdkeyResults = (await Lookup(cdKeylookup)).FirstOrDefault(); if (cdkeyResults == null) { return(null); } var profileResults = await keyMasterDb.ProfileCdKey.Where(b => b.Cdkeyid == cdkeyResults.Id).ToListAsync(); if (profileResults == null || profileResults.Count == 0) { throw new NoSuchUserException(); //client is out of luck, no profile found for cd key } //find first user id, this is the "owner" of the cdkey var userProfileLookup = new ProfileLookup(); userProfileLookup.id = profileResults.First().Profileid; var userProfile = (await profileRepository.Lookup(userProfileLookup)).FirstOrDefault(); if (userProfile == null) { throw new NoSuchUserException(); } if (cdKeylookup.profileLookup == null) { var profile_cdkey_records = await keyMasterDb.ProfileCdKey.Where(b => b.Cdkeyid == cdkeyResults.Id).ToListAsync(); var firstProfileAssociationRecord = profile_cdkey_records.FirstOrDefault(); if (firstProfileAssociationRecord == null) { throw new NoSuchUserException(); } //return first profile var profileLookup = new ProfileLookup(); profileLookup.id = firstProfileAssociationRecord.Profileid; return((await profileRepository.Lookup(profileLookup)).FirstOrDefault()); } else { //lock profile lookup to current user cdKeylookup.profileLookup.user = new UserLookup(); cdKeylookup.profileLookup.user.id = userProfile.Userid; Profile result = (await profileRepository.Lookup(cdKeylookup.profileLookup)).FirstOrDefault(); if (result != null) { return(result); } //create new profile for user result = new Profile(); result.Userid = userProfile.Userid; result.Nick = cdKeylookup.profileLookup.nick; result.Uniquenick = cdKeylookup.profileLookup.uniquenick; result.Namespaceid = cdKeylookup.profileLookup.namespaceid ?? 0; return(await profileRepository.Create(result)); } }
public async Task <AuthResponse> PreAuth([FromBody] AuthRequest authRequest) { Dictionary <string, string> dict = await sessionRepository.decodeAuthToken(authRequest.auth_token); if (dict == null) { throw new AuthInvalidCredentialsException(); } DateTime expireTime; AuthResponse response = new AuthResponse(); if (dict.Keys.Contains("expiresAt")) { long expiresAtTS; if (!long.TryParse(dict["expiresAt"], out expiresAtTS)) { throw new AuthInvalidCredentialsException(); } System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); expireTime = dtDateTime.AddSeconds(expiresAtTS).ToLocalTime(); if (DateTime.UtcNow > expireTime) { throw new AuthInvalidCredentialsException(); } } ProfileLookup profileLookup = new ProfileLookup(); UserLookup userLookup = new UserLookup(); int profileId; int.TryParse(dict["profileId"], out profileId); profileLookup.id = profileId; User user = null; if (dict.ContainsKey("userId")) { int.TryParse(dict["userId"], out profileId); userLookup.id = profileId; user = (await userRepository.Lookup(userLookup)).First(); } response.profile = (await profileRepository.Lookup(profileLookup)).First(); response.success = true; if (user == null) { userLookup.id = response.profile.Userid; user = (await userRepository.Lookup(userLookup)).First(); } response.user = user; //authRequest.client_response = authRequest.auth_token_challenge; var client_response = authRequest.client_response; authRequest.client_response = dict["true_signature"]; //test validity of auth token... confirm the users token is signed against "true_signature" if (client_response.CompareTo(GetPasswordProof(response.profile, authRequest, ProofType.ProofType_PreAuth, true)) != 0) { throw new AuthInvalidCredentialsException(); } response.server_response = GetPasswordProof(response.profile, authRequest, ProofType.ProofType_PreAuth, false); response.session = await generateSessionKey(response.profile); response.success = true; return(response); }
public async Task <IEnumerable <PlayerProgress> > Lookup(PlayerProgressLookup lookup) { Game game = null; Profile profile = null; var searchRequest = new BsonDocument { }; if (lookup.objectId != null) { searchRequest["_id"] = new BsonObjectId(new ObjectId(lookup.objectId)); } else { profile = (await profileRepository.Lookup(lookup.profileLookup)).FirstOrDefault(); game = (await gameRepository.Lookup(lookup.gameLookup)).FirstOrDefault(); searchRequest["gameid"] = game.Id; searchRequest["profileid"] = profile.Id; if (lookup.pageKey != null) { searchRequest["pageKey"] = lookup.pageKey; } } var return_value = new List <PlayerProgress>(); var results = (await collection.FindAsync(searchRequest)).ToList(); foreach (var result in results) { var progress = new PlayerProgress(); if (!result["profileid"].IsBsonNull && result["profileid"].AsInt32 != 0) { var profileLookup = new ProfileLookup(); profileLookup.id = result["profileid"].AsInt32; profile = (await profileRepository.Lookup(profileLookup)).FirstOrDefault(); } else { profile = null; } if (!result["gameid"].IsBsonNull || result["gameid"].AsInt32 != 0) { var gameLookup = new GameLookup(); gameLookup.id = result["gameid"].AsInt32; game = (await gameRepository.Lookup(gameLookup)).FirstOrDefault(); } else { game = null; } progress.game = game; progress.profile = profile; progress.data = Newtonsoft.Json.JsonConvert.DeserializeObject(result.GetValue("data").ToJson()); //stupid fix for weird bson deserialization if (result.Contains("modified")) { progress.modified = (decimal)result["modified"].AsDouble; } return_value.Add(progress); } return(return_value); }