-
Notifications
You must be signed in to change notification settings - Fork 0
/
controller.go
126 lines (103 loc) · 2.47 KB
/
controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package controller
import (
"errors"
"fmt"
"net/netip"
"sync"
"time"
"github.com/caldog20/zeronet/controller/db"
"github.com/caldog20/zeronet/controller/types"
ctrlv1 "github.com/caldog20/zeronet/proto/gen/controller/v1"
)
type Controller struct {
db *db.Store
// Config Related Items
prefix netip.Prefix
currentPeers sync.Map
}
func NewController(
db *db.Store,
prefix netip.Prefix,
) *Controller {
return &Controller{db: db, prefix: prefix}
}
func (c *Controller) ProcessPeerLogin(peer *types.Peer, req *ctrlv1.LoginPeerRequest) error {
// peer := c.db.GetPeerByMachineID(req.GetMachineId())
// if peer == nil {
// return nil, nil
// }
peer.LastLogin = time.Now()
peer.NoisePublicKey = req.GetPublicKey() // TODO: Validate public key
peer.Hostname = req.GetHostname()
peer.Endpoint = req.GetEndpoint()
peer.LoggedIn = true
// Update peer in database
err := c.db.UpdatePeer(peer)
if err != nil {
return err
}
// Add to map of current peers logged in
c.currentPeers.Store(peer.ID, true)
// Handle peer login event here
//go c.PeerLoginEvent(peer.Copy())
return nil
}
func (c *Controller) LogoutPeer(peer *types.Peer) error {
peer.LoggedIn = false
c.currentPeers.Delete(peer.ID)
// Handle per logout event here
// go c.PeerLogoutEvent(peer.Copy())
err := c.db.UpdatePeer(&types.Peer{ID: peer.ID, LoggedIn: false})
if err != nil {
return err
}
return nil
}
func (c *Controller) DeletePeer(peerID uint32) error {
peer := c.db.GetPeerbyID(peerID)
if peer == nil {
return errors.New("peer doesn't exist")
}
if peer.LoggedIn {
err := c.LogoutPeer(peer)
if err != nil {
return err
}
}
err := c.db.DeletePeer(peer)
if err != nil {
return err
}
fmt.Println(err)
return nil
}
func (c *Controller) RegisterPeer(
req *ctrlv1.LoginPeerRequest,
userID string,
) (*types.Peer, error) {
ip, err := c.db.AllocatePeerIP(c.prefix)
if err != nil {
return nil, err
}
// jwt, err := auth.GenerateJwtWithClaims()
// if err != nil {
// return nil, err
// }
newPeer := &types.Peer{
MachineID: req.GetMachineId(),
NoisePublicKey: req.GetPublicKey(),
Hostname: req.GetHostname(),
Prefix: c.prefix.String(),
IP: ip,
Endpoint: req.GetEndpoint(),
LoggedIn: false,
LastAuth: time.Now(),
User: userID,
}
err = c.db.CreatePeer(newPeer)
if err != nil {
return nil, errors.New("error creating peer in database")
}
return newPeer, nil
}
// func (c *Controller) CreatePeer()