diff options
Diffstat (limited to 'auth/file_source.go')
| -rw-r--r-- | auth/file_source.go | 68 | 
1 files changed, 68 insertions, 0 deletions
| diff --git a/auth/file_source.go b/auth/file_source.go new file mode 100644 index 0000000..1c1150b --- /dev/null +++ b/auth/file_source.go @@ -0,0 +1,68 @@ +package auth + +import ( +    "golang.org/x/oauth2" +    "encoding/json" +    "os" +    "io/ioutil" +) + + +func FileSource(path string, token *oauth2.Token, conf *oauth2.Config) oauth2.TokenSource { +    return &fileSource{ +        tokenPath: path, +        tokenSource: conf.TokenSource(oauth2.NoContext, token), +    } +} + +type fileSource struct { +    tokenPath string +    tokenSource oauth2.TokenSource +} + +func (self *fileSource) Token() (*oauth2.Token, error) { +    token, err := self.tokenSource.Token() +    if err != nil { +        return token, err +    } + +    // Save token to file +    SaveToken(self.tokenPath, token) + +    return token, nil +} + +func ReadToken(path string) (*oauth2.Token, bool, error) { +    if !fileExists(path) { +        return nil, false, nil +    } + +    content, err := ioutil.ReadFile(path) +    if err != nil { +        return nil, true, err +    } +    token := &oauth2.Token{} +    return token, true, json.Unmarshal(content, token) +} + +func SaveToken(path string, token *oauth2.Token) error { +    data, err := json.MarshalIndent(token, "", "  ") +    if err != nil { +        return err +    } + +    if err = mkdir(path); err != nil { +        return err +    } + +    // Write to temp file first +    tmpFile := path + ".tmp" +    err = ioutil.WriteFile(tmpFile, data, 0600) +    if err != nil { +        os.Remove(tmpFile) +        return err +    } + +    // Move file to correct path +    return os.Rename(tmpFile, path) +} | 
