initial
This commit is contained in:
commit
bea4c7eaad
116
create_databases.py
Normal file
116
create_databases.py
Normal file
|
@ -0,0 +1,116 @@
|
|||
import docopt, os, sqlite3
|
||||
|
||||
usage = \
|
||||
'''
|
||||
Usage:
|
||||
create_databases.py PATH
|
||||
|
||||
|
||||
'''
|
||||
|
||||
|
||||
args = docopt.docopt(usage)
|
||||
|
||||
|
||||
path = args["PATH"]
|
||||
|
||||
def create_private_db(path):
|
||||
private_path = os.path.join(path, "private")
|
||||
os.makedirs(private_path)
|
||||
|
||||
private_db_file = os.path.join(private_path, "users.db")
|
||||
db = sqlite3.connect(private_db_file)
|
||||
|
||||
cursor = db.cursor()
|
||||
|
||||
cursor.execute("CREATE TABLE users(" \
|
||||
"uid integer PRIMARY KEY AUTOINCREMENT, "\
|
||||
"username text UNIQUE, "\
|
||||
"passwd_hash text, "\
|
||||
"email text, "\
|
||||
"first_name text, "\
|
||||
"last_name text, " \
|
||||
"is_confirmed bool)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE globals(" \
|
||||
"confirmation_id_offset integer " \
|
||||
")")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE email_queue(" \
|
||||
"email_id integer PRIMARY KEY AUTOINCREMENT, " \
|
||||
"sender text, " \
|
||||
"recipient text, " \
|
||||
"message text, " \
|
||||
"in_transaction bool)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE confirmations_awaiting(" \
|
||||
"user_id integer, " \
|
||||
"convirmation_id integer PRIMARY KEY AUTOINCREMENT");
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE INDEX username ON users(username)")
|
||||
db.commit()
|
||||
|
||||
db.close()
|
||||
|
||||
def create_public_db(path):
|
||||
public_path = os.path.join(path, "pulic")
|
||||
os.makedirs(public_path)
|
||||
|
||||
public_db_file = os.path.join(public_path, "data")
|
||||
db = sqlite3.connect(public_db_file)
|
||||
|
||||
cursor = db.cursor()
|
||||
|
||||
cursor.execute("CREATE TABLE location_settings("\
|
||||
"username text PRIMARY KEY, "\
|
||||
"radius decimal, "\
|
||||
"use_gps bool, "\
|
||||
"country text)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE specimen_settings("\
|
||||
"username text PRIMARY KEY, "\
|
||||
"author text, "\
|
||||
"location_uri text) ")
|
||||
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE locations("\
|
||||
"username text, "\
|
||||
"latitude decimal, "\
|
||||
"longitude decimal, "\
|
||||
"name text, "\
|
||||
"radius decimal, "\
|
||||
"description text, "\
|
||||
"country text, "\
|
||||
"identifier text, "\
|
||||
"address text, "\
|
||||
"image_uri text)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE specimen("\
|
||||
"username text, "\
|
||||
"genus text, "\
|
||||
"species text, "\
|
||||
"subspecies text, "\
|
||||
"sex text, "\
|
||||
"nickname text, "\
|
||||
"author text, "\
|
||||
"image_uri text, "\
|
||||
"location_uri text, "\
|
||||
"identifier text, "\
|
||||
"latitude decimal, "\
|
||||
"longitude decimal)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE INDEX username_loc on locations(username)")
|
||||
cursor.execute("CREATE INDEX username_spec on specimen(username)")
|
||||
db.commit()
|
||||
|
||||
|
||||
create_private_db(path)
|
||||
create_public_db(path)
|
10
data.cfg
Normal file
10
data.cfg
Normal file
|
@ -0,0 +1,10 @@
|
|||
[register]
|
||||
index = "client/static/register.html"
|
||||
enabled = true
|
||||
|
||||
[database]
|
||||
users = "server/data/private/users.db"
|
||||
public = "server/data/public/data"
|
||||
public_path = "server/data/public"
|
||||
pulic_databases = data
|
||||
|
BIN
server/data/databases/private/users.db
Normal file
BIN
server/data/databases/private/users.db
Normal file
Binary file not shown.
BIN
server/data/databases/pulic/data
Normal file
BIN
server/data/databases/pulic/data
Normal file
Binary file not shown.
3
server/requirements.tx
Normal file
3
server/requirements.tx
Normal file
|
@ -0,0 +1,3 @@
|
|||
webdb
|
||||
cherrypy
|
||||
|
0
server/server/__init__.py
Normal file
0
server/server/__init__.py
Normal file
69
server/server/registration.py
Normal file
69
server/server/registration.py
Normal file
|
@ -0,0 +1,69 @@
|
|||
import cherrypy, sqlite3
|
||||
from cherrypy import HTTPError
|
||||
|
||||
required_for_register = ["email", "username", "password", "first_name", "last_name"]
|
||||
|
||||
class RegistrationServer(object):
|
||||
def __init__(self, conf, mkhash):
|
||||
self.conf = conf
|
||||
self.mkhash = mkhash
|
||||
|
||||
@cherrypy.expose
|
||||
def index(self):
|
||||
return open(self.conf["register"]["index"])
|
||||
|
||||
@cherrypy.expose
|
||||
@cherrypy.tools.json_in
|
||||
def do_register(self):
|
||||
|
||||
if(not self.conf["register"]["enabled"]):
|
||||
raise HTTPError(404, "registration is disabled")
|
||||
data = cherrypy.request.json
|
||||
|
||||
for required in required_for_register:
|
||||
if not required in data:
|
||||
raise HTTPError(400, "missing {}".format(required))
|
||||
|
||||
username = data["username"]
|
||||
self.check_username_validity(username)
|
||||
|
||||
passwd_hash = self.mkhash(data["password"])
|
||||
db = sqlite3.connect(self.conf["database"]["users"])
|
||||
|
||||
cursor = db.cursor()
|
||||
|
||||
cursor.execute("INSERT INTO users("\
|
||||
"username, passwd_hash, "\
|
||||
"email, first_name, last_name) "\
|
||||
"VALUES(?, ?, ?, ?, ?)",
|
||||
[username, passwd_hash, data["email"],
|
||||
data["first_name"], data["last_name"])
|
||||
|
||||
db.commit()
|
||||
db.close()
|
||||
return "registration successful"
|
||||
|
||||
|
||||
@cherrypy.expose
|
||||
def check_username_validity(self, username):
|
||||
for i in string.whitespace:
|
||||
if i in username:
|
||||
raise HTTPError(400, "username contains whitespace")
|
||||
for i in "\\\"\b\n\r/":
|
||||
if i in username:
|
||||
raise HTTPError(400, "username contains forbidden character")
|
||||
|
||||
db = sqlite3.connect(self.conf["database"]["users"])
|
||||
cursor = db.cursor()
|
||||
cursor.execute("SELECT uid FROM users WHERE username = ?", [(username)])
|
||||
if(cursor.fetchone()):
|
||||
db.close()
|
||||
raise HTTPError(404, "username already in use")
|
||||
db.close()
|
||||
return "username is valid"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
129
server/test/test_registration.py
Normal file
129
server/test/test_registration.py
Normal file
|
@ -0,0 +1,129 @@
|
|||
from hashlib import sha256
|
||||
|
||||
|
||||
from server.registration import RegistrationServer
|
||||
|
||||
mkhash = lambda s: sha256(s).hexdigest()
|
||||
|
||||
def build_dir(directory):
|
||||
def create_private_db(path):
|
||||
private_path = os.path.join(path, "private")
|
||||
os.makedirs(private_path)
|
||||
|
||||
private_db_file = os.path.join(private_path, "users.db")
|
||||
db = sqlite3.connect(private_db_file)
|
||||
|
||||
cursor = db.cursor()
|
||||
|
||||
cursor.execute("CREATE TABLE users(" \
|
||||
"uid integer PRIMARY KEY AUTOINCREMENT, "\
|
||||
"username text UNIQUE, "\
|
||||
"passwd_hash text, "\
|
||||
"email text, "\
|
||||
"first_name text, "\
|
||||
"last_name text, " \
|
||||
"is_confirmed bool)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE globals(" \
|
||||
"confirmation_id_offset integer " \
|
||||
")")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE email_queue(" \
|
||||
"email_id integer PRIMARY KEY AUTOINCREMENT, " \
|
||||
"sender text, " \
|
||||
"recipient text, " \
|
||||
"message text, " \
|
||||
"in_transaction bool)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE confirmations_awaiting(" \
|
||||
"user_id integer, " \
|
||||
"convirmation_id integer PRIMARY KEY AUTOINCREMENT");
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE INDEX username ON users(username)")
|
||||
db.commit()
|
||||
|
||||
db.close()
|
||||
|
||||
def create_public_db(path):
|
||||
public_path = os.path.join(path, "pulic")
|
||||
os.makedirs(public_path)
|
||||
|
||||
public_db_file = os.path.join(public_path, "data")
|
||||
db = sqlite3.connect(public_db_file)
|
||||
|
||||
cursor = db.cursor()
|
||||
|
||||
cursor.execute("CREATE TABLE location_settings("\
|
||||
"username text PRIMARY KEY, "\
|
||||
"radius decimal, "\
|
||||
"use_gps bool, "\
|
||||
"country text)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE specimen_settings("\
|
||||
"username text PRIMARY KEY, "\
|
||||
"author text, "\
|
||||
"location_uri text) ")
|
||||
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE locations("\
|
||||
"username text, "\
|
||||
"latitude decimal, "\
|
||||
"longitude decimal, "\
|
||||
"name text, "\
|
||||
"radius decimal, "\
|
||||
"description text, "\
|
||||
"country text, "\
|
||||
"identifier text, "\
|
||||
"address text, "\
|
||||
"image_uri text)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE TABLE specimen("\
|
||||
"username text, "\
|
||||
"genus text, "\
|
||||
"species text, "\
|
||||
"subspecies text, "\
|
||||
"sex text, "\
|
||||
"nickname text, "\
|
||||
"author text, "\
|
||||
"image_uri text, "\
|
||||
"location_uri text, "\
|
||||
"identifier text, "\
|
||||
"latitude decimal, "\
|
||||
"longitude decimal)")
|
||||
db.commit()
|
||||
|
||||
cursor.execute("CREATE INDEX username_loc on locations(username)")
|
||||
cursor.execute("CREATE INDEX username_spec on specimen(username)")
|
||||
db.commit()
|
||||
|
||||
|
||||
create_private_db(directory)
|
||||
create_public_db(directory)
|
||||
|
||||
with open("index.html", "w") as index:
|
||||
index.write("INDEX")
|
||||
|
||||
return {"database": {"users": directory + "private"},
|
||||
"register": {"index": directory + "index.html",
|
||||
"enabled": True}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def test_registration(tmpdir):
|
||||
conf = build_dir(str(tmpdir))
|
||||
|
||||
server = RegistrationServer(conf, mkhash)
|
||||
|
||||
assert server.index() == "INDEX"
|
||||
|
Loading…
Reference in New Issue
Block a user