2022-03-19 02:35:04 +00:00
|
|
|
package saltyim
|
|
|
|
|
|
|
|
import (
|
2022-03-19 11:42:36 +00:00
|
|
|
"bufio"
|
2022-03-19 06:02:40 +00:00
|
|
|
"fmt"
|
2022-03-19 11:42:36 +00:00
|
|
|
"io"
|
2022-03-19 02:35:04 +00:00
|
|
|
"os"
|
2022-03-21 00:31:59 +00:00
|
|
|
"path/filepath"
|
2022-03-19 11:42:36 +00:00
|
|
|
"strings"
|
2022-03-19 02:35:04 +00:00
|
|
|
|
|
|
|
"github.com/keys-pub/keys"
|
|
|
|
"go.mills.io/salty"
|
|
|
|
)
|
|
|
|
|
2022-03-19 11:42:36 +00:00
|
|
|
func readUser(fd io.Reader) (Addr, error) {
|
|
|
|
scan := bufio.NewScanner(fd)
|
|
|
|
|
|
|
|
var a Addr
|
|
|
|
for scan.Scan() {
|
|
|
|
if strings.HasPrefix(scan.Text(), "# user:") {
|
|
|
|
user := strings.Split(strings.TrimSpace(strings.TrimPrefix(scan.Text(), "# user:")), "@")
|
|
|
|
if len(user) != 2 {
|
2022-03-21 00:31:59 +00:00
|
|
|
return Addr{}, nil
|
2022-03-19 11:42:36 +00:00
|
|
|
}
|
|
|
|
a.User, a.Domain = user[0], user[1]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return a, scan.Err()
|
|
|
|
}
|
|
|
|
|
2022-03-19 06:34:33 +00:00
|
|
|
// DefaultIdentity returns a default identity file (if one exists) otherwise
|
|
|
|
// returns an empty string
|
|
|
|
func DefaultIdentity() string {
|
2022-03-21 00:31:59 +00:00
|
|
|
return os.ExpandEnv("$HOME/.config/salty/$USER.key")
|
2022-03-19 06:34:33 +00:00
|
|
|
}
|
|
|
|
|
2022-03-21 00:31:59 +00:00
|
|
|
// DefaultEndpoint returns a default inbox file (if one exists) otherwise
|
2022-03-19 21:33:03 +00:00
|
|
|
// returns an empty string
|
2022-03-21 00:31:59 +00:00
|
|
|
func DefaultEndpoint() string {
|
|
|
|
return os.ExpandEnv("https://msgbus.mills.io/$USER")
|
2022-03-19 21:33:03 +00:00
|
|
|
}
|
|
|
|
|
2022-03-19 11:42:36 +00:00
|
|
|
// CreateIdentity ...
|
|
|
|
func CreateIdentity(fn, user string) error {
|
|
|
|
f, err := os.OpenFile(fn, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600)
|
|
|
|
if err != nil {
|
2022-03-20 13:38:51 +00:00
|
|
|
return fmt.Errorf("error opening identity %q for writing: %w", fn, err)
|
2022-03-19 11:42:36 +00:00
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
salty.GenerateKeys(f)
|
|
|
|
|
|
|
|
f.Write([]byte(fmt.Sprintf("# user: %s\n", user)))
|
|
|
|
|
|
|
|
if err := f.Sync(); err != nil {
|
2022-03-20 13:38:51 +00:00
|
|
|
return fmt.Errorf("error syncing identity %q for writing: %w", fn, err)
|
2022-03-19 11:42:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if err := f.Close(); err != nil {
|
2022-03-20 13:38:51 +00:00
|
|
|
return fmt.Errorf("error closing identity %q for writing: %w", fn, err)
|
2022-03-19 11:42:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-03-19 02:35:04 +00:00
|
|
|
// GetIdentity ...
|
|
|
|
func GetIdentity(fn string) (*keys.EdX25519Key, Addr, error) {
|
2022-03-21 00:31:59 +00:00
|
|
|
// Handle unix home with `~`
|
|
|
|
if strings.HasPrefix(fn, "~/") {
|
|
|
|
dirname, _ := os.UserHomeDir()
|
|
|
|
fn = filepath.Join(dirname, fn[2:])
|
|
|
|
}
|
|
|
|
|
2022-03-19 02:35:04 +00:00
|
|
|
id, err := os.Open(fn)
|
|
|
|
if err != nil {
|
2022-03-20 13:38:51 +00:00
|
|
|
return nil, Addr{}, fmt.Errorf("error opening identity %q: %s", fn, err)
|
2022-03-19 02:35:04 +00:00
|
|
|
}
|
|
|
|
defer id.Close()
|
|
|
|
|
|
|
|
key, err := salty.ParseIdentity(id)
|
|
|
|
if err != nil {
|
2022-03-20 13:38:51 +00:00
|
|
|
return nil, Addr{}, fmt.Errorf("error reading identity %q: %s", fn, err)
|
2022-03-19 02:35:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
id.Seek(0, 0)
|
2022-03-19 11:42:36 +00:00
|
|
|
me, err := readUser(id)
|
2022-03-21 00:31:59 +00:00
|
|
|
return key, me, err
|
2022-03-19 02:35:04 +00:00
|
|
|
}
|