Revision 0e79735c

b/snf-astakos-app/astakos/im/auth_providers.py
99 99
    def add_url(self):
100 100
        return reverse(self.login_view)
101 101

  
102
    def __init__(self, user=None):
102
    @property
103
    def provider_details(self):
104
        if self.user:
105
            if self.identifier:
106
                self._provider_details = \
107
                    self.user.get_auth_providers().get(module=self.module,
108
                                                       identifier=self.identifier).__dict__
109
            else:
110
                self._provider_details = self.user.get(module=self.module).__dict__
111
        return self._provider_details
112

  
113
    def __init__(self, user=None, identifier=None, provider_details=None):
103 114
        self.user = user
115
        self.identifier = identifier
116

  
117
        self._provider_details = None
118
        if provider_details:
119
            self._provider_details = provider_details
120

  
104 121
        for tpl in ['login_prompt', 'login', 'signup_prompt']:
105 122
            tpl_name = '%s_%s' % (tpl, 'template')
106 123
            override = self.get_setting(tpl_name)
......
254 271
    login_prompt_template = 'im/auth/third_party_provider_generic_login_prompt.html'
255 272

  
256 273

  
257
def get_provider(id, user_obj=None, default=None):
274
def get_provider(id, user_obj=None, default=None, identifier=None, provider_details={}):
258 275
    """
259 276
    Return a provider instance from the auth providers registry.
260 277
    """
261 278
    if not id in PROVIDERS:
262 279
        raise Exception('Invalid auth provider requested "%s"' % id)
263 280

  
264
    return PROVIDERS.get(id, default)(user_obj)
281
    return PROVIDERS.get(id, default)(user_obj, identifier, provider_details)
265 282

  
b/snf-astakos-app/astakos/im/messages.py
207 207
AUTH_PROVIDER_INVALID_LOGIN                  =   "No account exists."
208 208
AUTH_PROVIDER_REQUIRED                       =   "%(provider)s login method is required. Add one from your profile page."
209 209
AUTH_PROVIDER_CANNOT_CHANGE_PASSWORD         =   "Changing password is not supported."
210
AUTH_PROVIDER_SIGNUP_FROM_LOGIN              =   None
210 211

  
211 212
EXISTING_EMAIL_THIRD_PARTY_NOTIFICATION      =   "You can add '%s' login method to your existing account from your " \
212 213
                                                 " <a href='%s'>profile page</a>"
b/snf-astakos-app/astakos/im/models.py
601 601
        if 'identifier' in kwargs:
602 602
            try:
603 603
                # provider with specified params already exist
604
                print "LALALALA", include_unverified
604 605
                if not include_unverified:
605 606
                    kwargs['user__email_verified'] = True
606 607
                existing_user = AstakosUser.objects.get_auth_provider_user(provider,
b/snf-astakos-app/astakos/im/target/__init__.py
46 46
from astakos.im.views import requires_anonymous, render_response
47 47

  
48 48

  
49
def init_third_party_session(request):
50
    params = dict(request.GET.items())
51
    request.session['third_party_request_params'] = params
52

  
53

  
54
def get_third_party_session_params(request):
55
    if 'third_party_request_params' in request.session:
56
        params = request.session['third_party_request_params']
57
        del request.session['third_party_request_params']
58
        return params
59
    return {}
60

  
61

  
49 62
def add_pending_auth_provider(request, third_party_token):
50 63
    if third_party_token:
51 64
        # use requests to assign the account he just authenticated with with
......
58 71

  
59 72

  
60 73
def get_pending_key(request):
61
    third_party_token = get_query(request).get('key', False)
62
    if not third_party_token:
63
        third_party_token = request.session.get('pending_key', None)
64
        if third_party_token:
65
          del request.session['pending_key']
74
    third_party_token = get_query(request).get('key', request.session.get('pending_key', False))
75
    if 'pending_key' in request.session:
76
        del request.session['pending_key']
66 77
    return third_party_token
67 78

  
68 79

  
......
115 126

  
116 127

  
117 128
def handle_third_party_login(request, provider_module, identifier,
118
                             third_party_key=None, provider_info=None,
119
                             affiliation=None):
129
                             provider_info=None, affiliation=None,
130
                             third_party_key=None):
120 131

  
121 132
    if not provider_info:
122 133
        provider_info = {}
......
124 135
    if not affiliation:
125 136
        affiliation = provider_module.title()
126 137

  
127
    if not third_party_key:
128
        third_party_key = get_pending_key(request)
129

  
130 138
    next_redirect = request.GET.get('next', request.session.get('next_url', None))
131 139
    if 'next_url' in request.session:
132 140
        del request.session['next_url']
133 141

  
142
    third_party_request_params = get_third_party_session_params(request)
143
    from_login = third_party_request_params.get('from_login', False)
144

  
134 145
    # an existing user accessed the view
135 146
    if request.user.is_authenticated():
136 147

  
......
153 164
        return HttpResponseRedirect(reverse('edit_profile'))
154 165

  
155 166
    # astakos user exists ?
156
    user = AstakosUser.objects.get_auth_provider_user(
157
        provider_module,
158
        identifier=identifier
159
    )
167
    try:
168
        user = AstakosUser.objects.get_auth_provider_user(
169
            provider_module,
170
            identifier=identifier,
171
            user__email_verified=True,
172
        )
173
    except AstakosUser.DoesNotExist:
174
        # TODO: add a message ? redirec to login ?
175
        if astakos_messages.AUTH_PROVIDER_SIGNUP_FROM_LOGIN:
176
            messages.warning(request,
177
                             astakos_messages.AUTH_PROVIDER_SIGNUP_FROM_LOGIN)
178
        raise
179

  
180
    if not third_party_key:
181
        third_party_key = get_pending_key(request)
182

  
160 183
    if user.is_active:
161 184
        # authenticate user
162 185
        response = prepare_response(request,
b/snf-astakos-app/astakos/im/target/google.py
55 55
from astakos.im import settings
56 56
from astakos.im import auth_providers
57 57
from astakos.im.target import add_pending_auth_provider, get_pending_key, \
58
    handle_third_party_signup, handle_third_party_login
58
    handle_third_party_signup, handle_third_party_login, init_third_party_session
59 59

  
60 60
import logging
61 61
import time
......
89 89
@requires_auth_provider('google', login=True)
90 90
@require_http_methods(["GET", "POST"])
91 91
def login(request):
92
    init_third_party_session(request)
92 93
    params = {
93 94
        'scope': token_scope,
94 95
        'response_type': 'code',
b/snf-astakos-app/astakos/im/target/linkedin.py
55 55
from astakos.im import settings
56 56
from astakos.im import auth_providers
57 57
from astakos.im.target import add_pending_auth_provider, get_pending_key, \
58
    handle_third_party_signup, handle_third_party_login
58
    handle_third_party_signup, handle_third_party_login, init_third_party_session
59 59

  
60 60
import astakos.im.messages as astakos_messages
61 61

  
......
77 77
@requires_auth_provider('linkedin', login=True)
78 78
@require_http_methods(["GET", "POST"])
79 79
def login(request):
80
    init_third_party_session(request)
80 81
    resp, content = client.request(request_token_url, "GET")
81 82
    if resp['status'] != '200':
82 83
        messages.error(request, 'Invalid linkedin response')
b/snf-astakos-app/astakos/im/target/shibboleth.py
55 55
from astakos.im import auth_providers
56 56
from astakos.im import settings
57 57
from astakos.im.target import add_pending_auth_provider, get_pending_key, \
58
    handle_third_party_signup, handle_third_party_login
58
    handle_third_party_signup, handle_third_party_login, init_third_party_session
59 59

  
60 60
import astakos.im.messages as astakos_messages
61 61
import logging
......
82 82
    template='im/third_party_check_local.html',
83 83
    extra_context=None):
84 84

  
85
    init_third_party_session(request)
85 86
    extra_context = extra_context or {}
86 87

  
87 88
    tokens = request.META
b/snf-astakos-app/astakos/im/target/twitter.py
56 56
from astakos.im import settings
57 57
from astakos.im import auth_providers
58 58
from astakos.im.target import add_pending_auth_provider, get_pending_key, \
59
    handle_third_party_signup, handle_third_party_login
59
    handle_third_party_signup, handle_third_party_login, init_third_party_session
60 60

  
61 61
import astakos.im.messages as astakos_messages
62 62

  
......
77 77
@requires_auth_provider('twitter', login=True)
78 78
@require_http_methods(["GET", "POST"])
79 79
def login(request):
80
    init_third_party_session(request)
80 81
    force_login = request.GET.get('force_login',
81 82
                                  settings.TWITTER_AUTH_FORCE_LOGIN)
82 83
    resp, content = client.request(request_token_url, "GET")
......
142 143

  
143 144

  
144 145
    try:
145
        return handle_third_party_login(request, 'google', userid,
146
        return handle_third_party_login(request, 'twitter', userid,
146 147
                                        provider_info, affiliation)
147 148
    except AstakosUser.DoesNotExist, e:
148 149
        third_party_key = get_pending_key(request)
b/snf-astakos-app/astakos/im/templates/im/auth/third_party_provider_generic_login.html
1 1
{% load astakos_tags %}
2
<h2><a href="{% provider_login_url provider %}">
2
<h2><a href="{% provider_login_url provider 1 %}">
3 3
    {{ provider.get_primary_login_prompt_display|safe }} {{ provider.get_title_display }}
4 4
</a></h2>
b/snf-astakos-app/astakos/im/templates/im/auth/third_party_provider_generic_login_prompt.html
1 1
{% load astakos_tags %}
2

  
3
<a href="{% provider_login_url provider %}" alt="{{ provider.get_title_display }}" class="icons"><img src="{{ provider.get_icon_url_display }}" alt="{{ provider.get_title_display }}" /></a>
2
<a href="{% provider_login_url provider 1 %}" alt="{{ provider.get_title_display }}" class="icons">
3
<img src="{{ provider.get_icon_url_display }}" alt="{{ provider.get_title_display }}" /></a>
4 4

  
b/snf-astakos-app/astakos/im/templatetags/astakos_tags.py
183 183

  
184 184
@register.tag(name="provider_login_url")
185 185
@basictag(takes_context=True)
186
def provider_login_url(context, provider):
186
def provider_login_url(context, provider, from_login=False):
187 187
    request = context['request'].REQUEST
188 188
    next = request.get('next', None)
189 189
    code = request.get('code', None)
......
196 196
        attrs['code'] = code
197 197
    if key:
198 198
        attrs['key'] = key
199
    if from_login:
200
        attrs['from_login'] = 1
199 201

  
200 202
    url = provider.add_url
201 203

  

Also available in: Unified diff