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
|
#!/usr/bin/python3
# Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
# Date: 2014-08-30
# License: GPLv3+
# For doing keyring-maint tasks with debian LDAP
import ldap
import getpass
import sys
if sys.argv.__len__() != 2 or sys.argv[1] in ['-h', '--help', 'help']:
print('''Usage: update-ldap <FILENAME>
FILENAME should be a simple text file, utf8 encoded, where each line
is a key replacement with three fields separated by a single space:
uid oldfpr newfpr
''')
exit(1)
class debldap:
def __init__(self):
self.l = ldap.initialize("ldaps://db.debian.org")
def auth(self, uid, password):
self.l.simple_bind_s("uid={uid},ou=users,dc=debian,dc=org".format(uid=uid),password)
def changefpr(self, uid, oldfpr, newfpr):
dn = "uid={uid},ou=users,dc=debian,dc=org".format(uid=uid)
objs = self.l.search_s(dn, ldap.SCOPE_SUBTREE, "objectclass=*")
if not objs:
raise BaseException("No objects found matching {dn}".format(dn=dn))
for o in objs:
if o[0] != dn:
raise BaseException("Weird/unexpected dn {new} (expected {old})".format(new=o[0], old=dn))
fprs = o[1]['keyFingerPrint']
if fprs != [oldfpr.encode('ascii')]:
raise BaseException("old fingerprint was {found}, but we expected {oldfpr}".format(found=fprs, oldfpr=oldfpr))
self.l.modify_s(dn, [(ldap.MOD_REPLACE, 'keyFingerPrint', [newfpr.encode('ascii')])])
f = open(sys.argv[1])
x = debldap()
username = getpass.getuser()
try:
passwd = getpass.getpass('Debian LDAP password for {user}: '.format(user=username))
x.auth(username, passwd)
bound = True
except BaseException as e:
print("Failed to authenticate: {m}".format(m=e.message))
exit(1)
errors = []
lineno = 0
successes = 0
for line in f:
lineno += 1
user = '<unknown>'
try:
data = line.strip('\n').split(' ')
if data.__len__() != 3:
raise BaseException("ignoring malformed line: {line}\n".format(lineno=lineno, line=line))
user = data[0]
x.changefpr(user, data[1], data[2])
successes += 1
except BaseException as e:
print("{lineno}: {user}: {message}".format(lineno=lineno, user=user,message=str(e.message).strip()))
errors.append((lineno, e))
print("{errors} errors, {successes} successfully processed".format(successes=successes, errors=errors.__len__()))
if errors:
exit(1)
|