forked from CyanogenMod/android_development
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadd-accounts
executable file
·131 lines (105 loc) · 3.45 KB
/
add-accounts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/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", "su", "root",
"/system/bin/getprop", name)
return RunCmd(args)
def SetProp(adb_flags, name, value):
args = ("adb",) + adb_flags + ("shell", "su", "root",
"/system/bin/setprop", name, value)
return RunCmd(args)
def DbExists(adb_flags):
args = ("adb",) + adb_flags + ("shell", "su", "root",
"/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] "
"[<dasher address[:password]>] "
"[<gmail address[:password]>]") % (argv[0],)
sys.exit(2)
argv = argv[1:]
gmail = None
dasher = None
while argv and "@" in argv[-1]:
addr = argv.pop()
if "@gmail.com" in addr or "@googlemail.com" in addr:
gmail = addr
else:
dasher = 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 dasher and hosted_account:
print
print "A dasher account is already configured on this device;"
print "can't add", hosted_account
print
dasher = 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 dasher: break
if dasher:
SetProp(adb_flags, "ro.config.hosted_account", dasher)
print "set hosted_account to", dasher
if gmail:
SetProp(adb_flags, "ro.config.google_account", gmail)
print "set google_account to", gmail
break
if __name__ == "__main__":
main(sys.argv)