Allow user to specify name of controlled room
This commit is contained in:
parent
cbf509b057
commit
b47c8a00b3
@ -416,16 +416,16 @@ class SyncplayClient(object):
|
|||||||
if promptForAction:
|
if promptForAction:
|
||||||
self.ui.promptFor(getMessage("enter-to-exit-prompt"))
|
self.ui.promptFor(getMessage("enter-to-exit-prompt"))
|
||||||
|
|
||||||
def createControlledRoom(self):
|
def createControlledRoom(self, roomName):
|
||||||
controlPassword = RoomPasswordGenerator.generate_password()
|
controlPassword = RoomPasswordGenerator.generate_password()
|
||||||
self.ui.showMessage(u"Attempting to create controlled room suffix with password '{}'...".format(controlPassword))
|
self.ui.showMessage(u"Attempting to create controlled room '{}' with password '{}'...".format(roomName, controlPassword))
|
||||||
self._protocol.requestControlledRoom(controlPassword)
|
self._protocol.requestControlledRoom(roomName, controlPassword)
|
||||||
|
|
||||||
def controlledRoomCreated(self, controlPassword, roomName):
|
def controlledRoomCreated(self, roomName, controlPassword):
|
||||||
self.ui.showMessage(u"Created controlled room suffix '{}' with password '{}'. Please save this information for future reference!".format(roomName, controlPassword))
|
self.ui.showMessage(u"Created controlled room '{}' with password '{}'. Please save this information for future reference!".format(roomName, controlPassword))
|
||||||
self.setRoom(roomName)
|
self.setRoom(roomName)
|
||||||
self.sendRoom()
|
self.sendRoom()
|
||||||
self._protocol.requestControlledRoom(controlPassword)
|
self._protocol.requestControlledRoom(roomName, controlPassword)
|
||||||
self.ui.updateRoomName(roomName)
|
self.ui.updateRoomName(roomName)
|
||||||
|
|
||||||
def stripControlPassword(self, controlPassword):
|
def stripControlPassword(self, controlPassword):
|
||||||
@ -437,7 +437,7 @@ class SyncplayClient(object):
|
|||||||
def identifyAsController(self, controlPassword):
|
def identifyAsController(self, controlPassword):
|
||||||
controlPassword = self.stripControlPassword(controlPassword)
|
controlPassword = self.stripControlPassword(controlPassword)
|
||||||
self.ui.showMessage(u"Identifying as room controller with password '{}'...".format(controlPassword))
|
self.ui.showMessage(u"Identifying as room controller with password '{}'...".format(controlPassword))
|
||||||
self._protocol.requestControlledRoom(controlPassword)
|
self._protocol.requestControlledRoom(self.getRoom(), controlPassword)
|
||||||
|
|
||||||
def controllerIdentificationError(self, username, room):
|
def controllerIdentificationError(self, username, room):
|
||||||
self.ui.showErrorMessage(u"<{}> failed to identify as a room controller.".format(username))
|
self.ui.showErrorMessage(u"<{}> failed to identify as a room controller.".format(username))
|
||||||
|
|||||||
@ -41,6 +41,7 @@ SYNC_ON_PAUSE = True # Client seek to global position - subtitles may disappear
|
|||||||
#Usually there's no need to adjust these
|
#Usually there's no need to adjust these
|
||||||
FILENAME_STRIP_REGEX = u"[-~_\.\[\](): ]"
|
FILENAME_STRIP_REGEX = u"[-~_\.\[\](): ]"
|
||||||
CONTROL_PASSWORD_STRIP_REGEX = u"[^a-zA-Z0-9\-]"
|
CONTROL_PASSWORD_STRIP_REGEX = u"[^a-zA-Z0-9\-]"
|
||||||
|
ROOM_NAME_STRIP_REGEX = u"^(\+)(?P<roomnamebase>.*)(:)(\w{12})$"
|
||||||
COMMANDS_UNDO = ["u", "undo", "revert"]
|
COMMANDS_UNDO = ["u", "undo", "revert"]
|
||||||
COMMANDS_LIST = ["l", "list", "users"]
|
COMMANDS_LIST = ["l", "list", "users"]
|
||||||
COMMANDS_PAUSE = ["p", "play", "pause"]
|
COMMANDS_PAUSE = ["p", "play", "pause"]
|
||||||
|
|||||||
@ -53,7 +53,7 @@ en = {
|
|||||||
"commandlist-notification/pause" : "\tp - toggle pause",
|
"commandlist-notification/pause" : "\tp - toggle pause",
|
||||||
"commandlist-notification/seek" : "\t[s][+-]time - seek to the given value of time, if + or - is not specified it's absolute time in seconds or min:sec",
|
"commandlist-notification/seek" : "\t[s][+-]time - seek to the given value of time, if + or - is not specified it's absolute time in seconds or min:sec",
|
||||||
"commandlist-notification/help" : "\th - this help",
|
"commandlist-notification/help" : "\th - this help",
|
||||||
"commandlist-notification/create" : "\tc - create controlled room using name of current room",
|
"commandlist-notification/create" : "\tc [name] - create controlled room using name of current room",
|
||||||
"commandlist-notification/auth" : "\ta [password] - authenticate as room controller with controller password",
|
"commandlist-notification/auth" : "\ta [password] - authenticate as room controller with controller password",
|
||||||
"syncplay-version-notification" : "Syncplay version: {}", # syncplay.version
|
"syncplay-version-notification" : "Syncplay version: {}", # syncplay.version
|
||||||
"more-info-notification" : "More info available at: {}", # projectURL
|
"more-info-notification" : "More info available at: {}", # projectURL
|
||||||
|
|||||||
@ -126,7 +126,7 @@ class SyncClientProtocol(JSONCommandProtocol):
|
|||||||
elif command == "newControlledRoom":
|
elif command == "newControlledRoom":
|
||||||
controlPassword = values['password']
|
controlPassword = values['password']
|
||||||
roomName = values['roomName']
|
roomName = values['roomName']
|
||||||
self._client.controlledRoomCreated(controlPassword, roomName)
|
self._client.controlledRoomCreated(roomName, controlPassword)
|
||||||
|
|
||||||
def sendSet(self, setting):
|
def sendSet(self, setting):
|
||||||
self.sendMessage({"Set": setting})
|
self.sendMessage({"Set": setting})
|
||||||
@ -217,9 +217,10 @@ class SyncClientProtocol(JSONCommandProtocol):
|
|||||||
state["ignoringOnTheFly"]["client"] = self.clientIgnoringOnTheFly
|
state["ignoringOnTheFly"]["client"] = self.clientIgnoringOnTheFly
|
||||||
self.sendMessage({"State": state})
|
self.sendMessage({"State": state})
|
||||||
|
|
||||||
def requestControlledRoom(self, password):
|
def requestControlledRoom(self, room, password):
|
||||||
self.sendSet({
|
self.sendSet({
|
||||||
"controllerAuth": {
|
"controllerAuth": {
|
||||||
|
"room": room,
|
||||||
"password": password
|
"password": password
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -325,7 +326,8 @@ class SyncServerProtocol(JSONCommandProtocol):
|
|||||||
self._watcher.setFile(set_[1])
|
self._watcher.setFile(set_[1])
|
||||||
elif command == "controllerAuth":
|
elif command == "controllerAuth":
|
||||||
password = set_[1]["password"] if set_[1].has_key("password") else None
|
password = set_[1]["password"] if set_[1].has_key("password") else None
|
||||||
self._factory.authRoomController(self._watcher, password)
|
room = set_[1]["room"] if set_[1].has_key("room") else None
|
||||||
|
self._factory.authRoomController(self._watcher, password, room)
|
||||||
|
|
||||||
def sendSet(self, setting):
|
def sendSet(self, setting):
|
||||||
self.sendMessage({"Set": setting})
|
self.sendMessage({"Set": setting})
|
||||||
|
|||||||
@ -109,15 +109,16 @@ class SyncFactory(Factory):
|
|||||||
def getAllWatchersForUser(self, forUser):
|
def getAllWatchersForUser(self, forUser):
|
||||||
return self._roomManager.getAllWatchersForUser(forUser)
|
return self._roomManager.getAllWatchersForUser(forUser)
|
||||||
|
|
||||||
def authRoomController(self, watcher, password):
|
def authRoomController(self, watcher, password, roomBaseName=None):
|
||||||
room = watcher.getRoom()
|
room = watcher.getRoom()
|
||||||
|
roomName = roomBaseName if roomBaseName else room.getName()
|
||||||
try:
|
try:
|
||||||
success = RoomPasswordProvider.check(room.getName(), password, self._salt)
|
success = RoomPasswordProvider.check(roomName, password, self._salt)
|
||||||
if success:
|
if success:
|
||||||
watcher.getRoom().addController(watcher)
|
watcher.getRoom().addController(watcher)
|
||||||
self._roomManager.broadcast(watcher, lambda w: w.sendControlledRoomAuthStatus(success, watcher.getName(), room._name))
|
self._roomManager.broadcast(watcher, lambda w: w.sendControlledRoomAuthStatus(success, watcher.getName(), room._name))
|
||||||
except NotControlledRoom:
|
except NotControlledRoom:
|
||||||
newName = RoomPasswordProvider.getControlledRoomName(room.getName(), password, self._salt)
|
newName = RoomPasswordProvider.getControlledRoomName(roomName, password, self._salt)
|
||||||
watcher.sendNewControlledRoom(newName, password)
|
watcher.sendNewControlledRoom(newName, password)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name))
|
self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name))
|
||||||
@ -343,8 +344,8 @@ class Watcher(object):
|
|||||||
def sendSetting(self, user, room, file_, event):
|
def sendSetting(self, user, room, file_, event):
|
||||||
self._connector.sendUserSetting(user, room, file_, event)
|
self._connector.sendUserSetting(user, room, file_, event)
|
||||||
|
|
||||||
def sendNewControlledRoom(self, roomName, password):
|
def sendNewControlledRoom(self, roomBaseName, password):
|
||||||
self._connector.sendNewControlledRoom(roomName, password)
|
self._connector.sendNewControlledRoom(roomBaseName, password)
|
||||||
|
|
||||||
def sendControlledRoomAuthStatus(self, success, username, room):
|
def sendControlledRoomAuthStatus(self, success, username, room):
|
||||||
self._connector.sendControlledRoomAuthStatus(success, username, room)
|
self._connector.sendControlledRoomAuthStatus(success, username, room)
|
||||||
|
|||||||
@ -144,7 +144,11 @@ class ConsoleUI(threading.Thread):
|
|||||||
self._syncplayClient.setRoom(room)
|
self._syncplayClient.setRoom(room)
|
||||||
self._syncplayClient.sendRoom()
|
self._syncplayClient.sendRoom()
|
||||||
elif command.group('command') in constants.COMMANDS_CREATE:
|
elif command.group('command') in constants.COMMANDS_CREATE:
|
||||||
self._syncplayClient.createControlledRoom()
|
roombasename = command.group('parameter')
|
||||||
|
if roombasename == None:
|
||||||
|
roombasename = self._syncplayClient.getRoom()
|
||||||
|
roombasename = utils.stripRoomName(roombasename)
|
||||||
|
self._syncplayClient.createControlledRoom(roombasename)
|
||||||
elif command.group('command') in constants.COMMANDS_AUTH:
|
elif command.group('command') in constants.COMMANDS_AUTH:
|
||||||
controlpassword = command.group('parameter')
|
controlpassword = command.group('parameter')
|
||||||
self._syncplayClient.identifyAsController(controlpassword)
|
self._syncplayClient.identifyAsController(controlpassword)
|
||||||
|
|||||||
@ -275,7 +275,11 @@ class MainWindow(QtGui.QMainWindow):
|
|||||||
self._syncplayClient._player.openFile(fileName)
|
self._syncplayClient._player.openFile(fileName)
|
||||||
|
|
||||||
def createControlledRoom(self):
|
def createControlledRoom(self):
|
||||||
self._syncplayClient.createControlledRoom()
|
controlroom, ok = QtGui.QInputDialog.getText(self, "Create controlled room",
|
||||||
|
"Enter name of controlled room\r\n(see http://syncplay.pl/guide/ for usage instructions):", QtGui.QLineEdit.Normal,
|
||||||
|
utils.stripRoomName(self._syncplayClient.getRoom()))
|
||||||
|
if ok and controlroom != '':
|
||||||
|
self._syncplayClient.createControlledRoom(controlroom)
|
||||||
|
|
||||||
def identifyAsController(self):
|
def identifyAsController(self):
|
||||||
tooltip = "Enter controller password for this room\r\n(see http://syncplay.pl/guide/ for usage instructions):"
|
tooltip = "Enter controller password for this room\r\n(see http://syncplay.pl/guide/ for usage instructions):"
|
||||||
|
|||||||
@ -141,7 +141,19 @@ def blackholeStdoutForFrozenWindow():
|
|||||||
# Relate to file hashing / difference checking:
|
# Relate to file hashing / difference checking:
|
||||||
|
|
||||||
def stripfilename(filename):
|
def stripfilename(filename):
|
||||||
return re.sub(constants.FILENAME_STRIP_REGEX, "", filename)
|
if filename:
|
||||||
|
return re.sub(constants.FILENAME_STRIP_REGEX, "", filename)
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def stripRoomName(RoomName):
|
||||||
|
if RoomName:
|
||||||
|
try:
|
||||||
|
return re.sub(constants.ROOM_NAME_STRIP_REGEX, "\g<roomnamebase>", RoomName)
|
||||||
|
except IndexError:
|
||||||
|
return RoomName
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
def hashFilename(filename):
|
def hashFilename(filename):
|
||||||
return hashlib.sha256(stripfilename(filename).encode('utf-8')).hexdigest()[:12]
|
return hashlib.sha256(stripfilename(filename).encode('utf-8')).hexdigest()[:12]
|
||||||
@ -196,6 +208,8 @@ class RoomPasswordProvider(object):
|
|||||||
if not password or not re.match(RoomPasswordProvider.PASSWORD_REGEX, password):
|
if not password or not re.match(RoomPasswordProvider.PASSWORD_REGEX, password):
|
||||||
raise ValueError()
|
raise ValueError()
|
||||||
|
|
||||||
|
if not roomName:
|
||||||
|
raise NotControlledRoom()
|
||||||
match = re.match(RoomPasswordProvider.CONTROLLED_ROOM_REGEX, roomName)
|
match = re.match(RoomPasswordProvider.CONTROLLED_ROOM_REGEX, roomName)
|
||||||
if not match:
|
if not match:
|
||||||
raise NotControlledRoom()
|
raise NotControlledRoom()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user