Complete icon and ssl change code

This commit is contained in:
Tim Bentley 2014-04-18 21:29:52 +01:00
parent f04c47c9c9
commit 25687dfd48
4 changed files with 82 additions and 48 deletions

View File

@ -149,11 +149,11 @@ class HttpRouter(RegistryProperties):
""" """
Initialise the router stack and any other variables. Initialise the router stack and any other variables.
""" """
authcode = "%s:%s" % (Settings().value('remotes/user id'), Settings().value('remotes/password')) auth_code = "%s:%s" % (Settings().value('remotes/user id'), Settings().value('remotes/password'))
try: try:
self.auth = base64.b64encode(authcode) self.auth = base64.b64encode(auth_code)
except TypeError: except TypeError:
self.auth = base64.b64encode(authcode.encode()).decode() self.auth = base64.b64encode(auth_code.encode()).decode()
self.routes = [ self.routes = [
('^/$', {'function': self.serve_file, 'secure': False}), ('^/$', {'function': self.serve_file, 'secure': False}),
('^/(stage)$', {'function': self.serve_file, 'secure': False}), ('^/(stage)$', {'function': self.serve_file, 'secure': False}),
@ -376,7 +376,6 @@ class HttpRouter(RegistryProperties):
Examines the extension of the file and determines what the content_type should be, defaults to text/plain Examines the extension of the file and determines what the content_type should be, defaults to text/plain
Returns the extension and the content_type Returns the extension and the content_type
""" """
content_type = 'text/plain'
ext = os.path.splitext(file_name)[1] ext = os.path.splitext(file_name)[1]
content_type = FILE_TYPES.get(ext, 'text/plain') content_type = FILE_TYPES.get(ext, 'text/plain')
return ext, content_type return ext, content_type
@ -439,7 +438,7 @@ class HttpRouter(RegistryProperties):
if plugin.status == PluginStatus.Active: if plugin.status == PluginStatus.Active:
try: try:
text = json.loads(self.request_data)['request']['text'] text = json.loads(self.request_data)['request']['text']
except KeyError as ValueError: except KeyError:
return self.do_http_error() return self.do_http_error()
text = urllib.parse.unquote(text) text = urllib.parse.unquote(text)
self.alerts_manager.emit(QtCore.SIGNAL('alerts_text'), [text]) self.alerts_manager.emit(QtCore.SIGNAL('alerts_text'), [text])
@ -488,7 +487,7 @@ class HttpRouter(RegistryProperties):
if self.request_data: if self.request_data:
try: try:
data = json.loads(self.request_data)['request']['id'] data = json.loads(self.request_data)['request']['id']
except KeyError as ValueError: except KeyError:
return self.do_http_error() return self.do_http_error()
log.info(data) log.info(data)
# This slot expects an int within a list. # This slot expects an int within a list.
@ -547,7 +546,7 @@ class HttpRouter(RegistryProperties):
""" """
try: try:
text = json.loads(self.request_data)['request']['text'] text = json.loads(self.request_data)['request']['text']
except KeyError as ValueError: except KeyError:
return self.do_http_error() return self.do_http_error()
text = urllib.parse.unquote(text) text = urllib.parse.unquote(text)
plugin = self.plugin_manager.get_plugin_by_name(plugin_name) plugin = self.plugin_manager.get_plugin_by_name(plugin_name)
@ -563,12 +562,12 @@ class HttpRouter(RegistryProperties):
Go live on an item of type ``plugin``. Go live on an item of type ``plugin``.
""" """
try: try:
id = json.loads(self.request_data)['request']['id'] request_id = json.loads(self.request_data)['request']['id']
except KeyError as ValueError: except KeyError:
return self.do_http_error() return self.do_http_error()
plugin = self.plugin_manager.get_plugin_by_name(plugin_name) plugin = self.plugin_manager.get_plugin_by_name(plugin_name)
if plugin.status == PluginStatus.Active and plugin.media_item: if plugin.status == PluginStatus.Active and plugin.media_item:
plugin.media_item.emit(QtCore.SIGNAL('%s_go_live' % plugin_name), [id, True]) plugin.media_item.emit(QtCore.SIGNAL('%s_go_live' % plugin_name), [request_id, True])
return self.do_http_success() return self.do_http_success()
def add_to_service(self, plugin_name): def add_to_service(self, plugin_name):
@ -576,11 +575,11 @@ class HttpRouter(RegistryProperties):
Add item of type ``plugin_name`` to the end of the service. Add item of type ``plugin_name`` to the end of the service.
""" """
try: try:
id = json.loads(self.request_data)['request']['id'] request_id = json.loads(self.request_data)['request']['id']
except KeyError as ValueError: except KeyError:
return self.do_http_error() return self.do_http_error()
plugin = self.plugin_manager.get_plugin_by_name(plugin_name) plugin = self.plugin_manager.get_plugin_by_name(plugin_name)
if plugin.status == PluginStatus.Active and plugin.media_item: if plugin.status == PluginStatus.Active and plugin.media_item:
item_id = plugin.media_item.create_item_from_id(id) item_id = plugin.media_item.create_item_from_id(request_id)
plugin.media_item.emit(QtCore.SIGNAL('%s_add_to_service' % plugin_name), [item_id, True]) plugin.media_item.emit(QtCore.SIGNAL('%s_add_to_service' % plugin_name), [item_id, True])
self.do_http_success() self.do_http_success()

View File

@ -38,10 +38,9 @@ import os
import logging import logging
import time import time
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore
from openlp.core.common import AppLocation, Settings, RegistryProperties from openlp.core.common import AppLocation, Settings, RegistryProperties
from openlp.core.lib import build_icon
from openlp.plugins.remotes.lib import HttpRouter from openlp.plugins.remotes.lib import HttpRouter
@ -72,7 +71,21 @@ class CustomHandler(BaseHTTPRequestHandler, HttpRouter):
self.do_post_processor() self.do_post_processor()
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): class StoppableHttpServer(HTTPServer):
"""
Http server that reacts to self.stop flag
"""
def serve_forever(self):
"""
Handle one request at a time until stopped.
"""
self.stop = False
while not self.stop:
self.handle_request()
class ThreadingHTTPServer(ThreadingMixIn, StoppableHttpServer):
pass pass
@ -95,6 +108,10 @@ class HttpThread(QtCore.QThread):
""" """
self.http_server.start_server() self.http_server.start_server()
def stop(self):
log.debug("stop called")
self.http_server.stop = True
class OpenLPServer(RegistryProperties): class OpenLPServer(RegistryProperties):
def __init__(self): def __init__(self):
@ -112,25 +129,19 @@ class OpenLPServer(RegistryProperties):
Start the correct server and save the handler Start the correct server and save the handler
""" """
address = Settings().value(self.settings_section + '/ip address') address = Settings().value(self.settings_section + '/ip address')
if Settings().value(self.settings_section + '/https enabled'): self.address = address
self.is_secure = Settings().value(self.settings_section + '/https enabled')
self.needs_authentication = Settings().value(self.settings_section + '/authentication enabled')
if self.is_secure:
port = Settings().value(self.settings_section + '/https port') port = Settings().value(self.settings_section + '/https port')
self.port = port
self.start_server_instance(address, port, HTTPSServer) self.start_server_instance(address, port, HTTPSServer)
else: else:
port = Settings().value(self.settings_section + '/port') port = Settings().value(self.settings_section + '/port')
self.port = port
self.start_server_instance(address, port, ThreadingHTTPServer) self.start_server_instance(address, port, ThreadingHTTPServer)
if hasattr(self, 'httpd') and self.httpd: if hasattr(self, 'httpd') and self.httpd:
self.httpd.serve_forever() self.httpd.serve_forever()
icon = QtGui.QImage(':/remote/network_server.png')
icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
overlay = QtGui.QImage(':/remote/network_ssl.png')
overlay = overlay.scaled(40, 40, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(icon)
painter.drawImage(0, 0, overlay)
painter.end()
print("Hi")
self.default_theme_label.setText("hello")
self.default_theme_label.setIcon(build_icon(icon))
self.default_theme_label.show()
else: else:
log.debug('Failed to start server') log.debug('Failed to start server')
@ -149,7 +160,7 @@ class OpenLPServer(RegistryProperties):
log.debug("Server started for class %s %s %d" % (server_class, address, port)) log.debug("Server started for class %s %s %d" % (server_class, address, port))
except OSError: except OSError:
log.debug("failed to start http server thread state %d %s" % log.debug("failed to start http server thread state %d %s" %
(loop, self.http_thread.isRunning() is True)) (loop, self.http_thread.isRunning()))
loop += 1 loop += 1
time.sleep(0.1) time.sleep(0.1)
except: except:
@ -159,12 +170,13 @@ class OpenLPServer(RegistryProperties):
""" """
Stop the server Stop the server
""" """
self.http_thread.exit(0) if self.http_thread.isRunning():
self.http_thread.stop()
self.httpd = None self.httpd = None
log.debug('Stopped the server.') log.debug('Stopped the server.')
class HTTPSServer(HTTPServer): class HTTPSServer(StoppableHttpServer):
def __init__(self, address, handler): def __init__(self, address, handler):
""" """
Initialise the secure handlers for the SSL server if required.s Initialise the secure handlers for the SSL server if required.s
@ -178,4 +190,4 @@ class HTTPSServer(HTTPServer):
keyfile=os.path.join(local_data, 'remotes', 'openlp.key'), keyfile=os.path.join(local_data, 'remotes', 'openlp.key'),
server_side=True) server_side=True)
self.server_bind() self.server_bind()
self.server_activate() self.server_activate()

View File

@ -32,7 +32,7 @@ import os.path
from PyQt4 import QtCore, QtGui, QtNetwork from PyQt4 import QtCore, QtGui, QtNetwork
from openlp.core.common import AppLocation, Settings, translate from openlp.core.common import AppLocation, Settings, translate
from openlp.core.lib import SettingsTab from openlp.core.lib import SettingsTab, build_icon
ZERO_URL = '0.0.0.0' ZERO_URL = '0.0.0.0'
@ -234,6 +234,7 @@ class RemoteTab(SettingsTab):
""" """
Load the configuration and update the server configuration if necessary Load the configuration and update the server configuration if necessary
""" """
self.is_secure = Settings().value(self.settings_section + '/https enabled')
self.port_spin_box.setValue(Settings().value(self.settings_section + '/port')) self.port_spin_box.setValue(Settings().value(self.settings_section + '/port'))
self.https_port_spin_box.setValue(Settings().value(self.settings_section + '/https port')) self.https_port_spin_box.setValue(Settings().value(self.settings_section + '/https port'))
self.address_edit.setText(Settings().value(self.settings_section + '/ip address')) self.address_edit.setText(Settings().value(self.settings_section + '/ip address'))
@ -263,9 +264,7 @@ class RemoteTab(SettingsTab):
Settings().value(self.settings_section + '/port') != self.port_spin_box.value() or \ Settings().value(self.settings_section + '/port') != self.port_spin_box.value() or \
Settings().value(self.settings_section + '/https port') != self.https_port_spin_box.value() or \ Settings().value(self.settings_section + '/https port') != self.https_port_spin_box.value() or \
Settings().value(self.settings_section + '/https enabled') != \ Settings().value(self.settings_section + '/https enabled') != \
self.https_settings_group_box.isChecked() or \ self.https_settings_group_box.isChecked():
Settings().value(self.settings_section + '/authentication enabled') != \
self.user_login_group_box.isChecked():
self.settings_form.register_post_process('remotes_config_updated') self.settings_form.register_post_process('remotes_config_updated')
Settings().setValue(self.settings_section + '/port', self.port_spin_box.value()) Settings().setValue(self.settings_section + '/port', self.port_spin_box.value())
Settings().setValue(self.settings_section + '/https port', self.https_port_spin_box.value()) Settings().setValue(self.settings_section + '/https port', self.https_port_spin_box.value())
@ -275,6 +274,7 @@ class RemoteTab(SettingsTab):
Settings().setValue(self.settings_section + '/authentication enabled', self.user_login_group_box.isChecked()) Settings().setValue(self.settings_section + '/authentication enabled', self.user_login_group_box.isChecked())
Settings().setValue(self.settings_section + '/user id', self.user_id.text()) Settings().setValue(self.settings_section + '/user id', self.user_id.text())
Settings().setValue(self.settings_section + '/password', self.password.text()) Settings().setValue(self.settings_section + '/password', self.password.text())
self.generate_icon()
def on_twelve_hour_check_box_changed(self, check_state): def on_twelve_hour_check_box_changed(self, check_state):
""" """
@ -290,3 +290,25 @@ class RemoteTab(SettingsTab):
Invert the HTTP group box based on Https group settings Invert the HTTP group box based on Https group settings
""" """
self.http_settings_group_box.setEnabled(not self.https_settings_group_box.isChecked()) self.http_settings_group_box.setEnabled(not self.https_settings_group_box.isChecked())
def generate_icon(self):
"""
Generate icon for main window
"""
self.remote_server_icon.hide()
icon = QtGui.QImage(':/remote/network_server.png')
icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
if self.is_secure:
overlay = QtGui.QImage(':/remote/network_ssl.png')
overlay = overlay.scaled(60, 60, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(icon)
painter.drawImage(0, 0, overlay)
painter.end()
if Settings().value(self.settings_section + '/authentication enabled'):
overlay = QtGui.QImage(':/remote/network_auth.png')
overlay = overlay.scaled(60, 60, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(icon)
painter.drawImage(20, 0, overlay)
painter.end()
self.remote_server_icon.setIcon(build_icon(icon))
self.remote_server_icon.show()

View File

@ -28,7 +28,6 @@
############################################################################### ###############################################################################
import logging import logging
import time
from PyQt4 import QtGui from PyQt4 import QtGui
@ -69,13 +68,13 @@ class RemotesPlugin(Plugin):
log.debug('initialise') log.debug('initialise')
super(RemotesPlugin, self).initialise() super(RemotesPlugin, self).initialise()
self.server = OpenLPServer() self.server = OpenLPServer()
self.default_theme_label = QtGui.QToolButton(self.main_window.status_bar) self.remote_server_icon = QtGui.QToolButton(self.main_window.status_bar)
self.default_theme_label.setCheckable(False) self.remote_server_icon.setCheckable(False)
self.default_theme_label.setAutoRaise(True) self.remote_server_icon.setAutoRaise(True)
self.default_theme_label.setObjectName('default_theme_label') self.remote_server_icon.setObjectName('remote_server_icon')
self.main_window.status_bar.insertPermanentWidget(2, self.default_theme_label) self.main_window.status_bar.insertPermanentWidget(2, self.remote_server_icon)
self.default_theme_label.hide() self.settings_tab.remote_server_icon = self.remote_server_icon
self.server.default_theme_label = self.default_theme_label self.settings_tab.generate_icon()
def finalise(self): def finalise(self):
""" """
@ -113,9 +112,11 @@ class RemotesPlugin(Plugin):
def config_update(self): def config_update(self):
""" """
Called when Config is changed to restart the server on new address or port Called when Config is changed to requests a restart with the server on new address or port
""" """
log.debug('remote config changed') log.debug('remote config changed')
self.finalise() QtGui.QMessageBox.information(self.main_window,
time.sleep(1) translate('RemotePlugin', 'Server Config Change'),
self.initialise() translate('RemotePlugin', 'Server configuration changes will require a restart '
'to take effect.'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))