00001
00002
00003 """
00004 usage: %(progname)s [args]
00005 """
00006
00007 import nstart
00008 import os, sys, string, time, getopt
00009 import urllib
00010
00011 from pyclearsilver.log import *
00012
00013 import config
00014
00015 from pyclearsilver import odb, hdfhelp, odb_sqlite3
00016 from pyclearsilver import CSPage
00017
00018 from pyclearsilver.odb import *
00019
00020 import pwauth
00021
00022 gDBSubPath = "host"
00023 gDBFilename = "auth"
00024 gDBTablePrefix = "auth"
00025
00026 class AuthDB(odb.Database):
00027 def __init__(self,db,debug=0):
00028 odb.Database.__init__(self, db, debug=debug)
00029
00030 self.addTable("users", gDBTablePrefix + "_users", UserTable,
00031 rowClass=UserRecord)
00032 self.addTable("login", gDBTablePrefix + "_login", UserLoginTable)
00033 self.addTable("vcode", gDBTablePrefix + "_vcode", VCodeTable)
00034 self.addTable("browserid", gDBTablePrefix + "_browserid", BrowserTable)
00035
00036 def defaultRowClass(self):
00037 return hdfhelp.HdfRow
00038 def defaultRowListClass(self):
00039 return hdfhelp.HdfItemList
00040
00041 def getAllUsers(self):
00042 users = []
00043 rows = self.users.fetchAllRows()
00044 for row in rows:
00045 users.append(row.username)
00046
00047 return users
00048
00049
00050
00051
00052 class UserTable(odb.Table):
00053 def _defineRows(self):
00054 self.d_addColumn("uid",kInteger,None,primarykey = 1,
00055 autoincrement = 1)
00056
00057 self.d_addColumn("username",kVarString, indexed=1, unique=1)
00058 self.d_addColumn("role", kVarString, default="")
00059 self.d_addColumn("pw_hash",kVarString)
00060 self.d_addColumn("status",kInteger, default=0)
00061
00062 self.d_addColumn("creationDate", kInteger, default=0)
00063 self.d_addColumn("dismissed_notices", kVarString, default="")
00064 self.d_addColumn("favorite_apps", kVarString, default="")
00065 self.d_addColumn("changePassword",kInteger, default=0)
00066 self.d_addColumn("skype_id", kVarString, default="")
00067
00068 def lookup(self, username):
00069 try:
00070 row = self.fetchRow(('username', username))
00071 except odb.eNoMatchingRows, reason:
00072 row = None
00073 return row
00074
00075 def new(self, username, password):
00076 row = self.lookup(username)
00077 if row is not None: return row
00078
00079 row = self.newRow()
00080 row.username = username
00081 row.creationDate = int(time.time())
00082 row.setPassword(password)
00083 row.save()
00084
00085 return row
00086
00087 class UserRecord(hdfhelp.HdfRow):
00088 def checkPasswordHash(self, passwordHash):
00089 if len(self.pw_hash) < 2: return 0
00090 if passwordHash == self.pw_hash: return 1
00091 return 0
00092
00093
00094 def checkPassword(self, password):
00095 if len(self.pw_hash) < 2: return 0
00096
00097 return pwauth.checkPassword(password, self.pw_hash)
00098
00099 def setPassword(self, new_password):
00100 self.pw_hash = pwauth.cryptPassword(new_password)
00101 self.changePassword = 0
00102 self.save()
00103
00104 def favorite_apps_list(self):
00105 return self.favorite_apps.split(',') if len(self.favorite_apps) > 0 else []
00106
00107 def is_favorite_app(self, app_taskid):
00108 return self.favorite_apps.find(app_taskid) != -1
00109
00110 def add_favorite_app(self, app_taskid):
00111 apps = self.favorite_apps_list()
00112 if not app_taskid in apps:
00113 apps.append(app_taskid)
00114 self.favorite_apps = string.join(apps, ',')
00115 self.save()
00116 self.sync_with_lobby()
00117
00118 def remove_favorite_app(self, app_taskid):
00119 apps = self.favorite_apps_list()
00120 if app_taskid in apps:
00121 apps.remove(app_taskid)
00122 self.favorite_apps = string.join(apps, ',')
00123 self.save()
00124 self.sync_with_lobby()
00125
00126 def dismissed_notice_list(self):
00127 return self.dismissed_notices.split(',') if len(self.dismissed_notices) > 0 else []
00128
00129 def notice_dismissed(self, notice):
00130 return self.dismissed_notices.find(notice) != -1
00131
00132 def dismiss_notice(self, notice):
00133 notices = self.dismissed_notice_list()
00134 if not notice in notices:
00135 notices.append(notice)
00136 self.dismissed_notices = string.join(notices, ',')
00137 self.save()
00138 self.sync_with_lobby()
00139
00140 def set_skype_id(self, id):
00141 self.skype_id = id
00142 self.save()
00143
00144 self.sync_with_lobby()
00145
00146 def sync_with_lobby(self):
00147 if not config.gLobby: return
00148
00149
00150 url = config.gLobby + "/lobby/lobby/userrec.py"
00151 postdata = {}
00152 postdata['username'] = self.username
00153
00154 postdata['skype_id'] = self.skype_id
00155 postdata['dismissed_notices'] = self.dismissed_notices
00156 postdata['favorite_apps'] = self.favorite_apps
00157
00158 fp = urllib.urlopen(url, urllib.urlencode(postdata.items()))
00159 fp.read()
00160 fp.close()
00161
00162
00163 class UserLoginTable(odb.Table):
00164 def _defineRows(self):
00165 self.d_addColumn("uid",kInteger, primarykey=1)
00166 self.d_addColumn("username",kVarString, indexed=1, primarykey=1)
00167 self.d_addColumn("time", kCreatedStampMS, primarykey=1)
00168
00169 self.d_addColumn("loginType", kInteger)
00170
00171
00172
00173 self.d_addColumn("browserid",kVarString)
00174 self.d_addColumn("ipaddr",kVarString)
00175
00176
00177 class VCodeTable(odb.Table):
00178 def _defineRows(self):
00179 self.d_addColumn("username",kVarString, primarykey=1)
00180 self.d_addColumn("vcode",kInteger, default=0)
00181 self.d_addColumn("browserid",kInteger, default=0)
00182 self.d_addColumn("creationDate", kInteger, default=0)
00183
00184
00185 class BrowserTable(odb.Table):
00186 def _defineRows(self):
00187 self.d_addColumn("browserid",kInteger, primarykey=1, autoincrement=1)
00188 self.d_addColumn("ipaddr", kVarString)
00189 self.d_addColumn("creationDate", kInteger, default=0)
00190
00191
00192
00193 def fullDBPath(path_to_store):
00194 return os.path.join(path_to_store, gDBFilename + ".db3")
00195
00196 def initSchema(create=0, timeout=None):
00197 if timeout is None: timeout = 600
00198
00199 path = config.getSiteDBPath(gDBSubPath)
00200
00201 if create == 1:
00202 config.createDBPath(path)
00203
00204 conn = odb_sqlite3.Connection(fullDBPath(path),
00205 timeout=timeout)
00206
00207 db = AuthDB(conn,debug=debug)
00208
00209 if create:
00210 db.createTables()
00211 db.synchronizeSchema()
00212 db.createIndices()
00213
00214 if 0:
00215 if config.gWebUserID is not None and config.gWebGroupID is not None:
00216 config.webChown(fullDBPath(path))
00217
00218 return db
00219
00220 def exists(username):
00221 path = config.getSiteDBPath(gDBSubPath)
00222 fn = fullDBPath(path)
00223 if os.path.exists(fn):
00224 return 1
00225 return 0
00226
00227
00228 def createDB():
00229 db = initSchema(create=1)
00230 return db
00231
00232
00233 def test():
00234 db = initSchema()
00235
00236 rows = db.users.fetchAllRows()
00237 for row in rows:
00238 print row.username, row.pw_hash
00239
00240
00241
00242 def usage(progname):
00243 print __doc__ % vars()
00244
00245 def main(argv, stdout, environ):
00246 progname = argv[0]
00247 optlist, args = getopt.getopt(argv[1:], "", ["help", "test", "debug"])
00248
00249 testflag = 0
00250 for (field, val) in optlist:
00251 if field == "--help":
00252 usage(progname)
00253 return
00254 elif field == "--debug":
00255 debugfull()
00256 elif field == "--test":
00257 testflag = 1
00258
00259 if testflag:
00260 test()
00261 return
00262
00263 db = initSchema(create=1)
00264
00265
00266
00267 if __name__ == "__main__":
00268 main(sys.argv, sys.stdout, os.environ)
00269
00270
00271