Skip to content

Commit

Permalink
Merge pull request #159 from juanfont/better-pak-management
Browse files Browse the repository at this point in the history
Add field AlreadyUsed to AuthKeys
  • Loading branch information
juanfont authored Oct 13, 2021
2 parents 809a5b8 + 7ce8c4c commit abfb179
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 6 deletions.
3 changes: 3 additions & 0 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,9 @@ func (h *Headscale) handleAuthKey(c *gin.Context, db *gorm.DB, idKey wgkey.Key,
m.RegisterMethod = "authKey"
db.Save(&m)

pak.Used = true
db.Save(&pak)

resp.MachineAuthorized = true
resp.User = *pak.Namespace.toUser()
respBody, err := encode(resp, &idKey, h.privateKey)
Expand Down
3 changes: 2 additions & 1 deletion cmd/headscale/cli/preauthkeys.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ var listPreAuthKeys = &cobra.Command{
return
}

d := pterm.TableData{{"ID", "Key", "Reusable", "Ephemeral", "Expiration", "Created"}}
d := pterm.TableData{{"ID", "Key", "Reusable", "Ephemeral", "Used", "Expiration", "Created"}}
for _, k := range *keys {
expiration := "-"
if k.Expiration != nil {
Expand All @@ -76,6 +76,7 @@ var listPreAuthKeys = &cobra.Command{
k.Key,
reusable,
strconv.FormatBool(k.Ephemeral),
fmt.Sprintf("%v", k.Used),
expiration,
k.CreatedAt.Format("2006-01-02 15:04:05"),
})
Expand Down
8 changes: 4 additions & 4 deletions preauth_keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

const errorAuthKeyNotFound = Error("AuthKey not found")
const errorAuthKeyExpired = Error("AuthKey expired")
const errorAuthKeyNotReusableAlreadyUsed = Error("AuthKey not reusable already used")
const errSingleUseAuthKeyHasBeenUsed = Error("AuthKey has already been used")

// PreAuthKey describes a pre-authorization key usable in a particular namespace
type PreAuthKey struct {
Expand All @@ -21,6 +21,7 @@ type PreAuthKey struct {
Namespace Namespace
Reusable bool
Ephemeral bool `gorm:"default:false"`
Used bool `gorm:"default:false"`

CreatedAt *time.Time
Expiration *time.Time
Expand Down Expand Up @@ -110,11 +111,10 @@ func (h *Headscale) checkKeyValidity(k string) (*PreAuthKey, error) {
return nil, err
}

if len(machines) != 0 {
return nil, errorAuthKeyNotReusableAlreadyUsed
if len(machines) != 0 || pak.Used {
return nil, errSingleUseAuthKeyHasBeenUsed
}

// missing here validation on current usage
return &pak, nil
}

Expand Down
15 changes: 14 additions & 1 deletion preauth_keys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ func (*Suite) TestAlreadyUsedKey(c *check.C) {
h.db.Save(&m)

p, err := h.checkKeyValidity(pak.Key)
c.Assert(err, check.Equals, errorAuthKeyNotReusableAlreadyUsed)
c.Assert(err, check.Equals, errSingleUseAuthKeyHasBeenUsed)
c.Assert(p, check.IsNil)
}

Expand Down Expand Up @@ -180,3 +180,16 @@ func (*Suite) TestExpirePreauthKey(c *check.C) {
c.Assert(err, check.Equals, errorAuthKeyExpired)
c.Assert(p, check.IsNil)
}

func (*Suite) TestNotReusableMarkedAsUsed(c *check.C) {
n, err := h.CreateNamespace("test6")
c.Assert(err, check.IsNil)

pak, err := h.CreatePreAuthKey(n.Name, false, false, nil)
c.Assert(err, check.IsNil)
pak.Used = true
h.db.Save(&pak)

_, err = h.checkKeyValidity(pak.Key)
c.Assert(err, check.Equals, errSingleUseAuthKeyHasBeenUsed)
}

0 comments on commit abfb179

Please sign in to comment.