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
|
# Copyright 2006 Massachusetts Institute of Technology.
# All Rights Reserved.
#
# Export of this software from the United States of America may
# require a specific license from the United States Government.
# It is the responsibility of any person or organization contemplating
# export to obtain such a license before exporting.
#
# WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
# distribute this software and its documentation for any purpose and
# without fee is hereby granted, provided that the above copyright
# notice appear in all copies and that both that copyright notice and
# this permission notice appear in supporting documentation, and that
# the name of M.I.T. not be used in advertising or publicity pertaining
# to distribution of the software without specific, written prior
# permission. Furthermore if you modify this software you must label
# your software as modified software and not distribute it in such a
# fashion that it might be confused with the original M.I.T. software.
# M.I.T. makes no representations about the suitability of
# this software for any purpose. It is provided "as is" without express
# or implied warranty.
# possible return values:
# False: request not handled by this script, try another means
# empty list: no server available, e.g., TCP KDC in realm with only UDP
# ordered list of (ip-addr-string, port-number-or-string, socket-type)
#
# Field ip-addr-string is a numeric representation of the IPv4 or IPv6
# address. Field port-number-or-string is, for example, "88" or 88. The
# socket type is also expressed numerically, SOCK_DGRAM or SOCK_STREAM.
# It must agree with the supplied socktype value if that is non-zero, but
# zero must not be used in the returned list.
#
# service enum values: kdc=1, master_kdc, kadmin, krb524, kpasswd
from socket import getaddrinfo, SOCK_STREAM, SOCK_DGRAM, AF_INET, AF_INET6
def locate1 (service, realm, socktype, family):
if (service == 1 or service == 2) and realm == "ATHENA.MIT.EDU":
if socktype == SOCK_STREAM: return []
socktype = SOCK_DGRAM
result = []
hlist = (("kerberos.mit.edu", 88), ("kerberos-1.mit.edu", 88),
("some-random-name-that-does-not-exist.mit.edu", 12345),
("kerberos.mit.edu", 750))
if service == 2: hlist = (hlist[0],)
for (hname,hport) in hlist:
try:
alist = getaddrinfo(hname, hport, family, socktype)
for a in alist:
(fam, stype, proto, canonname, sa) = a
if fam == AF_INET or fam == AF_INET6:
addr = sa[0]
port = sa[1]
result = result + [(addr, port, stype)]
except Exception, inst:
# print "getaddrinfo error for " + hname + ":", inst
pass # Enh, this is just a demo.
return result
if realm == "BOBO.MIT.EDU": return []
return False
verbose = 0
servicenames = { 1: "kdc", 2: "master_kdc", 3: "kadmin", 4: "krb524", 5: "kpasswd" }
socktypenames = { SOCK_STREAM: "STREAM", SOCK_DGRAM: "DGRAM" }
familynames = { 0: "UNSPEC", AF_INET: "INET", AF_INET6: "INET6" }
def locate (service, realm, socktype, family):
socktypename = socktype
if socktype in socktypenames: socktypename = "%s(%d)" % (socktypenames[socktype], socktype)
familyname = family
if family in familynames: familyname = "%s(%d)" % (familynames[family], family)
servicename = service
if service in servicenames: servicename = "%s(%d)" % (servicenames[service], service)
if verbose: print "locate called with service", servicename, "realm", realm, "socktype", socktypename, "family", familyname
result = locate1 (service, realm, socktype, family)
if verbose: print "locate result is", result
return result
|