Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }