YubiServe is a lightweight Validation Server supporting both OATH/HOTP and Yubico Yubikey implementations, written in Python that uses an SQLite database or, optionally, a MySQL database. It has an integrated threaded webserver, with HTTPS/SSL support, compatible with the Yubico validation protocol 2.0 including HMAC SHA-1 signatures to provide for authentication of the server.
274 lines
12 KiB
Plaintext
274 lines
12 KiB
Plaintext
$OpenBSD: patch-dbconf_py,v 1.1.1.1 2012/07/18 08:25:07 sthen Exp $
|
|
|
|
sqlite3 support from http://code.google.com/p/yubico-yubiserve/source/list r39
|
|
|
|
--- dbconf.py.orig Wed Jul 18 01:16:24 2012
|
|
+++ dbconf.py Wed Jul 18 01:04:51 2012
|
|
@@ -1,4 +1,4 @@
|
|
-#!/usr/bin/python
|
|
+#!${MODPY_BIN}
|
|
import time, random, re, os
|
|
from sys import argv
|
|
try:
|
|
@@ -6,12 +6,16 @@ try:
|
|
except ImportError:
|
|
pass
|
|
try:
|
|
+ import sqlite3
|
|
+except ImportError:
|
|
+ pass
|
|
+try:
|
|
import sqlite
|
|
except ImportError:
|
|
pass
|
|
|
|
def parseConfigFile(): # Originally I wrote this function to parse PHP configuration files!
|
|
- config = open(os.path.dirname(os.path.realpath(__file__)) + '/yubiserve.cfg', 'r').read().splitlines()
|
|
+ config = open('${SYSCONFDIR}/yubiserve/yubiserve.cfg', 'r').read().splitlines()
|
|
keys = {}
|
|
for line in config:
|
|
match = re.search('(.*?)=(.*);', line)
|
|
@@ -54,14 +58,15 @@ if config['yubiDB'] == 'mysql' and (config['yubiMySQLH
|
|
print "Cannot continue without any MySQL configuration.\nPlease read README.\n\n"
|
|
quit()
|
|
try:
|
|
- if config['yubiDB'] == 'sqlite':
|
|
- con = sqlite.connect(os.path.dirname(os.path.realpath(__file__)) + '/yubikeys.sqlite')
|
|
+ if config['yubiDB'] == 'sqlite3':
|
|
+ con = sqlite3.connect('/var/db/yubiserve/yubikeys.sqlite3')
|
|
+ elif config['yubiDB'] == 'sqlite':
|
|
+ con = sqlite.connect('/var/db/yubiserve/yubikeys.sqlite')
|
|
elif config['yubiDB'] == 'mysql':
|
|
con = MySQLdb.connect(host=config['yubiMySQLHost'], user=config['yubiMySQLUser'], passwd=config['yubiMySQLPass'], db=config['yubiMySQLName'])
|
|
except:
|
|
print "There's a problem with the database!\n"
|
|
cur = con.cursor()
|
|
-
|
|
if (len(argv)<2):
|
|
print ' == YubiServe Key Management Tool 2.0 ==\n'
|
|
print ' -ya <nickname> <publicid> <secretid> <aeskey>\tAdd a new Yubikey'
|
|
@@ -84,13 +89,15 @@ else:
|
|
if argv[1][0:2] == '-y': # Yubico Yubikey
|
|
if (argv[1][2] == 'd') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print 'Key not found.'
|
|
else:
|
|
- cur.execute("SELECT * FROM yubikeys WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
- if (cur.rowcount == 1):
|
|
- cur.execute("UPDATE yubikeys SET active = '1' WHERE nickname = '" + nickname + "'")
|
|
+ cur.execute("SELECT count(nickname) FROM yubikeys WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if rowcount[0]:
|
|
+ cur.execute("UPDATE yubikeys SET active = '0' WHERE nickname = '" + nickname + "'")
|
|
print "Key '" + nickname + "' disabled."
|
|
con.commit()
|
|
else:
|
|
@@ -98,12 +105,14 @@ else:
|
|
|
|
elif (argv[1][2] == 'e') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print 'Key not found.'
|
|
else:
|
|
- cur.execute("SELECT * FROM yubikeys WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
- if (cur.rowcount == 1):
|
|
+ cur.execute("SELECT count(nickname) FROM yubikeys WHERE nickname = '" + nickname + "' AND active = '0'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if rowcount[0]:
|
|
cur.execute("UPDATE yubikeys SET active = '1' WHERE nickname = '" + nickname + "'")
|
|
print "Key '" + nickname + "' enabled."
|
|
con.commit()
|
|
@@ -111,8 +120,9 @@ else:
|
|
print 'Key is already enabled.'
|
|
elif (argv[1][2] == 'k') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print 'Key not found.'
|
|
else:
|
|
cur.execute("DELETE FROM yubikeys WHERE nickname = '" + nickname + "'")
|
|
@@ -121,8 +131,9 @@ else:
|
|
elif (argv[1][2] == 'a') and (len(argv)>4):
|
|
nickname = re.escape(argv[2])
|
|
if ((len(argv[2])<=16) and (len(argv[3]) <= 16) and (len(argv[4]) <= 12) and (len(argv[5])<=32)):
|
|
- cur.execute("SELECT * FROM yubikeys WHERE nickname = '" + argv[2] + "' OR publicname = '" + argv[3] + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM yubikeys WHERE nickname = '" + argv[2] + "' OR publicname = '" + argv[3] + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
cur.execute("INSERT INTO yubikeys VALUES ('" + argv[2] + "', '" + argv[3] + "', '" + time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) + "', '" + argv[4] + "', '" + argv[5] + "', 1, 1, 1)")
|
|
con.commit()
|
|
print "Key '" + argv[2] + "' added to database."
|
|
@@ -133,13 +144,14 @@ else:
|
|
print 'Secretid must be 12 characters max, aeskey must be 32 characters max.\n'
|
|
quit()
|
|
elif (argv[1][2] == 'l'):
|
|
- cur.execute('SELECT nickname, publicname, active FROM yubikeys')
|
|
- if cur.rowcount != 0:
|
|
- print " " + str(cur.rowcount) + " keys into database:"
|
|
+ cur.execute('SELECT count(nickname) FROM yubikeys')
|
|
+ rowcount = cur.fetchone();
|
|
+ print " %s keys into database:" % (rowcount[0])
|
|
+ if rowcount[0]:
|
|
+ cur.execute('SELECT nickname, publicname, active FROM yubikeys')
|
|
print '[Nickname]\t\t>> [PublicID]'
|
|
- for i in range(0, cur.rowcount):
|
|
- (nickname, publicname, active) = cur.fetchone()
|
|
- print ' ' + nickname + ' ' * (23-len(nickname)) + ">> " + publicname + ' ' * (21-len(publicname)) + ">> " + active
|
|
+ for (nickname, publicname, active) in cur:
|
|
+ print '%-23s >> %-21s >> %s ' % (nickname, publicname, active)
|
|
print ''
|
|
else:
|
|
print 'No keys in database\n'
|
|
@@ -148,12 +160,14 @@ else:
|
|
elif argv[1][0:2] == '-h':
|
|
if (argv[1][2] == 'd') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print 'Key not found.'
|
|
else:
|
|
- cur.execute("SELECT * FROM oathtokens WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
- if (cur.rowcount == 1):
|
|
+ cur.execute("SELECT count(nickname) FROM oathtokens WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if rowcount[0]:
|
|
cur.execute("UPDATE oathtokens SET active = '1' WHERE nickname = '" + nickname + "'")
|
|
print "Key '" + nickname + "' disabled."
|
|
con.commit()
|
|
@@ -162,12 +176,14 @@ else:
|
|
|
|
elif (argv[1][2] == 'e') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print 'Key not found.'
|
|
else:
|
|
- cur.execute("SELECT * FROM oathtokens WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
- if (cur.rowcount == 1):
|
|
+ cur.execute("SELECT count(nickname) FROM oathtokens WHERE nickname = '" + nickname + "' AND active = '1'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if rowcount[0]:
|
|
cur.execute("UPDATE oathtokens SET active = '1' WHERE nickname = '" + nickname + "'")
|
|
print "Key '" + nickname + "' enabled."
|
|
con.commit()
|
|
@@ -175,8 +191,9 @@ else:
|
|
print 'Key is already enabled.'
|
|
elif (argv[1][2] == 'k') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print 'Key not found.'
|
|
else:
|
|
cur.execute("DELETE FROM oathtokens WHERE nickname = '" + nickname + "'")
|
|
@@ -185,8 +202,9 @@ else:
|
|
elif (argv[1][2] == 'a') and (len(argv)>3):
|
|
nickname = re.escape(argv[2])
|
|
if (len(argv[2])<=16) and (len(argv[3]) <= 16) and (len(argv[4]) <= 40):
|
|
- cur.execute("SELECT * FROM oathtokens WHERE nickname = '" + argv[2] + "' OR publicname = '" + argv[3] + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM oathtokens WHERE nickname = '" + argv[2] + "' OR publicname = '" + argv[3] + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
cur.execute("INSERT INTO oathtokens VALUES ('" + nickname + "', '" + argv[3] + "', '" + time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) + "', '" + argv[4] + "', 1, 1)")
|
|
con.commit()
|
|
print "Key '" + argv[2] + "' added to database."
|
|
@@ -197,14 +215,14 @@ else:
|
|
print 'Secret key must be 40 characters max.\n'
|
|
quit()
|
|
elif (argv[1][2] == 'l'):
|
|
- cur.execute('SELECT nickname, publicname FROM oathtokens')
|
|
- if cur.rowcount != 0:
|
|
- print " " + str(cur.rowcount) + " keys into database:"
|
|
+ cur.execute('SELECT count(nickname) FROM oathtokens')
|
|
+ rowcount = cur.fetchone();
|
|
+ print " %s keys into database:" % (rowcount[0])
|
|
+ if rowcount[0]:
|
|
+ cur.execute('SELECT nickname, publicname FROM oathtokens')
|
|
print '[Nickname]\t\t>> [PublicID]'
|
|
- for i in range(0, cur.rowcount):
|
|
- (nickname, publicname) = cur.fetchone()
|
|
- print ' ' + nickname + ' ' * (23-len(nickname)) + ">> " + publicname
|
|
- print ''
|
|
+ for (nickname, publicname) in cur:
|
|
+ print '%-23s >> %-21s >> %s ' % (nickname, publicname)
|
|
else:
|
|
print 'No keys in database\n'
|
|
else:
|
|
@@ -212,13 +230,15 @@ else:
|
|
elif argv[1][0:2] == '-a':
|
|
if (argv[1][2] == 'a') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM apikeys WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount != 0):
|
|
+ cur.execute("SELECT count(nickname) FROM apikeys WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if rowcount[0]:
|
|
print 'API Key for this nickname is already present. Remove it or choose another one.\n'
|
|
quit()
|
|
cur.execute('SELECT id FROM apikeys ORDER BY id DESC LIMIT 1')
|
|
- if (cur.rowcount != 0):
|
|
- id = cur.fetchone()[0] + 1
|
|
+ lastid = cur.fetchone()
|
|
+ if lastid:
|
|
+ id = lastid[0] + 1
|
|
else:
|
|
id = 1
|
|
api_key = randomChars(20)
|
|
@@ -228,22 +248,23 @@ else:
|
|
print "Your API Key ID is: " + str(id) + "\n"
|
|
elif (argv[1][2] == 'k') and (len(argv)>2):
|
|
nickname = re.escape(argv[2])
|
|
- cur.execute("SELECT * FROM apikeys WHERE nickname = '" + nickname + "'")
|
|
- if (cur.rowcount == 0):
|
|
+ cur.execute("SELECT count(nickname) FROM apikeys WHERE nickname = '" + nickname + "'")
|
|
+ rowcount = cur.fetchone();
|
|
+ if not rowcount[0]:
|
|
print "API Key for this nickname Doesn't exists!\n"
|
|
quit()
|
|
cur.execute("DELETE FROM apikeys WHERE nickname = '" + nickname + "'")
|
|
con.commit()
|
|
print "API Key for '" + nickname + "' has been deleted.\n"
|
|
elif (argv[1][2] == 'l'):
|
|
- cur.execute('SELECT nickname FROM apikeys')
|
|
- if cur.rowcount != 0:
|
|
- print ' ' + str(cur.rowcount) + ' keys into database:'
|
|
+ cur.execute('SELECT count(nickname) FROM apikeys')
|
|
+ rowcount = cur.fetchone();
|
|
+ print " %s keys into database:" % (rowcount[0])
|
|
+ if rowcount[0]:
|
|
+ cur.execute('SELECT nickname FROM apikeys')
|
|
print '[Nickname]'
|
|
- for i in range(0, cur.rowcount):
|
|
- nickname = cur.fetchone()[0]
|
|
- print ' ' + nickname
|
|
- print ''
|
|
+ for (nickname) in cur:
|
|
+ print '%-23s' % (nickname)
|
|
else:
|
|
print 'No keys in database\n'
|
|
-
|
|
\ No newline at end of file
|
|
+
|