aboutsummaryrefslogtreecommitdiff
path: root/userapi
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2021-03-08 13:19:02 +0000
committerGitHub <noreply@github.com>2021-03-08 13:19:02 +0000
commit850abb1dde2ce6f85554457e3ee94a9837e13897 (patch)
tree4b9068e9e4bca77ac1be1291c10fc53d8a704648 /userapi
parentc3ad2cca49a7ad5890dddf2d8eec3e3cbbff16d1 (diff)
Make bcrypt cost configurable (#1793)
Diffstat (limited to 'userapi')
-rw-r--r--userapi/storage/accounts/postgres/storage.go12
-rw-r--r--userapi/storage/accounts/sqlite3/storage.go12
-rw-r--r--userapi/storage/accounts/storage.go6
-rw-r--r--userapi/storage/accounts/storage_wasm.go3
-rw-r--r--userapi/userapi.go1
-rw-r--r--userapi/userapi_test.go3
6 files changed, 21 insertions, 16 deletions
diff --git a/userapi/storage/accounts/postgres/storage.go b/userapi/storage/accounts/postgres/storage.go
index e6adbfd8..3933fe5b 100644
--- a/userapi/storage/accounts/postgres/storage.go
+++ b/userapi/storage/accounts/postgres/storage.go
@@ -44,10 +44,11 @@ type Database struct {
accountDatas accountDataStatements
threepids threepidStatements
serverName gomatrixserverlib.ServerName
+ bcryptCost int
}
// NewDatabase creates a new accounts and profiles database
-func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (*Database, error) {
+func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName, bcryptCost int) (*Database, error) {
db, err := sqlutil.Open(dbProperties)
if err != nil {
return nil, err
@@ -56,6 +57,7 @@ func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserver
serverName: serverName,
db: db,
writer: sqlutil.NewDummyWriter(),
+ bcryptCost: bcryptCost,
}
// Create tables before executing migrations so we don't fail if the table is missing,
@@ -131,7 +133,7 @@ func (d *Database) SetDisplayName(
func (d *Database) SetPassword(
ctx context.Context, localpart, plaintextPassword string,
) error {
- hash, err := hashPassword(plaintextPassword)
+ hash, err := d.hashPassword(plaintextPassword)
if err != nil {
return err
}
@@ -175,7 +177,7 @@ func (d *Database) createAccount(
// Generate a password hash if this is not a password-less user
hash := ""
if plaintextPassword != "" {
- hash, err = hashPassword(plaintextPassword)
+ hash, err = d.hashPassword(plaintextPassword)
if err != nil {
return nil, err
}
@@ -246,8 +248,8 @@ func (d *Database) GetNewNumericLocalpart(
return d.accounts.selectNewNumericLocalpart(ctx, nil)
}
-func hashPassword(plaintext string) (hash string, err error) {
- hashBytes, err := bcrypt.GenerateFromPassword([]byte(plaintext), bcrypt.DefaultCost)
+func (d *Database) hashPassword(plaintext string) (hash string, err error) {
+ hashBytes, err := bcrypt.GenerateFromPassword([]byte(plaintext), d.bcryptCost)
return string(hashBytes), err
}
diff --git a/userapi/storage/accounts/sqlite3/storage.go b/userapi/storage/accounts/sqlite3/storage.go
index 747be34f..07cc68b3 100644
--- a/userapi/storage/accounts/sqlite3/storage.go
+++ b/userapi/storage/accounts/sqlite3/storage.go
@@ -42,6 +42,7 @@ type Database struct {
accountDatas accountDataStatements
threepids threepidStatements
serverName gomatrixserverlib.ServerName
+ bcryptCost int
accountsMu sync.Mutex
profilesMu sync.Mutex
@@ -50,7 +51,7 @@ type Database struct {
}
// NewDatabase creates a new accounts and profiles database
-func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (*Database, error) {
+func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName, bcryptCost int) (*Database, error) {
db, err := sqlutil.Open(dbProperties)
if err != nil {
return nil, err
@@ -59,6 +60,7 @@ func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserver
serverName: serverName,
db: db,
writer: sqlutil.NewExclusiveWriter(),
+ bcryptCost: bcryptCost,
}
// Create tables before executing migrations so we don't fail if the table is missing,
@@ -143,7 +145,7 @@ func (d *Database) SetDisplayName(
func (d *Database) SetPassword(
ctx context.Context, localpart, plaintextPassword string,
) error {
- hash, err := hashPassword(plaintextPassword)
+ hash, err := d.hashPassword(plaintextPassword)
if err != nil {
return err
}
@@ -208,7 +210,7 @@ func (d *Database) createAccount(
// Generate a password hash if this is not a password-less user
hash := ""
if plaintextPassword != "" {
- hash, err = hashPassword(plaintextPassword)
+ hash, err = d.hashPassword(plaintextPassword)
if err != nil {
return nil, err
}
@@ -278,8 +280,8 @@ func (d *Database) GetNewNumericLocalpart(
return d.accounts.selectNewNumericLocalpart(ctx, nil)
}
-func hashPassword(plaintext string) (hash string, err error) {
- hashBytes, err := bcrypt.GenerateFromPassword([]byte(plaintext), bcrypt.DefaultCost)
+func (d *Database) hashPassword(plaintext string) (hash string, err error) {
+ hashBytes, err := bcrypt.GenerateFromPassword([]byte(plaintext), d.bcryptCost)
return string(hashBytes), err
}
diff --git a/userapi/storage/accounts/storage.go b/userapi/storage/accounts/storage.go
index 3f69e95f..28c437da 100644
--- a/userapi/storage/accounts/storage.go
+++ b/userapi/storage/accounts/storage.go
@@ -27,12 +27,12 @@ import (
// NewDatabase opens a new Postgres or Sqlite database (based on dataSourceName scheme)
// and sets postgres connection parameters
-func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (Database, error) {
+func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName, bcryptCost int) (Database, error) {
switch {
case dbProperties.ConnectionString.IsSQLite():
- return sqlite3.NewDatabase(dbProperties, serverName)
+ return sqlite3.NewDatabase(dbProperties, serverName, bcryptCost)
case dbProperties.ConnectionString.IsPostgres():
- return postgres.NewDatabase(dbProperties, serverName)
+ return postgres.NewDatabase(dbProperties, serverName, bcryptCost)
default:
return nil, fmt.Errorf("unexpected database type")
}
diff --git a/userapi/storage/accounts/storage_wasm.go b/userapi/storage/accounts/storage_wasm.go
index dcaf371a..8038326f 100644
--- a/userapi/storage/accounts/storage_wasm.go
+++ b/userapi/storage/accounts/storage_wasm.go
@@ -25,10 +25,11 @@ import (
func NewDatabase(
dbProperties *config.DatabaseOptions,
serverName gomatrixserverlib.ServerName,
+ bcryptCost int,
) (Database, error) {
switch {
case dbProperties.ConnectionString.IsSQLite():
- return sqlite3.NewDatabase(dbProperties, serverName)
+ return sqlite3.NewDatabase(dbProperties, serverName, bcryptCost)
case dbProperties.ConnectionString.IsPostgres():
return nil, fmt.Errorf("can't use Postgres implementation")
default:
diff --git a/userapi/userapi.go b/userapi/userapi.go
index b8b826bc..74702020 100644
--- a/userapi/userapi.go
+++ b/userapi/userapi.go
@@ -37,7 +37,6 @@ func AddInternalRoutes(router *mux.Router, intAPI api.UserInternalAPI) {
func NewInternalAPI(
accountDB accounts.Database, cfg *config.UserAPI, appServices []config.ApplicationService, keyAPI keyapi.KeyInternalAPI,
) api.UserInternalAPI {
-
deviceDB, err := devices.NewDatabase(&cfg.DeviceDatabase, cfg.Matrix.ServerName)
if err != nil {
logrus.WithError(err).Panicf("failed to connect to device db")
diff --git a/userapi/userapi_test.go b/userapi/userapi_test.go
index 25c262ad..9a45a2dc 100644
--- a/userapi/userapi_test.go
+++ b/userapi/userapi_test.go
@@ -16,6 +16,7 @@ import (
"github.com/matrix-org/dendrite/userapi/inthttp"
"github.com/matrix-org/dendrite/userapi/storage/accounts"
"github.com/matrix-org/gomatrixserverlib"
+ "golang.org/x/crypto/bcrypt"
)
const (
@@ -25,7 +26,7 @@ const (
func MustMakeInternalAPI(t *testing.T) (api.UserInternalAPI, accounts.Database) {
accountDB, err := accounts.NewDatabase(&config.DatabaseOptions{
ConnectionString: "file::memory:",
- }, serverName)
+ }, serverName, bcrypt.MinCost)
if err != nil {
t.Fatalf("failed to create account DB: %s", err)
}