Fix instance account not being created (#310)

* Rework 'CreateInstanceAccount' with better checking logic

* add test for create instance account
This commit is contained in:
tobi 2021-11-17 13:40:09 +01:00 committed by GitHub
parent d81a123473
commit ff7c96caa3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 6 deletions

View file

@ -178,18 +178,19 @@ func (a *adminDB) NewSignup(ctx context.Context, username string, reason string,
func (a *adminDB) CreateInstanceAccount(ctx context.Context) db.Error { func (a *adminDB) CreateInstanceAccount(ctx context.Context) db.Error {
username := a.config.Host username := a.config.Host
// check if instance account already exists q := a.conn.
existsQ := a.conn.
NewSelect(). NewSelect().
Model(&gtsmodel.Account{}). Model(&gtsmodel.Account{}).
Where("username = ?", username). Where("username = ?", username).
WhereGroup(" AND ", whereEmptyOrNull("domain")) WhereGroup(" AND ", whereEmptyOrNull("domain"))
count, err := existsQ.Count(ctx)
if err != nil && count == 1 { exists, err := a.conn.Exists(ctx, q)
if err != nil {
return err
}
if exists {
logrus.Infof("instance account %s already exists", username) logrus.Infof("instance account %s already exists", username)
return nil return nil
} else if err != sql.ErrNoRows {
return a.conn.ProcessError(err)
} }
key, err := rsa.GenerateKey(rand.Reader, 2048) key, err := rsa.GenerateKey(rand.Reader, 2048)

View file

@ -0,0 +1,56 @@
/*
GoToSocial
Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package bundb_test
import (
"context"
"testing"
"github.com/stretchr/testify/suite"
"github.com/superseriousbusiness/gotosocial/testrig"
)
type AdminTestSuite struct {
BunDBStandardTestSuite
}
func (suite *AdminTestSuite) TestCreateInstanceAccount() {
// we need to take an empty db for this...
testrig.StandardDBTeardown(suite.db)
// ...with tables created but no data
testrig.CreateTestTables(suite.db)
// make sure there's no instance account in the db yet
acct, err := suite.db.GetInstanceAccount(context.Background(), suite.config.Host)
suite.Error(err)
suite.Nil(acct)
// create it
err = suite.db.CreateInstanceAccount(context.Background())
suite.NoError(err)
// and now check it exists
acct, err = suite.db.GetInstanceAccount(context.Background(), suite.config.Host)
suite.NoError(err)
suite.NotNil(acct)
}
func TestAdminTestSuite(t *testing.T) {
suite.Run(t, new(AdminTestSuite))
}