Cleanup, hub updates
This commit is contained in:
parent
a6e022e570
commit
6a6e30feb9
@ -15,7 +15,6 @@ import (
|
||||
"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
|
||||
@ -146,7 +145,7 @@ type PeerCreateArgs struct {
|
||||
Name string
|
||||
PublicIP []byte
|
||||
Port uint16
|
||||
Mediator bool
|
||||
Relay bool
|
||||
}
|
||||
|
||||
// Create the intention to add a peer. The returned code is used to complete
|
||||
@ -184,11 +183,6 @@ func (a *API) Peer_Create(creationCode string) (*m.PeerConfig, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
signPubKey, signPrivKey, err := sign.GenerateKey(rand.Reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Get peer IP.
|
||||
peerIP := byte(0)
|
||||
|
||||
@ -214,9 +208,8 @@ func (a *API) Peer_Create(creationCode string) (*m.PeerConfig, error) {
|
||||
Name: args.Name,
|
||||
PublicIP: args.PublicIP,
|
||||
Port: args.Port,
|
||||
Mediator: args.Mediator,
|
||||
EncPubKey: encPubKey[:],
|
||||
SignPubKey: signPubKey[:],
|
||||
Relay: args.Relay,
|
||||
PubKey: encPubKey[:],
|
||||
}
|
||||
|
||||
if err := db.Peer_Insert(a.db, peer); err != nil {
|
||||
@ -232,11 +225,9 @@ func (a *API) Peer_Create(creationCode string) (*m.PeerConfig, error) {
|
||||
Network: conf.VPNNetwork,
|
||||
PublicIP: peer.PublicIP,
|
||||
Port: peer.Port,
|
||||
Mediator: peer.Mediator,
|
||||
EncPubKey: encPubKey[:],
|
||||
EncPrivKey: encPrivKey[:],
|
||||
SignPubKey: signPubKey[:],
|
||||
SignPrivKey: signPrivKey[:],
|
||||
Relay: peer.Relay,
|
||||
PubKey: encPubKey[:],
|
||||
PrivKey: encPrivKey[:],
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
@ -313,12 +313,11 @@ type Peer struct {
|
||||
Name string
|
||||
PublicIP []byte
|
||||
Port uint16
|
||||
Mediator bool
|
||||
EncPubKey []byte
|
||||
SignPubKey []byte
|
||||
Relay bool
|
||||
PubKey []byte
|
||||
}
|
||||
|
||||
const Peer_SelectQuery = "SELECT PeerIP,Version,APIKey,Name,PublicIP,Port,Mediator,EncPubKey,SignPubKey FROM peers"
|
||||
const Peer_SelectQuery = "SELECT PeerIP,Version,APIKey,Name,PublicIP,Port,Relay,PubKey FROM peers"
|
||||
|
||||
func Peer_Insert(
|
||||
tx TX,
|
||||
@ -329,7 +328,7 @@ func Peer_Insert(
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = tx.Exec("INSERT INTO peers(PeerIP,Version,APIKey,Name,PublicIP,Port,Mediator,EncPubKey,SignPubKey) VALUES(?,?,?,?,?,?,?,?,?)", row.PeerIP, row.Version, row.APIKey, row.Name, row.PublicIP, row.Port, row.Mediator, row.EncPubKey, row.SignPubKey)
|
||||
_, err = tx.Exec("INSERT INTO peers(PeerIP,Version,APIKey,Name,PublicIP,Port,Relay,PubKey) VALUES(?,?,?,?,?,?,?,?)", row.PeerIP, row.Version, row.APIKey, row.Name, row.PublicIP, row.Port, row.Relay, row.PubKey)
|
||||
return err
|
||||
}
|
||||
|
||||
@ -342,7 +341,7 @@ func Peer_Update(
|
||||
return err
|
||||
}
|
||||
|
||||
result, err := tx.Exec("UPDATE peers SET Version=?,Name=?,PublicIP=?,Port=?,Mediator=? WHERE PeerIP=?", row.Version, row.Name, row.PublicIP, row.Port, row.Mediator, row.PeerIP)
|
||||
result, err := tx.Exec("UPDATE peers SET Version=?,Name=?,PublicIP=?,Port=?,Relay=? WHERE PeerIP=?", row.Version, row.Name, row.PublicIP, row.Port, row.Relay, row.PeerIP)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -370,7 +369,7 @@ func Peer_UpdateFull(
|
||||
return err
|
||||
}
|
||||
|
||||
result, err := tx.Exec("UPDATE peers SET Version=?,APIKey=?,Name=?,PublicIP=?,Port=?,Mediator=?,EncPubKey=?,SignPubKey=? WHERE PeerIP=?", row.Version, row.APIKey, row.Name, row.PublicIP, row.Port, row.Mediator, row.EncPubKey, row.SignPubKey, row.PeerIP)
|
||||
result, err := tx.Exec("UPDATE peers SET Version=?,APIKey=?,Name=?,PublicIP=?,Port=?,Relay=?,PubKey=? WHERE PeerIP=?", row.Version, row.APIKey, row.Name, row.PublicIP, row.Port, row.Relay, row.PubKey, row.PeerIP)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -420,8 +419,8 @@ func Peer_Get(
|
||||
err error,
|
||||
) {
|
||||
row = &Peer{}
|
||||
r := tx.QueryRow("SELECT PeerIP,Version,APIKey,Name,PublicIP,Port,Mediator,EncPubKey,SignPubKey FROM peers WHERE PeerIP=?", PeerIP)
|
||||
err = r.Scan(&row.PeerIP, &row.Version, &row.APIKey, &row.Name, &row.PublicIP, &row.Port, &row.Mediator, &row.EncPubKey, &row.SignPubKey)
|
||||
r := tx.QueryRow("SELECT PeerIP,Version,APIKey,Name,PublicIP,Port,Relay,PubKey FROM peers WHERE PeerIP=?", PeerIP)
|
||||
err = r.Scan(&row.PeerIP, &row.Version, &row.APIKey, &row.Name, &row.PublicIP, &row.Port, &row.Relay, &row.PubKey)
|
||||
return
|
||||
}
|
||||
|
||||
@ -435,7 +434,7 @@ func Peer_GetWhere(
|
||||
) {
|
||||
row = &Peer{}
|
||||
r := tx.QueryRow(query, args...)
|
||||
err = r.Scan(&row.PeerIP, &row.Version, &row.APIKey, &row.Name, &row.PublicIP, &row.Port, &row.Mediator, &row.EncPubKey, &row.SignPubKey)
|
||||
err = r.Scan(&row.PeerIP, &row.Version, &row.APIKey, &row.Name, &row.PublicIP, &row.Port, &row.Relay, &row.PubKey)
|
||||
return
|
||||
}
|
||||
|
||||
@ -455,7 +454,7 @@ func Peer_Iterate(
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
row := &Peer{}
|
||||
err := rows.Scan(&row.PeerIP, &row.Version, &row.APIKey, &row.Name, &row.PublicIP, &row.Port, &row.Mediator, &row.EncPubKey, &row.SignPubKey)
|
||||
err := rows.Scan(&row.PeerIP, &row.Version, &row.APIKey, &row.Name, &row.PublicIP, &row.Port, &row.Relay, &row.PubKey)
|
||||
if !yield(row, err) {
|
||||
return
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ func Peer_Sanitize(p *Peer) {
|
||||
}
|
||||
}
|
||||
if p.Port == 0 {
|
||||
p.Port = 515
|
||||
p.Port = 456
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,6 @@ TABLE peers OF Peer (
|
||||
Name string,
|
||||
PublicIP []byte,
|
||||
Port uint16,
|
||||
Mediator bool,
|
||||
EncPubKey []byte NoUpdate,
|
||||
SignPubKey []byte NoUpdate
|
||||
Relay bool,
|
||||
PubKey []byte NoUpdate
|
||||
);
|
||||
|
@ -22,7 +22,6 @@ CREATE TABLE peers (
|
||||
Name TEXT NOT NULL UNIQUE, -- For humans.
|
||||
PublicIP BLOB NOT NULL,
|
||||
Port INTEGER NOT NULL,
|
||||
Mediator INTEGER NOT NULL DEFAULT 0, -- Boolean if peer will forward packets. Must also have public address.
|
||||
EncPubKey BLOB NOT NULL,
|
||||
SignPubKey BLOB NOT NULL
|
||||
Relay INTEGER NOT NULL DEFAULT 0, -- Boolean if peer will forward packets. Must also have public address.
|
||||
PubKey BLOB NOT NULL
|
||||
) WITHOUT ROWID;
|
||||
|
@ -4,6 +4,8 @@ import (
|
||||
"errors"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"strings"
|
||||
"vppn/hub/api"
|
||||
"vppn/m"
|
||||
|
||||
@ -155,6 +157,29 @@ func (a *App) _adminPeerList(s *api.Session, w http.ResponseWriter, r *http.Requ
|
||||
})
|
||||
}
|
||||
|
||||
func (a *App) _adminHosts(s *api.Session, w http.ResponseWriter, r *http.Request) error {
|
||||
conf := a.api.Config_Get()
|
||||
|
||||
peers, err := a.api.Peer_List()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
b := strings.Builder{}
|
||||
|
||||
for _, peer := range peers {
|
||||
ip := conf.VPNNetwork
|
||||
ip[3] = peer.PeerIP
|
||||
b.WriteString(netip.AddrFrom4([4]byte(ip)).String())
|
||||
b.WriteString(" ")
|
||||
b.WriteString(peer.Name)
|
||||
b.WriteString("\n")
|
||||
}
|
||||
|
||||
w.Write([]byte(b.String()))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *App) _adminPeerCreate(s *api.Session, w http.ResponseWriter, r *http.Request) error {
|
||||
return a.render("/admin-peer-create.html", w, struct{ Session *api.Session }{s})
|
||||
}
|
||||
@ -167,7 +192,7 @@ func (a *App) _adminPeerCreateSubmit(s *api.Session, w http.ResponseWriter, r *h
|
||||
Scan("Name", &args.Name).
|
||||
Scan("PublicIP", &ipStr).
|
||||
Scan("Port", &args.Port).
|
||||
Scan("Mediator", &args.Mediator).
|
||||
Scan("Relay", &args.Relay).
|
||||
Error()
|
||||
if err != nil {
|
||||
return err
|
||||
@ -249,7 +274,7 @@ func (a *App) _adminPeerEditSubmit(s *api.Session, w http.ResponseWriter, r *htt
|
||||
Scan("Name", &peer.Name).
|
||||
Scan("PublicIP", &ipStr).
|
||||
Scan("Port", &peer.Port).
|
||||
Scan("Mediator", &peer.Mediator).
|
||||
Scan("Relay", &peer.Relay).
|
||||
Error()
|
||||
if err != nil {
|
||||
return err
|
||||
@ -311,19 +336,16 @@ func (a *App) _peerCreate(w http.ResponseWriter, r *http.Request) error {
|
||||
func (a *App) _peerFetchState(w http.ResponseWriter, r *http.Request) error {
|
||||
_, apiKey, ok := r.BasicAuth()
|
||||
if !ok {
|
||||
log.Printf("1")
|
||||
return api.ErrNotAuthorized
|
||||
}
|
||||
|
||||
peer, err := a.api.Peer_GetByAPIKey(apiKey)
|
||||
if err != nil {
|
||||
log.Printf("2")
|
||||
return err
|
||||
}
|
||||
|
||||
peers, err := a.api.Peer_List()
|
||||
if err != nil {
|
||||
log.Printf("3")
|
||||
return err
|
||||
}
|
||||
|
||||
@ -344,9 +366,8 @@ func (a *App) _peerFetchState(w http.ResponseWriter, r *http.Request) error {
|
||||
Name: p.Name,
|
||||
PublicIP: p.PublicIP,
|
||||
Port: p.Port,
|
||||
Mediator: p.Mediator,
|
||||
EncPubKey: p.EncPubKey,
|
||||
SignPubKey: p.SignPubKey,
|
||||
Relay: p.Relay,
|
||||
PubKey: p.PubKey,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@ func (a *App) registerRoutes() {
|
||||
a.handleSignedIn("GET /admin/password/edit/", a._adminPasswordEdit)
|
||||
a.handleSignedIn("POST /admin/password/edit/", a._adminPasswordSubmit)
|
||||
a.handleSignedIn("GET /admin/peer/list/", a._adminPeerList)
|
||||
a.handleSignedIn("GET /admin/peer/hosts/", a._adminHosts)
|
||||
a.handleSignedIn("GET /admin/peer/create/", a._adminPeerCreate)
|
||||
a.handleSignedIn("POST /admin/peer/create/", a._adminPeerCreateSubmit)
|
||||
a.handleSignedIn("GET /admin/peer/intent-created/", a._adminPeerIntentCreated)
|
||||
|
@ -13,12 +13,12 @@
|
||||
</p>
|
||||
<p>
|
||||
<label>Port</label><br>
|
||||
<input type="number" name="Port" value="515">
|
||||
<input type="number" name="Port" value="456">
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
<input type="checkbox" name="Mediator">
|
||||
Mediator
|
||||
<input type="checkbox" name="Relay">
|
||||
Relay
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
|
@ -22,8 +22,8 @@
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
<input type="checkbox" {{if .Mediator}}checked{{end}} disabled>
|
||||
Mediator
|
||||
<input type="checkbox" {{if .Relay}}checked{{end}} disabled>
|
||||
Relay
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
|
@ -22,8 +22,8 @@
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
<input type="checkbox" name="Mediator" {{if .Mediator}}checked{{end}}>
|
||||
Mediator
|
||||
<input type="checkbox" name="Relay" {{if .Relay}}checked{{end}}>
|
||||
Relay
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
|
@ -2,7 +2,8 @@
|
||||
<h2>Peers</h2>
|
||||
|
||||
<p>
|
||||
<a href="/admin/peer/create/">Add Peer</a>
|
||||
<a href="/admin/peer/create/">Add Peer</a> /
|
||||
<a href="/admin/peer/hosts/">Hosts</a>
|
||||
</p>
|
||||
|
||||
{{if .Peers -}}
|
||||
@ -13,7 +14,7 @@
|
||||
<th>Name</th>
|
||||
<th>Public IP</th>
|
||||
<th>Port</th>
|
||||
<th>Mediator</th>
|
||||
<th>Relay</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -27,7 +28,7 @@
|
||||
<td>{{.Name}}</td>
|
||||
<td>{{ipToString .PublicIP}}</td>
|
||||
<td>{{.Port}}</td>
|
||||
<td>{{if .Mediator}}T{{else}}F{{end}}</td>
|
||||
<td>{{if .Relay}}T{{else}}F{{end}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
{{- end}}
|
||||
|
@ -12,7 +12,7 @@
|
||||
<tr><td>Name</td><td>{{.Name}}</td></tr>
|
||||
<tr><td>Public IP</td><td>{{ipToString .PublicIP}}</td></tr>
|
||||
<tr><td>Port</td><td>{{.Port}}</td></tr>
|
||||
<tr><td>Mediator</td><td>{{if .Mediator}}T{{else}}F{{end}}</td></tr>
|
||||
<tr><td>Relay</td><td>{{if .Relay}}T{{else}}F{{end}}</td></tr>
|
||||
<tr><td>API Key</td><td>{{.APIKey}}</td></tr>
|
||||
</table>
|
||||
{{- end}}
|
||||
|
13
m/models.go
13
m/models.go
@ -8,11 +8,9 @@ type PeerConfig struct {
|
||||
APIKey string
|
||||
PublicIP []byte
|
||||
Port uint16
|
||||
Mediator bool
|
||||
EncPubKey []byte
|
||||
EncPrivKey []byte
|
||||
SignPubKey []byte
|
||||
SignPrivKey []byte
|
||||
Relay bool
|
||||
PubKey []byte
|
||||
PrivKey []byte
|
||||
}
|
||||
|
||||
type Peer struct {
|
||||
@ -21,9 +19,8 @@ type Peer struct {
|
||||
Name string
|
||||
PublicIP []byte
|
||||
Port uint16
|
||||
Mediator bool
|
||||
EncPubKey []byte
|
||||
SignPubKey []byte
|
||||
Relay bool
|
||||
PubKey []byte
|
||||
}
|
||||
|
||||
type NetworkState struct {
|
||||
|
@ -106,7 +106,7 @@ func main(listenIP string, port uint16) {
|
||||
// Intialize globals.
|
||||
localIP = config.PeerIP
|
||||
localPub = addrIsValid(config.PublicIP)
|
||||
privateKey = config.EncPrivKey
|
||||
privateKey = config.PrivKey
|
||||
|
||||
_iface = newIFWriter(iface)
|
||||
_conn = newConnWriter(conn)
|
||||
|
@ -14,8 +14,6 @@ const (
|
||||
packetTypeSyn = iota + 1
|
||||
packetTypeSynAck
|
||||
packetTypeAck
|
||||
packetTypeAddrReq
|
||||
packetTypeAddrResp
|
||||
)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -34,10 +32,6 @@ func (p *controlPacket) ParsePayload(buf []byte) (err error) {
|
||||
p.Payload, err = parseSynAckPacket(buf)
|
||||
case packetTypeAck:
|
||||
p.Payload, err = parseAckPacket(buf)
|
||||
case packetTypeAddrReq:
|
||||
p.Payload, err = parseAddrReqPacket(buf)
|
||||
case packetTypeAddrResp:
|
||||
p.Payload, err = parseAddrRespPacket(buf)
|
||||
default:
|
||||
return errUnknownPacketType
|
||||
}
|
||||
@ -118,46 +112,3 @@ func parseAckPacket(buf []byte) (p ackPacket, err error) {
|
||||
Error()
|
||||
return
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
type addrReqPacket struct {
|
||||
TraceID uint64
|
||||
}
|
||||
|
||||
func (p addrReqPacket) Marshal(buf []byte) []byte {
|
||||
return newBinWriter(buf).
|
||||
Byte(packetTypeAddrReq).
|
||||
Uint64(p.TraceID).
|
||||
Build()
|
||||
}
|
||||
|
||||
func parseAddrReqPacket(buf []byte) (p addrReqPacket, err error) {
|
||||
err = newBinReader(buf[1:]).
|
||||
Uint64(&p.TraceID).
|
||||
Error()
|
||||
return
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
type addrRespPacket struct {
|
||||
TraceID uint64
|
||||
Addr netip.AddrPort
|
||||
}
|
||||
|
||||
func (p addrRespPacket) Marshal(buf []byte) []byte {
|
||||
return newBinWriter(buf).
|
||||
Byte(packetTypeAddrResp).
|
||||
Uint64(p.TraceID).
|
||||
AddrPort(p.Addr).
|
||||
Build()
|
||||
}
|
||||
|
||||
func parseAddrRespPacket(buf []byte) (p addrRespPacket, err error) {
|
||||
err = newBinReader(buf[1:]).
|
||||
Uint64(&p.TraceID).
|
||||
AddrPort(&p.Addr).
|
||||
Error()
|
||||
return
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package node
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"net/netip"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
@ -25,6 +26,7 @@ func TestPacketSyn(t *testing.T) {
|
||||
func TestPacketSynAck(t *testing.T) {
|
||||
in := synAckPacket{
|
||||
TraceID: newTraceID(),
|
||||
RecvAddr: netip.AddrPort{},
|
||||
}
|
||||
|
||||
out, err := parseSynAckPacket(in.Marshal(make([]byte, bufferSize)))
|
||||
|
@ -102,12 +102,12 @@ func (s *peerSupervisor) _peerUpdate(peer *m.Peer) stateFunc {
|
||||
}
|
||||
|
||||
s.staged.IP = s.remoteIP
|
||||
s.staged.ControlCipher = newControlCipher(privateKey, peer.EncPubKey)
|
||||
s.staged.ControlCipher = newControlCipher(privateKey, peer.PubKey)
|
||||
s.staged.DataCipher = newDataCipher()
|
||||
|
||||
if ip, isValid := netip.AddrFromSlice(peer.PublicIP); isValid {
|
||||
s.remotePub = true
|
||||
s.staged.Relay = peer.Mediator
|
||||
s.staged.Relay = peer.Relay
|
||||
s.staged.RemoteAddr = netip.AddrPortFrom(ip, peer.Port)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user