drivel/credentials.go
2020-08-08 11:52:42 +02:00

90 lines
2.4 KiB
Go

package main
import (
"fmt"
"git.gutmet.org/goutil.git"
"github.com/dghubble/oauth1"
"io/ioutil"
"net/http"
"os"
"os/user"
"path"
)
const (
AppDir = ".drivel" //inside home dir
fileConsumerKey = "ConsumerKey"
fileConsumerSecret = "ConsumerSecret"
fileAccessToken = "AccessToken"
fileAccessTokenSecret = "AccessTokenSecret"
registerAppURL = "https://apps.twitter.com/app/new"
)
type credentials struct {
consumerKey string
consumerSecret string
accessToken string
accessTokenSecret string
}
func (c *credentials) writeToAppDir(appDir string) {
write := func(file string, s string) {
optLogFatal("writeToAppDir", ioutil.WriteFile(path.Join(appDir, file), []byte(s), 0640))
}
write(fileConsumerKey, c.consumerKey)
write(fileConsumerSecret, c.consumerSecret)
write(fileAccessToken, c.accessToken)
write(fileAccessTokenSecret, c.accessTokenSecret)
}
func readFromAppDir(appDir string) *credentials {
read := func(f string) string {
s, err := goutil.ReadFile(path.Join(appDir, f))
optLogFatal("readFromAppDir", err)
return s
}
ck := read(fileConsumerKey)
cs := read(fileConsumerSecret)
at := read(fileAccessToken)
ats := read(fileAccessTokenSecret)
return &credentials{ck, cs, at, ats}
}
func createAppDir(appDir string) {
ask := func(s string) string {
a, err := goutil.AskFor(s)
optLogFatal("createAppDir", err)
return a
}
fmt.Println("Did not find " + appDir + ", creating.")
fmt.Println("Go to " + registerAppURL + " to register a developer account, register a new app and generate access tokens with read & write permissions\n")
err := os.MkdirAll(appDir, 0755)
optLogFatal("createAppDir", err)
ck := ask("Consumer Key/API Key")
cs := ask("Consumer Secret/API Secret")
at := ask("Access Token")
ats := ask("Access Token Secret")
c := credentials{ck, cs, at, ats}
c.writeToAppDir(appDir)
}
func loadCredentials() *credentials {
log := func(err error) { optLogFatal("loadCredentials", err) }
currentUser, err := user.Current()
log(err)
homeDir := currentUser.HomeDir
appDir := path.Join(homeDir, AppDir)
if !goutil.PathExists(appDir) {
createAppDir(appDir)
}
c := readFromAppDir(appDir)
return c
}
func getClient() *http.Client {
c := loadCredentials()
config := oauth1.NewConfig(c.consumerKey, c.consumerSecret)
token := oauth1.NewToken(c.accessToken, c.accessTokenSecret)
return config.Client(oauth1.NoContext, token)
}