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
|
2017-08-22 13:23:58 +03:00
|
|
|
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
|
|
|
}
|