From 31f7d6e11469c5ce2ae8ea7fdbf5b093e02afdbd Mon Sep 17 00:00:00 2001 From: David Florness Date: Sat, 14 Nov 2020 20:47:34 -0500 Subject: [PATCH] Organize Matrix auth data logic --- matrix/data.go | 120 +++++++++++++++++++++++++++++++++++++++++++++++++ matrix/main.go | 61 ++----------------------- 2 files changed, 123 insertions(+), 58 deletions(-) create mode 100644 matrix/data.go diff --git a/matrix/data.go b/matrix/data.go new file mode 100644 index 0000000..a50a8de --- /dev/null +++ b/matrix/data.go @@ -0,0 +1,120 @@ +package main + +import ( + "bufio" + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/kyoh86/xdg" + "maunium.net/go/mautrix" + "maunium.net/go/mautrix/id" +) + +type Data struct { + Homeserver string `json:"homeserver"` + Username string `json:"username"` + AccessToken string `json:"access_token"` + DeviceID id.DeviceID `json:"device_id"` + UserID id.UserID `json:"user_id"` +} + +var dataFname = xdg.DataHome() + "/tallyard/data.json" + +func GetData() (data *Data, err error) { + if _, err = os.Stat(dataFname); os.IsNotExist(err) { + data, err = InquireForData() + if err == nil { + data.Save() + } + return data, err + } + + jsonBytes, err := ioutil.ReadFile(dataFname) + if err != nil { + return nil, fmt.Errorf("error reading data file %s: %s", dataFname, err) + } + + data = &Data{} + err = json.Unmarshal(jsonBytes, data) + if err != nil { + return nil, fmt.Errorf("error unmarshalling data file: %s", err) + } + + return data, nil +} + +func stripNewline(s string) string { + if s == "" { + return s + } + if s[len(s)-1] == '\n' { + return s[:len(s)-1] + } + return s +} + +func InquireForData() (data *Data, err error) { + var ( + password string + reader = bufio.NewReader(os.Stdin) + ) + + data = &Data{} + + for data.Homeserver == "" || data.Homeserver == "\n" { + fmt.Print("enter homeserver: ") + data.Homeserver, err = reader.ReadString('\n') + if err != nil { + return nil, fmt.Errorf("error reading homeserver: %s", err) + } + } + data.Homeserver = stripNewline(data.Homeserver) + + for data.Username == "" || data.Username == "\n" { + fmt.Print("enter username: ") + data.Username, err = reader.ReadString('\n') + if err != nil { + return nil, fmt.Errorf("error reading username: %s", err) + } + } + data.Username = stripNewline(data.Username) + + for password == "" || password == "\n" { + fmt.Print("enter password: ") + password, err = reader.ReadString('\n') + if err != nil { + return nil, fmt.Errorf("error reading password: %s", err) + } + } + password = stripNewline(password) + + client, err := mautrix.NewClient(data.Homeserver, "", "") + if err != nil { + return nil, fmt.Errorf("error creating mautrix client: %s", err) + } + respLogin, err := client.Login(&mautrix.ReqLogin{ + Type: "m.login.password", + Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: data.Username}, + Password: password, + StoreCredentials: true, + }) + if err != nil { + return nil, fmt.Errorf("error logging in with given credentials: %s", err) + } + + data.AccessToken = respLogin.AccessToken + data.DeviceID = respLogin.DeviceID + data.UserID = respLogin.UserID + + return data, nil +} + +func (data *Data) Save() error { + jsonBytes, err := json.Marshal(*data) + if err != nil { + return err + } + return ioutil.WriteFile(dataFname, jsonBytes, 0600) +} diff --git a/matrix/main.go b/matrix/main.go index 49683f7..34e3ade 100644 --- a/matrix/main.go +++ b/matrix/main.go @@ -1,69 +1,14 @@ package main import ( - "bufio" - "encoding/json" "fmt" - "io/ioutil" "os" - - "github.com/kyoh86/xdg" - "maunium.net/go/mautrix" - "maunium.net/go/mautrix/id" ) -type Data struct { - Homeserver string `json:"homeserver"` - Username string `json:"username"` - AccessToken string `json:"access_token"` - DeviceID id.DeviceID `json:"device_id"` - UserID id.UserID `json:"user_id"` -} - func main() { - fname := xdg.DataHome() + "/tallyard/data.json" - jsonBytes, err := ioutil.ReadFile(fname) - if err != nil { - fmt.Fprintf(os.Stderr, "error reading data file %s: %s\n", fname, err) - os.Exit(1) - } - - var data Data - err = json.Unmarshal(jsonBytes, &data) - if err != nil { - fmt.Fprintf(os.Stderr, "error unmarshalling data file: %s\n", err) - os.Exit(1) - } - - fmt.Printf("homeserver: %s\n", data.Homeserver) - fmt.Printf("username: %s\n", data.Username) - - reader := bufio.NewReader(os.Stdin) - var password string - for password == "" || password == "\n" { - fmt.Print("enter password: ") - password, err = reader.ReadString('\n') - if err != nil { - panic(err) - } - } - - if password[len(password)-1] == '\n' { - password = password[:len(password)-1] - } - - fmt.Printf("password: \"%s\"\n", password) - - client, err := mautrix.NewClient(data.Homeserver, "", "") - respLogin, err := client.Login(&mautrix.ReqLogin{ - Type: "m.login.password", - Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: data.Username}, - Password: password, - StoreCredentials: true, - }) + data, err := GetData() if err != nil { - panic(err) + fmt.Fprintln(os.Stderr, err) } - - fmt.Println(respLogin) + fmt.Println(data) } -- 2.38.4