diff --git a/warden3/warden_client/warden_client_test.py b/warden3/warden_client/warden_client_test.py index 93297ee4716dcc9e6d96a54f4ac5352096f832b7..7a634ceeae0633a57706d689d94a01083df7e943 100755 --- a/warden3/warden_client/warden_client_test.py +++ b/warden3/warden_client/warden_client_test.py @@ -161,6 +161,11 @@ def main(): if not isinstance(info, Error): pprint(info) + print "=== Debug ===" + info = wclient.getDebug() + if not isinstance(info, Error): + pprint(info) + if __name__ == "__main__": main() diff --git a/warden3/warden_server/warden_server.py b/warden3/warden_server/warden_server.py index b8a0d959d56ff4a530c71d397da91e76e893978e..80ce0071d7d04d3633e92a4a6215e92d646c854a 100755 --- a/warden3/warden_server/warden_server.py +++ b/warden3/warden_server/warden_server.py @@ -11,6 +11,8 @@ import ConfigParser from traceback import format_tb import M2Crypto.X509 import json +import MySQLdb as my +import MySQLdb.cursors as mycursors from uuid import uuid4 from time import time, gmtime from math import trunc @@ -187,16 +189,11 @@ class X509Authenticator(NoAuthenticator): def authenticate (self, env): names = self.get_cert_dns_names(env["SSL_CLIENT_CERT"]) - # FIXME: should probably fetch and return id from db, not textual username - env["warden.x509_dns_names"] = names - return names[0] if names else None + return self.db.get_client_by_name(names) def authorize(self, env, client, method, args): - # Here we might choose with methods or args to (dis)allow for which - # client. - # FIXME: fetch reader/writer or better list of allowed methods from db - return (client is not None) + return (client is not None) and client["rights"]=="whatever" @@ -239,13 +236,44 @@ class JSONSchemaValidator(NoValidator): -class Database(Object): - #FIXME: here database model will dictate methods, which other - # objects will use. This is only dull example. +class MySQL(Object): + + def __init__(self, host, user, password, dbname, port): + self.host = host + self.user = user + self.password = password + self.dbname = dbname + self.port = port + + self.con = my.connect(host=self.host, user=self.user, passwd=self.password, + db=self.dbname, port=self.port, cursorclass=mycursors.DictCursor) + self.crs = self.con.cursor() + + + def __str__(self): + return "%s(host='%s', user='%s', dbname='%s', port=%d)" % ( + type(self).__name__, self.host, self.user, self.dbname, self.port) + + + def get_client_by_name(self, name): + return { + "name": name[0] if name else None, + "rights": "whatever" + } + + + def get_debug(self): + self.crs.execute("SELECT VERSION() AS VER"); + row = self.crs.fetchone() + return { + "db": "MySQL", + "version": row["VER"] + } + + + def get_status(self): + return {} - def __init__(self): - # Will accept db configuration parameters, initialize connection, etc. - pass def gen_random_idea(self): @@ -419,7 +447,10 @@ class WardenHandler(Object): @expose def getDebug(self, _env, _client): - return _env + return { + "environment": _env, + "database": self.db.get_debug() + } @expose @@ -572,7 +603,7 @@ def build_server(conf): # "type" keyword in section may be used to choose other section_def = { "log": ["FileLogger", "SysLogger"], - "db": ["Database"], + "db": ["MySQL"], "auth": ["X509Authenticator", "NoAuthenticator"], "validator": ["JSONSchemaValidator", "NoValidator"], "handler": ["WardenHandler"], @@ -598,7 +629,13 @@ def build_server(conf): "JSONSchemaValidator": { "filename": {"type": filepath, "default": path.join(path.dirname(__file__), "idea.schema")} }, - "Database": {}, + "MySQL": { + "host": {"type": str, "default": "localhost"}, + "user": {"type": str, "default": "warden"}, + "password": {"type": str, "default": ""}, + "dbname": {"type": str, "default": "warden3"}, + "port": {"type": natural, "default": 3306} + }, "WardenHandler": { "validator": {"type": obj, "default": "validator"}, "db": {"type": obj, "default": "DB"},