Skip to content

Commit 3110dd1

Browse files
committed
Added fields in Machine to store authkey + validation tests
1 parent 486faa9 commit 3110dd1

File tree

3 files changed

+105
-3
lines changed

3 files changed

+105
-3
lines changed

machine.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,13 @@ type Machine struct {
2525
NamespaceID uint
2626
Namespace Namespace
2727

28-
Registered bool // temp
29-
LastSeen *time.Time
30-
Expiry *time.Time
28+
Registered bool // temp
29+
RegisterMethod string
30+
AuthKeyID uint
31+
AuthKey *PreAuthKey
32+
33+
LastSeen *time.Time
34+
Expiry *time.Time
3135

3236
HostInfo postgres.Jsonb
3337
Endpoints postgres.Jsonb

preauth_keys.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
const errorAuthKeyNotFound = Error("AuthKey not found")
1111
const errorAuthKeyExpired = Error("AuthKey expired")
12+
const errorAuthKeyNotReusableAlreadyUsed = Error("AuthKey not reusable already used")
1213

1314
// PreAuthKey describes a pre-authorization key usable in a particular namespace
1415
type PreAuthKey struct {
@@ -93,6 +94,19 @@ func (h *Headscale) checkKeyValidity(k string) (*PreAuthKey, error) {
9394
return nil, errorAuthKeyExpired
9495
}
9596

97+
if pak.Reusable { // we don't need to check if has been used before
98+
return &pak, nil
99+
}
100+
101+
machines := []Machine{}
102+
if err := db.Preload("AuthKey").Where(&Machine{AuthKeyID: uint(pak.ID)}).Find(&machines).Error; err != nil {
103+
return nil, err
104+
}
105+
106+
if len(machines) != 0 {
107+
return nil, errorAuthKeyNotReusableAlreadyUsed
108+
}
109+
96110
// missing here validation on current usage
97111
return &pak, nil
98112
}

preauth_keys_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,87 @@ func (*Suite) TestPreAuthKeyDoesNotExist(c *check.C) {
9494
c.Assert(err, check.Equals, errorAuthKeyNotFound)
9595
c.Assert(p, check.IsNil)
9696
}
97+
98+
func (*Suite) TestValidateKeyOk(c *check.C) {
99+
n, err := h.CreateNamespace("test3")
100+
c.Assert(err, check.IsNil)
101+
102+
pak, err := h.CreatePreAuthKey(n.Name, true, nil)
103+
c.Assert(err, check.IsNil)
104+
105+
p, err := h.checkKeyValidity(pak.Key)
106+
c.Assert(err, check.IsNil)
107+
c.Assert(p.ID, check.Equals, pak.ID)
108+
}
109+
110+
func (*Suite) TestAlreadyUsedKey(c *check.C) {
111+
n, err := h.CreateNamespace("test4")
112+
c.Assert(err, check.IsNil)
113+
114+
pak, err := h.CreatePreAuthKey(n.Name, false, nil)
115+
c.Assert(err, check.IsNil)
116+
117+
db, err := h.db()
118+
if err != nil {
119+
c.Fatal(err)
120+
}
121+
defer db.Close()
122+
m := Machine{
123+
ID: 0,
124+
MachineKey: "foo",
125+
NodeKey: "bar",
126+
DiscoKey: "faa",
127+
Name: "testest",
128+
NamespaceID: n.ID,
129+
Registered: true,
130+
RegisterMethod: "authKey",
131+
AuthKeyID: uint(pak.ID),
132+
}
133+
db.Save(&m)
134+
135+
p, err := h.checkKeyValidity(pak.Key)
136+
c.Assert(err, check.Equals, errorAuthKeyNotReusableAlreadyUsed)
137+
c.Assert(p, check.IsNil)
138+
}
139+
140+
func (*Suite) TestReusableBeingUsedKey(c *check.C) {
141+
n, err := h.CreateNamespace("test5")
142+
c.Assert(err, check.IsNil)
143+
144+
pak, err := h.CreatePreAuthKey(n.Name, true, nil)
145+
c.Assert(err, check.IsNil)
146+
147+
db, err := h.db()
148+
if err != nil {
149+
c.Fatal(err)
150+
}
151+
defer db.Close()
152+
m := Machine{
153+
ID: 1,
154+
MachineKey: "foo",
155+
NodeKey: "bar",
156+
DiscoKey: "faa",
157+
Name: "testest",
158+
NamespaceID: n.ID,
159+
Registered: true,
160+
RegisterMethod: "authKey",
161+
AuthKeyID: uint(pak.ID),
162+
}
163+
db.Save(&m)
164+
165+
p, err := h.checkKeyValidity(pak.Key)
166+
c.Assert(err, check.IsNil)
167+
c.Assert(p.ID, check.Equals, pak.ID)
168+
}
169+
170+
func (*Suite) TestNotReusableNotBeingUsedKey(c *check.C) {
171+
n, err := h.CreateNamespace("test6")
172+
c.Assert(err, check.IsNil)
173+
174+
pak, err := h.CreatePreAuthKey(n.Name, false, nil)
175+
c.Assert(err, check.IsNil)
176+
177+
p, err := h.checkKeyValidity(pak.Key)
178+
c.Assert(err, check.IsNil)
179+
c.Assert(p.ID, check.Equals, pak.ID)
180+
}

0 commit comments

Comments
 (0)