961e841bd7
errs.Class should not contain "error" in the name, since that causes a lot of stutter in the error logs. As an example a log line could end up looking like: ERROR node stats service error: satellitedbs error: node stats database error: no rows Whereas something like: ERROR nodestats service: satellitedbs: nodestatsdb: no rows Would contain all the necessary information without the stutter. Change-Id: I7b7cb7e592ebab4bcfadc1eef11122584d2b20e0
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
// Copyright (C) 2020 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package storagenodedb
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
|
|
"github.com/zeebo/errs"
|
|
|
|
"storj.io/storj/private/multinodeauth"
|
|
"storj.io/storj/storagenode/apikeys"
|
|
)
|
|
|
|
// ensures that apiKeysDB implements apikeys.DB interface.
|
|
var _ apikeys.DB = (*apiKeysDB)(nil)
|
|
|
|
// ErrAPIKeysDB represents errors from the api keys database.
|
|
var ErrAPIKeysDB = errs.Class("apikeysdb")
|
|
|
|
// APIKeysDBName represents the database name.
|
|
const APIKeysDBName = "secret"
|
|
|
|
// apiKeysDB works with node api keys DB.
|
|
type apiKeysDB struct {
|
|
dbContainerImpl
|
|
}
|
|
|
|
// Store stores api key into database.
|
|
func (db *apiKeysDB) Store(ctx context.Context, apiKey apikeys.APIKey) (err error) {
|
|
defer mon.Task()(&ctx)(&err)
|
|
|
|
query := `INSERT INTO secret (
|
|
token,
|
|
created_at
|
|
) VALUES(?,?)`
|
|
|
|
_, err = db.ExecContext(ctx, query,
|
|
apiKey.Secret[:],
|
|
apiKey.CreatedAt,
|
|
)
|
|
|
|
return ErrAPIKeysDB.Wrap(err)
|
|
}
|
|
|
|
// Check checks if api key exists in db by secret.
|
|
func (db *apiKeysDB) Check(ctx context.Context, secret multinodeauth.Secret) (err error) {
|
|
defer mon.Task()(&ctx)(&err)
|
|
|
|
var bytes []uint8
|
|
var createdAt string
|
|
|
|
rowStub := db.QueryRowContext(ctx,
|
|
`SELECT token, created_at FROM secret WHERE token = ?`,
|
|
secret[:],
|
|
)
|
|
|
|
err = rowStub.Scan(
|
|
&bytes,
|
|
&createdAt,
|
|
)
|
|
if err != nil {
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return apikeys.ErrNoAPIKey.Wrap(err)
|
|
}
|
|
return ErrAPIKeysDB.Wrap(err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Revoke removes api key from db.
|
|
func (db *apiKeysDB) Revoke(ctx context.Context, secret multinodeauth.Secret) (err error) {
|
|
defer mon.Task()(&ctx)(&err)
|
|
|
|
query := `DELETE FROM secret WHERE token = ?`
|
|
|
|
_, err = db.ExecContext(ctx, query, secret[:])
|
|
|
|
return ErrAPIKeysDB.Wrap(err)
|
|
}
|