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 {
}
func Add(name string, desc *description) (*Group, error) {
if name == "" || strings.HasSuffix(name, "/") {
return nil, UserError("illegal group name")
}
groups.mu.Lock()
defer groups.mu.Unlock()
......
......@@ -3,11 +3,11 @@ package rtpconn
import (
"encoding/json"
"errors"
"fmt"
"log"
"os"
"sync"
"time"
"fmt"
"github.com/gorilla/websocket"
"github.com/pion/webrtc/v3"
......@@ -1031,13 +1031,18 @@ func handleClientMessage(c *webClient, m clientMessage) error {
c.password = m.Password
g, err := group.AddClient(m.Group, c)
if err != nil {
var s string
if os.IsNotExist(err) {
return c.error(
group.UserError("group does not exist"),
)
s = "group does not exist"
} else if err == group.ErrNotAuthorised {
s = "not authorised"
time.Sleep(200 * time.Millisecond)
s := "not authorised"
} else if e, ok := err.(group.UserError); ok {
s = string(e)
} else {
s = "internal server error"
log.Printf("Join group: %v")
}
return c.write(clientMessage{
Type: "joined",
Kind: "fail",
......@@ -1046,14 +1051,16 @@ func handleClientMessage(c *webClient, m clientMessage) error {
Value: &s,
})
}
return err
}
if redirect := g.Redirect(); redirect != "" {
// We normally redirect at the HTTP level, but the group
// description could have been edited in the meantime.
return c.error(
group.UserError("group is now at " + redirect),
)
return c.write(clientMessage{
Type: "joined",
Kind: "redirect",
Group: m.Group,
Permissions: &group.ClientPermissions{},
Value: &redirect,
})
}
c.group = g
perms := c.permissions
......
......@@ -271,7 +271,7 @@ function setConnected(connected) {
userpass ? userpass.password : '';
userbox.classList.add('invisible');
connectionbox.classList.remove('invisible');
displayError("Disconnected!", "error");
displayError('Disconnected', 'error');
hideVideo();
closeVideoControls();
}
......@@ -1425,25 +1425,39 @@ let presentRequested = null;
* @param {Object<string,boolean>} perms
*/
async function gotJoined(kind, group, perms, message) {
if(kind === 'fail') {
let present = presentRequested;
presentRequested = null;
switch(kind) {
case 'fail':
displayError('The server said: ' + message);
this.close();
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();
setButtonsVisibility();
if(kind !== 'leave')
this.request(getSettings().request);
try {
if(kind === 'join' &&
serverConnection.permissions.present && !findUpMedia('local')) {
if(presentRequested) {
if(presentRequested === 'mike')
if(serverConnection.permissions.present && !findUpMedia('local')) {
if(present) {
if(present === 'mike')
updateSettings({video: ''});
else if(presentRequested === 'both')
else if(present === 'both')
delSetting('video');
reflectSettings();
......@@ -1456,13 +1470,10 @@ async function gotJoined(kind, group, perms, message) {
}
} else {
displayMessage(
"Press Present to enable your camera or microphone"
"Press Ready to enable your camera or microphone"
);
}
}
} finally {
presentRequested = null;
}
}
const urlRegexp = /https?:\/\/[-a-zA-Z0-9@:%/._\\+~#&()=?]+[-a-zA-Z0-9@:%/_\\+~#&()=]/g;
......
......@@ -243,6 +243,12 @@ func groupHandler(w http.ResponseWriter, r *http.Request) {
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)
if err != nil {
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