github.com/kvattikuti/drone@v0.2.1-0.20140603034306-d400229a327a/pkg/handler/auth.go (about) 1 package handler 2 3 import ( 4 "log" 5 "net/http" 6 7 "github.com/drone/drone/pkg/database" 8 . "github.com/drone/drone/pkg/model" 9 "github.com/drone/go-bitbucket/bitbucket" 10 "github.com/drone/go-bitbucket/oauth1" 11 "github.com/drone/go-github/github" 12 "github.com/drone/go-github/oauth2" 13 ) 14 15 // Create the User session. 16 func Authorize(w http.ResponseWriter, r *http.Request) error { 17 // extract form data 18 username := r.FormValue("username") 19 password := r.FormValue("password") 20 returnTo := r.FormValue("return_to") 21 22 // get the user from the database 23 user, err := database.GetUserEmail(username) 24 if err != nil { 25 return RenderTemplate(w, "login_error.html", nil) 26 } 27 28 // verify the password 29 if err := user.ComparePassword(password); err != nil { 30 return RenderTemplate(w, "login_error.html", nil) 31 } 32 33 // add the user to the session object 34 SetCookie(w, r, "_sess", username) 35 36 // where should we send the user to? 37 if len(returnTo) == 0 { 38 returnTo = "/dashboard" 39 } 40 41 // redirect to the homepage 42 http.Redirect(w, r, returnTo, http.StatusSeeOther) 43 return nil 44 } 45 46 func LinkGithub(w http.ResponseWriter, r *http.Request, u *User) error { 47 48 // get settings from database 49 settings := database.SettingsMust() 50 51 // github OAuth2 Data 52 var oauth = oauth2.Client{ 53 RedirectURL: settings.URL().String() + "/auth/login/github", 54 AccessTokenURL: "https://" + settings.GitHubDomain + "/login/oauth/access_token", 55 AuthorizationURL: "https://" + settings.GitHubDomain + "/login/oauth/authorize", 56 ClientId: settings.GitHubKey, 57 ClientSecret: settings.GitHubSecret, 58 } 59 60 // get the OAuth code 61 code := r.FormValue("code") 62 if len(code) == 0 { 63 scope := "repo,repo:status,user:email" 64 state := "FqB4EbagQ2o" 65 redirect := oauth.AuthorizeRedirect(scope, state) 66 http.Redirect(w, r, redirect, http.StatusSeeOther) 67 return nil 68 } 69 70 // exchange code for an auth token 71 token, err := oauth.GrantToken(code) 72 if err != nil { 73 log.Println("Error granting GitHub authorization token") 74 return err 75 } 76 77 // create the client 78 client := github.New(token.AccessToken) 79 client.ApiUrl = settings.GitHubApiUrl 80 81 // get the user information 82 githubUser, err := client.Users.Current() 83 if err != nil { 84 log.Println("Error retrieving currently authenticated GitHub user") 85 return err 86 } 87 88 // save the github token to the user account 89 u.GithubToken = token.AccessToken 90 u.GithubLogin = githubUser.Login 91 if err := database.SaveUser(u); err != nil { 92 log.Println("Error persisting user's GitHub auth token to the database") 93 return err 94 } 95 96 http.Redirect(w, r, "/new/github.com", http.StatusSeeOther) 97 return nil 98 } 99 100 func LinkBitbucket(w http.ResponseWriter, r *http.Request, u *User) error { 101 102 // get settings from database 103 settings := database.SettingsMust() 104 105 // bitbucket oauth1 consumer 106 var consumer = oauth1.Consumer{ 107 RequestTokenURL: "https://bitbucket.org/api/1.0/oauth/request_token/", 108 AuthorizationURL: "https://bitbucket.org/!api/1.0/oauth/authenticate", 109 AccessTokenURL: "https://bitbucket.org/api/1.0/oauth/access_token/", 110 CallbackURL: settings.URL().String() + "/auth/login/bitbucket", 111 ConsumerKey: settings.BitbucketKey, 112 ConsumerSecret: settings.BitbucketSecret, 113 } 114 115 // get the oauth verifier 116 verifier := r.FormValue("oauth_verifier") 117 if len(verifier) == 0 { 118 // Generate a Request Token 119 requestToken, err := consumer.RequestToken() 120 if err != nil { 121 return err 122 } 123 124 // add the request token as a signed cookie 125 SetCookie(w, r, "bitbucket_token", requestToken.Encode()) 126 127 url, _ := consumer.AuthorizeRedirect(requestToken) 128 http.Redirect(w, r, url, http.StatusSeeOther) 129 return nil 130 } 131 132 // remove bitbucket token data once before redirecting 133 // back to the application. 134 defer DelCookie(w, r, "bitbucket_token") 135 136 // get the tokens from the request 137 requestTokenStr := GetCookie(r, "bitbucket_token") 138 requestToken, err := oauth1.ParseRequestTokenStr(requestTokenStr) 139 if err != nil { 140 return err 141 } 142 143 // exchange for an access token 144 accessToken, err := consumer.AuthorizeToken(requestToken, verifier) 145 if err != nil { 146 return err 147 } 148 149 // create the Bitbucket client 150 client := bitbucket.New( 151 settings.BitbucketKey, 152 settings.BitbucketSecret, 153 accessToken.Token(), 154 accessToken.Secret(), 155 ) 156 157 // get the currently authenticated Bitbucket User 158 user, err := client.Users.Current() 159 if err != nil { 160 return err 161 } 162 163 // update the user account 164 u.BitbucketLogin = user.User.Username 165 u.BitbucketToken = accessToken.Token() 166 u.BitbucketSecret = accessToken.Secret() 167 if err := database.SaveUser(u); err != nil { 168 return err 169 } 170 171 http.Redirect(w, r, "/new/bitbucket.org", http.StatusSeeOther) 172 return nil 173 }