Skip to content
This repository was archived by the owner on Dec 22, 2023. It is now read-only.

Commit a2ae20a

Browse files
IniZiolouischan-oursky
authored andcommitted
fix(auth): allow signup with restricted user record
1 parent 5f37777 commit a2ae20a

3 files changed

Lines changed: 43 additions & 2 deletions

File tree

pkg/server/handler/authutil.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ func (ctx *authUserRecordContext) execute(info *skydb.AuthInfo, authData skydb.A
214214
RecordsToSave: []*skydb.Record{
215215
&userRecord,
216216
},
217+
BypassCreationAccess: true,
217218
}
218219

219220
recordResp := recordutil.RecordModifyResponse{

pkg/server/recordutil/recordutil.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ type RecordModifyRequest struct {
8484

8585
// Delete Only
8686
RecordIDsToDelete []skydb.RecordID
87+
88+
// Bypass ACL even if it is restricted in _record_creation
89+
BypassCreationAccess bool
8790
}
8891

8992
type RecordModifyResponse struct {
@@ -168,7 +171,7 @@ func (f RecordFetcher) FetchRecord(recordID skydb.RecordID, authInfo *skydb.Auth
168171
return
169172
}
170173

171-
func (f RecordFetcher) FetchOrCreateRecord(recordID skydb.RecordID, authInfo *skydb.AuthInfo) (record skydb.Record, created bool, err skyerr.Error) {
174+
func (f RecordFetcher) FetchOrCreateRecord(recordID skydb.RecordID, authInfo *skydb.AuthInfo, bypassAccess bool) (record skydb.Record, created bool, err skyerr.Error) {
172175
fetchedRecord, err := f.FetchRecord(recordID, authInfo, skydb.WriteLevel)
173176
if err == nil {
174177
record = *fetchedRecord
@@ -177,6 +180,10 @@ func (f RecordFetcher) FetchOrCreateRecord(recordID skydb.RecordID, authInfo *sk
177180

178181
if err.Code() == skyerr.ResourceNotFound {
179182
allowCreation := func() bool {
183+
if bypassAccess {
184+
return true
185+
}
186+
180187
if f.withMasterKey {
181188
return true
182189
}
@@ -231,7 +238,7 @@ func RecordSaveHandler(req *RecordModifyRequest, resp *RecordModifyResponse) sky
231238
// fetch records
232239
originalRecordMap := map[skydb.RecordID]*skydb.Record{}
233240
records = executeRecordFunc(records, resp.ErrMap, func(record *skydb.Record) (err skyerr.Error) {
234-
dbRecord, created, err := fetcher.FetchOrCreateRecord(record.ID, req.AuthInfo)
241+
dbRecord, created, err := fetcher.FetchOrCreateRecord(record.ID, req.AuthInfo, req.BypassCreationAccess)
235242
if err != nil {
236243
return err
237244
}

pkg/server/skydb/pq/recorddb_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import (
2626
"github.com/skygeario/skygear-server/pkg/server/skydb"
2727
"github.com/skygeario/skygear-server/pkg/server/skydb/pq/builder"
2828
. "github.com/skygeario/skygear-server/pkg/server/skytest"
29+
"github.com/skygeario/skygear-server/pkg/server/authtoken/authtokentest"
30+
. "github.com/skygeario/skygear-server/pkg/server/handler"
31+
"github.com/skygeario/skygear-server/pkg/server/audit"
32+
"github.com/skygeario/skygear-server/pkg/server/router"
2933
)
3034

3135
func TestGet(t *testing.T) {
@@ -278,6 +282,35 @@ func TestSave(t *testing.T) {
278282
So(count, ShouldEqual, 0)
279283
})
280284

285+
Convey("allow sign up new account even when user type access is restricted", func() {
286+
tokenStore := authtokentest.SingleTokenStore{}
287+
handler := &SignupHandler{
288+
TokenStore: &tokenStore,
289+
AuthRecordKeys: [][]string{[]string{"username"}, []string{"email"}},
290+
PasswordChecker: &audit.PasswordChecker{},
291+
}
292+
293+
insertRow(t, c.Db(), `INSERT INTO "_record_creation" ` +
294+
`(record_type, role_id) ` +
295+
`VALUES ('user', 'Admin')`)
296+
297+
req := router.Payload{
298+
Data: map[string]interface{}{
299+
"auth_data": map[string]interface{}{
300+
"username": "bilibala",
301+
"email": "bilibala@example.com",
302+
},
303+
"password": "secret",
304+
},
305+
DBConn: c,
306+
Database: db,
307+
}
308+
resp := router.Response{}
309+
handler.Handle(&req, &resp)
310+
311+
So(resp.Result, ShouldHaveSameTypeAs, AuthResponse{})
312+
})
313+
281314
Convey("REGRESSION: update record with attribute having capital letters", func() {
282315
_, err := db.Extend("note", skydb.RecordSchema{
283316
"noteOrder": skydb.FieldType{Type: skydb.TypeNumber},

0 commit comments

Comments
 (0)