Skip to content

Commit 4b2f642

Browse files
committed
feat(dev): login;
- Handled cross domain logins.
1 parent db90a9e commit 4b2f642

File tree

5 files changed

+68
-18
lines changed

5 files changed

+68
-18
lines changed

ckanext/language_domains/assets/scripts/language_login_receiver.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ window.addEventListener('message', function(_event){
66
return;
77
}
88

9+
if( typeof _event.data.login_receiver_ready != 'undefined' ){
10+
_event.source.postMessage({'login_receiver_ready': true}, _event.origin);
11+
return;
12+
}
13+
914
if( ! _event.data.session_user || ! _event.data.session_token || ! _event.data.target_domain || ! _event.data.target_language ){
1015
return;
1116
}
@@ -18,12 +23,12 @@ window.addEventListener('message', function(_event){
1823
'complete': function(_data){
1924
if( _data.responseJSON ){ // we have response JSON
2025
if( _data.responseJSON.success ){ // successful format guess
21-
console.log(_data.responseJSON);
26+
_event.source.postMessage({'login_successful': true}, _event.origin);
2227
}else{ // validation error
23-
console.log(_data);
28+
_event.source.postMessage({'login_successful': false}, _event.origin);
2429
}
2530
}else{ // fully flopped ajax request
26-
console.log(_data);
31+
_event.source.postMessage({'login_successful': false}, _event.origin);
2732
}
2833
}
2934
});

ckanext/language_domains/assets/scripts/language_login_sender.js

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,65 @@ window.addEventListener('load', function(){
44

55
const session_user = SESSION_USER || null;
66
const session_token = SESSION_TOKEN || null;
7-
const requester_domain = REQUESTER_DOMAIN || null;
7+
const trusted_domains = TRUSTED_LANG_DOMAINS || [];
88
const domain_scheme = DOMAIN_SCHEME || null;
99
const language_domains = LANGUAGE_DOMAINS || {};
1010

1111
if( session_user == null || session_token == null ){
1212
return;
1313
}
1414

15+
// TODO: improve check for all domains being logged in?? fallback to tries/time??
16+
let _index = 0;
17+
const _max = Object.keys(language_domains).length;
18+
1519
for( let [_lang, _lang_domains] of Object.entries(language_domains) ){
1620
let targetDomain = domain_scheme + '://' + _lang_domains[0];
1721
let loginWindow = window.open(targetDomain + '/user/language_domain_login', '', 'width=700,height=500');
18-
// FIXME: get this data to the window....and then get a callback to close the window from window.opener...
19-
loginWindow.postMessage(
20-
{
21-
'session_user': session_user,
22-
'session_token': session_token,
23-
'target_domain': targetDomain,
24-
'target_language': _lang,
25-
},
26-
domain_scheme + '://' + requester_domain
27-
);
22+
let checkInterval = setInterval(function(){
23+
loginWindow.postMessage(
24+
{
25+
'login_receiver_ready': false,
26+
},
27+
targetDomain
28+
)
29+
}, 250);
30+
31+
window.addEventListener('message', function(_event){
32+
33+
if( ! Array.prototype.includes.call(trusted_domains, _event.origin) ){
34+
return;
35+
}
36+
37+
if( typeof _event.data.login_receiver_ready == 'undefined' && typeof _event.data.login_successful == 'undefined' ){
38+
return;
39+
}
40+
41+
if( _event.data.login_receiver_ready ){
42+
clearInterval(checkInterval);
43+
checkInterval = false;
44+
loginWindow.postMessage(
45+
{
46+
'session_user': session_user,
47+
'session_token': session_token,
48+
'target_domain': targetDomain,
49+
'target_language': _lang,
50+
},
51+
targetDomain
52+
);
53+
return;
54+
}
55+
56+
if( _event.data.login_successful ){
57+
loginWindow.close();
58+
if( _index >= _max ){
59+
window.location.assign('/');
60+
}
61+
_index++;
62+
}
63+
64+
});
65+
2866
}
2967

3068
});

ckanext/language_domains/blueprint.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,13 @@ def language_domain_login_master():
3232
else:
3333
language_domains = json.loads(language_domains)
3434

35-
# TODO: figure out lang_domains[0] from current subdomain or not??
36-
requester_domain = language_domains.pop(h.lang())[0]
35+
trusted_domains = []
36+
if language_domains:
37+
for _lang_code, lang_domains in language_domains.items():
38+
# TODO: figure out lang_domains[0] from current subdomain or not??
39+
trusted_domains.append(f'{domain_scheme}://{lang_domains[0]}')
40+
41+
del language_domains[h.lang()]
3742

3843
jwt_secret = config.get('ckanext.language_domains.secret')
3944
token = None
@@ -49,7 +54,7 @@ def language_domain_login_master():
4954
return render('user/language_login_sender.html',
5055
{'language_domains': language_domains,
5156
'domain_scheme': domain_scheme,
52-
'requester_domain': requester_domain,
57+
'trusted_domains': trusted_domains,
5358
'token': token})
5459

5560

ckanext/language_domains/plugin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class LanguageDomainsPlugin(plugins.SingletonPlugin):
2424
plugins.implements(plugins.ITemplateHelpers)
2525
plugins.implements(plugins.IBlueprint)
2626

27+
# TODO: hardcode in the login redirect and logout redirect
28+
2729
# IMiddleware
2830
def make_middleware(self, app: CKANApp, config: 'CKANConfig') -> CKANApp:
2931
return LanguageDomainMiddleware(app, config)

ckanext/language_domains/templates/user/language_login_sender.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
const SESSION_USER = '{{- g.user -}}';
1818
const SESSION_TOKEN = '{{- token -}}';
1919
const DOMAIN_SCHEME = '{{- domain_scheme -}}';
20-
const REQUESTER_DOMAIN = '{{- requester_domain -}}';
20+
const TRUSTED_LANG_DOMAINS = {{- trusted_domains|tojson -}};
2121
const LANGUAGE_DOMAINS = {{- language_domains|tojson -}};
2222
</script>
2323
{% asset 'language_domain_assets/js_login_sender' %}

0 commit comments

Comments
 (0)