configurationengine/source/cone/storage/authenticate.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import getpass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import urllib, urllib2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import urlparse
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
from HTMLParser import HTMLParser
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
import sys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
class SSOHTMLParser(HTMLParser):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    Simple html parser which understand what is needed to show the current
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    version of the SSO login page. End parsing at <\html>, which is in
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    current version of login page inside <noscript> before other stuff on page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    Asks form inputs of types text and password from the user.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    The data is saved in varables inside class
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    def __init__(self, *argv, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        HTMLParser.__init__(self, *argv, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        self.html_end = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        self.httpdata = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        self.input_requested = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        self.input_entered = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        self.method = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        self.action = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        self.username = kwargs.get('username')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        self.password = kwargs.get('password')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
    def handle_starttag(self, tag, attrs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        attrs = dict(attrs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        if self.html_end:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
            return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        if tag == 'br':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
            print
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        elif tag == 'form':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
            self.action = attrs.get('action')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            self.method = attrs.get('method')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        elif tag == 'input':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
            inputtype = attrs.get('type', 'text')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
            if inputtype == 'hidden':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
                # Should the username be also overridable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
                self.httpdata[attrs.get('name')] = attrs.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
            if inputtype == 'password':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
                self.input_requested = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
                data = self.password
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
                if data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
                    self.input_entered = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
                self.httpdata[attrs.get('name')] = data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
            if inputtype == 'text':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
                self.input_requested = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
                data = raw_input()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
                if data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
                    self.input_entered = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
                self.httpdata[attrs.get('name')] = data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
            if inputtype == 'submit':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
                self.httpdata['submit'] = attrs.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    def handle_endtag(self, tag):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        if self.html_end:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
            return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        if tag == 'tr':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
            print
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        if tag == 'title':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
            print
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        if tag == 'html':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
            self.html_end = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    def handle_data(self, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        if self.html_end:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
            return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        if data.strip():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
            print data.strip(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
class CarbonAuthHandler(urllib2.AbstractHTTPHandler):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
    handler_order = 600
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
    def add_password(self, username, password):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        Add username and password
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        self.username = username
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        self.password = password
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
    def https_response(self, request, response):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        Catches responses which are from sso login page and asks for the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        information from the command line and posts it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        After posting urllib2 takes care of following redirects back to
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        original page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        if (re.match('login.*\.europe\.nokia\.com', request.get_host())):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
            sso_parser = SSOHTMLParser(username=self.username, password=self.password)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
            sso_parser.feed(response.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
            # !sso_parser.input_requested when we have posted the form and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
            # are reading the redirect back. We don't want to handle that
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
            if sso_parser.input_requested:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
                if not sso_parser.input_entered:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                    # By entering empty username and password you get
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
                    # out of infinite invalid login loop
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
                    # Only bad thing that the SSO login page doesen't
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
                    # tell you that login failed, only shows the same text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
                    # again
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
                    raise urllib2.URLError("No login data entered")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
                newurl = urlparse.urljoin(request.get_full_url(), sso_parser.action)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
                ssoreq = urllib2.Request(newurl,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
                                         urllib.urlencode(sso_parser.httpdata),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
                                         origin_req_host=request.get_origin_req_host(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
                                         unverifiable=True,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
                                         )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
                return self.parent.open(ssoreq)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        return response
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
    def http_response(self, request, response):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        Catches responses which are from normal carbon authenticatoin page and uses set password if found
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        or asks for the information from the command line and posts it.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        After posting urllib2 takes care of following redirects back to
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        original page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        """    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        if response.code == 200 and (re.match('.*/extauth/login/?.*', request.get_full_url())):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
            loginreq = urllib2.Request(request.get_full_url(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
                                     urllib.urlencode({ 'username' : self.username, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
                                                        'password' : self.password,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
                                                        'submit' : 'login'}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                                                      ),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
                                     origin_req_host=request.get_origin_req_host(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
                                     unverifiable=True,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
                                     )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
            return self.parent.open(loginreq)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        else:            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
            return response