87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net/url"
|
|
"os"
|
|
|
|
"github.com/mattn/go-mastodon"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var authCmd = &cobra.Command{
|
|
Use: "auth",
|
|
Short: "Authenticate to a Mastodon/Pleroma instance",
|
|
Run: func(_ *cobra.Command, args []string) {
|
|
doLogin()
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
ConfInit()
|
|
rootCmd.AddCommand(authCmd)
|
|
}
|
|
|
|
func doLogin() {
|
|
client := &mastodon.AppConfig{
|
|
Server: Config.Host,
|
|
ClientName: "Yuki",
|
|
Scopes: "read write follow",
|
|
Website: "https://projects.laidback.moe/yuki/",
|
|
RedirectURIs: "urn:ietf:wg:oauth:2.0:oob",
|
|
}
|
|
|
|
app, err := mastodon.RegisterApp(context.Background(), client)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
u, err := url.Parse(app.AuthURI)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
fmt.Printf("Go to \n%s\n and copy/paste the given auth code\n", u)
|
|
var authCode string
|
|
fmt.Print("Paste the code here:")
|
|
fmt.Scanln(&authCode)
|
|
|
|
conf := &mastodon.Config{
|
|
Server: Config.Host,
|
|
ClientID: app.ClientID,
|
|
ClientSecret: app.ClientSecret,
|
|
}
|
|
|
|
c := mastodon.NewClient(conf)
|
|
|
|
err = c.GetUserAccessToken(context.Background(), authCode, app.RedirectURI)
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
config, err := os.UserConfigDir()
|
|
if err != nil {
|
|
log.Println("Unable to obtain user's configuration directory")
|
|
log.Fatal(err)
|
|
}
|
|
configPath := config + "/yuki.ini"
|
|
|
|
f, err := os.OpenFile(configPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
client_id := c.Config.ClientID
|
|
client_secret := c.Config.ClientSecret
|
|
access_token := c.Config.AccessToken
|
|
|
|
f.WriteString("client_id = " + client_id + "\n")
|
|
f.WriteString("client_secret = " + client_secret + "\n")
|
|
f.WriteString("token = " + access_token + "\n")
|
|
}
|