summaryrefslogtreecommitdiffstats
path: root/scripts/add-accounts
blob: d2cddc0875bc1df3298dd88f708b4f01dcc41a10 (plain)
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)