public async Task <IActionResult> QTLogin(string code, string a)
        {
            ViewBag.codeProvided = false;
            if (!string.IsNullOrEmpty(code))
            {
                ViewBag.codeProvided = true;

                var response = new ApiResponse();

                var email = MiscHelpers.Base64Decode(a);

                var curUser = db.Users.Include(p => p.Token).FirstOrDefault(p => p.Email == email);

                if (curUser == null)
                {
                    response.Success = false;
                    response.Messages.Add("No user found with provided email.");
                    await traderHub.Clients.Client(curUser.ConnectionId).InvokeAsync("recievedAuthToken", response);

                    return(View());
                }

                var redirectUrl = appSettings.BaseUrl + GlobalVars.LOGIN_REDIRECT_PATH;
                try
                {
                    var curToken = AuthHelper.GetRefreshToken(appSettings.QuestradeaAppKey, code, redirectUrl, true);

                    if (curToken == null)
                    {
                        response.Success = false;
                        response.Messages.Add("Error fetching auth token. Please contact administrator.");
                        await traderHub.Clients.Client(curUser.ConnectionId).InvokeAsync("recievedAuthToken", response);

                        return(View());
                    }

                    if (curUser.Token != null)
                    {
                        db.Tokens.Remove(curUser.Token);
                        db.SaveChanges();
                    }

                    curToken.UserID = curUser.ID;

                    db.Tokens.Add(curToken);
                    db.SaveChanges();

                    //TODO: I think this has potential to be a race condition, make sure the email provided matches the current connection
                    await traderHub.Clients.Client(curUser.ConnectionId).InvokeAsync("recievedAuthToken", response);
                }
                catch (Exception e)
                {
                    await traderHub.Clients.Client(curUser.ConnectionId).InvokeAsync("recievedAuthToken", e);
                }
            }

            return(View());
        }
Esempio n. 2
0
        public override async Task OnConnectedAsync()
        {
            var email            = Context.Connection.GetHttpContext().Request.Query["email"].ToString().Trim().ToLower();
            var QTAppKeyOverride = Context.Connection.GetHttpContext().Request.Query["QTAppKeyOverride"];

            //TODO: Add proper email validation
            if (string.IsNullOrEmpty(email))
            {
                await Clients.Client(Context.ConnectionId).InvokeAsync("recievedLoginUrl", new ApiResponse(success: false, message: "Email is invalid."));

                return;
            }

            var curUser = db.Users.Include(p => p.Token).FirstOrDefault(p => p.Email.ToLower() == email);

            if (curUser == null)
            {
                curUser       = new BLL.DBModels.User();
                curUser.Email = email;

                db.Users.Add(curUser);
            }
            curUser.ConnectionId = Context.ConnectionId;
            db.SaveChanges();

            if (curUser.Token != null)
            {
                //TODO: make a proper function for this
                try {
                    RestClient client = new RestClient(curUser.Token.ApiServer);
                    client.AddDefaultHeader("Authorization", curUser.Token.TokenType + " " + curUser.Token.AccessToken);

                    var request  = new RestRequest("/v1/accounts", Method.GET);
                    var accounts = client.Execute <AccountsResponse>(request).Data;

                    await Clients.Client(Context.ConnectionId).InvokeAsync("recievedAccounts", new ApiResponse(accounts));
                }
                catch {
                }
            }

            var redirectUrl = appSettings.BaseUrl + GlobalVars.LOGIN_REDIRECT_PATH + "?a=" + MiscHelpers.Base64Encode(email);

            var loginUrl = GlobalVars.QT_OAUTH_LOGIN_URL;

            loginUrl += "?client_id=" + (string.IsNullOrEmpty(QTAppKeyOverride) ? appSettings.QuestradeaAppKey : QTAppKeyOverride.ToString());
            loginUrl += "&response_type=code";
            loginUrl += "&redirect_uri=" + redirectUrl;

            await Clients.Client(Context.ConnectionId).InvokeAsync("recievedLoginUrl", new ApiResponse(loginUrl));
        }
        public static Token RefreshToken(AutoQuestraderContext db, Token curToken)
        {
            IRestResponse <AuthTokenResponse> responseToken = null;

            try
            {
                var authClient = new RestClient(curToken.LoginServer);

                var request = new RestRequest("oauth2/token", Method.GET);
                request.AddParameter("grant_type", "refresh_token");
                request.AddParameter("refresh_token", curToken.RefreshToken);

                responseToken = authClient.Execute <AuthTokenResponse>(request);

                curToken.ApiServer    = responseToken.Data.api_server;
                curToken.AccessToken  = responseToken.Data.access_token;
                curToken.ExpiresIn    = responseToken.Data.expires_in;
                curToken.ExpiresDate  = DateTimeOffset.UtcNow.AddSeconds(responseToken.Data.expires_in - 30); // create a 30 second buffer to account for network slowness
                curToken.RefreshToken = responseToken.Data.refresh_token;
                curToken.TokenType    = responseToken.Data.token_type;

                db.SaveChanges();

                return(curToken);
            }
            catch
            {
                Console.WriteLine("Error logging in: " + responseToken.Content);

                return(RefreshToken(db, PromptForNewRefreshToken(curToken)));
            }
        }
        public static MailAddress GetAccountOwnerEmail(AutoQuestraderContext db)
        {
            var    ownerEmailSetting = db.SettingValues.FirstOrDefault(p => p.Name == SETTING_NAME_ACCOUNT_OWNER_EMAIL_ADDRESS);
            string ownerEmail;

            if (ownerEmailSetting == null || string.IsNullOrEmpty(ownerEmailSetting.Value))
            {
                Console.WriteLine("Please enter the email address of the account owner:");
                ownerEmail = Console.ReadLine().Trim();
                db.SettingValues.Add(new SettingValues
                {
                    Name  = SETTING_NAME_ACCOUNT_OWNER_EMAIL_ADDRESS,
                    Value = ownerEmail
                });
                db.SaveChanges();
            }
            else
            {
                ownerEmail = ownerEmailSetting.Value;
            }

            var    ownerDisplayNameSetting = db.SettingValues.FirstOrDefault(p => p.Name == SETTING_NAME_ACCOUNT_OWNER_EMAIL_DISPLAY_NAME);
            string ownerDisplayName;

            if (ownerDisplayNameSetting == null || string.IsNullOrEmpty(ownerDisplayNameSetting.Value))
            {
                Console.WriteLine("Please enter the display name for email address: " + ownerEmail);
                ownerDisplayName = Console.ReadLine().Trim();
                db.SettingValues.Add(new SettingValues
                {
                    Name  = SETTING_NAME_ACCOUNT_OWNER_EMAIL_DISPLAY_NAME,
                    Value = ownerDisplayName
                });
                db.SaveChanges();
            }
            else
            {
                ownerDisplayName = ownerDisplayNameSetting.Value;
            }

            return(new MailAddress(ownerEmail, ownerDisplayName));
        }