You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.3 KiB
128 lines
3.3 KiB
#!/usr/bin/env python |
|
# |
|
# Copyright (C) 2008 The Android Open Source Project |
|
# |
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
# you may not use this file except in compliance with the License. |
|
# You may obtain a copy of the License at |
|
# |
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
# |
|
# Unless required by applicable law or agreed to in writing, software |
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
# See the License for the specific language governing permissions and |
|
# limitations under the License. |
|
|
|
""" |
|
A faux Setup Wizard. Stuffs one or two usernames + passwords into the |
|
database on the device. |
|
""" |
|
|
|
import sys |
|
if sys.hexversion < 0x02040000: |
|
print "This script requires python 2.4 or higher." |
|
sys.exit(1) |
|
|
|
import getpass |
|
import subprocess |
|
import time |
|
import sha |
|
|
|
DB = "/data/data/com.google.android.googleapps/databases/accounts.db" |
|
|
|
def RunCmd(args): |
|
proc = subprocess.Popen(args, stdout=subprocess.PIPE) |
|
out = proc.stdout.read() |
|
if proc.wait(): |
|
print |
|
print "failed: %s" % " ".join(args) |
|
return None |
|
return out |
|
|
|
def GetProp(adb_flags, name): |
|
args = ("adb",) + adb_flags + ("shell", "/system/bin/getprop", name) |
|
return RunCmd(args) |
|
|
|
def SetProp(adb_flags, name, value): |
|
args = ("adb",) + adb_flags + ("shell", "/system/bin/setprop", name, value) |
|
return RunCmd(args) |
|
|
|
def DbExists(adb_flags): |
|
args = ("adb",) + adb_flags + ("shell", "/system/bin/ls", DB) |
|
result = RunCmd(args) |
|
if result is None: return None |
|
return "No such file" not in result |
|
|
|
def main(argv): |
|
if len(argv) == 1: |
|
print ("usage: %s [adb flags] " |
|
"[<hosted address[:password]>] " |
|
"[<gmail address[:password]>]") % (argv[0],) |
|
sys.exit(2) |
|
|
|
argv = argv[1:] |
|
|
|
gmail = None |
|
hosted = None |
|
while argv and "@" in argv[-1]: |
|
addr = argv.pop() |
|
if "@gmail.com" in addr or "@googlemail.com" in addr: |
|
gmail = addr |
|
else: |
|
hosted = addr |
|
|
|
adb_flags = tuple(argv) |
|
|
|
while True: |
|
db = DbExists(adb_flags) |
|
if db is None: |
|
print "failed to contact device; will retry in 3 seconds" |
|
time.sleep(3) |
|
continue |
|
|
|
if db: |
|
print |
|
print "GoogleLoginService has already started on this device;" |
|
print "it's too late to use this script to add accounts." |
|
print |
|
print "This script only works on a freshly-wiped device (or " |
|
print "emulator) while booting for the first time." |
|
print |
|
break |
|
|
|
hosted_account = GetProp(adb_flags, "ro.config.hosted_account").strip() |
|
google_account = GetProp(adb_flags, "ro.config.google_account").strip() |
|
|
|
if hosted and hosted_account: |
|
print |
|
print "A hosted account is already configured on this device;" |
|
print "can't add", hosted_account |
|
print |
|
hosted = None |
|
|
|
if gmail and google_account: |
|
print |
|
print "A google account is already configured on this device;" |
|
print "can't add", google_account |
|
print |
|
gmail = None |
|
|
|
if not gmail and not hosted: break |
|
|
|
if hosted: |
|
SetProp(adb_flags, "ro.config.hosted_account", hosted) |
|
print "set hosted_account to", hosted |
|
if gmail: |
|
SetProp(adb_flags, "ro.config.google_account", gmail) |
|
print "set google_account to", gmail |
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
main(sys.argv)
|
|
|