diff --git a/scripts/webadvisor_tokenidx.js b/scripts/webadvisor_tokenidx.js --- a/scripts/webadvisor_tokenidx.js +++ b/scripts/webadvisor_tokenidx.js @@ -1,3 +1,22 @@ +/* -*- tab-width: 4; -*- + * Copyright 2010 Nathan Gelderloos, Ethan Zonca, Nathan Phillip Brink + * + * This file is part of SlatePermutate. + * + * SlatePermutate is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SlatePermutate is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SlatePermutate. If not, see . + */ + /* * Assumes that WebAdvisor_scripts.js for WebAdvisor-2.x is loaded, * displayFormHTML() or something was called and thus @@ -29,8 +48,14 @@ var slate_permutate_input_login; /* * Discover the TOKENIDX if it's available. */ + var sp_err = document.getElementById('sp_err'); if (containsParameter(g_tokenIdx)) { + /* Remove the warning about the script not having loaded */ + sp_err.replaceChild(document.createTextNode("Slate Permutate TOKENIDX-acquiring script loaded…"), sp_err.firstChild); + sp_err.setAttribute('style', 'color: grey;'); + + /* Inform home base of the newly generated TOKENIDX. */ var TOKENIDX = getURLParameter(g_tokenIdx); var myscript = document.createElement('script'); myscript.setAttribute('type', 'text/javascript'); @@ -39,7 +64,9 @@ var slate_permutate_input_login; } else { - alert('Unable to discover TOKENIDX. You must register manually.'); + sp_err.replaceChild(document.createTextNode('Slate Permutate unable to acquire TOKENIDX. You must register manually.'), sp_err.firstChild); + sp_err.setAttribute('style', 'color: red; background: yellow;'); + alert('Unable to discover WebAdvisor TOKENIDX. You must register manually.'); } } @@ -66,5 +93,9 @@ function slate_permutate_token_callback( { slate_permutate_input_login.setAttribute('value', 'LOG IN'); slate_permutate_input_login.removeAttribute('disabled'); + + var sp_err = document.getElementById('sp_err'); + sp_err.replaceChild(document.createTextNode('Slate Permutate has acquired WebAdvisor TOKENIDX, ready for login.'), sp_err.firstChild); + sp_err.setAttribute('style', 'color: green;'); } } diff --git a/webadvisor.php b/webadvisor.php --- a/webadvisor.php +++ b/webadvisor.php @@ -39,6 +39,8 @@ if (!empty($_GET['TOKENIDX'])) echo json_encode($result); if ($jsonp) echo ");\n"; + if ($jsonp && !empty($_GET['destination'])) + echo 'document.location.href = ' . json_encode($_GET['destination']) . ";\n"; exit; } @@ -111,53 +113,16 @@ function webadvisor_login($page, array $ * to keep redirecting to itself infinitely. Similarly, if the * browser does not yet have a TOKENIDX-related cookie, * SS=LGRQ&URL= will redirect the user to URL without giving - * the user a cookie. Thus, our strategy is: - * - * 1. Send the user to - * SS=LGRQ&URL=&SP_CALLBACK=&ERROR=. In - * this case, the URL will be set to have `from_webadvisor' as a - * GET parameter and ERROR will be set to the appropriate XSS for - * the normal login form. Thus, if the user does not have a - * token, he will be directed here and sent to step #2 to get a - * token. Otherwise, the user will have a jump start (already - * having TOKENIDX cookies) and communicate his token to us while - * logging in. - * - * 2. If webadvisor.php is called with from_webadvisor, that means - * one of two things. It might mean that webadvisor_tokenidx.js - * was called successfully and we have the webadvisor TOKENIDX - * stored in our session. In that case, the user's browser - * already had a WebAdvisor TOKENIDX before we did #1; also, this - * function won't be called in that case because this function is - * only called if TOKENIDX is unknown. Thus, we don't know the - * TOKENIDX, meaning that we need to request that the WebAdvisor - * installation allocate a TOKENIDX for the user and _then_ - * proceed directly to the login page to send us TOKENIDX. + * the user a cookie. Thus, our strategy is to specify + * LASTTOKEN=NULL: this is the magic which prevents the silly + * infinite looping when the user already has cookies and also works + * when the user doesn’t have a cookie to start with. */ - $login_form_uri = $school['webadvisor_url'] . '?SS=LGRQ&URL=' . rawurlencode($dest) + $login_form_uri = $school['webadvisor_url'] . '?LASTTOKEN=NULL&SS=LGRQ&URL=' . rawurlencode($dest) . '&SP_CALLBACK=' . rawurlencode($tokenidx_callback) - . '&ERROR=' . rawurlencode(''); - - if (isset($_GET['from_webadvisor'])) - /* - * Case 2, infer that browser needs TOKENIDX cookies _and_ that - * the following URI won't cause endless looping - * (hopefully). Unfortunately, this process is not reentrant. - */ - redir($school['webadvisor_url'] . '?TOKENIDX=&SS=LGRQ&URL=' . rawurlencode($login_form_uri)); - - /* - * Case 1, assume that the user has a TOKENIDX cookie _but_ make - * provisions ($dest has from_webadvisor in it) for needing to - * allocate that cookie. - */ + . '&ERROR=' . rawurlencode('Slate Permutate loading… (automatic registration may not be working)'); redir($login_form_uri); - - return array( - /* 'preload' => $school['webadvisor_url'] . '?TYPE=P&PID=UT-LGRQ&PROCESS=-XUTAUTH01&URL=', */ - 'uri' => $school['webadvisor_url'] . '?SS=LGRQ&URL=' . rawurlencode($login_form_uri), - ); } function redir($dest) @@ -184,8 +149,8 @@ if (empty($_SESSION['webadvisor_TOKENIDX { /* * Get a token for the ST-WERG form and have the user perform the - * WebAdmin-specific login. This can only be done after the login form - * has an SS allocated for it. + * WebAdvisor-specific login. This can only be done after the + * login form has an SS allocated for it. */ webadvisor_login($page, $school, page::uri_resolve('webadvisor.php') . '?r=' . rand() . '§ions=' . rawurlencode(empty($_GET['sections']) ? '' : $_GET['sections'])