Commit b134bfcf authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Improve error handling on join failure.

Solves the issue of groups with a name ending in "/".
parent e3098899
...@@ -159,6 +159,10 @@ func (g *Group) API() *webrtc.API { ...@@ -159,6 +159,10 @@ func (g *Group) API() *webrtc.API {
} }
func Add(name string, desc *description) (*Group, error) { func Add(name string, desc *description) (*Group, error) {
if name == "" || strings.HasSuffix(name, "/") {
return nil, UserError("illegal group name")
}
groups.mu.Lock() groups.mu.Lock()
defer groups.mu.Unlock() defer groups.mu.Unlock()
......
...@@ -3,11 +3,11 @@ package rtpconn ...@@ -3,11 +3,11 @@ package rtpconn
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"log" "log"
"os" "os"
"sync" "sync"
"time" "time"
"fmt"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/pion/webrtc/v3" "github.com/pion/webrtc/v3"
...@@ -1031,29 +1031,36 @@ func handleClientMessage(c *webClient, m clientMessage) error { ...@@ -1031,29 +1031,36 @@ func handleClientMessage(c *webClient, m clientMessage) error {
c.password = m.Password c.password = m.Password
g, err := group.AddClient(m.Group, c) g, err := group.AddClient(m.Group, c)
if err != nil { if err != nil {
var s string
if os.IsNotExist(err) { if os.IsNotExist(err) {
return c.error( s = "group does not exist"
group.UserError("group does not exist"),
)
} else if err == group.ErrNotAuthorised { } else if err == group.ErrNotAuthorised {
s = "not authorised"
time.Sleep(200 * time.Millisecond) time.Sleep(200 * time.Millisecond)
s := "not authorised" } else if e, ok := err.(group.UserError); ok {
return c.write(clientMessage{ s = string(e)
Type: "joined", } else {
Kind: "fail", s = "internal server error"
Group: m.Group, log.Printf("Join group: %v")
Permissions: &group.ClientPermissions{},
Value: &s,
})
} }
return err return c.write(clientMessage{
Type: "joined",
Kind: "fail",
Group: m.Group,
Permissions: &group.ClientPermissions{},
Value: &s,
})
} }
if redirect := g.Redirect(); redirect != "" { if redirect := g.Redirect(); redirect != "" {
// We normally redirect at the HTTP level, but the group // We normally redirect at the HTTP level, but the group
// description could have been edited in the meantime. // description could have been edited in the meantime.
return c.error( return c.write(clientMessage{
group.UserError("group is now at " + redirect), Type: "joined",
) Kind: "redirect",
Group: m.Group,
Permissions: &group.ClientPermissions{},
Value: &redirect,
})
} }
c.group = g c.group = g
perms := c.permissions perms := c.permissions
...@@ -1264,11 +1271,11 @@ func handleClientMessage(c *webClient, m clientMessage) error { ...@@ -1264,11 +1271,11 @@ func handleClientMessage(c *webClient, m clientMessage) error {
sg.Name, sg.Clients, plural) sg.Name, sg.Clients, plural)
} }
c.write(clientMessage{ c.write(clientMessage{
Type: "chat", Type: "chat",
Dest: c.id, Dest: c.id,
Username: "Server", Username: "Server",
Time: group.ToJSTime(time.Now()), Time: group.ToJSTime(time.Now()),
Value: &s, Value: &s,
}) })
default: default:
return group.ProtocolError("unknown group action") return group.ProtocolError("unknown group action")
......
...@@ -271,7 +271,7 @@ function setConnected(connected) { ...@@ -271,7 +271,7 @@ function setConnected(connected) {
userpass ? userpass.password : ''; userpass ? userpass.password : '';
userbox.classList.add('invisible'); userbox.classList.add('invisible');
connectionbox.classList.remove('invisible'); connectionbox.classList.remove('invisible');
displayError("Disconnected!", "error"); displayError('Disconnected', 'error');
hideVideo(); hideVideo();
closeVideoControls(); closeVideoControls();
} }
...@@ -1425,43 +1425,54 @@ let presentRequested = null; ...@@ -1425,43 +1425,54 @@ let presentRequested = null;
* @param {Object<string,boolean>} perms * @param {Object<string,boolean>} perms
*/ */
async function gotJoined(kind, group, perms, message) { async function gotJoined(kind, group, perms, message) {
if(kind === 'fail') { let present = presentRequested;
presentRequested = null;
switch(kind) {
case 'fail':
displayError('The server said: ' + message); displayError('The server said: ' + message);
this.close(); this.close();
return; return;
case 'redirect':
this.close();
document.location = message;
return;
case 'leave':
this.close();
return;
case 'join':
break;
default:
displayError('Unknown join message');
this.close();
return;
} }
displayUsername(); displayUsername();
setButtonsVisibility(); setButtonsVisibility();
if(kind !== 'leave') this.request(getSettings().request);
this.request(getSettings().request);
if(serverConnection.permissions.present && !findUpMedia('local')) {
try { if(present) {
if(kind === 'join' && if(present === 'mike')
serverConnection.permissions.present && !findUpMedia('local')) { updateSettings({video: ''});
if(presentRequested) { else if(present === 'both')
if(presentRequested === 'mike') delSetting('video');
updateSettings({video: ''}); reflectSettings();
else if(presentRequested === 'both')
delSetting('video'); let button = getButtonElement('presentbutton');
reflectSettings(); button.disabled = true;
try {
let button = getButtonElement('presentbutton'); await addLocalMedia();
button.disabled = true; } finally {
try { button.disabled = false;
await addLocalMedia();
} finally {
button.disabled = false;
}
} else {
displayMessage(
"Press Present to enable your camera or microphone"
);
} }
} else {
displayMessage(
"Press Ready to enable your camera or microphone"
);
} }
} finally {
presentRequested = null;
} }
} }
......
...@@ -243,6 +243,12 @@ func groupHandler(w http.ResponseWriter, r *http.Request) { ...@@ -243,6 +243,12 @@ func groupHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
if strings.HasSuffix(r.URL.Path, "/") {
http.Redirect(w, r, r.URL.Path[:len(r.URL.Path)-1],
http.StatusPermanentRedirect)
return
}
g, err := group.Add(name, nil) g, err := group.Add(name, nil)
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment