Fix room aliases

This commit is contained in:
nxshock 2019-08-08 19:38:30 +05:00
parent f8b9591af0
commit 3bbb8b19a8
6 changed files with 69 additions and 6 deletions

View File

@ -28,6 +28,7 @@ type Room interface {
Creator() User Creator() User
Users() []User Users() []User
AliasName() string AliasName() string
Aliases() []string
Name() string Name() string
Topic() string Topic() string
Visibility() createroom.VisibilityType Visibility() createroom.VisibilityType

View File

@ -156,8 +156,7 @@ func (backend *Backend) GetRoomByAlias(alias string) internal.Room {
backend.mutex.RLock() backend.mutex.RLock()
defer backend.mutex.RUnlock() defer backend.mutex.RUnlock()
alias = strings.TrimPrefix(alias, "#") // TODO: create strip alias func alias = internal.StripAlias(backend.hostname, alias)
alias = strings.TrimSuffix(alias, ":"+backend.hostname)
if room, exists := backend.roomAliases[alias]; exists { if room, exists := backend.roomAliases[alias]; exists {
return room return room

View File

@ -48,6 +48,20 @@ func (room *Room) AliasName() string {
return room.aliasName return room.aliasName
} }
func (room *Room) Aliases() []string {
room.server.mutex.RLock()
defer room.server.mutex.RUnlock()
var aliases []string
for alias, serverRoom := range room.server.roomAliases {
if serverRoom.ID() == room.ID() {
aliases = append(aliases, "#"+alias+":"+room.server.hostname)
}
}
return aliases
}
func (room *Room) Topic() string { func (room *Room) Topic() string {
room.mutex.RLock() room.mutex.RLock()
defer room.mutex.RUnlock() defer room.mutex.RUnlock()

View File

@ -572,7 +572,7 @@ func roomAliasHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
room := currServer.Backend.GetRoomByAlias(roomAlias) room := currServer.Backend.GetRoomByAlias(StripAlias(currServer.Address, roomAlias))
if room == nil { if room == nil {
errorResponse(w, models.M_NOT_FOUND, http.StatusNotFound, "room not found") errorResponse(w, models.M_NOT_FOUND, http.StatusNotFound, "room not found")
return return
@ -597,7 +597,7 @@ func roomAliasHandler(w http.ResponseWriter, r *http.Request) {
response = struct{}{} response = struct{}{}
case http.MethodDelete: case http.MethodDelete:
err := user.DeleteRoomAlias(roomAlias) err := user.DeleteRoomAlias(StripAlias(currServer.Address, roomAlias))
if err != nil { if err != nil {
errorResponse(w, err, http.StatusConflict, "") // TODO: check http code errorResponse(w, err, http.StatusConflict, "") // TODO: check http code
return return

View File

@ -1,13 +1,28 @@
package internal package internal
import "github.com/signaller-matrix/signaller/internal/models/publicrooms" import (
"strings"
"github.com/signaller-matrix/signaller/internal/models/publicrooms"
)
func GetCanonicalAlias(hostName string, alias string) string {
return "#" + alias + ":" + hostName
}
func StripAlias(hostName string, canonicalAlias string) string {
canonicalAlias = strings.TrimPrefix(canonicalAlias, "#")
canonicalAlias = strings.TrimSuffix(canonicalAlias, ":"+hostName)
return canonicalAlias
}
func roomsToPublicRoomsChunks(rooms []Room) []publicrooms.PublicRoomsChunk { func roomsToPublicRoomsChunks(rooms []Room) []publicrooms.PublicRoomsChunk {
var chunks []publicrooms.PublicRoomsChunk var chunks []publicrooms.PublicRoomsChunk
for _, room := range rooms { for _, room := range rooms {
chunk := publicrooms.PublicRoomsChunk{ chunk := publicrooms.PublicRoomsChunk{
// TODO: Aliases: Aliases: room.Aliases(),
CanonicalAlias: room.AliasName(), CanonicalAlias: room.AliasName(),
Name: room.Name(), Name: room.Name(),
NumJoinedMembers: len(room.Users()), NumJoinedMembers: len(room.Users()),

34
internal/utils_test.go Normal file
View File

@ -0,0 +1,34 @@
package internal
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestGetCanonicalAlias(t *testing.T) {
tests := []struct {
hostname string
alias string
expected string
}{{"host.com", "alias", "#alias:host.com"}}
for _, test := range tests {
got := GetCanonicalAlias(test.hostname, test.alias)
assert.Equal(t, test.expected, got)
}
}
func TestStripAlias(t *testing.T) {
tests := []struct {
hostname string
canonicalAlias string
expected string
}{{"host.com", "#alias:host.com", "alias"}}
for _, test := range tests {
got := StripAlias(test.hostname, test.canonicalAlias)
assert.Equal(t, test.expected, got)
}
}