@@ -176,12 +176,6 @@ func createRoom(
176176 roomVersion = candidateVersion
177177 }
178178
179- logger .WithFields (log.Fields {
180- "userID" : userID .String (),
181- "roomID" : roomID .String (),
182- "roomVersion" : roomVersion ,
183- }).Info ("Creating new room" )
184-
185179 profile , err := appserviceAPI .RetrieveUserProfile (ctx , userID .String (), asAPI , profileAPI )
186180 if err != nil {
187181 util .GetLogger (ctx ).WithError (err ).Error ("appserviceAPI.RetrieveUserProfile failed" )
@@ -197,13 +191,57 @@ func createRoom(
197191 keyID := cfg .Matrix .KeyID
198192 privateKey := cfg .Matrix .PrivateKey
199193
194+ verImpl := gomatrixserverlib .MustGetRoomVersion (roomVersion )
195+
196+ var createEventJSON json.RawMessage
197+ if verImpl .DomainlessRoomIDs () {
198+ // make the create event up-front so the roomserver can calculate the room NID to store.
199+ var additionalCreators []string
200+ if createRequest .Preset == spec .PresetTrustedPrivateChat {
201+ additionalCreators = createRequest .Invite
202+ }
203+ createContent , err := roomserverAPI .GenerateCreateContent (ctx , createRequest .RoomVersion , userID .String (), createRequest .CreationContent , additionalCreators )
204+ if err != nil {
205+ util .GetLogger (ctx ).WithError (err ).Error ("GenerateCreateContent failed" )
206+ return util.JSONResponse {
207+ Code : http .StatusBadRequest ,
208+ JSON : spec .BadJSON ("invalid create content" ),
209+ }
210+ }
211+ authEvents , _ := gomatrixserverlib .NewAuthEvents (nil )
212+ identity , err := cfg .Matrix .SigningIdentityFor (userID .Domain ())
213+ if err != nil {
214+ util .GetLogger (ctx ).WithError (err ).Error ("Failed to get signing identity" )
215+ return util.JSONResponse {
216+ Code : http .StatusInternalServerError ,
217+ JSON : spec.InternalServerError {},
218+ }
219+ }
220+ createEvent , jsonErr := roomserverAPI .GeneratePDU (
221+ ctx , gomatrixserverlib .MustGetRoomVersion (roomVersion ),
222+ gomatrixserverlib.FledglingEvent {
223+ Type : spec .MRoomCreate ,
224+ Content : createContent ,
225+ },
226+ authEvents , 1 , "" , identity , evTime , userID .String (), "" , rsAPI ,
227+ )
228+ if jsonErr != nil {
229+ util .GetLogger (ctx ).WithError (err ).Error ("Failed to make the create event" )
230+ return * jsonErr
231+ }
232+ createEventJSON = createEvent .JSON ()
233+ r := createEvent .RoomID ()
234+ roomID = & r
235+ }
236+
200237 req := roomserverAPI.PerformCreateRoomRequest {
201238 InvitedUsers : createRequest .Invite ,
202239 RoomName : createRequest .Name ,
203240 Visibility : createRequest .Visibility ,
204241 Topic : createRequest .Topic ,
205242 StatePreset : createRequest .Preset ,
206243 CreationContent : createRequest .CreationContent ,
244+ CreateEvent : createEventJSON ,
207245 InitialState : createRequest .InitialState ,
208246 RoomAliasName : createRequest .RoomAliasName ,
209247 RoomVersion : roomVersion ,
@@ -217,6 +255,12 @@ func createRoom(
217255 EventTime : evTime ,
218256 }
219257
258+ logger .WithFields (log.Fields {
259+ "userID" : userID .String (),
260+ "roomID" : roomID .String (),
261+ "roomVersion" : roomVersion ,
262+ }).Info ("Creating new room" )
263+
220264 roomAlias , createRes := rsAPI .PerformCreateRoom (ctx , * userID , * roomID , & req )
221265 if createRes != nil {
222266 return * createRes
0 commit comments