// getToken returns the token saved in the config file under // section name. func getToken(name string) (*oauth2.Token, error) { tokenString, err := fs.ConfigFile.GetValue(string(name), ConfigToken) if err != nil { return nil, err } if tokenString == "" { return nil, fmt.Errorf("Empty token found - please run rclone config again") } token := new(oauth2.Token) err = json.Unmarshal([]byte(tokenString), token) if err != nil { return nil, err } // if has data then return it if token.AccessToken != "" && token.RefreshToken != "" { return token, nil } // otherwise try parsing as oldToken oldtoken := new(oldToken) err = json.Unmarshal([]byte(tokenString), oldtoken) if err != nil { return nil, err } // Fill in result into new token token.AccessToken = oldtoken.AccessToken token.RefreshToken = oldtoken.RefreshToken token.Expiry = oldtoken.Expiry // Save new format in config file err = putToken(name, token) if err != nil { return nil, err } return token, nil }
// decodeToken parses an access token, refresh token, and optional // expiry unix timestamp separated by spaces into an oauth2.Token. // It returns as much as it can. func decodeToken(encoded string) *oauth2.Token { t := new(oauth2.Token) f := strings.Fields(encoded) if len(f) > 0 { t.AccessToken = f[0] } if len(f) > 1 { t.RefreshToken = f[1] } if len(f) > 2 && f[2] != "0" { sec, err := strconv.ParseInt(f[2], 10, 64) if err == nil { t.Expiry = time.Unix(sec, 0) } } return t }
// people fetches the list of people user has shared with this app func people(w http.ResponseWriter, r *http.Request) *appError { session, err := store.Get(r, "sessionName") if err != nil { log.Println("error fetching session:", err) return &appError{err, "Error fetching session", 500} } token := session.Values["accessToken"] // Only fetch a list of people for connected users if token == nil { m := "Current user not connected" return &appError{errors.New(m), m, 401} } // Create a new authorized API client tok := new(oauth2.Token) tok.AccessToken = token.(string) client := oauth2.NewClient(oauth2.NoContext, oauth2.StaticTokenSource(tok)) service, err := plus.New(client) if err != nil { return &appError{err, "Create Plus Client", 500} } // Get a list of people that this user has shared with this app people := service.People.List("me", "visible") peopleFeed, err := people.Do() if err != nil { m := "Failed to refresh access token" if err.Error() == "AccessTokenRefreshError" { return &appError{errors.New(m), m, 500} } return &appError{err, m, 500} } w.Header().Set("Content-type", "application/json") err = json.NewEncoder(w).Encode(&peopleFeed) if err != nil { return &appError{err, "Convert PeopleFeed to JSON", 500} } return nil }