forked from tildetown/town
creating auth codes in db
parent
5c6f4cce19
commit
a3b13d21b3
|
@ -7,6 +7,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"git.tilde.town/tildetown/town/codes"
|
||||||
"git.tilde.town/tildetown/town/towndb"
|
"git.tilde.town/tildetown/town/towndb"
|
||||||
"github.com/charmbracelet/lipgloss"
|
"github.com/charmbracelet/lipgloss"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
|
@ -162,11 +163,22 @@ func collectEmail(db *sql.DB, cs colorScheme, tty *tty.TTY) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("found a user so gonna email")
|
code := codes.NewCode(email)
|
||||||
|
|
||||||
|
fmt.Println(code)
|
||||||
|
|
||||||
|
ac := &towndb.AuthCode{
|
||||||
|
Code: code,
|
||||||
|
Email: email,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ac.Insert(db)
|
||||||
|
if err != nil {
|
||||||
|
// TODO log
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// TODO generate reset code
|
|
||||||
// TODO send email
|
// TODO send email
|
||||||
// TODO report success
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,16 @@
|
||||||
package invites
|
package invites
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
"errors"
|
||||||
"math/big"
|
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.tilde.town/tildetown/town/codes"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
dsn = "/town/var/invites/invites.db?mode=rw"
|
dsn = "/town/var/invites/invites.db?mode=rw"
|
||||||
codeLen = 32
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Invite struct {
|
type Invite struct {
|
||||||
|
@ -33,7 +29,7 @@ func (i *Invite) Insert(db *sql.DB) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
i.Code = generateCode(i.Email)
|
i.Code = codes.NewCode(i.Email)
|
||||||
|
|
||||||
_, err = stmt.Exec(i.Code, i.Email)
|
_, err = stmt.Exec(i.Code, i.Email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -53,44 +49,6 @@ func ConnectDB() (*sql.DB, error) {
|
||||||
return db, nil
|
return db, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateCode(email string) string {
|
|
||||||
|
|
||||||
charset := "abcdefghijklmnopqrztuvwxyz"
|
|
||||||
charset += strings.ToUpper(charset)
|
|
||||||
charset += "0123456789"
|
|
||||||
charset += "`~!@#$%^&*()-=_+[]{}|;:,./<>?"
|
|
||||||
|
|
||||||
code := []byte{}
|
|
||||||
|
|
||||||
max := big.NewInt(int64(len(charset)))
|
|
||||||
for len(code) < codeLen {
|
|
||||||
ix, err := rand.Int(rand.Reader, max)
|
|
||||||
if err != nil {
|
|
||||||
// TODO this is bad but I'm just kind of hoping it doesn't happen...often
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
code = append(code, charset[ix.Int64()])
|
|
||||||
}
|
|
||||||
|
|
||||||
code = append(code, ' ')
|
|
||||||
|
|
||||||
eb := []byte(email)
|
|
||||||
for x := 0; x < len(eb); x++ {
|
|
||||||
code = append(code, eb[x])
|
|
||||||
}
|
|
||||||
|
|
||||||
return base64.StdEncoding.EncodeToString(code)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Decode(code string) ([]string, error) {
|
|
||||||
decoded, err := base64.StdEncoding.DecodeString(code)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.Split(string(decoded), " "), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Get(db *sql.DB, code string) (*Invite, error) {
|
func Get(db *sql.DB, code string) (*Invite, error) {
|
||||||
inv := &Invite{
|
inv := &Invite{
|
||||||
Code: code,
|
Code: code,
|
||||||
|
|
|
@ -32,3 +32,11 @@ CREATE TABLE IF NOT EXISTS notes (
|
||||||
|
|
||||||
FOREIGN KEY (author) REFERENCES users(author)
|
FOREIGN KEY (author) REFERENCES users(author)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS auth_codes (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
created TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M', 'now', 'localtime')),
|
||||||
|
code TEXT,
|
||||||
|
email TEXT,
|
||||||
|
used INTEGER DEFAULT 0
|
||||||
|
);
|
||||||
|
|
|
@ -173,3 +173,18 @@ func ConnectDB() (*sql.DB, error) {
|
||||||
|
|
||||||
return db, nil
|
return db, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AuthCode struct {
|
||||||
|
ID int64
|
||||||
|
Code string
|
||||||
|
Email string
|
||||||
|
Used bool
|
||||||
|
Created time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *AuthCode) Insert(db *sql.DB) error {
|
||||||
|
// TODO
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO other auth code as needed
|
||||||
|
|
Loading…
Reference in New Issue