2020-02-05 12:06:39 -06:00
|
|
|
// Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2020-02-05 10:25:58 -06:00
|
|
|
package version
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"github.com/matrix-org/dendrite/roomserver/state"
|
|
|
|
)
|
|
|
|
|
|
|
|
type RoomVersionID int
|
|
|
|
type EventFormatID int
|
|
|
|
|
|
|
|
const (
|
|
|
|
RoomVersionV1 RoomVersionID = iota + 1
|
|
|
|
RoomVersionV2
|
|
|
|
RoomVersionV3
|
|
|
|
RoomVersionV4
|
|
|
|
RoomVersionV5
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
EventFormatV1 EventFormatID = iota + 1 // original event ID formatting
|
|
|
|
EventFormatV2 // event ID is event hash
|
|
|
|
EventFormatV3 // event ID is URL-safe base64 event hash
|
|
|
|
)
|
|
|
|
|
|
|
|
type RoomVersionDescription struct {
|
|
|
|
Supported bool
|
|
|
|
Stable bool
|
|
|
|
StateResolution state.StateResolutionVersion
|
|
|
|
EventFormat EventFormatID
|
|
|
|
EnforceSigningKeyValidity bool
|
|
|
|
}
|
|
|
|
|
|
|
|
var roomVersions = map[RoomVersionID]RoomVersionDescription{
|
|
|
|
RoomVersionV1: RoomVersionDescription{
|
|
|
|
Supported: true,
|
|
|
|
Stable: true,
|
|
|
|
StateResolution: state.StateResolutionAlgorithmV1,
|
|
|
|
EventFormat: EventFormatV1,
|
|
|
|
EnforceSigningKeyValidity: false,
|
|
|
|
},
|
|
|
|
RoomVersionV2: RoomVersionDescription{
|
|
|
|
Supported: false,
|
|
|
|
Stable: true,
|
|
|
|
StateResolution: state.StateResolutionAlgorithmV2,
|
|
|
|
EventFormat: EventFormatV1,
|
|
|
|
EnforceSigningKeyValidity: false,
|
|
|
|
},
|
|
|
|
RoomVersionV3: RoomVersionDescription{
|
|
|
|
Supported: false,
|
|
|
|
Stable: true,
|
|
|
|
StateResolution: state.StateResolutionAlgorithmV2,
|
|
|
|
EventFormat: EventFormatV2,
|
|
|
|
EnforceSigningKeyValidity: false,
|
|
|
|
},
|
|
|
|
RoomVersionV4: RoomVersionDescription{
|
|
|
|
Supported: false,
|
|
|
|
Stable: true,
|
|
|
|
StateResolution: state.StateResolutionAlgorithmV2,
|
|
|
|
EventFormat: EventFormatV3,
|
|
|
|
EnforceSigningKeyValidity: false,
|
|
|
|
},
|
|
|
|
RoomVersionV5: RoomVersionDescription{
|
|
|
|
Supported: false,
|
|
|
|
Stable: true,
|
|
|
|
StateResolution: state.StateResolutionAlgorithmV2,
|
|
|
|
EventFormat: EventFormatV3,
|
|
|
|
EnforceSigningKeyValidity: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2020-02-05 12:06:39 -06:00
|
|
|
func GetDefaultRoomVersion() RoomVersionID {
|
|
|
|
return RoomVersionV1
|
|
|
|
}
|
|
|
|
|
2020-02-05 10:25:58 -06:00
|
|
|
func GetRoomVersions() map[RoomVersionID]RoomVersionDescription {
|
|
|
|
return roomVersions
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetSupportedRoomVersions() map[RoomVersionID]RoomVersionDescription {
|
|
|
|
versions := make(map[RoomVersionID]RoomVersionDescription)
|
|
|
|
for id, version := range GetRoomVersions() {
|
|
|
|
if version.Supported {
|
|
|
|
versions[id] = version
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return versions
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetSupportedRoomVersion(version RoomVersionID) (desc RoomVersionDescription, err error) {
|
|
|
|
if version, ok := roomVersions[version]; ok {
|
|
|
|
desc = version
|
|
|
|
}
|
|
|
|
if !desc.Supported {
|
|
|
|
err = errors.New("unsupported room version")
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|