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  }