diff --git a/modules/orange/browser.py b/modules/orange/browser.py index 56d0b72c8b35e5fcf274177cf9ab887bd62139a8..34c058be1cd53694886c18fb9e1327885f15bf12 100644 --- a/modules/orange/browser.py +++ b/modules/orange/browser.py @@ -22,9 +22,9 @@ from requests.exceptions import ConnectTimeout from weboob.browser import LoginBrowser, URL, need_login -from weboob.exceptions import BrowserIncorrectPassword, BrowserUnavailable, ActionNeeded +from weboob.exceptions import BrowserIncorrectPassword, BrowserUnavailable, ActionNeeded, BrowserPasswordExpired from .pages import LoginPage, BillsPage -from .pages.login import ManageCGI, HomePage +from .pages.login import ManageCGI, HomePage, PasswordPage from .pages.bills import SubscriptionsPage, BillsApiProPage, BillsApiParPage, ContractsPage from .pages.profile import ProfilePage from weboob.browser.exceptions import ClientError, ServerError @@ -41,6 +41,7 @@ class OrangeBillBrowser(LoginBrowser): home_page = URL('https://businesslounge.orange.fr/$', HomePage) loginpage = URL('https://login.orange.fr/\?service=sosh&return_url=https://www.sosh.fr/', 'https://login.orange.fr/front/login', LoginPage) + password_page = URL(r'https://login.orange.fr/front/password', PasswordPage) contracts = URL('https://espaceclientpro.orange.fr/api/contracts\?page=1&nbcontractsbypage=15', ContractsPage) @@ -80,6 +81,11 @@ def do_login(self): raise BrowserIncorrectPassword(error.response.json()) raise + if self.password_page.is_here(): + error_message = self.page.get_change_password_message() + if error_message: + raise BrowserPasswordExpired(error_message) + def get_nb_remaining_free_sms(self): raise NotImplementedError() diff --git a/modules/orange/pages/login.py b/modules/orange/pages/login.py index 76aae259a283795c32ad26a6b837a404bdef61bb..7af3b773517ebf9c5a01469f60775d0970ab5b25 100644 --- a/modules/orange/pages/login.py +++ b/modules/orange/pages/login.py @@ -17,8 +17,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with this weboob module. If not, see . +from __future__ import unicode_literals -from weboob.browser.pages import HTMLPage, LoggedPage +import lxml.html as html + +from StringIO import StringIO + +from weboob.browser.pages import HTMLPage, LoggedPage, JsonPage from weboob.tools.json import json from weboob.browser.filters.standard import CleanText, Format @@ -39,6 +44,31 @@ def login(self, username, password): self.browser.location('https://login.orange.fr/front/password', json=json_data) +class PasswordPage(JsonPage): + def get_change_password_message(self): + if self.doc.get('stage') != 'changePassword': + # when stage is not present everything is okay, and if it's not changePassword we prefer do nothing here + return + + if 'mandatory' not in self.doc['options']: + # maybe there are some cases where it's optional + return + + encoding = self.encoding + if encoding == 'latin-1': + encoding = 'latin1' + if encoding: + encoding = encoding.replace('ISO8859_', 'ISO8859-') + + parser = html.HTMLParser(encoding=encoding) + html_doc = html.parse(StringIO(self.doc['view']), parser) + + # message should be: + # Votre mot de passe actuel n’est pas suffisamment sécurisé et doit être renforcé. + # Veuillez le modifier pour accéder à vos services Orange. + return CleanText('//p[@id="cnMsg"]')(html_doc) + + class ManageCGI(HTMLPage): pass