Blob Blame History Raw
Login fixes.  Includes commits 10dcea10, dc2b37f7, aff7ea13, 47a612de.

diff --git a/mhgui b/mhgui
index f95bee5..1c8746d 100755
--- a/mhgui
+++ b/mhgui
@@ -248,8 +248,13 @@ class WelcomePanel(WizardPanelBase):
         if loginResult is True:
             self.parent._SetPage(self.next, True, True)
         else:
-            wx.MessageBox('Login failed.', 'Login failed.', wx.OK |
-                          wx.ICON_WARNING)
+            if loginResult is None:
+                msg = 'You appear to have used a members.harmonyremote.com ' \
+                      'account.  Please create a myharmony.com account or ' \
+                      'login with an existing one.'
+            else:
+                msg = 'Login failed.  Username or password incorrect.'
+            wx.MessageBox(msg, 'Login Failed', wx.OK | wx.ICON_WARNING)
             self.usernameCtrl.Clear()
             self.passwordCtrl.Clear()
 
diff --git a/mhmanager.py b/mhmanager.py
index e65a098..904085c 100644
--- a/mhmanager.py
+++ b/mhmanager.py
@@ -30,6 +30,7 @@ import os
 import sys
 import random
 import datetime
+import json
 from HTMLParser import HTMLParser
 from suds.cache import ObjectCache
 from suds.client import Client
@@ -153,16 +154,35 @@ class MHManager():
             logging.basicConfig(level=logging.INFO)
             logging.getLogger('suds.transport').setLevel(logging.DEBUG)
         self.client = Client(url, cache=cache, plugins=[MHPlugin()])
-        self.logged_in = False
 
-    # Log in to web service - Returns True if login succeeded, False otherwise.
+    # Log in to web service - returns True if login succeeded, False if login
+    # failed, and None if the account appears to be a members.harmonyremote.com
+    # account.
     def Login(self, email, password):
-        self.logged_in = self.client.service['Security'].LoginUser(
-            email=email, password=password, customCredential='',
-            isPresistent=False)
+        baseUrl = "https://setup.myharmony.com"
+        url = baseUrl + "/Home/TestLogin"
+        params = urllib.urlencode({'username': email, 'password': password})
+        request = urllib2.Request(url, params)
+        response = urllib2.urlopen(request)
+        jsonResponse = json.loads(response.read())
+        if jsonResponse["Result"] == False:
+            return False
+        elif jsonResponse["Token"] is None: # members.harmonyremote.com acct
+            return None
+        self.client.options.transport.cookiejar.extract_cookies(response,
+                                                                request)
+
+        url = baseUrl + "/Home/Login?usr=" + jsonResponse["Token"]
+        request = urllib2.Request(url)
+        response = urllib2.urlopen(request)
+        parser = LoginResponseHTMLParser()
+        parser.feed(response.read())
+        initparams = dict(u.split("=", 1) for u in parser.initparams.split(","))
+        self.contentServiceAuthKey = initparams['ContentServiceAuthKey']
+
         self.email = email
         self.password = password
-        return self.logged_in is not None
+        return True
 
     # Gets the household info.
     def GetHousehold(self):
@@ -910,6 +930,13 @@ class MHAccountDetails:
         securityAnswer = ""
         keepMeInformed = ""
 
+class LoginResponseHTMLParser(HTMLParser):
+    def handle_starttag(self, tag, attrs):
+        if tag == 'param' and ('name', 'initparams') in attrs:
+            for key, value in attrs:
+                if key == 'value':
+                    self.initparams = value
+
 class CreateAccountResponseHTMLParser(HTMLParser):
     def __init__(self):
         HTMLParser.__init__(self)