~edwargix/tallyard

31f7d6e11469c5ce2ae8ea7fdbf5b093e02afdbd — David Florness 5 years ago a51d478
Organize Matrix auth data logic
2 files changed, 123 insertions(+), 58 deletions(-)

A matrix/data.go
M matrix/main.go
A matrix/data.go => matrix/data.go +120 -0
@@ 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)
}

M matrix/main.go => matrix/main.go +3 -58
@@ 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)
}