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