func (im *imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { tempToken := ctx.AccountNode.Attr(importer.AcctAttrTempToken) tempSecret := ctx.AccountNode.Attr(importer.AcctAttrTempSecret) if tempToken == "" || tempSecret == "" { log.Printf("twitter: no temp creds in callback") httputil.BadRequestError(w, "no temp creds in callback") return } if tempToken != r.FormValue("oauth_token") { log.Printf("unexpected oauth_token: got %v, want %v", r.FormValue("oauth_token"), tempToken) httputil.BadRequestError(w, "unexpected oauth_token") return } oauthClient, err := ctx.NewOAuthClient(oAuthURIs) if err != nil { err = fmt.Errorf("error getting OAuth client: %v", err) httputil.ServeError(w, r, err) return } tokenCred, vals, err := oauthClient.RequestToken( ctxutil.Client(ctx), &oauth.Credentials{ Token: tempToken, Secret: tempSecret, }, r.FormValue("oauth_verifier"), ) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting request token: %v ", err)) return } userid := vals.Get("user_id") if userid == "" { httputil.ServeError(w, r, fmt.Errorf("Couldn't get user id: %v", err)) return } if err := ctx.AccountNode.SetAttrs( importer.AcctAttrAccessToken, tokenCred.Token, importer.AcctAttrAccessTokenSecret, tokenCred.Secret, ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting token attributes: %v", err)) return } u, err := getUserInfo(importer.OAuthContext{ctx.Context, oauthClient, tokenCred}) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Couldn't get user info: %v", err)) return } if err := ctx.AccountNode.SetAttrs( importer.AcctAttrUserID, u.ID, importer.AcctAttrName, u.Name, importer.AcctAttrUserName, u.ScreenName, nodeattr.Title, fmt.Sprintf("%s's Twitter Account", u.ScreenName), ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im *imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { // ServeCallback is called after ServeSetup, at the end of an // OAuth redirect flow. code := r.FormValue("code") // e.g. get the OAuth code out of the redirect if code == "" { code = "some_dummy_code" } name := ctx.AccountNode.Attr(acctAttrUsername) if name == "" { names := []string{ "alfred", "alice", "bob", "bethany", "cooper", "claire", "doug", "darla", "ed", "eve", "frank", "francine", } name = names[rand.Intn(len(names))] } if err := ctx.AccountNode.SetAttrs( "title", fmt.Sprintf("dummy account: %s", name), acctAttrUsername, name, acctAttrToken, code, ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attributes: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im extendedOAuth2) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { if im.getUserInfo == nil { panic("No getUserInfo is provided, don't use the default ServeCallback!") } oauthConfig, err := im.auth(ctx) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting oauth config: %v", err)) return } if r.Method != "GET" { http.Error(w, "Expected a GET", 400) return } code := r.FormValue("code") if code == "" { http.Error(w, "Expected a code", 400) return } // picago calls take an *http.Client, so we need to provide one which already // has a transport set up correctly wrt to authentication. In particular, it // needs to have the access token that is obtained during Exchange. transport := &oauth.Transport{ Config: oauthConfig, Transport: notOAuthTransport(ctxutil.Client(ctx)), } token, err := transport.Exchange(code) log.Printf("Token = %#v, error %v", token, err) if err != nil { log.Printf("Token Exchange error: %v", err) httputil.ServeError(w, r, fmt.Errorf("token exchange error: %v", err)) return } picagoCtx, cancel := context.WithCancel(context.WithValue(ctx, ctxutil.HTTPClient, transport.Client())) defer cancel() userInfo, err := im.getUserInfo(picagoCtx) if err != nil { log.Printf("Couldn't get username: %v", err) httputil.ServeError(w, r, fmt.Errorf("can't get username: %v", err)) return } if err := ctx.AccountNode.SetAttrs( importer.AcctAttrUserID, userInfo.ID, importer.AcctAttrGivenName, userInfo.FirstName, importer.AcctAttrFamilyName, userInfo.LastName, acctAttrOAuthToken, encodeToken(token), ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { tempToken := ctx.AccountNode.Attr(importer.AcctAttrTempToken) tempSecret := ctx.AccountNode.Attr(importer.AcctAttrTempSecret) if tempToken == "" || tempSecret == "" { log.Printf("flicker: no temp creds in callback") httputil.BadRequestError(w, "no temp creds in callback") return } if tempToken != r.FormValue("oauth_token") { log.Printf("unexpected oauth_token: got %v, want %v", r.FormValue("oauth_token"), tempToken) httputil.BadRequestError(w, "unexpected oauth_token") return } oauthClient, err := ctx.NewOAuthClient(oAuthURIs) if err != nil { err = fmt.Errorf("error getting OAuth client: %v", err) httputil.ServeError(w, r, err) return } tokenCred, vals, err := oauthClient.RequestToken( ctx.Context.HTTPClient(), &oauth.Credentials{ Token: tempToken, Secret: tempSecret, }, r.FormValue("oauth_verifier"), ) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting request token: %v ", err)) return } userID := vals.Get("user_nsid") if userID == "" { httputil.ServeError(w, r, fmt.Errorf("Couldn't get user id: %v", err)) return } username := vals.Get("username") if username == "" { httputil.ServeError(w, r, fmt.Errorf("Couldn't get user name: %v", err)) return } // TODO(mpl): get a few more bits of info (first name, last name etc) like I did for twitter, if possible. if err := ctx.AccountNode.SetAttrs( importer.AcctAttrAccessToken, tokenCred.Token, importer.AcctAttrAccessTokenSecret, tokenCred.Secret, importer.AcctAttrUserID, userID, importer.AcctAttrUserName, username, ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting basic account attributes: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im extendedOAuth2) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { if im.getUserInfo == nil { panic("No getUserInfo is provided, don't use the default ServeCallback!") } oauthConfig, err := im.auth(ctx) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting oauth config: %v", err)) return } if r.Method != "GET" { http.Error(w, "Expected a GET", 400) return } code := r.FormValue("code") if code == "" { http.Error(w, "Expected a code", 400) return } token, err := oauthConfig.Exchange(ctx, code) log.Printf("Token = %#v, error %v", token, err) if err != nil { log.Printf("Token Exchange error: %v", err) httputil.ServeError(w, r, fmt.Errorf("token exchange error: %v", err)) return } picagoCtx, cancel := context.WithCancel(context.WithValue(ctx, ctxutil.HTTPClient, oauthConfig.Client(ctx, token))) defer cancel() userInfo, err := im.getUserInfo(picagoCtx) if err != nil { log.Printf("Couldn't get username: %v", err) httputil.ServeError(w, r, fmt.Errorf("can't get username: %v", err)) return } if err := ctx.AccountNode.SetAttrs( importer.AcctAttrUserID, userInfo.ID, importer.AcctAttrGivenName, userInfo.FirstName, importer.AcctAttrFamilyName, userInfo.LastName, acctAttrOAuthToken, encodeToken(token), ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im *imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { creds := im.creds() if creds == nil { log.Printf("twitter: nil creds in callback") httputil.BadRequestError(w, "nil creds in callback") return } if creds.Token != r.FormValue("oauth_token") { log.Printf("unexpected oauth_token: got %v, want %v", r.FormValue("oauth_token"), creds.Token) httputil.BadRequestError(w, "unexpected oauth_token") return } tokenCred, vals, err := oauthClient.RequestToken(ctx.Context.HTTPClient(), creds, r.FormValue("oauth_verifier")) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting request token: %v ", err)) return } userid := vals.Get("user_id") if userid == "" { httputil.ServeError(w, r, fmt.Errorf("Couldn't get user id: %v", err)) return } im.setCreds(tokenCred) u, err := im.getUserInfo(ctx.Context) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Couldn't get user info: %v", err)) return } firstName, lastName := "", "" if u.Name != "" { if pieces := strings.Fields(u.Name); len(pieces) == 2 { firstName = pieces[0] lastName = pieces[1] } } if err := ctx.AccountNode.SetAttrs( acctAttrUserID, u.ID, acctAttrUserFirst, firstName, acctAttrUserLast, lastName, acctAttrScreenName, u.ScreenName, acctAttrAccessToken, tokenCred.Token, ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { t := r.FormValue("apiToken") if t == "" { http.Error(w, "Expected an API Token", 400) return } if extractUsername(t) == "" { errText := fmt.Sprintf("Unable to parse %q as an api token. We expect <username>:<somevalue>", t) http.Error(w, errText, 400) } if err := ctx.AccountNode.SetAttrs( attrAuthToken, t, ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { oauthConfig, err := im.auth(ctx) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting oauth config: %v", err)) return } if r.Method != "GET" { http.Error(w, "Expected a GET", 400) return } code := r.FormValue("code") if code == "" { http.Error(w, "Expected a code", 400) return } token, err := oauthConfig.Exchange(ctx, code) if err != nil { log.Printf("importer/picasa: token exchange error: %v", err) httputil.ServeError(w, r, fmt.Errorf("token exchange error: %v", err)) return } log.Printf("importer/picasa: got exhanged token.") picagoCtx := context.WithValue(ctx, ctxutil.HTTPClient, oauthConfig.Client(ctx, token)) userInfo, err := im.getUserInfo(picagoCtx) if err != nil { log.Printf("Couldn't get username: %v", err) httputil.ServeError(w, r, fmt.Errorf("can't get username: %v", err)) return } if err := ctx.AccountNode.SetAttrs( importer.AcctAttrUserID, userInfo.ID, importer.AcctAttrName, userInfo.Name, acctAttrOAuthToken, encodeToken(token), ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im *imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { oauthConfig, err := auth(ctx) if err != nil { httputil.ServeError(w, r, fmt.Errorf("Error getting oauth config: %v", err)) return } if r.Method != "GET" { http.Error(w, "Expected a GET", 400) return } code := r.FormValue("code") if code == "" { http.Error(w, "Expected a code", 400) return } transport := &oauth.Transport{Config: oauthConfig} token, err := transport.Exchange(code) log.Printf("Token = %#v, error %v", token, err) if err != nil { log.Printf("Token Exchange error: %v", err) http.Error(w, "token exchange error", 500) return } u, err := im.getUserInfo(ctx.Context, token.AccessToken) if err != nil { log.Printf("Couldn't get username: %v", err) http.Error(w, "can't get username", 500) return } if err := ctx.AccountNode.SetAttrs( acctAttrUserId, u.Id, acctAttrUserFirst, u.FirstName, acctAttrUserLast, u.LastName, acctAttrAccessToken, token.AccessToken, ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }
func (im *imp) ServeCallback(w http.ResponseWriter, r *http.Request, ctx *importer.SetupContext) { u := r.FormValue("feedURL") if u == "" { http.Error(w, "Expected a feed URL", 400) return } feed, err := url.Parse(u) if err != nil { httputil.ServeError(w, r, err) return } if feed.Scheme == "" { feed.Scheme = "http" } if err := ctx.AccountNode.SetAttrs( acctAttrFeedURL, feed.String(), ); err != nil { httputil.ServeError(w, r, fmt.Errorf("Error setting attribute: %v", err)) return } http.Redirect(w, r, ctx.AccountURL(), http.StatusFound) }