Handle kind=guest query parameter on /register (#860)
* Handle kind=guest query parameter on /register * Reorganized imports * Pass device_id as nil * Added tests to systest-whitelistmain
parent
68ee11d96c
commit
4113599f61
|
@ -43,6 +43,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/clientapi/userutil"
|
"github.com/matrix-org/dendrite/clientapi/userutil"
|
||||||
"github.com/matrix-org/dendrite/common"
|
"github.com/matrix-org/dendrite/common"
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib/tokens"
|
||||||
"github.com/matrix-org/util"
|
"github.com/matrix-org/util"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
@ -449,6 +450,9 @@ func Register(
|
||||||
if resErr != nil {
|
if resErr != nil {
|
||||||
return *resErr
|
return *resErr
|
||||||
}
|
}
|
||||||
|
if req.URL.Query().Get("kind") == "guest" {
|
||||||
|
return handleGuestRegistration(req, r, cfg, accountDB, deviceDB)
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve or generate the sessionID
|
// Retrieve or generate the sessionID
|
||||||
sessionID := r.Auth.Session
|
sessionID := r.Auth.Session
|
||||||
|
@ -505,6 +509,59 @@ func Register(
|
||||||
return handleRegistrationFlow(req, r, sessionID, cfg, accountDB, deviceDB)
|
return handleRegistrationFlow(req, r, sessionID, cfg, accountDB, deviceDB)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleGuestRegistration(
|
||||||
|
req *http.Request,
|
||||||
|
r registerRequest,
|
||||||
|
cfg *config.Dendrite,
|
||||||
|
accountDB *accounts.Database,
|
||||||
|
deviceDB *devices.Database,
|
||||||
|
) util.JSONResponse {
|
||||||
|
|
||||||
|
//Generate numeric local part for guest user
|
||||||
|
id, err := accountDB.GetNewNumericLocalpart(req.Context())
|
||||||
|
if err != nil {
|
||||||
|
return httputil.LogThenError(req, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
localpart := strconv.FormatInt(id, 10)
|
||||||
|
acc, err := accountDB.CreateAccount(req.Context(), localpart, "", "")
|
||||||
|
if err != nil {
|
||||||
|
return util.JSONResponse{
|
||||||
|
Code: http.StatusInternalServerError,
|
||||||
|
JSON: jsonerror.Unknown("failed to create account: " + err.Error()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
token, err := tokens.GenerateLoginToken(tokens.TokenOptions{
|
||||||
|
ServerPrivateKey: cfg.Matrix.PrivateKey.Seed(),
|
||||||
|
ServerName: string(acc.ServerName),
|
||||||
|
UserID: acc.UserID,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return util.JSONResponse{
|
||||||
|
Code: http.StatusInternalServerError,
|
||||||
|
JSON: jsonerror.Unknown("Failed to generate access token"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//we don't allow guests to specify their own device_id
|
||||||
|
dev, err := deviceDB.CreateDevice(req.Context(), acc.Localpart, nil, token, r.InitialDisplayName)
|
||||||
|
if err != nil {
|
||||||
|
return util.JSONResponse{
|
||||||
|
Code: http.StatusInternalServerError,
|
||||||
|
JSON: jsonerror.Unknown("failed to create device: " + err.Error()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return util.JSONResponse{
|
||||||
|
Code: http.StatusOK,
|
||||||
|
JSON: registerResponse{
|
||||||
|
UserID: dev.UserID,
|
||||||
|
AccessToken: dev.AccessToken,
|
||||||
|
HomeServer: acc.ServerName,
|
||||||
|
DeviceID: dev.ID,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// handleRegistrationFlow will direct and complete registration flow stages
|
// handleRegistrationFlow will direct and complete registration flow stages
|
||||||
// that the client has requested.
|
// that the client has requested.
|
||||||
// nolint: gocyclo
|
// nolint: gocyclo
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -18,6 +18,8 @@ require (
|
||||||
github.com/matrix-org/naffka v0.0.0-20171115094957-662bfd0841d0
|
github.com/matrix-org/naffka v0.0.0-20171115094957-662bfd0841d0
|
||||||
github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5
|
github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5
|
||||||
github.com/miekg/dns v1.1.12 // indirect
|
github.com/miekg/dns v1.1.12 // indirect
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
|
github.com/modern-go/reflect2 v1.0.1 // indirect
|
||||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5
|
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5
|
||||||
github.com/opentracing/opentracing-go v1.0.2
|
github.com/opentracing/opentracing-go v1.0.2
|
||||||
github.com/pierrec/lz4 v0.0.0-20161206202305-5c9560bfa9ac // indirect
|
github.com/pierrec/lz4 v0.0.0-20161206202305-5c9560bfa9ac // indirect
|
||||||
|
|
|
@ -210,3 +210,20 @@ Message history can be paginated
|
||||||
Getting messages going forward is limited for a departed room (SPEC-216)
|
Getting messages going forward is limited for a departed room (SPEC-216)
|
||||||
m.room.history_visibility == "world_readable" allows/forbids appropriately for Real users
|
m.room.history_visibility == "world_readable" allows/forbids appropriately for Real users
|
||||||
Backfill works correctly with history visibility set to joined
|
Backfill works correctly with history visibility set to joined
|
||||||
|
Guest user cannot call /events globally
|
||||||
|
Guest users can join guest_access rooms
|
||||||
|
Guest user can set display names
|
||||||
|
Guest user cannot upgrade other users
|
||||||
|
m.room.history_visibility == "world_readable" allows/forbids appropriately for Guest users
|
||||||
|
Guest non-joined user cannot call /events on shared room
|
||||||
|
Guest non-joined user cannot call /events on invited room
|
||||||
|
Guest non-joined user cannot call /events on joined room
|
||||||
|
Guest non-joined user cannot call /events on default room
|
||||||
|
Guest non-joined users can get state for world_readable rooms
|
||||||
|
Guest non-joined users can get individual state for world_readable rooms
|
||||||
|
Guest non-joined users cannot room initalSync for non-world_readable rooms
|
||||||
|
Guest non-joined users can get individual state for world_readable rooms after leaving
|
||||||
|
Guest non-joined users cannot send messages to guest_access rooms if not joined
|
||||||
|
Guest users can sync from world_readable guest_access rooms if joined
|
||||||
|
Guest users can sync from default guest_access rooms if joined
|
||||||
|
Real non-joined users cannot room initalSync for non-world_readable rooms
|
||||||
|
|
Loading…
Reference in New Issue