forked from tildetown/town
		
	creating auth codes in db
This commit is contained in:
		
							parent
							
								
									5c6f4cce19
								
							
						
					
					
						commit
						a3b13d21b3
					
				| @ -7,6 +7,7 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"git.tilde.town/tildetown/town/codes" | ||||
| 	"git.tilde.town/tildetown/town/towndb" | ||||
| 	"github.com/charmbracelet/lipgloss" | ||||
| 	_ "github.com/mattn/go-sqlite3" | ||||
| @ -162,11 +163,22 @@ func collectEmail(db *sql.DB, cs colorScheme, tty *tty.TTY) error { | ||||
| 		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 report success | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,20 +1,16 @@ | ||||
| package invites | ||||
| 
 | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"database/sql" | ||||
| 	"encoding/base64" | ||||
| 	"errors" | ||||
| 	"math/big" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"git.tilde.town/tildetown/town/codes" | ||||
| 	_ "github.com/mattn/go-sqlite3" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	dsn     = "/town/var/invites/invites.db?mode=rw" | ||||
| 	codeLen = 32 | ||||
| 	dsn = "/town/var/invites/invites.db?mode=rw" | ||||
| ) | ||||
| 
 | ||||
| type Invite struct { | ||||
| @ -33,7 +29,7 @@ func (i *Invite) Insert(db *sql.DB) error { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	i.Code = generateCode(i.Email) | ||||
| 	i.Code = codes.NewCode(i.Email) | ||||
| 
 | ||||
| 	_, err = stmt.Exec(i.Code, i.Email) | ||||
| 	if err != nil { | ||||
| @ -53,44 +49,6 @@ func ConnectDB() (*sql.DB, error) { | ||||
| 	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) { | ||||
| 	inv := &Invite{ | ||||
| 		Code: code, | ||||
|  | ||||
| @ -32,3 +32,11 @@ CREATE TABLE IF NOT EXISTS notes ( | ||||
| 
 | ||||
|   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 | ||||
| } | ||||
| 
 | ||||
| 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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user