hydroxide-push/cmd/hydroxide/hydroxide.go

103 lines
1.8 KiB
Go
Raw Normal View History

2017-08-22 01:04:16 +03:00
package main
import (
"bufio"
2017-08-22 13:07:31 +03:00
"encoding/json"
2017-08-22 01:04:16 +03:00
"fmt"
"log"
"os"
"github.com/emersion/hydroxide/protonmail"
)
2017-08-22 13:07:31 +03:00
const authFile = "auth.json"
func readCachedAuth() (*protonmail.Auth, error) {
f, err := os.Open(authFile)
if err != nil {
return nil, err
}
defer f.Close()
auth := new(protonmail.Auth)
err = json.NewDecoder(f).Decode(auth)
return auth, err
}
func saveAuth(auth *protonmail.Auth) error {
f, err := os.Create(authFile)
if err != nil {
return err
}
defer f.Close()
return json.NewEncoder(f).Encode(auth)
}
2017-08-22 01:04:16 +03:00
func main() {
c := &protonmail.Client{
2017-08-22 11:16:20 +03:00
RootURL: "https://dev.protonmail.com/api",
AppVersion: "Web_3.11.1",
ClientID: "Web",
2017-08-22 01:04:16 +03:00
ClientSecret: "4957cc9a2e0a2a49d02475c9d013478d",
}
scanner := bufio.NewScanner(os.Stdin)
2017-08-22 13:07:31 +03:00
var password string
auth, err := readCachedAuth()
if err == nil {
var err error
auth, err = c.AuthRefresh(auth)
2017-08-22 13:07:31 +03:00
if err != nil {
log.Fatal(err)
}
} else if os.IsNotExist(err) {
fmt.Printf("Username: ")
scanner.Scan()
username := scanner.Text()
2017-08-22 11:51:48 +03:00
2017-08-22 13:07:31 +03:00
fmt.Printf("Password: ")
2017-08-22 11:51:48 +03:00
scanner.Scan()
2017-08-22 13:07:31 +03:00
password = scanner.Text()
2017-08-22 01:04:16 +03:00
2017-08-22 13:07:31 +03:00
authInfo, err := c.AuthInfo(username)
if err != nil {
log.Fatal(err)
}
var twoFactorCode string
if authInfo.TwoFactor == 1 {
fmt.Printf("2FA code: ")
scanner.Scan()
twoFactorCode = scanner.Text()
}
auth, err = c.Auth(username, password, twoFactorCode, authInfo)
if err != nil {
log.Fatal(err)
}
} else {
2017-08-22 01:04:16 +03:00
log.Fatal(err)
}
2017-08-22 10:41:47 +03:00
2017-08-22 13:07:31 +03:00
if err := saveAuth(auth); err != nil {
log.Fatal(err)
}
2017-08-22 11:51:48 +03:00
2017-08-22 13:07:31 +03:00
if auth.PasswordMode == protonmail.PasswordTwo || password == "" {
if auth.PasswordMode == protonmail.PasswordTwo {
fmt.Printf("Mailbox password: ")
} else {
fmt.Printf("Password: ")
}
2017-08-22 11:51:48 +03:00
scanner.Scan()
2017-08-22 13:07:31 +03:00
password = scanner.Text()
2017-08-22 11:51:48 +03:00
}
2017-08-22 13:07:31 +03:00
_, err = c.Unlock(auth, password)
2017-08-22 11:51:48 +03:00
if err != nil {
log.Fatal(err)
}
2017-08-22 01:04:16 +03:00
}