Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
30 lines
908 B
Go
30 lines
908 B
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
// RevokeNode records that a node was removed at a moment: every certificate
|
|
// issued for it until then is refused from now on.
|
|
func (s *DB) RevokeNode(ctx context.Context, nodeID string, at time.Time) error {
|
|
_, err := s.db.ExecContext(ctx, `INSERT INTO revoked_nodes (node_id, revoked_at) VALUES (?, ?)
|
|
ON CONFLICT (node_id) DO UPDATE SET revoked_at = excluded.revoked_at`, nodeID, millis(at))
|
|
return err
|
|
}
|
|
|
|
// NodeRevokedAt is when a node was last removed; zero if it never was.
|
|
func (s *DB) NodeRevokedAt(ctx context.Context, nodeID string) (time.Time, error) {
|
|
var at int64
|
|
err := s.db.QueryRowContext(ctx, `SELECT revoked_at FROM revoked_nodes WHERE node_id = ?`, nodeID).Scan(&at)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return time.Time{}, nil
|
|
}
|
|
if err != nil {
|
|
return time.Time{}, err
|
|
}
|
|
return fromMillis(at), nil
|
|
}
|