Cleanup
This commit is contained in:
		| @@ -1,7 +1,6 @@ | ||||
| package api | ||||
|  | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"database/sql" | ||||
| 	"embed" | ||||
| 	"errors" | ||||
| @@ -14,17 +13,14 @@ import ( | ||||
| 	"git.crumpington.com/lib/go/idgen" | ||||
| 	"git.crumpington.com/lib/go/sqliteutil" | ||||
| 	"golang.org/x/crypto/bcrypt" | ||||
| 	"golang.org/x/crypto/nacl/box" | ||||
| 	"golang.org/x/crypto/nacl/sign" | ||||
| ) | ||||
|  | ||||
| //go:embed migrations | ||||
| var migrations embed.FS | ||||
|  | ||||
| type API struct { | ||||
| 	db          *sql.DB | ||||
| 	lock        sync.Mutex | ||||
| 	initIntents map[string]byte // Map from intent key to peer IP | ||||
| 	db   *sql.DB | ||||
| 	lock sync.Mutex | ||||
| } | ||||
|  | ||||
| func New(dbPath string) (*API, error) { | ||||
| @@ -38,8 +34,7 @@ func New(dbPath string) (*API, error) { | ||||
| 	} | ||||
|  | ||||
| 	a := &API{ | ||||
| 		db:          sqlDB, | ||||
| 		initIntents: map[string]byte{}, | ||||
| 		db: sqlDB, | ||||
| 	} | ||||
|  | ||||
| 	return a, a.ensurePassword() | ||||
| @@ -151,55 +146,13 @@ func (a *API) Peer_CreateNew(p *Peer) error { | ||||
| 	return db.Peer_Insert(a.db, p) | ||||
| } | ||||
|  | ||||
| // Create the intention to initialize a peer. The returned code is used to | ||||
| // complete the peer initialization. The code is valid for 5 minutes. | ||||
| func (a *API) Peer_CreateInitIntent(peerIP byte) string { | ||||
| func (a *API) Peer_Init(peer *Peer, args m.PeerInitArgs) (*m.PeerConfig, error) { | ||||
| 	a.lock.Lock() | ||||
| 	defer a.lock.Unlock() | ||||
|  | ||||
| 	code := idgen.NewToken() | ||||
| 	a.initIntents[code] = peerIP | ||||
|  | ||||
| 	go func() { | ||||
| 		time.Sleep(5 * time.Minute) | ||||
| 		a.lock.Lock() | ||||
| 		defer a.lock.Unlock() | ||||
| 		delete(a.initIntents, code) | ||||
| 	}() | ||||
|  | ||||
| 	return code | ||||
| } | ||||
|  | ||||
| func (a *API) Peer_Init(initCode string) (*m.PeerConfig, error) { | ||||
| 	a.lock.Lock() | ||||
| 	defer a.lock.Unlock() | ||||
|  | ||||
| 	ip, ok := a.initIntents[initCode] | ||||
| 	if !ok { | ||||
| 		return nil, ErrNotAuthorized | ||||
| 	} | ||||
|  | ||||
| 	peer, err := a.Peer_Get(ip) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	delete(a.initIntents, initCode) | ||||
|  | ||||
| 	encPubKey, encPrivKey, err := box.GenerateKey(rand.Reader) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	signPubKey, signPrivKey, err := sign.GenerateKey(rand.Reader) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	peer.Version = idgen.NextID(0) | ||||
| 	peer.APIKey = idgen.NewToken() | ||||
| 	peer.PubKey = encPubKey[:] | ||||
| 	peer.PubSignKey = signPubKey[:] | ||||
| 	peer.PubKey = args.EncPubKey | ||||
| 	peer.PubSignKey = args.PubSignKey | ||||
|  | ||||
| 	if err := db.Peer_UpdateFull(a.db, peer); err != nil { | ||||
| 		return nil, err | ||||
| @@ -208,17 +161,11 @@ func (a *API) Peer_Init(initCode string) (*m.PeerConfig, error) { | ||||
| 	conf := a.Config_Get() | ||||
|  | ||||
| 	return &m.PeerConfig{ | ||||
| 		PeerIP:      peer.PeerIP, | ||||
| 		HubAddress:  conf.HubAddress, | ||||
| 		APIKey:      peer.APIKey, | ||||
| 		Network:     conf.VPNNetwork, | ||||
| 		PublicIP:    peer.PublicIP, | ||||
| 		Port:        peer.Port, | ||||
| 		Relay:       peer.Relay, | ||||
| 		PubKey:      encPubKey[:], | ||||
| 		PrivKey:     encPrivKey[:], | ||||
| 		PubSignKey:  signPubKey[:], | ||||
| 		PrivSignKey: signPrivKey[:], | ||||
| 		PeerIP:   peer.PeerIP, | ||||
| 		Network:  conf.VPNNetwork, | ||||
| 		PublicIP: peer.PublicIP, | ||||
| 		Port:     peer.Port, | ||||
| 		Relay:    peer.Relay, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user