From 8e510e1c2a18167a804690582d5494780ab9c835 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Thu, 8 Mar 2012 22:23:08 +0200 Subject: [PATCH 01/14] added the port number. For some reason the server wont bind auto on 443 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 137c502..8061bcd 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ The apiName is usually printed in error messages when you miss a certain API Key Now you are ready to go, start the server with: - python SiriServer.py + python SiriServer.py -p 443 You don't need to run it as root, as we use https port 4443. If you want to use another port use: From b9d45123abe2641a94b935af127254cccfd79a36 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Thu, 8 Mar 2012 22:24:03 +0200 Subject: [PATCH 02/14] fixed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8061bcd..137c502 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ The apiName is usually printed in error messages when you miss a certain API Key Now you are ready to go, start the server with: - python SiriServer.py -p 443 + python SiriServer.py You don't need to run it as root, as we use https port 4443. If you want to use another port use: From c7fafe14e782e5dcf7f5c3471e466df1da091157 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Thu, 8 Mar 2012 22:24:29 +0200 Subject: [PATCH 03/14] fixed typo --- SiriServer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SiriServer.py b/SiriServer.py index ab24abd..ff6358c 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -84,7 +84,7 @@ def main(): parser = OptionParser() parser.add_option('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') - parser.add_option('-p', '--port', default=4443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') + parser.add_option('-p', '--port', default=443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') parser.add_option('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') (options, _) = parser.parse_args() From e0b60cc9bd9a5d3a3e0796aa4b34aa800b83bb1b Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 21:20:03 +0200 Subject: [PATCH 04/14] imported and set system encoding to utf-8 due to some plugins not working when printing eg chineese and several other characters --- SiriProtocolHandler.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index f78eaf3..cbbc1cc 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -22,7 +22,10 @@ import time import uuid import twisted +import sys +reload(sys) +sys.setdefaultencoding( "utf-8" ) class SiriProtocolHandler(Siri): @@ -270,7 +273,7 @@ def received_plist(self, plist): objProperties = plist['properties'] self.assistant.censorSpeech = objProperties['censorSpeech'] self.assistant.timeZoneId = objProperties['timeZoneId'] - self.assistant.language = objProperties['language'] + self.assistant.language = objProperties['language'] self.assistant.region = objProperties['region'] #Record the user firstName and nickName try: From ce4cd4530e41e63d3962e3f3bb97ac2d1aa5bf06 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 21:25:06 +0200 Subject: [PATCH 05/14] sorry i had uploaded my server port --- SiriServer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SiriServer.py b/SiriServer.py index a12fe9e..50d2ce7 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -186,7 +186,7 @@ def main(): parser = OptionParser() parser.add_option('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') - parser.add_option('-p', '--port', default=443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') + parser.add_option('-p', '--port', default=4443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') parser.add_option('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') (options, _) = parser.parse_args() From 819af51f34584ff570c06e141d153865f0ba340b Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 22:12:08 +0200 Subject: [PATCH 06/14] Testing in public --- SiriProtocolHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index cbbc1cc..fca2c39 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -68,7 +68,7 @@ def checkTimeout(self): self.logger.info("Connection timed out") self.transport.loseConnection() else: - self.timeoutschedule.reset(SiriProtocolHandler.__timeout_delay) + self.timeoutschedule.reset(SiriProtocolHandler.__scheduling_interval_timeout__) def handle_google_data(self, body, requestId, dictation): self.current_google_request = None From d4503a98f90e386f39eaee11e0232d15786e54fc Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 22:19:10 +0200 Subject: [PATCH 07/14] fixind already timeout connections trying to reset the schedule timer --- SiriProtocolHandler.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index fca2c39..8bfbb7f 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -68,7 +68,10 @@ def checkTimeout(self): self.logger.info("Connection timed out") self.transport.loseConnection() else: - self.timeoutschedule.reset(SiriProtocolHandler.__scheduling_interval_timeout__) + try: + self.timeoutschedule.reset(SiriProtocolHandler.__scheduling_interval_timeout__) + except: + self.logger.info("Schedule Connection has Timed out") def handle_google_data(self, body, requestId, dictation): self.current_google_request = None From 26ef1a03085e2daa534d303bc37dc9fe4f6f35a7 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 22:21:24 +0200 Subject: [PATCH 08/14] delay set to 30 due to speech thinking and not request based. More power to open/close connections --- SiriProtocolHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index 8bfbb7f..1b1dc22 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -32,7 +32,7 @@ class SiriProtocolHandler(Siri): __not_recognized = {"de-DE": u"Entschuldigung, ich verstehe \"{0}\" nicht.", "en-US": u"Sorry I don't understand {0}", "fr-FR": u"Désolé je ne comprends pas ce que \"{0}\" veut dire."} __websearch = {"de-DE": u"Websuche", "en-US": u"Websearch", "fr-FR": u"Rechercher sur le Web"} __scheduling_interval_timeout__ = 20 - __timeout_delay = 10 + __timeout_delay = 30 def __init__(self, server, peer): Siri.__init__(self, server, peer) From 0e905a5a9f04475e556315d1c3d82fd4df7c45de Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 22:22:38 +0200 Subject: [PATCH 09/14] delay set to 30 due to speech thinking and not request based. More power to open/close connections --- SiriProtocolHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index 1b1dc22..de5088e 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -31,7 +31,7 @@ class SiriProtocolHandler(Siri): __not_recognized = {"de-DE": u"Entschuldigung, ich verstehe \"{0}\" nicht.", "en-US": u"Sorry I don't understand {0}", "fr-FR": u"Désolé je ne comprends pas ce que \"{0}\" veut dire."} __websearch = {"de-DE": u"Websuche", "en-US": u"Websearch", "fr-FR": u"Rechercher sur le Web"} - __scheduling_interval_timeout__ = 20 + __scheduling_interval_timeout__ = 60 __timeout_delay = 30 def __init__(self, server, peer): From 3dc8419a8cda011269df7cc17cc8e8b6895aad6e Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Sun, 11 Mar 2012 22:24:35 +0200 Subject: [PATCH 10/14] fixed info --- SiriProtocolHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index de5088e..e70772a 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -71,7 +71,7 @@ def checkTimeout(self): try: self.timeoutschedule.reset(SiriProtocolHandler.__scheduling_interval_timeout__) except: - self.logger.info("Schedule Connection has Timed out") + self.logger.info("Schedule Connection had been lost") def handle_google_data(self, body, requestId, dictation): self.current_google_request = None From e7c0a5be6a43b8c1e00009659f6ddc8ec0755d61 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Fri, 16 Mar 2012 21:05:54 +0200 Subject: [PATCH 11/14] Added support for Chinese and other languages --- SiriProtocolHandler.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index 8f96357..e5ccb7b 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -289,6 +289,11 @@ def received_plist(self, plist): self.assistant.timeZoneId = objProperties['timeZoneId'] self.assistant.language = objProperties['language'] self.assistant.region = objProperties['region'] + #Here it is possible to support more languages combined with anyvoice package + #We can make assumption that the region will define the language. + #Chinese Example + if self.assistant.region=="zh-CN": + self.assistant.language = "zh-CN" #Record the user firstName and nickName try: self.assistant.firstName = objProperties["meCards"][0]["properties"]["firstName"].encode("utf-8") From 4d5358c03a2cff66d0b3dc522f7888685f9fb385 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Mon, 19 Mar 2012 04:35:41 +0200 Subject: [PATCH 12/14] added support for forcelanguge argument and switched to arg parser --- SiriServer.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/SiriServer.py b/SiriServer.py index 13e1296..9e7a796 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -13,11 +13,13 @@ exit(-1) from SiriProtocolHandler import SiriProtocolHandler -from optparse import OptionParser +#switched to argparse due to optionparser is a depriciated module and connot handle empty argument values +import argparse from os.path import exists from socket import gethostname import PluginManager import db +import config import logging import sys @@ -46,12 +48,12 @@ def __init__(self): self.numberOfConnections = 0 self.sessionCert = None self.sessionCACert = None - self.dbConnection = None + self.dbConnection = None def buildProtocol(self, addr): return SiriProtocolHandler(self, addr) - def startFactory(self): + def startFactory(self): logging.getLogger().info("Loading Session Certificates") caFile = open("keys/SessionCACert.pem") self.sessionCACert = crypto.load_certificate(crypto.FILETYPE_PEM,caFile.read()) @@ -188,24 +190,30 @@ def create_self_signed_cert(): def main(): - parser = OptionParser() - parser.add_option('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') - parser.add_option('-p', '--port', default=4443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') - parser.add_option('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') - (options, _) = parser.parse_args() + parser = argparse.ArgumentParser(description='SiriServerCore\n') + parser.add_argument('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') + parser.add_argument('-p', '--port', default=4443, type=int, dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') + parser.add_argument('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') + parser.add_argument('-f', '--forcelanguage', action='store_true', default=False, dest='forcelanguage', help='Force the server use language by region of device and ignore the Siri Settings language. Usefull with anyvoice cydia package. Adds functionallity for unsupported languages') + options = parser.parse_args() x = logging.getLogger() - x.setLevel(log_levels[options.logLevel]) - + x.setLevel(log_levels[options.logLevel]) if options.logfile != None: - h = logging.FileHandler(options.logfile) + h = logging.FileHandler(options.logfile) else: - h = logging.StreamHandler() - + h = logging.StreamHandler() + f = logging.Formatter(u"%(levelname)s %(message)s") h.setFormatter(f) x.addHandler(h) + if options.forcelanguage != False: + config.forcelanguage=True + x.info("Forcing languages to device region and ignoring Siri Languge settings") + else: + config.forcelanguage=False + create_self_signed_cert() try: From 56d9b7933b295025956b201f05df1f3dfbb4546d Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Mon, 19 Mar 2012 04:36:59 +0200 Subject: [PATCH 13/14] added forcing of language plus FR and CH localizations on errors etc... --- SiriProtocolHandler.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/SiriProtocolHandler.py b/SiriProtocolHandler.py index e5ccb7b..b1a3db1 100644 --- a/SiriProtocolHandler.py +++ b/SiriProtocolHandler.py @@ -22,12 +22,12 @@ import time import uuid import twisted - +import config class SiriProtocolHandler(Siri): - __not_recognized = {"de-DE": u"Entschuldigung, ich verstehe \"{0}\" nicht.", "en-US": u"Sorry I don't understand {0}", "fr-FR": u"Désolé je ne comprends pas ce que \"{0}\" veut dire."} - __websearch = {"de-DE": u"Websuche", "en-US": u"Websearch", "fr-FR": u"Rechercher sur le Web"} + __not_recognized = {"de-DE": u"Entschuldigung, ich verstehe \"{0}\" nicht.", "en-US": u"Sorry, I don't understand ‘{0}’.", "fr-FR": u"Désolé je ne comprends pas ce que \"{0}\" veut dire.", "zh-CN": u"对不起,我不知道“{0}”是什么意思。"} + __websearch = {"de-DE": u"Websuche", "en-US": u"Search the web", "fr-FR": u"Rechercher sur le Web", "zh-CN": u"搜索网页"} __scheduling_interval_timeout__ = 20 __timeout_delay = 10 @@ -290,10 +290,13 @@ def received_plist(self, plist): self.assistant.language = objProperties['language'] self.assistant.region = objProperties['region'] #Here it is possible to support more languages combined with anyvoice package - #We can make assumption that the region will define the language. - #Chinese Example - if self.assistant.region=="zh-CN": - self.assistant.language = "zh-CN" + #We can make assumption that the region will define the language. + if config.forcelanguage==True: + #Chinese Example + if self.assistant.region=="zh-CN": + self.assistant.language = "zh-CN" + self.logger.debug("Forced language to {0}".format(self.assistant.language)) + #Record the user firstName and nickName try: self.assistant.firstName = objProperties["meCards"][0]["properties"]["firstName"].encode("utf-8") @@ -309,7 +312,7 @@ def received_plist(self, plist): c.close() except: self.send_plist({"class":"CommandFailed", "properties": {"reason":"Database error", "errorCode":2, "callbacks":[]}, "aceId": str(uuid.uuid4()), "refId": plist['aceId'], "group":"com.apple.ace.system"}) - self.logger.error("Database Error on setting assistant data") + self.logger.error("Error on setting assistant data") else: self.send_plist({"class":"CommandFailed", "properties": {"reason":"Assistant to set data not found", "errorCode":2, "callbacks":[]}, "aceId": str(uuid.uuid4()), "refId": plist['aceId'], "group":"com.apple.ace.system"}) self.logger.warning("Trying to set assistant data without having a valid assistant") From 73531ad9d32157136b8653817ab9041dc0b6b3e8 Mon Sep 17 00:00:00 2001 From: Jimmy Kane Date: Mon, 19 Mar 2012 04:37:17 +0200 Subject: [PATCH 14/14] global config values --- config.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 config.py diff --git a/config.py b/config.py new file mode 100644 index 0000000..2096f94 --- /dev/null +++ b/config.py @@ -0,0 +1,5 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +#This can be used as a module to set some config values for all classes +#It is not thread safe! But is safe for per server run values +forcelanguage=False \ No newline at end of file