// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. function init_params() { var hash; var hashes = window.location.href.slice( window.location.href.indexOf('?') + 1).split('&'); // Prepopulate via cookies first. document.getElementById('xmpp_auth').value = get_cookie('xmpp_auth'); document.getElementById('chromoting_auth').value = get_cookie('chromoting_auth'); document.getElementById('username').value = get_cookie('username'); for(var i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); if (hash[0] == 'xmpp_auth') { document.getElementById('xmpp_auth').value = hash[1]; set_cookie('xmpp_auth', hash[1]); } else if (hash[0] == "chromoting_auth") { document.getElementById('chromoting_auth').value = hash[1]; set_cookie('chromoting_auth', hash[1]); } else if (hash[0] == 'username') { document.getElementById('username').value = hash[1]; set_cookie('username', hash[1]); } else if (hash[0] == 'password') { document.getElementById('password').value = hash[1]; } else if (hash[0] == 'host_jid') { document.getElementById('host_jid').value = hash[1]; } } } function find_hosts(form) { // If either cookie is missing, login first. if (get_cookie('chromoting_auth') == null || get_cookie('xmpp_auth') == null) { do_login(form.username.value, form.username.password, do_list_hosts); } else { do_list_hosts(); } } function login(form) { do_login(form.username.value, form.password.value); } function extract_auth_token(message) { var lines = message.split('\n'); for (var i = 0; i < lines.length; i++) { if (lines[i].match('^Auth=.*')) { return lines[i].split('=')[1]; } } console.log('Could not parse auth token in : "' + message + '"'); return 'bad_token'; } function do_gaia_login(username, password, service, done) { var xhr = new XMLHttpRequest(); xhr.open('POST', 'https://www.google.com/accounts/ClientLogin', true); xhr.onreadystatechange = function() { if (xhr.readyState != 4) { return; } if (xhr.status = 200) { done(extract_auth_token(xhr.responseText)); } else { console.log('Bad status on auth: ' + xhr.statusText); } }; xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.send('accountType=HOSTED_OR_GOOGLE&Email=' + username + '&Passwd=' + password + '&service=' + service + '&source=chromoclient'); } function do_login(username, password, done) { var count = 2; var barrier = function() { count--; if (done && count == 0) { done(); } } set_cookie('username', username, 100); do_gaia_login(username, password, 'chromoting', function(token1) { set_cookie('chromoting_auth', token1, 100); document.getElementById('chromoting_auth').value = token1; barrier(); }); do_gaia_login(username, password, 'chromiumsync', function(token) { set_cookie('xmpp_auth', token, 100); document.getElementById('xmpp_auth').value = token; barrier(); }); } function do_list_hosts() { var xhr = new XMLHttpRequest(); var token = get_cookie('chromoting_auth'); // Unhide host list. var hostlist_div = document.getElementById('hostlist_div'); hostlist_div.style.display = "block"; xhr.onreadystatechange = function() { if (xhr.readyState == 1) { hostlist_div.appendChild(document.createTextNode('Finding..')); hostlist_div.appendChild(document.createElement('br')); } if (xhr.readyState != 4) { return; } if (xhr.status == 200) { parsed_response = JSON.parse(xhr.responseText); hostlist_div.appendChild(document.createTextNode('--Found Hosts--')); hostlist_div.appendChild(document.createElement('br')); append_host_links(parsed_response.data.items); } else { console.log('bad status on host list query: "' + xhr.status + ' ' + xhr.statusText); hostlist_div.appendChild(document.createTextNode('!! Failed !!. :\'(')); } }; xhr.open('GET', 'http://www-googleapis-test.sandbox.google.com/chromoting/v1/@me/hosts'); xhr.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8'); xhr.setRequestHeader('Authorization', 'GoogleLogin auth=' + token); xhr.send(null); } function append_host_links(hostlist) { // A host link entry should look like: // - Host: NAME (JID)
var host; var host_link; var hostlist_div = document.getElementById('hostlist_div'); // Add the hosts. for(var i = 0; i < hostlist.length; ++i) { hostlist_div.appendChild(document.createTextNode('-*- Host: ')); host = hostlist[i]; host_link = document.createElement('a'); // TODO(ajwong): Reenable once we figure out how to control a new tab. host_link.setAttribute('onclick', 'open_chromoting_tab(\'' + host.jabberId + '\'); return false;'); host_link.setAttribute('href', 'javascript:void(0)'); host_link.appendChild(document.createTextNode(host.hostName + ' (' + host.hostId + ', ' + host.jabberId + ')')); hostlist_div.appendChild(host_link); hostlist_div.appendChild(document.createElement('br')); } } // Cookie reading code taken from quirksmode with modification for escaping. // http://www.quirksmode.org/js/cookies.html function set_cookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else var expires = ""; document.cookie = name+"="+escape(value)+expires+"; path=/"; } function get_cookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length)); } return null; } function set_auth_cookies(form) { var now = new Date(); now.setTime(now.getTime() + 1000 * 60 * 60 * 24 * 365) create_cookie('xmpp_auth', form.xmpp_auth.value, 100); create_cookie('chromoting_auth', form.chromoting_auth.value, 100); } function connect(form) { open_chromoting_tab(form.host_jid.value); } function debug_output(message) { var debug_div = document.getElementById('debug_div'); debug_div.appendChild(document.createTextNode(message)); debug_div.appendChild(document.createElement('br')); } function open_chromoting_tab(host_jid) { var username = get_cookie('username'); var xmpp_auth = get_cookie('xmpp_auth'); var new_tab_url = chrome.extension.getURL("chromoting_tab.html"); var request = { username: get_cookie('username'), xmpp_auth: get_cookie('xmpp_auth'), host_jid: host_jid, }; var tab_args = { url: new_tab_url, selected: false, }; console.log("Attempt to connect with " + "username='" + request.username + "'" + " host_jid='" + request.host_jid + "'" + " auth_token='" + request.xmpp_auth + "'"); // TODO(sergeyu): Currently we open a new tab, send a message and only after // that select the new tab. This is neccessary because chrome closes the // popup the moment the new tab is selected, and so we fail to send the // message if the tab is selected when it is created. There is visible delay // when opening a new tab, so it is necessary to pass the message somehow // differently. Figure out how. chrome.tabs.create(tab_args, function(tab) { console.log("We're trying now to send to " + tab.id); chrome.tabs.sendRequest( tab.id, request, function() { console.log('Tab finished connect.'); chrome.tabs.update(tab.id, {selected: true}); }); }); }