#!/usr/bin/env python # Copyright (c) 2012 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. """Registers new hosts in chromoting directory. It asks for username/password and then writes these settings to config file. """ import base64 import getpass import hashlib import hmac import json import os import random import socket import sys import urllib import urllib2 import gaia_auth import keygen def random_uuid(): return ("%04x%04x-%04x-%04x-%04x-%04x%04x%04x" % tuple(map(lambda x: random.randrange(0,65536), range(8)))) def main(): server = 'www.googleapis.com' url = 'https://' + server + '/chromoting/v1/@me/hosts' settings_filepath = os.path.join(os.path.expanduser('~'), '.ChromotingConfig.json') print "Email:", email = raw_input() password = getpass.getpass("Password: ") chromoting_auth = gaia_auth.GaiaAuthenticator('chromoting') auth_token = chromoting_auth.authenticate(email, password) host_id = random_uuid() print "HostId:", host_id host_name = socket.gethostname() print "HostName:", host_name print "Generating RSA key pair...", (private_key, public_key) = keygen.generateRSAKeyPair() print "Done" while 1: pin = getpass.getpass("Host PIN: ") if len(pin) < 4: print "PIN must be at least 4 characters long." continue pin2 = getpass.getpass("Confirm host PIN: ") if pin2 != pin: print "PINs didn't match. Please try again." continue break host_secret_hash = "hmac:" + base64.b64encode( hmac.new(str(host_id), pin, hashlib.sha256).digest()) params = { "data": { "hostId": host_id, "hostName": host_name, "publicKey": public_key, } } headers = {"Authorization": "GoogleLogin auth=" + auth_token, "Content-Type": "application/json" } request = urllib2.Request(url, json.dumps(params), headers) opener = urllib2.OpenerDirector() opener.add_handler(urllib2.HTTPDefaultErrorHandler()) print print "Registering host with directory service..." try: res = urllib2.urlopen(request) data = res.read() except urllib2.HTTPError, err: print >> sys.stderr, "Directory returned error:", err print >> sys.stderr, err.fp.read() return 1 print "Done" # Get token that the host will use to athenticate in talk network. authenticator = gaia_auth.GaiaAuthenticator('chromiumsync'); auth_token = authenticator.authenticate(email, password) # Write settings file. os.umask(0066) # Set permission mask for created file. settings_file = open(settings_filepath, 'w') config = { "xmpp_login" : email, "xmpp_auth_token" : auth_token, "host_id" : host_id, "host_name" : host_name, "host_secret_hash": host_secret_hash, "private_key" : private_key, } settings_file.write(json.dumps(config, indent=2)) settings_file.close() print 'Configuration saved in', settings_filepath return 0 if __name__ == '__main__': sys.exit(main())