@@ -39,3 +39,24 @@ type LoginResponse struct {
|
||||
PermissionManage bool `json:"permission_manage_agent"`
|
||||
PermissionAdmin bool `json:"permission_admin"`
|
||||
}
|
||||
|
||||
// RegistrationToken represents a one-time agent registration token.
|
||||
type RegistrationToken struct {
|
||||
ID int64 `json:"id"`
|
||||
Token string `json:"token"`
|
||||
Label string `json:"label"`
|
||||
Used bool `json:"used"`
|
||||
CreatedAt *string `json:"created_at"`
|
||||
UsedAt *string `json:"used_at"`
|
||||
}
|
||||
|
||||
// RegistrationRequest is the request body for creating a registration token.
|
||||
type RegistrationRequest struct {
|
||||
Label string `json:"label" binding:"required"`
|
||||
}
|
||||
|
||||
// RegistrationResponse is returned when an agent registers.
|
||||
type RegistrationResponse struct {
|
||||
CACert string `json:"ca_cert"`
|
||||
ClientCert string `json:"client_cert"`
|
||||
}
|
||||
|
||||
@@ -185,3 +185,62 @@ func (r *Repository) ExistsByLogin(login string) bool {
|
||||
}
|
||||
return count > 0
|
||||
}
|
||||
|
||||
// InitRegistrationTokens creates the registration_tokens table if it does not exist.
|
||||
func (r *Repository) InitRegistrationTokens() error {
|
||||
_, err := r.DB.Exec(storage.CreateRegistrationTokensTable)
|
||||
return err
|
||||
}
|
||||
|
||||
// CreateRegistrationToken inserts a new one-time registration token.
|
||||
func (r *Repository) CreateRegistrationToken(label string) (string, error) {
|
||||
token, err := utils.RandomToken()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
_, err = r.DB.Exec(
|
||||
`INSERT INTO registration_tokens (token, label, used) VALUES (?, ?, 0)`,
|
||||
token, label,
|
||||
)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return token, nil
|
||||
}
|
||||
|
||||
// GetRegistrationToken retrieves a registration token if it exists and is not used.
|
||||
func (r *Repository) GetRegistrationToken(token string) (*RegistrationToken, error) {
|
||||
var rt RegistrationToken
|
||||
err := r.DB.QueryRow(
|
||||
`SELECT id, token, label, used, created_at, used_at FROM registration_tokens WHERE token = ?`,
|
||||
token,
|
||||
).Scan(&rt.ID, &rt.Token, &rt.Label, &rt.Used, &rt.CreatedAt, &rt.UsedAt)
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return &rt, nil
|
||||
}
|
||||
|
||||
// MarkRegistrationTokenUsed marks a registration token as used.
|
||||
func (r *Repository) MarkRegistrationTokenUsed(token string) error {
|
||||
result, err := r.DB.Exec(
|
||||
`UPDATE registration_tokens SET used = 1, used_at = CURRENT_TIMESTAMP WHERE token = ? AND used = 0`,
|
||||
token,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
affected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if affected == 0 {
|
||||
return ErrNotFound
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user