From ebc3ab73a0a197f6b10f6c0712463a858333cd63 Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Tue, 25 Nov 2014 13:35:00 -0800 Subject: [PATCH 01/23] Fixes for WorldQueue.config XML Changes and version bump to 0.2.1 --- ChangeLog | 4 ++++ PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/MainWindow.py | 5 ++++- PyLotROLauncher/PyLotROUtils.py | 19 +++++++++++++++++-- PyLotROLauncher/StartGame.py | 10 +++++++--- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 05a5e94..492ccfc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -77,3 +77,7 @@ Changes Fix problems when path settings have trailing (back-)slashes. Support for Python 3.x, PyQt 4.6+ and OpenSSL 1.x Enable server authentication for better security (Python 3.2+ only currently) + +0.2.1 Fixes for WorldQueue.config XML Changes and version bump to 0.2.1 + Fix for 20-Nov-2014 slight changes to WorldQueue.config by Turbine which + broke pylotro. diff --git a/PyLotRO.iss b/PyLotRO.iss index 08fd992..59f2344 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.0 +AppVerName=PyLotRO 0.2.1 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index 12a2c59..c16f176 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.0" +Version = "0.2.1" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/MainWindow.py b/PyLotROLauncher/MainWindow.py index 7c17a48..c6d7bad 100644 --- a/PyLotROLauncher/MainWindow.py +++ b/PyLotROLauncher/MainWindow.py @@ -366,7 +366,10 @@ def LaunchGame(self): self.langConfig.langList[self.uiMain.cboLanguage.currentIndex()].code, self.settings.gameDir, self.settings.wineProg, self.settings.wineDebug, self.settings.winePrefix, self.settings.hiResEnabled, self.settings.app, - self.osType, self.valHomeDir, self.gameType.icoFile, self.rootDir) + self.osType, self.valHomeDir, self.gameType.icoFile, self.rootDir, + self.worldQueueConfig.bugurl, self.worldQueueConfig.authserverurl, + self.worldQueueConfig.supporturl, self.worldQueueConfig.supportserviceurl, + self.worldQueueConfig.glsticketlifetime) self.winMain.hide() game.Run() diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index c01485e..b705698 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -458,6 +458,11 @@ class WorldQueueConfig: def __init__(self, urlConfigServer, usingDND, baseDir, osType): self.gameClientFilename = "" self.gameClientArgTemplate = "" + self.bugurl = "" + self.authserverurl = "" + self.supporturl = "" + self.supportserviceurl = "" + self.glsticketlifetime = "" self.newsFeedURL = "" self.newsStyleSheetURL = "" self.patchProductCode = "" @@ -487,10 +492,20 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): nodes = doc.getElementsByTagName("appSettings")[0].childNodes for node in nodes: if node.nodeType == node.ELEMENT_NODE: - if node.getAttribute("key") == "GameClient.Filename": + if node.getAttribute("key") == "GameClient.WIN32.Filename": self.gameClientFilename = node.getAttribute("value") - elif node.getAttribute("key") == "GameClient.ArgTemplate": + elif node.getAttribute("key") == "GameClient.WIN32.ArgTemplate": self.gameClientArgTemplate = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.bugurl": + self.bugurl = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.authserverurl": + self.authserverurl = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.supporturl": + self.supporturl = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.supportserviceurl": + self.supportserviceurl = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.glsticketlifetime": + self.glsticketlifetime = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsFeed": self.newsFeedURL = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsStyleSheet": diff --git a/PyLotROLauncher/StartGame.py b/PyLotROLauncher/StartGame.py index 1573338..efaaef0 100644 --- a/PyLotROLauncher/StartGame.py +++ b/PyLotROLauncher/StartGame.py @@ -34,7 +34,8 @@ class StartGame: def __init__(self, parent, appName, argTemplate, account, server, ticket, chatServer, language, runDir, wineProgram, wineDebug, winePrefix, - hiResEnabled, wineApp, osType, homeDir, icoFileIn, rootDir): + hiResEnabled, wineApp, osType, homeDir, icoFileIn, rootDir, bugurl, + authserverurl, supporturl, supportserviceurl, glsticketlifetime): self.winMain = parent self.homeDir = homeDir @@ -84,8 +85,11 @@ def __init__(self, parent, appName, argTemplate, account, server, ticket, self.command = "" self.arguments = [] - gameParams = argTemplate.replace("{0}", account).replace("{1}", server)\ - .replace("{2}", ticket).replace("{3}", chatServer).replace("{4}", language) + gameParams = argTemplate.replace("{SUBSCRIPTION}", account).replace("{LOGIN}", server)\ + .replace("{GLS}", ticket).replace("{CHAT}", chatServer).replace("{LANG}", language)\ + .replace("{BUGURL}", bugurl).replace("{AUTHSERVERURL}", authserverurl)\ + .replace("{GLSTICKETLIFETIME}", glsticketlifetime).replace("{SUPPORTURL}", supporturl)\ + .replace("{SUPPORTSERVICEURL}",supportserviceurl) if not hiResEnabled: gameParams = gameParams + " --HighResOutOfDate" From 8011cd289733bfb2f2d6209d6b1a433f93f2538d Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Mon, 15 Dec 2014 07:58:47 -0800 Subject: [PATCH 02/23] Fixes for Update 15.1 changes to launcher.config. --- PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/MainWindow.py | 1 + PyLotROLauncher/PyLotROUtils.py | 6 ++++++ PyLotROLauncher/StartGame.py | 6 ++++-- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/PyLotRO.iss b/PyLotRO.iss index 59f2344..5cb5d0a 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.1 +AppVerName=PyLotRO 0.2.2 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index c16f176..9f7b4b0 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.1" +Version = "0.2.2" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/MainWindow.py b/PyLotROLauncher/MainWindow.py index c6d7bad..59cc2ae 100644 --- a/PyLotROLauncher/MainWindow.py +++ b/PyLotROLauncher/MainWindow.py @@ -367,6 +367,7 @@ def LaunchGame(self): self.settings.gameDir, self.settings.wineProg, self.settings.wineDebug, self.settings.winePrefix, self.settings.hiResEnabled, self.settings.app, self.osType, self.valHomeDir, self.gameType.icoFile, self.rootDir, + self.worldQueueConfig.crashreceiver, self.worldQueueConfig.DefaultUploadThrottleMbps, self.worldQueueConfig.bugurl, self.worldQueueConfig.authserverurl, self.worldQueueConfig.supporturl, self.worldQueueConfig.supportserviceurl, self.worldQueueConfig.glsticketlifetime) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index b705698..fcbc090 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -458,6 +458,8 @@ class WorldQueueConfig: def __init__(self, urlConfigServer, usingDND, baseDir, osType): self.gameClientFilename = "" self.gameClientArgTemplate = "" + self.crashreceiver = "" + self.DefaultUploadThrottleMbps = "" self.bugurl = "" self.authserverurl = "" self.supporturl = "" @@ -496,6 +498,10 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): self.gameClientFilename = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.WIN32.ArgTemplate": self.gameClientArgTemplate = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.crashreceiver": + self.crashreceiver = node.getAttribute("value") + elif node.getAttribute("key") == "GameClient.Arg.DefaultUploadThrottleMbps": + self.DefaultUploadThrottleMbps = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.bugurl": self.bugurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.authserverurl": diff --git a/PyLotROLauncher/StartGame.py b/PyLotROLauncher/StartGame.py index efaaef0..59016d0 100644 --- a/PyLotROLauncher/StartGame.py +++ b/PyLotROLauncher/StartGame.py @@ -34,8 +34,9 @@ class StartGame: def __init__(self, parent, appName, argTemplate, account, server, ticket, chatServer, language, runDir, wineProgram, wineDebug, winePrefix, - hiResEnabled, wineApp, osType, homeDir, icoFileIn, rootDir, bugurl, - authserverurl, supporturl, supportserviceurl, glsticketlifetime): + hiResEnabled, wineApp, osType, homeDir, icoFileIn, rootDir, + crashreceiver, DefaultUploadThrottleMbps, bugurl, authserverurl, + supporturl, supportserviceurl, glsticketlifetime): self.winMain = parent self.homeDir = homeDir @@ -87,6 +88,7 @@ def __init__(self, parent, appName, argTemplate, account, server, ticket, gameParams = argTemplate.replace("{SUBSCRIPTION}", account).replace("{LOGIN}", server)\ .replace("{GLS}", ticket).replace("{CHAT}", chatServer).replace("{LANG}", language)\ + .replace("{CRASHRECEIVER}", crashreceiver).replace("{UPLOADTHROTTLE}", DefaultUploadThrottleMbps)\ .replace("{BUGURL}", bugurl).replace("{AUTHSERVERURL}", authserverurl)\ .replace("{GLSTICKETLIFETIME}", glsticketlifetime).replace("{SUPPORTURL}", supporturl)\ .replace("{SUPPORTSERVICEURL}",supportserviceurl) From d0111c1658e46b63de23c0b85685733171c671d5 Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Mon, 15 Dec 2014 08:02:11 -0800 Subject: [PATCH 03/23] Fixes for update 15.1 (updated Changelog) --- ChangeLog | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 492ccfc..a54fdc1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -78,6 +78,10 @@ Changes Support for Python 3.x, PyQt 4.6+ and OpenSSL 1.x Enable server authentication for better security (Python 3.2+ only currently) -0.2.1 Fixes for WorldQueue.config XML Changes and version bump to 0.2.1 +0.2.1 Fixes for launcher.config XML Changes and version bump to 0.2.1 Fix for 20-Nov-2014 slight changes to WorldQueue.config by Turbine which broke pylotro. + +0.2.2 Fixes for Update 15.1 changes to launcher.config argument template. Turbine is now + using crashserverurl and DefaultUploadThrottleMbps in the argument template. + Version bump to 0.2.2. From 514ff90b11b4dc6927db7498932bb4f28b10c455 Mon Sep 17 00:00:00 2001 From: "Wade T. Cline" Date: Fri, 15 Jan 2016 07:41:48 -0800 Subject: [PATCH 04/23] Update certificate chain. The old chain has been broken as of yesterday (01-13-2016) or possibly earlier. --- PyLotROLauncher/certificates/README | 33 +++++ PyLotROLauncher/certificates/ca_certs.pem | 145 ++++++++++++++-------- 2 files changed, 125 insertions(+), 53 deletions(-) create mode 100644 PyLotROLauncher/certificates/README diff --git a/PyLotROLauncher/certificates/README b/PyLotROLauncher/certificates/README new file mode 100644 index 0000000..d8f04d4 --- /dev/null +++ b/PyLotROLauncher/certificates/README @@ -0,0 +1,33 @@ +In order to connect via SSL/TLS, the server's certificate is validated against +the certificate chain stored in this file. When Turbine updates their +certificate chain, this program will break (again) with the error message: + + [E15] SSL Error occured in HTTPS connection + +In that case you will need re-assemble the certificate chain and place it into +this file. Useful commands at the time of this writing include: + + openssl s_client -connect gls.lotro.com:443 + +...which will attempt to connect to the LotRO authentication server and +allow you to copy+paste the server's certificate and begin hunting down the +chain. In order to read each certificate as you work your way up the chain, +you can use: + + openssl x509 -in -text + +...in order to dump information about the specified certificate. You may +need to add '-inform der' if the certificate is in binary format. Look +for the 'Authority Information Access' under 'X509v3 extensions' in order +to quickly retrieve URLs for the certificate chain. You may also need to +retrieve the root certificate from your local '/etc/ssl/certs/'. + +When you have retrieved all of the certificates, you will need to concatenate +them together. In order to verify that this has been done correctly, again use +the 'openssl verify' command, and in addition use the '-CAfile ' +argument. It's best to start with the root authority and then work your way +down (in the order opposite of which the certificates were retrieved). Note +that, when I did this, the root authority wasn't required for the command +to verify, but was necessary for the program to actually work. + +Good luck. diff --git a/PyLotROLauncher/certificates/ca_certs.pem b/PyLotROLauncher/certificates/ca_certs.pem index 85e7722..eb6c790 100644 --- a/PyLotROLauncher/certificates/ca_certs.pem +++ b/PyLotROLauncher/certificates/ca_certs.pem @@ -1,53 +1,92 @@ ------BEGIN CERTIFICATE----- -MIIEpjCCA46gAwIBAgIQEOd26KZabjd+BQMG1Dwl6jANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNMDYwNDEwMDAwMDAwWhcNMjAwNTMwMTA0ODM4WjBiMQswCQYD -VQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYD -VQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDD3TbMg8MYVbCW2RMl0yaGSDi7 -Fn/xnyn2/QPx7U0mmlbwtRoazebMhVVApLXQDcoi7z0jxn5szLyh6XxQRuC9FK1l -EsILEWlSCgeSH3NvwbrXYvDOAC40pcjmLw/sDepEYXVo5eTcgDZP2nhdUyWUlPVP -Ljpgbwym2bP2Ki4DEtUmQgdRsmRXcdwhHInHaaPm+8J7bu8Mh/tQZOhOS+/ncZuD -Y2HJMo2M7BSn5ImtPysmZOSFQvKJUOE6vhXjRSXiWsuMP+AzHjUJWoTqfl2h9ZGA -CigGt8sxQSVhiwHpVqL2Pl8v88RD9hmUdYNMoYJCOsa6xAkwpuF1AlG5XmSLAgMB -AAGjggEgMIIBHDAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV -HQ4EFgQUPEHijwgIqUwliY1txTjQ/IWMYhcwDgYDVR0PAQH/BAQDAgEGMBIGA1Ud -EwEB/wQIMAYBAf8CAQAwGQYDVR0gBBIwEDAOBgwrBgEEAYYOAQIBAwEwRAYDVR0f -BD0wOzA5oDegNYYzaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly -c3QtSGFyZHdhcmUuY3JsMFUGCCsGAQUFBwEBBEkwRzBFBggrBgEFBQcwAoY5aHR0 -cDovL3d3dy51c2VydHJ1c3QuY29tL2NhY2VydHMvVVROQWRkVHJ1c3RTZXJ2ZXJf -Q0EuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQBoq/zvgGsYsrCzo0WJy1PFouavCKn9 -/w9JrP/kn9dBfKPFouiq4FchLcOqfAxMKAt59O5MMq15Dn6iXjQYT99U8b1ofOPT -10ZebWTC922IgnMM75mF6qnvMkrwg59zkQykPisxUaZijxWE+aY6EjA/2m74zMcZ -kg9c9P4X8ZUIR1IsUI/om6XurnAziZGC/jCqdnZZ12wY0ysSWx0oHXhx9s02oukH -SEQ751duggqtxYrd6FO0ca8T0gadN21TP4o1CPr+ohbmuW9cVjnWxqrvGWfOE8W4 -lQX7CkTJn6lAJUsyEa8H/gjVQnHp4VOLFR/dKgeVcCRvZF7Tt5AuiyHY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGBjCCA+6gAwIBAgIRAMPe33bP14a+oa+L7++k3TgwDQYJKoZIhvcNAQEMBQAw +gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK +ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD +VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE0 +MDkyNDAwMDAwMFoXDTI0MDkyMzIzNTk1OVowejELMAkGA1UEBhMCVVMxCzAJBgNV +BAgTAlZBMRAwDgYDVQQHEwdIZXJuZG9uMSEwHwYDVQQKExhOZXR3b3JrIFNvbHV0 +aW9ucyBMLkwuQy4xKTAnBgNVBAMTIE5ldHdvcmsgU29sdXRpb25zIE9WIFNlcnZl +ciBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhMEY20u06eQH +i9Bk1mdkoZzwMzzodh2U4tUYRyi3Ezrk8ylwlRu5JWi2fBd9dE7z4JMrYlE2pNlY +EfNzqHw2C8g8paL9EYvcEa7MVltx2/qYTZ+WXDt7IeS/rKLEmpnyjSjPjeOQn9rH +86wtGQOEfn2yrw+LwshvK7memBk8woCJxmyEXqi2MxfXjdHSF8fyF6N/j12iUMeS +rU93QKecdOx5Bv5y8R17GDorK6F5gvDXGsA55zgjpouIiNnd/fue8yMv4nOnN/C4 +78sSniJ+mmgHOqX6ZfyMS08+CqHMp+D7/m3n9eYHcBX9mFltwGHQh4CUHSaXBGsY +sb54MHdVeQIDAQABo4IBdjCCAXIwHwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd +8rIDZsswHQYDVR0OBBYEFCAzzbdh9qWGT9zJ13NqvApRZZjsMA4GA1UdDwEB/wQE +AwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr +BgEFBQcDAjAjBgNVHSAEHDAaMA4GDCsGAQQBhg4BAgEDATAIBgZngQwBAgIwUAYD +VR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVz +dFJTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/ +BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJT +QUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1 +c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAipDA3APqXT3n3SWLtMk4GrCEm5TH7 +oIlIaaPVJ/TBuKFM45rOUyKmsLta0Lc5M6hfo2Hs/YRuNFgxA9QAiJUsBtFEOtIK +BTK7rMvwgxwtlVKHKUZ3l91EO2dwPmENmLH5krb6uOuKzlBC7RHh2sjXDDBLjyok +uHOm34TJpI4vjB0zxf752Z3H5OxGR2tUpBo0T3+7mz0d4Ve4Hp60cJTLhRpitOUS +CpK2rEcWnGzx+WXucSk9REVugbucdA6UrAqBp0TQ5Z0j4dSMGLa6e7U1mbJz+zDF +oPbUjwh7rNKm385hH5ahuX01nQk+PplCTTXsR5B3LjiKY0QP6x93SGVvdh2azrsw +/FQI1n7M9k3fPzrHFuYYct/YYqJGkLCPzpzn3a6pkKvtJWfG7SY2CgcepPR8gn2v +I8GIM3tDmZ2ZDSyI8qulT9/Vey2gL3CL895SWseWCii5TMR6Ox7LeBCZj0iZhLXH +aaJprqX/B8t72NYrL3NZSiMbHBfzwIQiVSMw4hMHdL68VC+bASpgcfBtMPW/fpwN +T2BuSzxVuMpjq3b124i5wd2cGDqWDJ4N8nauG8mawekrazr7OakVUY3O4Own76Pd +M9ubyuCZUE+bR5eFhpx3/x/FBB5QWFv3fYq5nyyaxnG2hVSZqtp4RTNrGKVWG5+D +blKbMUlAzl8aVQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk +ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF +eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow +gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK +ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD +VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00yt +UINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NC +tnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQf +jtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM +8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hm +AUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiV +Z4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9 +N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sF +qV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9 +HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ ++gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyX +HAc/DVL17e8vgg8CAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTv +A73gJMtUGjAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/ +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1Ud +HwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4 +dGVybmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0 +dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAJNl9jeD +lQ9ew4IcH9Z35zyKwKoJ8OkLJvHgwmp1ocd5yblSYMgpEg7wrQPWCcR23+WmgZWn +RtqCV6mVksW2jwMibDN3wXsyF24HzloUQToFJBv2FAY7qCUkDrvMKnXduXBBP3zQ +YzYhBx9G/2CkkeFnvN4ffhkUyWNnkepnB2u0j4vAbkN9w6GAbLIevFOFfdyQoaS8 +Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf +Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p +0fKtirOMxyHNwu8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- From 49511b91ce3ce64d1809b63e37042467297c648d Mon Sep 17 00:00:00 2001 From: Harry Johnson Date: Sat, 23 Jan 2016 20:37:05 -0500 Subject: [PATCH 05/23] Fix localization support. Turbine has removed the client local files for each language. Now each language has a separate subdirectory. If the client local file is not found then I pick languages based on those subdirectories --- PyLotROLauncher/PyLotROUtils.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index fcbc090..664a6fa 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -376,19 +376,21 @@ def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): class Language: def __init__(self, code): self.code = code.upper() - self.news = "en" + self.news = "" if code == "EN_GB": self.name = "English (UK)" self.code = "ENGLISH" - elif code == "ENGLISH": + self.news = "en" + elif code == "ENGLISH" or code == "en": self.name = "English" self.code = "ENGLISH" - elif code == "FR": + self.news = "en" + elif code == "FR" or code == "fr": self.name = "French" self.code = "FR" self.news = "fr" - elif code == "DE": + elif code == "DE" or code == "de": self.name = "German" self.code = "DE" self.news = "de" @@ -406,7 +408,13 @@ def __init__(self, runDir): # remove "client_local_" (13 chars) and ".dat" (4 chars) from filename temp = os.path.basename(name)[13:-4] self.langList.append(Language(temp)) - + # Handle newer clients where the language is a subdir + for name in os.listdir(runDir): + lang = Language(name) + if lang.news != "": + self.langList.append(lang) + self.langFound = True + class Realm: def __init__(self, name, urlChatServer, urlServerStatus): self.name = name From 88d2f37882c6f3acf95027a90fa846d6d39cf885 Mon Sep 17 00:00:00 2001 From: James Potts Date: Fri, 5 Feb 2016 12:50:22 -0600 Subject: [PATCH 06/23] Fix whitespace issues caused by previous commit. --- PyLotROLauncher/PyLotROUtils.py | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 664a6fa..15b1ae6 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -242,7 +242,7 @@ def startCXG(self): os.environ["FONT_ENCODINGS_DIRECTORY"] = (cxPath + "/Contents/SharedSupport/X11/lib/" + "X11/fonts/encodings/encodings.dir") os.environ["FONTCONFIG_ROOT"] = "%s/Contents/SharedSupport/X11" % (cxPath) - os.environ["COMMAND_MODE"] = "legacy" + os.environ["COMMAND_MODE"] = "legacy" os.environ["FONTCONFIG_PATH"] = "%s/Contents/SharedSupport/X11/etc/fonts" % (cxPath) os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = (cxPath + "/Contents/SharedSupport/X11/lib" + ":" + os.environ.get('HOME') + "/lib:/usr/local/lib:/lib:/usr/lib") @@ -256,7 +256,7 @@ def startCXG(self): display = "2" os.environ["DISPLAY"] = ":%s" % (display) - return finished + return finished def startCXO(self): finished = True @@ -299,7 +299,7 @@ def startCXO(self): os.environ["FONT_ENCODINGS_DIRECTORY"] = (cxPath + "/Contents/SharedSupport/X11/lib/" + "X11/fonts/encodings/encodings.dir") os.environ["FONTCONFIG_ROOT"] = "%s/Contents/SharedSupport/X11" % (cxPath) - os.environ["COMMAND_MODE"] = "legacy" + os.environ["COMMAND_MODE"] = "legacy" os.environ["FONTCONFIG_PATH"] = "%s/Contents/SharedSupport/X11/etc/fonts" % (cxPath) os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = (cxPath + "/Contents/SharedSupport/X11/lib" + ":" + os.environ.get('HOME') + "/lib:/usr/local/lib:/lib:/usr/lib") @@ -313,7 +313,7 @@ def startCXO(self): display = "2" os.environ["DISPLAY"] = ":%s" % (display) - return finished + return finished class GLSDataCentre: def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): @@ -381,11 +381,11 @@ def __init__(self, code): if code == "EN_GB": self.name = "English (UK)" self.code = "ENGLISH" - self.news = "en" + self.news = "en" elif code == "ENGLISH" or code == "en": self.name = "English" self.code = "ENGLISH" - self.news = "en" + self.news = "en" elif code == "FR" or code == "fr": self.name = "French" self.code = "FR" @@ -408,13 +408,13 @@ def __init__(self, runDir): # remove "client_local_" (13 chars) and ".dat" (4 chars) from filename temp = os.path.basename(name)[13:-4] self.langList.append(Language(temp)) - # Handle newer clients where the language is a subdir - for name in os.listdir(runDir): - lang = Language(name) - if lang.news != "": - self.langList.append(lang) - self.langFound = True - + # Handle newer clients where the language is a subdir + for name in os.listdir(runDir): + lang = Language(name) + if lang.news != "": + self.langList.append(lang) + self.langFound = True + class Realm: def __init__(self, name, urlChatServer, urlServerStatus): self.name = name @@ -507,17 +507,17 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): elif node.getAttribute("key") == "GameClient.WIN32.ArgTemplate": self.gameClientArgTemplate = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.crashreceiver": - self.crashreceiver = node.getAttribute("value") + self.crashreceiver = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.DefaultUploadThrottleMbps": - self.DefaultUploadThrottleMbps = node.getAttribute("value") + self.DefaultUploadThrottleMbps = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.bugurl": - self.bugurl = node.getAttribute("value") + self.bugurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.authserverurl": - self.authserverurl = node.getAttribute("value") + self.authserverurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.supporturl": - self.supporturl = node.getAttribute("value") + self.supporturl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.supportserviceurl": - self.supportserviceurl = node.getAttribute("value") + self.supportserviceurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.glsticketlifetime": self.glsticketlifetime = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsFeed": From 1bb3eb3256548d8ecb42eef0fcbbd4404c590184 Mon Sep 17 00:00:00 2001 From: James Potts Date: Fri, 5 Feb 2016 12:51:42 -0600 Subject: [PATCH 07/23] Change default news language back from "" to "en". With or without this, PyLotro in Lotro mode lists "English" twice, but without it PyLotro doesn't display news by default. I would very much welcome a better fix here. --- PyLotROLauncher/PyLotROUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 15b1ae6..72f345a 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -376,7 +376,7 @@ def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): class Language: def __init__(self, code): self.code = code.upper() - self.news = "" + self.news = "en" if code == "EN_GB": self.name = "English (UK)" From 493c829375bf3de6bbb679930e4f992cbd50ba02 Mon Sep 17 00:00:00 2001 From: James Potts Date: Fri, 5 Feb 2016 16:05:34 -0600 Subject: [PATCH 08/23] Fixes for unicode errors on Python 3.x for Windows. Python 3.x was throwing a UnicodeDecodeError when attempting to write turbine-supplied config files. This fixes that by opening the files in utf-8 mode. --- PyLotROLauncher/PyLotROUtils.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index fcbc090..d3ecce2 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -31,6 +31,7 @@ import subprocess import sys import glob +import codecs from PyQt4 import QtCore import xml.dom.minidom from xml.sax.saxutils import escape as xml_escape @@ -340,7 +341,7 @@ def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sGLSDataCenter.config" % (baseDir, osType.appDir) - outfile = open(filename, "w") + outfile = codecs.open(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -429,7 +430,7 @@ def CheckRealm(self, useDND, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sserver.config" % (baseDir, osType.appDir) - outfile = open(filename, "w") + outfile = codecs.open(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -482,7 +483,7 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%slauncher.config" % (baseDir, osType.appDir) - outfile = open(filename, "w") + outfile = codecs.open(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -526,6 +527,7 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): self.loadSuccess = True except: self.loadSuccess = False + raise class Game: def __init__(self, name, description): @@ -568,7 +570,7 @@ def __init__(self, urlLoginServer, name, password, game, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sGLSAuthServer.config" % (baseDir, osType.appDir) - outfile = open(filename, "w") + outfile = codecs.open(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -634,7 +636,7 @@ def __init__(self, argTemplate, account, ticket, queue, urlIn, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sWorldQueue.config" % (baseDir, osType.appDir) - outfile = open(filename, "w") + outfile = codecs.open(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() From 07cbccd67e275b314d7eed172f4579b762d6d7f7 Mon Sep 17 00:00:00 2001 From: James Potts Date: Fri, 5 Feb 2016 18:27:40 -0600 Subject: [PATCH 09/23] Fix previous fix for Python 2.x The previous fix works fine on Python 3.x, but breaks on 2.x because of differences in unicode support. This change makes the fix so it is now only used when Python 3.x is in use. --- PyLotROLauncher/PyLotROUtils.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index d3ecce2..78599ac 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -37,6 +37,15 @@ from xml.sax.saxutils import escape as xml_escape import ssl +# Python 3 on windows needs Turbine-supplied config files +# to be written in UTF-8, but Python 2 doesn't, and won't +# convert an ascii string for use in codecs.open() +if sys.version_info > (2,): + import codecs + uopen = codecs.open +else: + uopen = open + # If Python >3.0 is in use use http otherwise httplib # Python >3.0 uses unicode strings by default, so also # need to take care of encoding/decoding for sending/receiving @@ -341,7 +350,7 @@ def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sGLSDataCenter.config" % (baseDir, osType.appDir) - outfile = codecs.open(filename, "w", "utf-8") + outfile = uopen(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -430,7 +439,7 @@ def CheckRealm(self, useDND, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sserver.config" % (baseDir, osType.appDir) - outfile = codecs.open(filename, "w", "utf-8") + outfile = uopen(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -483,7 +492,7 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%slauncher.config" % (baseDir, osType.appDir) - outfile = codecs.open(filename, "w", "utf-8") + outfile = uopen(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -570,7 +579,7 @@ def __init__(self, urlLoginServer, name, password, game, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sGLSAuthServer.config" % (baseDir, osType.appDir) - outfile = codecs.open(filename, "w", "utf-8") + outfile = uopen(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() @@ -636,7 +645,7 @@ def __init__(self, argTemplate, account, ticket, queue, urlIn, baseDir, osType): tempxml = string_decode(webresp.read()) filename = "%s%sWorldQueue.config" % (baseDir, osType.appDir) - outfile = codecs.open(filename, "w", "utf-8") + outfile = uopen(filename, "w", "utf-8") outfile.write(tempxml) outfile.close() From e5c4167a2cffec1a3225935048845e117f89ba7a Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Feb 2016 16:29:11 -0800 Subject: [PATCH 10/23] Version bump and ChangeLog update. --- ChangeLog | 5 +++++ PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a54fdc1..0fb7305 100644 --- a/ChangeLog +++ b/ChangeLog @@ -85,3 +85,8 @@ Changes 0.2.2 Fixes for Update 15.1 changes to launcher.config argument template. Turbine is now using crashserverurl and DefaultUploadThrottleMbps in the argument template. Version bump to 0.2.2. + +0.2.3 Localization changes from hcjiv1 and Arek75. Turbine has removed the client local + files for each language. Now each language has a separate subdirectory. If + the client local file is not found then I (hcjiv1) pick languages based on those + subdirectories. Thanks to hcjiv1 and Arek75. Version bump to 0.2.3 diff --git a/PyLotRO.iss b/PyLotRO.iss index 5cb5d0a..8910cfd 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.2 +AppVerName=PyLotRO 0.2.3 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index 9f7b4b0..1b9ff56 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.2" +Version = "0.2.3" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" From b83e4d3b0790a60d0ee8adf336cd659bc9c0e917 Mon Sep 17 00:00:00 2001 From: James Potts Date: Fri, 5 Feb 2016 19:39:33 -0600 Subject: [PATCH 11/23] Fixed uopen definition. That was embarrasing. I forgot to make sure that the 2 open functions had compatible signatures or that I was using them in a compatible way. My wrapper now fixes that, but doesn't expose the full functionality of open(), only what's used here. --- PyLotROLauncher/PyLotROUtils.py | 42 +++++++++++++-------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index dfc5fc8..30c333b 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -40,11 +40,11 @@ # Python 3 on windows needs Turbine-supplied config files # to be written in UTF-8, but Python 2 doesn't, and won't # convert an ascii string for use in codecs.open() -if sys.version_info > (2,): - import codecs - uopen = codecs.open +if sys.version_info >= (3,): + from codecs import open as uopen else: - uopen = open + def uopen(name, mode, dummy): + return open(name, mode) # If Python >3.0 is in use use http otherwise httplib # Python >3.0 uses unicode strings by default, so also @@ -252,7 +252,7 @@ def startCXG(self): os.environ["FONT_ENCODINGS_DIRECTORY"] = (cxPath + "/Contents/SharedSupport/X11/lib/" + "X11/fonts/encodings/encodings.dir") os.environ["FONTCONFIG_ROOT"] = "%s/Contents/SharedSupport/X11" % (cxPath) - os.environ["COMMAND_MODE"] = "legacy" + os.environ["COMMAND_MODE"] = "legacy" os.environ["FONTCONFIG_PATH"] = "%s/Contents/SharedSupport/X11/etc/fonts" % (cxPath) os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = (cxPath + "/Contents/SharedSupport/X11/lib" + ":" + os.environ.get('HOME') + "/lib:/usr/local/lib:/lib:/usr/lib") @@ -266,7 +266,7 @@ def startCXG(self): display = "2" os.environ["DISPLAY"] = ":%s" % (display) - return finished + return finished def startCXO(self): finished = True @@ -309,7 +309,7 @@ def startCXO(self): os.environ["FONT_ENCODINGS_DIRECTORY"] = (cxPath + "/Contents/SharedSupport/X11/lib/" + "X11/fonts/encodings/encodings.dir") os.environ["FONTCONFIG_ROOT"] = "%s/Contents/SharedSupport/X11" % (cxPath) - os.environ["COMMAND_MODE"] = "legacy" + os.environ["COMMAND_MODE"] = "legacy" os.environ["FONTCONFIG_PATH"] = "%s/Contents/SharedSupport/X11/etc/fonts" % (cxPath) os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = (cxPath + "/Contents/SharedSupport/X11/lib" + ":" + os.environ.get('HOME') + "/lib:/usr/local/lib:/lib:/usr/lib") @@ -323,7 +323,7 @@ def startCXO(self): display = "2" os.environ["DISPLAY"] = ":%s" % (display) - return finished + return finished class GLSDataCentre: def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): @@ -391,16 +391,14 @@ def __init__(self, code): if code == "EN_GB": self.name = "English (UK)" self.code = "ENGLISH" - self.news = "en" - elif code == "ENGLISH" or code == "en": + elif code == "ENGLISH": self.name = "English" self.code = "ENGLISH" - self.news = "en" - elif code == "FR" or code == "fr": + elif code == "FR": self.name = "French" self.code = "FR" self.news = "fr" - elif code == "DE" or code == "de": + elif code == "DE": self.name = "German" self.code = "DE" self.news = "de" @@ -418,12 +416,6 @@ def __init__(self, runDir): # remove "client_local_" (13 chars) and ".dat" (4 chars) from filename temp = os.path.basename(name)[13:-4] self.langList.append(Language(temp)) - # Handle newer clients where the language is a subdir - for name in os.listdir(runDir): - lang = Language(name) - if lang.news != "": - self.langList.append(lang) - self.langFound = True class Realm: def __init__(self, name, urlChatServer, urlServerStatus): @@ -517,17 +509,17 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): elif node.getAttribute("key") == "GameClient.WIN32.ArgTemplate": self.gameClientArgTemplate = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.crashreceiver": - self.crashreceiver = node.getAttribute("value") + self.crashreceiver = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.DefaultUploadThrottleMbps": - self.DefaultUploadThrottleMbps = node.getAttribute("value") + self.DefaultUploadThrottleMbps = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.bugurl": - self.bugurl = node.getAttribute("value") + self.bugurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.authserverurl": - self.authserverurl = node.getAttribute("value") + self.authserverurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.supporturl": - self.supporturl = node.getAttribute("value") + self.supporturl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.supportserviceurl": - self.supportserviceurl = node.getAttribute("value") + self.supportserviceurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.glsticketlifetime": self.glsticketlifetime = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsFeed": From 54ae99dca37978f5a4422df7e88467855ddfbd47 Mon Sep 17 00:00:00 2001 From: James Potts Date: Fri, 5 Feb 2016 20:13:03 -0600 Subject: [PATCH 12/23] Fixed whitespace errors, again. --- PyLotROLauncher/PyLotROUtils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 30c333b..388e256 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -509,17 +509,17 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): elif node.getAttribute("key") == "GameClient.WIN32.ArgTemplate": self.gameClientArgTemplate = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.crashreceiver": - self.crashreceiver = node.getAttribute("value") + self.crashreceiver = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.DefaultUploadThrottleMbps": - self.DefaultUploadThrottleMbps = node.getAttribute("value") + self.DefaultUploadThrottleMbps = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.bugurl": - self.bugurl = node.getAttribute("value") + self.bugurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.authserverurl": - self.authserverurl = node.getAttribute("value") + self.authserverurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.supporturl": - self.supporturl = node.getAttribute("value") + self.supporturl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.supportserviceurl": - self.supportserviceurl = node.getAttribute("value") + self.supportserviceurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.glsticketlifetime": self.glsticketlifetime = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsFeed": From 5178e90718e9df23e5ac0accd7b69c01b903c599 Mon Sep 17 00:00:00 2001 From: James Potts Date: Sun, 7 Feb 2016 13:40:57 -0600 Subject: [PATCH 13/23] Fix language list displaying non-languages in list. --- PyLotROLauncher/PyLotROUtils.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 72f345a..88cd50b 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -375,22 +375,24 @@ def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): class Language: def __init__(self, code): - self.code = code.upper() + # make code uppercase for easier testing - don't use self.code here unless you want to test against self.code instead of code. + code = code.upper() + print("{}: {}".format("code", code)) self.news = "en" if code == "EN_GB": self.name = "English (UK)" self.code = "ENGLISH" self.news = "en" - elif code == "ENGLISH" or code == "en": + elif code == "ENGLISH" or code == "EN": self.name = "English" self.code = "ENGLISH" self.news = "en" - elif code == "FR" or code == "fr": + elif code == "FR": self.name = "French" self.code = "FR" self.news = "fr" - elif code == "DE" or code == "de": + elif code == "DE": self.name = "German" self.code = "DE" self.news = "de" @@ -410,8 +412,9 @@ def __init__(self, runDir): self.langList.append(Language(temp)) # Handle newer clients where the language is a subdir for name in os.listdir(runDir): - lang = Language(name) - if lang.news != "": + path = os.path.join(runDir, name) + if os.path.exists(os.path.join(path, "Licenses")): + lang = Language(name) self.langList.append(lang) self.langFound = True From e91608fcd794c08dc8d67e8947b4e25319aa9844 Mon Sep 17 00:00:00 2001 From: James Potts Date: Sun, 7 Feb 2016 13:40:57 -0600 Subject: [PATCH 14/23] Fix language list displaying non-languages in list. --- PyLotROLauncher/PyLotROUtils.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 388e256..062975d 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -385,7 +385,9 @@ def __init__(self, urlGLSDataCentreService, gameName, baseDir, osType): class Language: def __init__(self, code): - self.code = code.upper() + # make code uppercase for easier testing - don't use self.code here unless you want to test against self.code instead of code. + code = code.upper() + print("{}: {}".format("code", code)) self.news = "en" if code == "EN_GB": @@ -394,6 +396,11 @@ def __init__(self, code): elif code == "ENGLISH": self.name = "English" self.code = "ENGLISH" + self.news = "en" + elif code == "ENGLISH" or code == "EN": + self.name = "English" + self.code = "ENGLISH" + self.news = "en" elif code == "FR": self.name = "French" self.code = "FR" @@ -416,6 +423,13 @@ def __init__(self, runDir): # remove "client_local_" (13 chars) and ".dat" (4 chars) from filename temp = os.path.basename(name)[13:-4] self.langList.append(Language(temp)) + # Handle newer clients where the language is a subdir + for name in os.listdir(runDir): + path = os.path.join(runDir, name) + if os.path.exists(os.path.join(path, "Licenses")): + lang = Language(name) + self.langList.append(lang) + self.langFound = True class Realm: def __init__(self, name, urlChatServer, urlServerStatus): From 7f1c66c943cd601dab561693caafa82ce4e7db31 Mon Sep 17 00:00:00 2001 From: James Potts Date: Sun, 7 Feb 2016 15:52:21 -0600 Subject: [PATCH 15/23] Fixed a problem with the merge. --- PyLotROLauncher/PyLotROUtils.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 062975d..8270a16 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -393,9 +393,6 @@ def __init__(self, code): if code == "EN_GB": self.name = "English (UK)" self.code = "ENGLISH" - elif code == "ENGLISH": - self.name = "English" - self.code = "ENGLISH" self.news = "en" elif code == "ENGLISH" or code == "EN": self.name = "English" From e8f6c52f6ed1f9af4e583865b0484be47f7d927f Mon Sep 17 00:00:00 2001 From: James Potts Date: Sun, 7 Feb 2016 15:56:12 -0600 Subject: [PATCH 16/23] Removed some debugging code. --- PyLotROLauncher/PyLotROUtils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index 8270a16..db9a536 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -387,7 +387,6 @@ class Language: def __init__(self, code): # make code uppercase for easier testing - don't use self.code here unless you want to test against self.code instead of code. code = code.upper() - print("{}: {}".format("code", code)) self.news = "en" if code == "EN_GB": From 1587627f8ec09e9fd2f1fb92385f67b7fac0f43d Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Tue, 9 Feb 2016 12:12:18 -0800 Subject: [PATCH 17/23] typo --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 7c96c65..414ad8b 100644 --- a/README +++ b/README @@ -57,7 +57,7 @@ find relevant installations of LotRO or DDO. For CrossOver and CrossOver Games it searches in the default bottle location. For Wine it looks for wine folders in your home directory -(folders tarting with a full stop with a +(folders starting with a full stop with a directory called drive_c under that). For all options it tries to find the game in the "Program Files" directory (or directories off From 00821cdd7def7081df514bb6d8e4a2ec2746081e Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Fri, 25 Mar 2016 15:43:00 -0700 Subject: [PATCH 18/23] News feed fixes and widget palette adjustments. Verson bump to 0.2.4. --- ChangeLog | 6 ++++ PyLotRO.iss | 2 +- PyLotROLauncher/CheckConfig.py | 1 + PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/MainWindow.py | 49 +++++++++++++++++++++++++++++-- PyLotROLauncher/PatchWindow.py | 1 + PyLotROLauncher/SettingsWindow.py | 1 + PyLotROLauncher/SettingsWizard.py | 1 + PyLotROLauncher/StartGame.py | 1 + 9 files changed, 59 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0fb7305..b76d60b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -90,3 +90,9 @@ Changes files for each language. Now each language has a separate subdirectory. If the client local file is not found then I (hcjiv1) pick languages based on those subdirectories. Thanks to hcjiv1 and Arek75. Version bump to 0.2.3 + +0.2.4 News feed fixed - Apparently Turbine changed the content encoding of the news feed to + gzip and retrieving the news feed was failing. We now accept gzip content + encoding for the news feed by default and check the Content-Encoding header and + uncompress if content is gzip. + Also some palette adjustments to the widgets (darker theme) diff --git a/PyLotRO.iss b/PyLotRO.iss index 8910cfd..d5a2391 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.3 +AppVerName=PyLotRO 0.2.4 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/CheckConfig.py b/PyLotROLauncher/CheckConfig.py index d9da51c..dd98685 100644 --- a/PyLotROLauncher/CheckConfig.py +++ b/PyLotROLauncher/CheckConfig.py @@ -40,6 +40,7 @@ def __init__(self, parent, settings, homeDir, osType, rootDir): self.osType = osType self.winCheckConfig = QtGui.QDialog(parent) + self.winCheckConfig.setPalette(parent.palette()) uifile = None diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index 1b9ff56..e868e46 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.3" +Version = "0.2.4" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/MainWindow.py b/PyLotROLauncher/MainWindow.py index 59cc2ae..243215e 100644 --- a/PyLotROLauncher/MainWindow.py +++ b/PyLotROLauncher/MainWindow.py @@ -30,6 +30,7 @@ import os import sys import xml.dom.minidom +import zlib from PyQt4 import QtCore, QtGui, uic from .SettingsWindow import SettingsWindow from .SettingsWizard import SettingsWizard @@ -83,6 +84,30 @@ def __init__(self): self.uiMain = Ui_winMain() self.uiMain.setupUi(self.winMain) + # Set window palette + self.palette = QtGui.QPalette() + self.palette.setColor(QtGui.QPalette.Base, QtCore.Qt.black) + self.palette.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(22,21,21)) + self.palette.setColor(QtGui.QPalette.ToolTipBase, QtGui.QColor(255,255,220)) + self.palette.setColor(QtGui.QPalette.ToolTipText, QtCore.Qt.black) + self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(44,43,42)) + self.palette.setColor(QtGui.QPalette.WindowText, QtCore.Qt.white) + self.palette.setColor(QtGui.QPalette.Text, QtCore.Qt.white) + self.palette.setColor(QtGui.QPalette.BrightText, QtCore.Qt.white) + self.palette.setColor(QtGui.QPalette.ButtonText, QtCore.Qt.white) + self.palette.setColor(QtGui.QPalette.Button, QtGui.QColor(44,43,42)) + self.winMain.setPalette(self.palette) + + # find menubar object and save it so we can find the menus + for child in self.winMain.children(): + if isinstance(child, QtGui.QMenuBar): + self.menubar = child + + # find menu objects and set the palette on them + for child in self.menubar.children(): + if isinstance(child, QtGui.QMenu): + child.setPalette(self.palette) + self.webMainExists = True try: self.webMain = QtWebKit.QWebView(self.uiMain.centralwidget) @@ -162,6 +187,7 @@ def actionCheckSelected(self): def actionAboutSelected(self): dlgAbout = QtGui.QDialog(self.winMain) + dlgAbout.setPalette(self.winMain.palette()) uifile = None @@ -240,6 +266,7 @@ def actionWizardSelected(self): def actionSwitchSelected(self): dlgChooseAccount = QtGui.QDialog(self.winMain) + dlgChooseAccount.setPalette(self.winMain.palette()) uifile = None @@ -640,11 +667,16 @@ def GetNews(self): webservice, post = WebConnection(self.worldQueueConfig.newsStyleSheetURL) webservice.putrequest("GET", post) + webservice.putheader("Accept-Encoding", "gzip") webservice.endheaders() webresp = webservice.getresponse() - tempxml = webresp.read() + if webresp.getheader('Content-Encoding', '') == 'gzip': + tempxml = zlib.decompress(webresp.read(), 16+zlib.MAX_WBITS) + + else: + tempxml = webresp.read() doc = xml.dom.minidom.parseString(tempxml) @@ -673,18 +705,29 @@ def GetNews(self): webservice, post = WebConnection(urlNewsFeed) webservice.putrequest("GET", post) + webservice.putheader("Accept-Encoding", "gzip") webservice.endheaders() webresp = webservice.getresponse() - tempxml = webresp.read() + if webresp.getheader('Content-Encoding', '') == 'gzip': + tempxml = zlib.decompress(webresp.read(), 16+zlib.MAX_WBITS) + + else: + tempxml = webresp.read() if len(tempxml) == 0: webservice, post = WebConnection(webresp.getheader("location")) webservice.putrequest("GET", post) + webservice.putheader("Accept-Encoding", "gzip") webservice.endheaders() webresp = webservice.getresponse() - tempxml = webresp.read() + + if webresp.getheader('Content-Encoding', '') == 'gzip': + tempxml = zlib.decompress(webresp.read(), 16+zlib.MAX_WBITS) + + else: + tempxml = webresp.read() result = HTMLTEMPLATE diff --git a/PyLotROLauncher/PatchWindow.py b/PyLotROLauncher/PatchWindow.py index fd17341..8257850 100644 --- a/PyLotROLauncher/PatchWindow.py +++ b/PyLotROLauncher/PatchWindow.py @@ -40,6 +40,7 @@ def __init__(self, parent, urlPatchServer, prodCode, language, runDir, patchClie self.winMain = parent self.homeDir = homeDir self.winLog = QtGui.QDialog(parent) + self.winLog.setPalette(parent.palette()) self.osType = osType uifile = None diff --git a/PyLotROLauncher/SettingsWindow.py b/PyLotROLauncher/SettingsWindow.py index 6caef30..43edafe 100644 --- a/PyLotROLauncher/SettingsWindow.py +++ b/PyLotROLauncher/SettingsWindow.py @@ -40,6 +40,7 @@ def __init__(self, parent, hiRes, app, wineProg, wineDebug, patchClient, winePre self.osType = osType self.winSettings = QtGui.QDialog(parent) + self.winSettings.setPalette(parent.palette()) uifile = None diff --git a/PyLotROLauncher/SettingsWizard.py b/PyLotROLauncher/SettingsWizard.py index da6afff..1ed74be 100644 --- a/PyLotROLauncher/SettingsWizard.py +++ b/PyLotROLauncher/SettingsWizard.py @@ -48,6 +48,7 @@ def __init__(self, parent, homeDir, osType, rootDir): self.gameDir = "" self.winSettings = QtGui.QDialog(parent) + self.winSettings.setPalette(parent.palette()) uifile = None diff --git a/PyLotROLauncher/StartGame.py b/PyLotROLauncher/StartGame.py index 59016d0..e2a7867 100644 --- a/PyLotROLauncher/StartGame.py +++ b/PyLotROLauncher/StartGame.py @@ -41,6 +41,7 @@ def __init__(self, parent, appName, argTemplate, account, server, ticket, self.winMain = parent self.homeDir = homeDir self.winLog = QtGui.QDialog(parent) + self.winLog.setPalette(parent.palette()) self.osType = osType uifile = None From 20254cccb1648910914b57bea108c69007f41cb4 Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Wed, 30 Mar 2016 18:02:54 -0700 Subject: [PATCH 19/23] Fix news feed again, white space cleanup --- PyLotROLauncher/MainWindow.py | 6 +++--- PyLotROLauncher/PyLotROUtils.py | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/PyLotROLauncher/MainWindow.py b/PyLotROLauncher/MainWindow.py index 243215e..d9ed4da 100644 --- a/PyLotROLauncher/MainWindow.py +++ b/PyLotROLauncher/MainWindow.py @@ -674,7 +674,6 @@ def GetNews(self): if webresp.getheader('Content-Encoding', '') == 'gzip': tempxml = zlib.decompress(webresp.read(), 16+zlib.MAX_WBITS) - else: tempxml = webresp.read() @@ -695,6 +694,9 @@ def GetNews(self): if link.nodeType == link.ELEMENT_NODE: href = link.attributes["href"] + # Ignore broken href (as of 3/30/16) in the style sheet and use Launcher.NewsFeedCSSUrl defined in launcher.config + href.value = self.worldQueueConfig.newsFeedCSSURL + HTMLTEMPLATE = '
' @@ -712,7 +714,6 @@ def GetNews(self): if webresp.getheader('Content-Encoding', '') == 'gzip': tempxml = zlib.decompress(webresp.read(), 16+zlib.MAX_WBITS) - else: tempxml = webresp.read() @@ -725,7 +726,6 @@ def GetNews(self): if webresp.getheader('Content-Encoding', '') == 'gzip': tempxml = zlib.decompress(webresp.read(), 16+zlib.MAX_WBITS) - else: tempxml = webresp.read() diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index db9a536..fab7f60 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -532,6 +532,8 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): self.supportserviceurl = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.glsticketlifetime": self.glsticketlifetime = node.getAttribute("value") + elif node.getAttribute("key") == "Launcher.NewsFeedCSSUrl": + self.newsFeedCSSURL = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsFeed": self.newsFeedURL = node.getAttribute("value") elif node.getAttribute("key") == "URL.NewsStyleSheet": From 3eba1b8a8eda01cd67c9f326d3cf2da4904945ab Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Fri, 2 Jun 2017 07:14:22 -0700 Subject: [PATCH 20/23] Added code to handle local game client override in TurbineLauncher.exe.config in game directory --- ChangeLog | 7 +++++++ PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/MainWindow.py | 6 ++++-- PyLotROLauncher/PyLotROUtils.py | 17 ++++++++++++++++- PyLotROLauncher/StartGame.py | 9 ++++++++- 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index b76d60b..a8b54de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -96,3 +96,10 @@ Changes encoding for the news feed by default and check the Content-Encoding header and uncompress if content is gzip. Also some palette adjustments to the widgets (darker theme) + +0.2.5 Added code to check for local game client override in TurbineLauncher.exe.config in game + directory. This is to handle workaround from SSG for game client crashes on + Windows XP/Vista platforms that also affects Linux users running the game under + wine. For more information see link below. + + https://www.lotro.com/forums/showthread.php?654273-Windows-XP-and-Vista-Launcher-Issues-Solution diff --git a/PyLotRO.iss b/PyLotRO.iss index d5a2391..304d9f6 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.4 +AppVerName=PyLotRO 0.2.5 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index e868e46..c45104a 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.4" +Version = "0.2.5" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/MainWindow.py b/PyLotROLauncher/MainWindow.py index d9ed4da..a0f290e 100644 --- a/PyLotROLauncher/MainWindow.py +++ b/PyLotROLauncher/MainWindow.py @@ -397,7 +397,9 @@ def LaunchGame(self): self.worldQueueConfig.crashreceiver, self.worldQueueConfig.DefaultUploadThrottleMbps, self.worldQueueConfig.bugurl, self.worldQueueConfig.authserverurl, self.worldQueueConfig.supporturl, self.worldQueueConfig.supportserviceurl, - self.worldQueueConfig.glsticketlifetime) + self.worldQueueConfig.glsticketlifetime, + self.uiMain.cboRealm.currentText(), + self.uiMain.txtAccount.text()) self.winMain.hide() game.Run() @@ -649,7 +651,7 @@ def AccessGLSDataCentre(self, urlGLS, gameName): QtCore.QObject.emit(self.winMain, QtCore.SIGNAL("AddLog(QString)"), "[E04] Error accessing GLS data centre.") def GetWorldQueueConfig(self, urlWorldQueueServer): - self.worldQueueConfig = WorldQueueConfig(urlWorldQueueServer, self.settings.usingDND, self.baseDir, self.osType) + self.worldQueueConfig = WorldQueueConfig(urlWorldQueueServer, self.settings.usingDND, self.baseDir, self.osType, self.settings.gameDir) if self.worldQueueConfig.loadSuccess: QtCore.QObject.emit(self.winMain, QtCore.SIGNAL("AddLog(QString)"), "World queue configuration read") diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index fab7f60..b2cec17 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -475,7 +475,7 @@ def CheckRealm(self, useDND, baseDir, osType): self.realmAvailable = False class WorldQueueConfig: - def __init__(self, urlConfigServer, usingDND, baseDir, osType): + def __init__(self, urlConfigServer, usingDND, baseDir, osType, gameDir): self.gameClientFilename = "" self.gameClientArgTemplate = "" self.crashreceiver = "" @@ -546,6 +546,21 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType): self.worldQueueParam = node.getAttribute("value") self.loadSuccess = True + + # check TurbineLauncher.exe.config in gameDir for local game client override + tempxml = "" + filename = gameDir + '/TurbineLauncher.exe.config' + if os.path.exists(filename): + infile = uopen(filename, "r", "utf-8") + tempxml = infile.read() + infile.close() + doc = xml.dom.minidom.parseString(tempxml) + nodes = doc.getElementsByTagName("appSettings")[0].childNodes + for node in nodes: + if node.nodeType == node.ELEMENT_NODE: + if node.getAttribute("key") == "GameClient.WIN32.Filename": + self.gameClientFilename = node.getAttribute("value") + except: self.loadSuccess = False raise diff --git a/PyLotROLauncher/StartGame.py b/PyLotROLauncher/StartGame.py index e2a7867..eb339f2 100644 --- a/PyLotROLauncher/StartGame.py +++ b/PyLotROLauncher/StartGame.py @@ -36,13 +36,15 @@ def __init__(self, parent, appName, argTemplate, account, server, ticket, chatServer, language, runDir, wineProgram, wineDebug, winePrefix, hiResEnabled, wineApp, osType, homeDir, icoFileIn, rootDir, crashreceiver, DefaultUploadThrottleMbps, bugurl, authserverurl, - supporturl, supportserviceurl, glsticketlifetime): + supporturl, supportserviceurl, glsticketlifetime, realmName, accountText): self.winMain = parent self.homeDir = homeDir self.winLog = QtGui.QDialog(parent) self.winLog.setPalette(parent.palette()) self.osType = osType + self.realmName = realmName + self.accountText = accountText uifile = None icofile = None @@ -179,6 +181,11 @@ def __init__(self, parent, appName, argTemplate, account, server, ticket, for arg in tempArg.split(" "): self.arguments.append(arg) + self.uiLog.txtLog.append("Connecting to server: " + realmName) + self.uiLog.txtLog.append("Account: " + accountText) + self.uiLog.txtLog.append("Game Directory: " + runDir) + self.uiLog.txtLog.append("Game Client: " + appName) + def readOutput(self): self.uiLog.txtLog.append(QByteArray2str(self.process.readAllStandardOutput())) From a9c96404cadab22b2d03540731f5a11a2c29d229 Mon Sep 17 00:00:00 2001 From: Neal Westfall Date: Fri, 16 Mar 2018 18:07:01 -0700 Subject: [PATCH 21/23] Update to new SSL certificate chain used by SSG --- ChangeLog | 3 + PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/certificates/ca_certs.pem | 169 +++++++++++----------- 4 files changed, 88 insertions(+), 88 deletions(-) diff --git a/ChangeLog b/ChangeLog index a8b54de..13e3e03 100644 --- a/ChangeLog +++ b/ChangeLog @@ -103,3 +103,6 @@ Changes wine. For more information see link below. https://www.lotro.com/forums/showthread.php?654273-Windows-XP-and-Vista-Launcher-Issues-Solution + +0.2.6 Updated certificate chain to new SSL certificates after recent update (22.0.1 or possibly 22) update + by SSG broke authentication using the old certs. diff --git a/PyLotRO.iss b/PyLotRO.iss index 304d9f6..42fed96 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.5 +AppVerName=PyLotRO 0.2.6 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index c45104a..ff42b2c 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.5" +Version = "0.2.6" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/certificates/ca_certs.pem b/PyLotROLauncher/certificates/ca_certs.pem index eb6c790..1c8e754 100644 --- a/PyLotROLauncher/certificates/ca_certs.pem +++ b/PyLotROLauncher/certificates/ca_certs.pem @@ -1,92 +1,89 @@ -----BEGIN CERTIFICATE----- -MIIGBjCCA+6gAwIBAgIRAMPe33bP14a+oa+L7++k3TgwDQYJKoZIhvcNAQEMBQAw -gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK -ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD -VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE0 -MDkyNDAwMDAwMFoXDTI0MDkyMzIzNTk1OVowejELMAkGA1UEBhMCVVMxCzAJBgNV -BAgTAlZBMRAwDgYDVQQHEwdIZXJuZG9uMSEwHwYDVQQKExhOZXR3b3JrIFNvbHV0 -aW9ucyBMLkwuQy4xKTAnBgNVBAMTIE5ldHdvcmsgU29sdXRpb25zIE9WIFNlcnZl -ciBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhMEY20u06eQH -i9Bk1mdkoZzwMzzodh2U4tUYRyi3Ezrk8ylwlRu5JWi2fBd9dE7z4JMrYlE2pNlY -EfNzqHw2C8g8paL9EYvcEa7MVltx2/qYTZ+WXDt7IeS/rKLEmpnyjSjPjeOQn9rH -86wtGQOEfn2yrw+LwshvK7memBk8woCJxmyEXqi2MxfXjdHSF8fyF6N/j12iUMeS -rU93QKecdOx5Bv5y8R17GDorK6F5gvDXGsA55zgjpouIiNnd/fue8yMv4nOnN/C4 -78sSniJ+mmgHOqX6ZfyMS08+CqHMp+D7/m3n9eYHcBX9mFltwGHQh4CUHSaXBGsY -sb54MHdVeQIDAQABo4IBdjCCAXIwHwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd -8rIDZsswHQYDVR0OBBYEFCAzzbdh9qWGT9zJ13NqvApRZZjsMA4GA1UdDwEB/wQE -AwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr -BgEFBQcDAjAjBgNVHSAEHDAaMA4GDCsGAQQBhg4BAgEDATAIBgZngQwBAgIwUAYD -VR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVz -dFJTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/ -BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJT -QUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1 -c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAipDA3APqXT3n3SWLtMk4GrCEm5TH7 -oIlIaaPVJ/TBuKFM45rOUyKmsLta0Lc5M6hfo2Hs/YRuNFgxA9QAiJUsBtFEOtIK -BTK7rMvwgxwtlVKHKUZ3l91EO2dwPmENmLH5krb6uOuKzlBC7RHh2sjXDDBLjyok -uHOm34TJpI4vjB0zxf752Z3H5OxGR2tUpBo0T3+7mz0d4Ve4Hp60cJTLhRpitOUS -CpK2rEcWnGzx+WXucSk9REVugbucdA6UrAqBp0TQ5Z0j4dSMGLa6e7U1mbJz+zDF -oPbUjwh7rNKm385hH5ahuX01nQk+PplCTTXsR5B3LjiKY0QP6x93SGVvdh2azrsw -/FQI1n7M9k3fPzrHFuYYct/YYqJGkLCPzpzn3a6pkKvtJWfG7SY2CgcepPR8gn2v -I8GIM3tDmZ2ZDSyI8qulT9/Vey2gL3CL895SWseWCii5TMR6Ox7LeBCZj0iZhLXH -aaJprqX/B8t72NYrL3NZSiMbHBfzwIQiVSMw4hMHdL68VC+bASpgcfBtMPW/fpwN -T2BuSzxVuMpjq3b124i5wd2cGDqWDJ4N8nauG8mawekrazr7OakVUY3O4Own76Pd -M9ubyuCZUE+bR5eFhpx3/x/FBB5QWFv3fYq5nyyaxnG2hVSZqtp4RTNrGKVWG5+D -blKbMUlAzl8aVQ== +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk -ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF -eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow -gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK -ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD -VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00yt -UINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NC -tnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQf -jtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM -8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hm -AUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiV -Z4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9 -N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sF -qV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9 -HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ -+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyX -HAc/DVL17e8vgg8CAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTv -A73gJMtUGjAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/ -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1Ud -HwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4 -dGVybmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0 -dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAJNl9jeD -lQ9ew4IcH9Z35zyKwKoJ8OkLJvHgwmp1ocd5yblSYMgpEg7wrQPWCcR23+WmgZWn -RtqCV6mVksW2jwMibDN3wXsyF24HzloUQToFJBv2FAY7qCUkDrvMKnXduXBBP3zQ -YzYhBx9G/2CkkeFnvN4ffhkUyWNnkepnB2u0j4vAbkN9w6GAbLIevFOFfdyQoaS8 -Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf -Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p -0fKtirOMxyHNwu8= +MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy +YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2 +4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC +Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1 +itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn +4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X +sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft +bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw +NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy +dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t +L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG +BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ +UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D +aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd +aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH +E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly +/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu +xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF +0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae +cPUeybQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +MIIGeDCCBWCgAwIBAgIQBgKb3FRFwPBduUYWKUhgrDANBgkqhkiG9w0BAQsFADBw +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz +dXJhbmNlIFNlcnZlciBDQTAeFw0xODAzMTIwMDAwMDBaFw0xOTAzMjAxMjAwMDBa +MIGEMQswCQYDVQQGEwJVUzELMAkGA1UECBMCbWExEDAOBgNVBAcTB05lZWRoYW0x +HTAbBgNVBAoTFFN0YW5kaW5nIFN0b25lIEdhbWVzMSEwHwYDVQQLExhTdGFuZGlu +ZyBTdG9uZSBHYW1lcyBMTEMxFDASBgNVBAMMCyoubG90cm8uY29tMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAztIfPfYhzT2nevQqOrtm8M4NF5j5FWG7 +UkZm7ab0BfzPcqdV+EaoJntDP30/QpvoLryACDBJ+iO2g+EWISaK0uWaW2agCOiY +jTcZFOoQecRqQFNrRZKDZ/kFU5qqyV3ex4DHc0mBmssuaale4IFqj/NcApAt/xaS +LzyfXerUJ9zgJYLbphIpZcUB/7YofhOc2dgzqgSoPA0N31SUvyZQWJJu3F1q4YPa +8ApZ+5OGxNbruwzjwZs8NUbiP2v2HqjxkpYdU5CjYFB8JeF8nGa3aM7xTLf2NxdG +BPp2zr0hybmGeoJNL6FtV0ieMzQiH+VY8hhw0QT8xTdUDCpzalnitQIDAQABo4IC +9zCCAvMwHwYDVR0jBBgwFoAUUWj/kK8CB3U8zNllZGKiErhZcjswHQYDVR0OBBYE +FK5HJlnjBHYloLJvDYjGYAb1sd0LMCEGA1UdEQQaMBiCCyoubG90cm8uY29tggls +b3Ryby5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr +BgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5odHRwOi8vY3JsMy5kaWdpY2VydC5j +b20vc2hhMi1oYS1zZXJ2ZXItZzYuY3JsMDSgMqAwhi5odHRwOi8vY3JsNC5kaWdp +Y2VydC5jb20vc2hhMi1oYS1zZXJ2ZXItZzYuY3JsMEwGA1UdIARFMEMwNwYJYIZI +AYb9bAEBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9D +UFMwCAYGZ4EMAQICMIGDBggrBgEFBQcBAQR3MHUwJAYIKwYBBQUHMAGGGGh0dHA6 +Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBNBggrBgEFBQcwAoZBaHR0cDovL2NhY2VydHMu +ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkhpZ2hBc3N1cmFuY2VTZXJ2ZXJDQS5j +cnQwDAYDVR0TAQH/BAIwADCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AKS5CZC0 +GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABYhxI4sQAAAQDAEcwRQIhAPM3 +Ml3DFVKv4SpCKxqAuTqhuOrtALKer1P+sk+u+OKCAiBCbMfSpVewdBSU7So7GHTs +s2EzTn3tVDdLKNgPBTiD7AB2AG9Tdqwx8DEZ2JkApFEV/3cVHBHZAsEAKQaNsgia +N9kTAAABYhxI5GEAAAQDAEcwRQIgTn/gPActne2hsVfowJ0VnvR9zypLBmufXNuo +kid/fvwCIQDR4xrWQsLPaudcHeLKPLWyuUAqFVnSptXBRd9fM6OB3DANBgkqhkiG +9w0BAQsFAAOCAQEABs3RFuCL2eHuC0cr398A6ZjwcjmEeKkQMKntRffCAmR5b5Gb +W8IwLWmXwtJWUz4tFIpWdpPaHdtZD3KFzlvGCm+YMH/n6zxXGve3JU+OTm216uOr +Oxyqrfs15Y19eGWe0A3Y3CgZtg6gEoqEnQfZk0DSUWGWNVu+wH0290TND8BRjwah +jFSUwfm+DzN157a1C7fO09p0EJTxmfA6f9GMIihJIHJhchFlWqsjaGnOO/o5f2gd +5YifUhgc10bIIwidT4FI/OYPTdKsZqy6q27UCEGJna8//Ft/vHcGKWlOTz7VhON4 +v4aW3gUfcSCUuaiHGQbyjgksyJtWNTRaUu6RzA== -----END CERTIFICATE----- + From 77ae2544bea819d2ed9ab64f337847bd592e392f Mon Sep 17 00:00:00 2001 From: root Date: Wed, 12 Feb 2020 14:59:03 -0500 Subject: [PATCH 22/23] Added option to Game Settings to select game client. Version bump to 0.27 --- ChangeLog | 6 + PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/MainWindow.py | 16 ++- PyLotROLauncher/PyLotROUtils.py | 24 ++-- PyLotROLauncher/Settings.py | 7 + PyLotROLauncher/SettingsWindow.py | 10 +- PyLotROLauncher/ui/winSettings.ui | 170 ++++++++++++++---------- PyLotROLauncher/ui/winSettingsNative.ui | 108 +++++++++------ 9 files changed, 209 insertions(+), 136 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13e3e03..0a8522a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -106,3 +106,9 @@ Changes 0.2.6 Updated certificate chain to new SSL certificates after recent update (22.0.1 or possibly 22) update by SSG broke authentication using the old certs. + +0.2.7 Added option in Game Settings to select which game client to use. + The choices are 32-bit, 32-bit Legacy ("Awesomium"), and 64-bit. The 32-bit + Legacy Awesomium client is recommended for Linux users. Game client override + code that checked TurbineLauncher.exe.config has been removed since it is no + longer needed with this option. diff --git a/PyLotRO.iss b/PyLotRO.iss index 42fed96..281eb4e 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.6 +AppVerName=PyLotRO 0.2.7 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index ff42b2c..fcde622 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.6" +Version = "0.2.7" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/MainWindow.py b/PyLotROLauncher/MainWindow.py index a0f290e..80ab829 100644 --- a/PyLotROLauncher/MainWindow.py +++ b/PyLotROLauncher/MainWindow.py @@ -224,11 +224,13 @@ def actionPatchSelected(self): def actionOptionsSelected(self): winSettings = SettingsWindow(self.winMain, self.settings.hiResEnabled, self.settings.app, self.settings.wineProg, self.settings.wineDebug, self.settings.patchClient, - self.settings.winePrefix, self.settings.gameDir, self.valHomeDir, self.osType, self.rootDir) + self.settings.winePrefix, self.settings.gameDir, self.valHomeDir, self.osType, self.rootDir, + self.settings.gameClientIdx) self.hideWinMain() if winSettings.Run() == QtGui.QDialog.Accepted: self.settings.hiResEnabled = winSettings.getHiRes() + self.settings.gameClientIdx = winSettings.getGameClientIdx() self.settings.app = winSettings.getApp() self.settings.patchClient = winSettings.getPatchClient() self.settings.gameDir = winSettings.getGameDir() @@ -252,6 +254,7 @@ def actionWizardSelected(self): self.settings.usingDND = winWizard.getUsingDND() self.settings.usingTest = winWizard.getUsingTest() self.settings.hiResEnabled = winWizard.getHiRes() + self.settings.gameClientIdx = winSettings.getGameClientIdx() self.settings.app = winWizard.getApp() self.settings.wineProg = winWizard.getProg() self.settings.wineDebug = winWizard.getDebug() @@ -387,7 +390,16 @@ def AuthAccount(self): self.AddLog(self.account.messError) def LaunchGame(self): - game = StartGame(self.winMain, self.worldQueueConfig.gameClientFilename, + gameClientIdx = int(self.settings.gameClientIdx) + + if gameClientIdx == 0: + gameClientFilename = self.worldQueueConfig.gameClientFilename32 + elif gameClientIdx == 1: + gameClientFilename = self.worldQueueConfig.gameClientFilenameLegacy + elif gameClientIdx == 2: + gameClientFilename = "x64/" + self.worldQueueConfig.gameClientFilename64 + + game = StartGame(self.winMain, gameClientFilename, self.worldQueueConfig.gameClientArgTemplate, self.accNumber, self.urlLoginServer, self.account.ticket, self.urlChatServer, self.langConfig.langList[self.uiMain.cboLanguage.currentIndex()].code, diff --git a/PyLotROLauncher/PyLotROUtils.py b/PyLotROLauncher/PyLotROUtils.py index b2cec17..a3bdae8 100644 --- a/PyLotROLauncher/PyLotROUtils.py +++ b/PyLotROLauncher/PyLotROUtils.py @@ -477,6 +477,9 @@ def CheckRealm(self, useDND, baseDir, osType): class WorldQueueConfig: def __init__(self, urlConfigServer, usingDND, baseDir, osType, gameDir): self.gameClientFilename = "" + self.gameClientFilename32 = "" + self.gameClientFilename64 = "" + self.gameClientFilenameLegacy = "" self.gameClientArgTemplate = "" self.crashreceiver = "" self.DefaultUploadThrottleMbps = "" @@ -515,7 +518,11 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType, gameDir): for node in nodes: if node.nodeType == node.ELEMENT_NODE: if node.getAttribute("key") == "GameClient.WIN32.Filename": - self.gameClientFilename = node.getAttribute("value") + self.gameClientFilename32 = node.getAttribute("value") + if node.getAttribute("key") == "GameClient.WIN64.Filename": + self.gameClientFilename64 = node.getAttribute("value") + if node.getAttribute("key") == "GameClient.WIN32Legacy.Filename": + self.gameClientFilenameLegacy = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.WIN32.ArgTemplate": self.gameClientArgTemplate = node.getAttribute("value") elif node.getAttribute("key") == "GameClient.Arg.crashreceiver": @@ -546,21 +553,6 @@ def __init__(self, urlConfigServer, usingDND, baseDir, osType, gameDir): self.worldQueueParam = node.getAttribute("value") self.loadSuccess = True - - # check TurbineLauncher.exe.config in gameDir for local game client override - tempxml = "" - filename = gameDir + '/TurbineLauncher.exe.config' - if os.path.exists(filename): - infile = uopen(filename, "r", "utf-8") - tempxml = infile.read() - infile.close() - doc = xml.dom.minidom.parseString(tempxml) - nodes = doc.getElementsByTagName("appSettings")[0].childNodes - for node in nodes: - if node.nodeType == node.ELEMENT_NODE: - if node.getAttribute("key") == "GameClient.WIN32.Filename": - self.gameClientFilename = node.getAttribute("value") - except: self.loadSuccess = False raise diff --git a/PyLotROLauncher/Settings.py b/PyLotROLauncher/Settings.py index 8e8e916..2664ecb 100644 --- a/PyLotROLauncher/Settings.py +++ b/PyLotROLauncher/Settings.py @@ -52,6 +52,7 @@ def LoadSettings(self, useGame=None): self.focusAccount = True self.winePrefix = os.environ.get('WINEPREFIX') self.gameDir = "" + self.gameClientIdx = 0 self.hideWinMain = False success = False @@ -95,6 +96,8 @@ def LoadSettings(self, useGame=None): self.hiResEnabled = True else: self.hiResEnabled = False + elif node.nodeName == "Game.Client.Index": + self.gameClientIdx = GetText(node.childNodes) elif node.nodeName == "Game.Directory": self.gameDir = GetText(node.childNodes) elif node.nodeName == "Realm": @@ -191,6 +194,10 @@ def SaveSettings(self, saveAccountDetails): tempNode.appendChild(doc.createTextNode("%s" % (self.gameDir))) gameConfigNode.appendChild(tempNode) + tempNode = doc.createElementNS(EMPTY_NAMESPACE, "Game.Client.Index") + tempNode.appendChild(doc.createTextNode("%s" % (self.gameClientIdx))) + gameConfigNode.appendChild(tempNode) + tempNode = doc.createElementNS(EMPTY_NAMESPACE, "PatchClient") tempNode.appendChild(doc.createTextNode("%s" % (self.patchClient))) gameConfigNode.appendChild(tempNode) diff --git a/PyLotROLauncher/SettingsWindow.py b/PyLotROLauncher/SettingsWindow.py index 43edafe..fa6ed20 100644 --- a/PyLotROLauncher/SettingsWindow.py +++ b/PyLotROLauncher/SettingsWindow.py @@ -34,7 +34,7 @@ class SettingsWindow: def __init__(self, parent, hiRes, app, wineProg, wineDebug, patchClient, winePrefix, - gameDir, homeDir, osType, rootDir): + gameDir, homeDir, osType, rootDir, gameClientIdx): self.homeDir = homeDir self.osType = osType @@ -77,6 +77,9 @@ def __init__(self, parent, hiRes, app, wineProg, wineDebug, patchClient, winePre self.uiSettings.txtGameDir.setText(gameDir) self.uiSettings.cboGraphics.addItem("Enabled") self.uiSettings.cboGraphics.addItem("Disabled") + self.uiSettings.cboGameClient.addItem("32-bit") + self.uiSettings.cboGameClient.addItem("32-bit Legacy (\"Awesomium\")") + self.uiSettings.cboGameClient.addItem("64-bit") self.uiSettings.chkAdvanced.setChecked(False) self.uiSettings.txtPatchClient.setText(patchClient) self.uiSettings.txtPatchClient.setEnabled(False) @@ -102,6 +105,8 @@ def __init__(self, parent, hiRes, app, wineProg, wineDebug, patchClient, winePre else: self.uiSettings.cboGraphics.setCurrentIndex(1) + self.uiSettings.cboGameClient.setCurrentIndex(int(gameClientIdx)) + QtCore.QObject.connect(self.uiSettings.btnGameDir, QtCore.SIGNAL("clicked()"), self.btnGameDirClicked) QtCore.QObject.connect(self.uiSettings.chkAdvanced, QtCore.SIGNAL("clicked()"), self.chkAdvancedClicked) @@ -203,6 +208,9 @@ def getHiRes(self): else: return False + def getGameClientIdx(self): + return self.uiSettings.cboGameClient.currentIndex() + def Run(self): return self.winSettings.exec_() diff --git a/PyLotROLauncher/ui/winSettings.ui b/PyLotROLauncher/ui/winSettings.ui index 6e6927f..cf5e14e 100644 --- a/PyLotROLauncher/ui/winSettings.ui +++ b/PyLotROLauncher/ui/winSettings.ui @@ -1,47 +1,48 @@ - + + dlgSettings - - + + Qt::ApplicationModal - + 0 0 460 - 338 + 379 - + Verdana 12 - + Game Settings - + true - - + + - 5 - 301 + 0 + 340 450 32 - + Qt::Horizontal - + QDialogButtonBox::Cancel|QDialogButtonBox::Save - - + + 5 10 @@ -49,12 +50,12 @@ 23 - + Application - - + + 155 5 @@ -63,8 +64,8 @@ - - + + 5 47 @@ -72,12 +73,12 @@ 23 - + WINEDEBUG - - + + 155 43 @@ -86,8 +87,8 @@ - - + + 5 85 @@ -95,12 +96,12 @@ 23 - + WINEPREFIX - - + + 155 80 @@ -109,11 +110,11 @@ - - + + true - + 155 79 @@ -122,8 +123,8 @@ - - + + 155 117 @@ -132,8 +133,8 @@ - - + + 419 117 @@ -141,12 +142,12 @@ 30 - + ... - - + + 5 121 @@ -154,12 +155,12 @@ 23 - + Game Directory - - + + 5 158 @@ -167,12 +168,12 @@ 23 - + Hi-Res Graphics - - + + 155 153 @@ -181,68 +182,91 @@ - - + + - 5 - 196 + 0 + 237 280 28 - + Advanced Options - + false - - + + - 155 - 229 + 150 + 270 300 31 - - + + - 5 - 233 + 0 + 274 140 23 - + Wine Program - - + + - 155 - 265 + 150 + 306 300 31 - - + + - 5 - 269 + 0 + 310 150 23 - + Patch Client DLL + + + + 155 + 193 + 300 + 33 + + + + + + + 5 + 197 + 150 + 23 + + + + Game Client + + @@ -252,11 +276,11 @@ dlgSettings accept() - + 248 254 - + 157 274 @@ -268,11 +292,11 @@ dlgSettings reject() - + 316 260 - + 286 274 diff --git a/PyLotROLauncher/ui/winSettingsNative.ui b/PyLotROLauncher/ui/winSettingsNative.ui index d5fd1df..cf8aded 100644 --- a/PyLotROLauncher/ui/winSettingsNative.ui +++ b/PyLotROLauncher/ui/winSettingsNative.ui @@ -1,47 +1,48 @@ - + + dlgSettings - - + + Qt::ApplicationModal - + 0 0 460 - 190 + 236 - + Verdana 12 - + Game Settings - + true - - + + 5 - 150 + 192 450 32 - + Qt::Horizontal - + QDialogButtonBox::Cancel|QDialogButtonBox::Save - - + + 155 6 @@ -50,8 +51,8 @@ - - + + 419 6 @@ -59,12 +60,12 @@ 30 - + ... - - + + 5 10 @@ -72,12 +73,12 @@ 23 - + Game Directory - - + + 5 47 @@ -85,12 +86,12 @@ 23 - + Hi-Res Graphics - - + + 155 42 @@ -99,45 +100,68 @@ - - + + 5 - 80 + 122 280 28 - + Advanced Options - + false - - + + 155 - 113 + 155 300 31 - - + + 5 - 117 + 159 150 23 - + Patch Client DLL + + + + 5 + 85 + 150 + 23 + + + + Game Client + + + + + + 155 + 81 + 300 + 33 + + + @@ -147,11 +171,11 @@ dlgSettings accept() - + 248 254 - + 157 274 @@ -163,11 +187,11 @@ dlgSettings reject() - + 316 260 - + 286 274 From 19c06095719190b0752019ee0f1589b65e8b96d0 Mon Sep 17 00:00:00 2001 From: nwestfal Date: Mon, 19 Apr 2021 12:08:32 -0400 Subject: [PATCH 23/23] Update certificate chain after game update 29.5 --- ChangeLog | 2 + PyLotRO.iss | 2 +- PyLotROLauncher/Information.py | 2 +- PyLotROLauncher/certificates/ca_certs.pem | 161 +++++++++++----------- 4 files changed, 85 insertions(+), 82 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a8522a..33a3caa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -112,3 +112,5 @@ Changes Legacy Awesomium client is recommended for Linux users. Game client override code that checked TurbineLauncher.exe.config has been removed since it is no longer needed with this option. + +0.2.8 Updated certificate chain after game update 29.5 invalidated old certs. diff --git a/PyLotRO.iss b/PyLotRO.iss index 281eb4e..994adaf 100755 --- a/PyLotRO.iss +++ b/PyLotRO.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{EB42F98E-B61B-4EE7-AF06-CAAF8D1825A3} AppName=PyLotRO -AppVerName=PyLotRO 0.2.7 +AppVerName=PyLotRO 0.2.8 AppPublisher=AJackson AppPublisherURL=http://www.lotrolinux.com AppSupportURL=http://www.lotrolinux.com diff --git a/PyLotROLauncher/Information.py b/PyLotROLauncher/Information.py index fcde622..e652d19 100644 --- a/PyLotROLauncher/Information.py +++ b/PyLotROLauncher/Information.py @@ -1,5 +1,5 @@ # coding=utf-8 -Version = "0.2.7" +Version = "0.2.8" Description = "LOTRO/DDO Launcher" Author = "Alan Jackson" Email = "ajackson@bcs.org.uk" diff --git a/PyLotROLauncher/certificates/ca_certs.pem b/PyLotROLauncher/certificates/ca_certs.pem index 1c8e754..d5ec2dc 100644 --- a/PyLotROLauncher/certificates/ca_certs.pem +++ b/PyLotROLauncher/certificates/ca_certs.pem @@ -1,89 +1,90 @@ -----BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs +MIIE6jCCA9KgAwIBAgIQCjUI1VwpKwF9+K1lwA/35DANBgkqhkiG9w0BAQsFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy -YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2 -4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC -Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1 -itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn -4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X -sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft -bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0yMDA5MjQwMDAwMDBaFw0zMDA5MjMyMzU5NTlaME8xCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS +U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a +qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn +g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW +raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB +Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r +eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBrjCCAaowHQYDVR0OBBYEFLdrouqo +qoSMeeq02g+YssWVdrn0MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFV MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy -dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t -L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG -BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ -UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D -aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd -aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH -E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly -/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu -xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF -0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae -cPUeybQ= +EgYDVR0TAQH/BAgwBgEB/wIBADB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG +GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh +Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDB7BgNV +HR8EdDByMDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH +bG9iYWxSb290Q0EuY3JsMDegNaAzhjFodHRwOi8vY3JsNC5kaWdpY2VydC5jb20v +RGlnaUNlcnRHbG9iYWxSb290Q0EuY3JsMDAGA1UdIAQpMCcwBwYFZ4EMAQEwCAYG +Z4EMAQIBMAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEBAHer +t3onPa679n/gWlbJhKrKW3EX3SJH/E6f7tDBpATho+vFScH90cnfjK+URSxGKqNj +OSD5nkoklEHIqdninFQFBstcHL4AGw+oWv8Zu2XHFq8hVt1hBcnpj5h232sb0HIM +ULkwKXq/YFkQZhM6LawVEWwtIwwCPgU7/uWhnOKK24fXSuhe50gG66sSmvKvhMNb +g0qZgYOrAKHKCjxMoiWJKiKnpPMzTFuMLhoClw+dj20tlQj7T9rxkTgl4ZxuYRiH +as6xuwAwapu3r9rxxZf+ingkquqTgLozZXq8oXfpf2kUCwA/d5KxTVtzhwoT0JzI +8ks5T1KESaZMkE4f97Q= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIGeDCCBWCgAwIBAgIQBgKb3FRFwPBduUYWKUhgrDANBgkqhkiG9w0BAQsFADBw -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz -dXJhbmNlIFNlcnZlciBDQTAeFw0xODAzMTIwMDAwMDBaFw0xOTAzMjAxMjAwMDBa -MIGEMQswCQYDVQQGEwJVUzELMAkGA1UECBMCbWExEDAOBgNVBAcTB05lZWRoYW0x -HTAbBgNVBAoTFFN0YW5kaW5nIFN0b25lIEdhbWVzMSEwHwYDVQQLExhTdGFuZGlu -ZyBTdG9uZSBHYW1lcyBMTEMxFDASBgNVBAMMCyoubG90cm8uY29tMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAztIfPfYhzT2nevQqOrtm8M4NF5j5FWG7 -UkZm7ab0BfzPcqdV+EaoJntDP30/QpvoLryACDBJ+iO2g+EWISaK0uWaW2agCOiY -jTcZFOoQecRqQFNrRZKDZ/kFU5qqyV3ex4DHc0mBmssuaale4IFqj/NcApAt/xaS -LzyfXerUJ9zgJYLbphIpZcUB/7YofhOc2dgzqgSoPA0N31SUvyZQWJJu3F1q4YPa -8ApZ+5OGxNbruwzjwZs8NUbiP2v2HqjxkpYdU5CjYFB8JeF8nGa3aM7xTLf2NxdG -BPp2zr0hybmGeoJNL6FtV0ieMzQiH+VY8hhw0QT8xTdUDCpzalnitQIDAQABo4IC -9zCCAvMwHwYDVR0jBBgwFoAUUWj/kK8CB3U8zNllZGKiErhZcjswHQYDVR0OBBYE -FK5HJlnjBHYloLJvDYjGYAb1sd0LMCEGA1UdEQQaMBiCCyoubG90cm8uY29tggls -b3Ryby5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr -BgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5odHRwOi8vY3JsMy5kaWdpY2VydC5j -b20vc2hhMi1oYS1zZXJ2ZXItZzYuY3JsMDSgMqAwhi5odHRwOi8vY3JsNC5kaWdp -Y2VydC5jb20vc2hhMi1oYS1zZXJ2ZXItZzYuY3JsMEwGA1UdIARFMEMwNwYJYIZI -AYb9bAEBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9D -UFMwCAYGZ4EMAQICMIGDBggrBgEFBQcBAQR3MHUwJAYIKwYBBQUHMAGGGGh0dHA6 -Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBNBggrBgEFBQcwAoZBaHR0cDovL2NhY2VydHMu -ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkhpZ2hBc3N1cmFuY2VTZXJ2ZXJDQS5j -cnQwDAYDVR0TAQH/BAIwADCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AKS5CZC0 -GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABYhxI4sQAAAQDAEcwRQIhAPM3 -Ml3DFVKv4SpCKxqAuTqhuOrtALKer1P+sk+u+OKCAiBCbMfSpVewdBSU7So7GHTs -s2EzTn3tVDdLKNgPBTiD7AB2AG9Tdqwx8DEZ2JkApFEV/3cVHBHZAsEAKQaNsgia -N9kTAAABYhxI5GEAAAQDAEcwRQIgTn/gPActne2hsVfowJ0VnvR9zypLBmufXNuo -kid/fvwCIQDR4xrWQsLPaudcHeLKPLWyuUAqFVnSptXBRd9fM6OB3DANBgkqhkiG -9w0BAQsFAAOCAQEABs3RFuCL2eHuC0cr398A6ZjwcjmEeKkQMKntRffCAmR5b5Gb -W8IwLWmXwtJWUz4tFIpWdpPaHdtZD3KFzlvGCm+YMH/n6zxXGve3JU+OTm216uOr -Oxyqrfs15Y19eGWe0A3Y3CgZtg6gEoqEnQfZk0DSUWGWNVu+wH0290TND8BRjwah -jFSUwfm+DzN157a1C7fO09p0EJTxmfA6f9GMIihJIHJhchFlWqsjaGnOO/o5f2gd -5YifUhgc10bIIwidT4FI/OYPTdKsZqy6q27UCEGJna8//Ft/vHcGKWlOTz7VhON4 -v4aW3gUfcSCUuaiHGQbyjgksyJtWNTRaUu6RzA== +MIIGwDCCBaigAwIBAgIQDuAmwkWKDUFDxKxfPW7GOjANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE +aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMTA0MTMwMDAwMDBa +Fw0yMjA0MjgyMzU5NTlaMHAxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNo +dXNldHRzMRAwDgYDVQQHEwdOZWVkaGFtMSEwHwYDVQQKExhTdGFuZGluZyBTdG9u +ZSBHYW1lcyBMTEMxFDASBgNVBAMMCyoubG90cm8uY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAztIfPfYhzT2nevQqOrtm8M4NF5j5FWG7UkZm7ab0 +BfzPcqdV+EaoJntDP30/QpvoLryACDBJ+iO2g+EWISaK0uWaW2agCOiYjTcZFOoQ +ecRqQFNrRZKDZ/kFU5qqyV3ex4DHc0mBmssuaale4IFqj/NcApAt/xaSLzyfXerU +J9zgJYLbphIpZcUB/7YofhOc2dgzqgSoPA0N31SUvyZQWJJu3F1q4YPa8ApZ+5OG +xNbruwzjwZs8NUbiP2v2HqjxkpYdU5CjYFB8JeF8nGa3aM7xTLf2NxdGBPp2zr0h +ybmGeoJNL6FtV0ieMzQiH+VY8hhw0QT8xTdUDCpzalnitQIDAQABo4IDdTCCA3Ew +HwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFK5HJlnj +BHYloLJvDYjGYAb1sd0LMCEGA1UdEQQaMBiCCyoubG90cm8uY29tgglsb3Ryby5j +b20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjCBiwYDVR0fBIGDMIGAMD6gPKA6hjhodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v +RGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0ExLmNybDA+oDygOoY4aHR0cDovL2Ny +bDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS5jcmww +PgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5k +aWdpY2VydC5jb20vQ1BTMH0GCCsGAQUFBwEBBHEwbzAkBggrBgEFBQcwAYYYaHR0 +cDovL29jc3AuZGlnaWNlcnQuY29tMEcGCCsGAQUFBzAChjtodHRwOi8vY2FjZXJ0 +cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0ExLmNydDAM +BgNVHRMBAf8EAjAAMIIBgAYKKwYBBAHWeQIEAgSCAXAEggFsAWoAdgApeb7wnjk5 +IfBWc59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXjIzphwAAAEAwBHMEUCIFznUqt4 +r3oqLf0EJCxckG8w65dl9TtIqWYlJRBNsEyqAiEAqei2Ma1amnDqPEgub2+AbiKa +HRByKwNyQHAlJIKZ0SUAdwAiRUUHWVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIP +AgAAAXjIzpjQAAAEAwBIMEYCIQCJmFsghrbvklCc8uTa3PNQ3/oXFCbZ9M52ynCj +yNjrLQIhAJ9/iL3H/Vp3I7vXfvjY76g5holbnikmBxZHzGFrhScbAHcAQcjKsd8i +RkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvYAAAF4yM6YbAAABAMASDBGAiEArRTv +870dWCMuGYddzSbZv3sy0f7ZBuNENtaN1VFjlIICIQDtKbotdQgKgrbkjOnAgyPp +R7SZ4nAtl3KkKRvFBjR8sDANBgkqhkiG9w0BAQsFAAOCAQEATpQsD909GlE+R72y +e/ZiIDZLpV2hEXmVXoMwiTbGieh3aoQTXCY7kNMVJ36hCtflOEbREaKcjsF5mhDs +kXAtttg3eLrP092Nof5dfVkNKZx6dNs0tuU0jT/1hr7J2j1Q4DhoLepzH8FK40pz +/05+H/1nfrSgAEEbP6kXpKk6rjY7fBsouESgA2ht+jk3opPUoZeZRvavL9CnKYQM +DUIhYcPx3F8EgQRL0uHDgXTyswXrEtJdFY2X5vSFzF5/MxSnW+XqeYRjfuuS437c +TRNMvO/B7/IzA1/mQNbO1KBDyruP6sr8VK5L8n+kap8WJuVBKX5I1F6CodaIjS2m +/uP+YA== -----END CERTIFICATE----- -