pam: use a pam object method instead of pam module function
[cascardo/ipsilon.git] / tests / testgssapi.py
1 #!/usr/bin/python
2 #
3 # Copyright (C) 2015 Ipsilon project Contributors, for license see COPYING
4
5 from helpers.common import IpsilonTestBase  # pylint: disable=relative-import
6 from helpers.common import WRAP_HOSTNAME  # pylint: disable=relative-import
7 from helpers.http import HttpSessions  # pylint: disable=relative-import
8 import os
9 import pwd
10 import sys
11 from string import Template
12
13 idp_g = {'TEMPLATES': '${TESTDIR}/templates/install',
14          'CONFDIR': '${TESTDIR}/etc',
15          'DATADIR': '${TESTDIR}/lib',
16          'CACHEDIR': '${TESTDIR}/cache',
17          'HTTPDCONFD': '${TESTDIR}/${NAME}/conf.d',
18          'STATICDIR': '${ROOTDIR}',
19          'BINDIR': '${ROOTDIR}/ipsilon',
20          'WSGI_SOCKET_PREFIX': '${TESTDIR}/${NAME}/logs/wsgi'}
21
22
23 idp_a = {'hostname': '${ADDRESS}:${PORT}',
24          'admin_user': '${TEST_USER}',
25          'system_user': '${TEST_USER}',
26          'instance': '${NAME}',
27          'secure': 'no',
28          'testauth': 'yes',
29          'pam': 'no',
30          'gssapi': 'yes',
31          'ipa': 'no',
32          'gssapi_httpd_keytab': '${TESTDIR}/${HTTP_KTNAME}',
33          'server_debugging': 'True'}
34
35
36 sp_g = {'HTTPDCONFD': '${TESTDIR}/${NAME}/conf.d',
37         'SAML2_TEMPLATE': '${TESTDIR}/templates/install/saml2/sp.conf',
38         'SAML2_CONFFILE': '${TESTDIR}/${NAME}/conf.d/ipsilon-saml.conf',
39         'SAML2_HTTPDIR': '${TESTDIR}/${NAME}/saml2'}
40
41
42 sp_a = {'hostname': '${ADDRESS}:${PORT}',
43         'saml_idp_metadata':
44             'http://%s:45080/idp1/saml2/metadata' % WRAP_HOSTNAME,
45         'saml_secure_setup': 'False',
46         'saml_auth': '/sp',
47         'httpd_user': '${TEST_USER}'}
48
49 sp2_g = {'HTTPDCONFD': '${TESTDIR}/${NAME}/conf.d',
50          'SAML2_TEMPLATE': '${TESTDIR}/templates/install/saml2/sp.conf',
51          'SAML2_CONFFILE': '${TESTDIR}/${NAME}/conf.d/ipsilon-saml.conf',
52          'SAML2_HTTPDIR': '${TESTDIR}/${NAME}/saml2'}
53
54 sp2_a = {'hostname': '${ADDRESS}:${PORT}',
55          'saml_idp_url': 'http://idp.ipsilon.dev:45080/idp1',
56          'admin_user': '${TEST_USER}',
57          'admin_password': '${TESTDIR}/pw.txt',
58          'saml_sp_name': 'sp2',
59          'saml_secure_setup': 'False',
60          'saml_auth': '/sp',
61          'httpd_user': '${TEST_USER}'}
62
63
64 def fixup_sp_httpd(httpdir):
65     location = """
66
67 Alias /sp ${HTTPDIR}/sp
68
69 <Directory ${HTTPDIR}/sp>
70     Require all granted
71 </Directory>
72 """
73     index = """WORKS!"""
74
75     t = Template(location)
76     text = t.substitute({'HTTPDIR': httpdir})
77     with open(httpdir + '/conf.d/ipsilon-saml.conf', 'a') as f:
78         f.write(text)
79
80     os.mkdir(httpdir + '/sp')
81     with open(httpdir + '/sp/index.html', 'w') as f:
82         f.write(index)
83
84
85 class IpsilonTest(IpsilonTestBase):
86
87     def __init__(self):
88         super(IpsilonTest, self).__init__('testgssapi', __file__)
89
90     def setup_servers(self, env=None):
91         os.mkdir("%s/ccaches" % self.testdir)
92
93         print "Installing KDC server"
94         kdcenv = self.setup_kdc(env)
95
96         print "Creating principals and keytabs"
97         self.setup_keys(kdcenv)
98
99         print "Getting a TGT"
100         self.kinit_keytab(kdcenv)
101
102         print "Installing IDP server"
103         name = 'idp1'
104         addr = 'idp.ipsilon.dev'
105         port = '45080'
106         env.update(kdcenv)
107         idp = self.generate_profile(idp_g, idp_a, name, addr, port)
108         conf = self.setup_idp_server(idp, name, addr, port, env)
109
110         print "Starting IDP's httpd server"
111         self.start_http_server(conf, env)
112
113         print "Installing first SP server"
114         name = 'sp1'
115         addr = '127.0.0.11'
116         port = '45081'
117         sp = self.generate_profile(sp_g, sp_a, name, addr, port)
118         conf = self.setup_sp_server(sp, name, addr, port, env)
119         fixup_sp_httpd(os.path.dirname(conf))
120
121         print "Starting first SP's httpd server"
122         self.start_http_server(conf, env)
123
124         print "Installing second SP server"
125         name = 'sp2'
126         addr = '127.0.0.11'
127         port = '45082'
128         sp = self.generate_profile(sp2_g, sp2_a, name, addr, port)
129         with open(os.path.dirname(sp) + '/pw.txt', 'a') as f:
130             f.write('ipsilon')
131         conf = self.setup_sp_server(sp, name, addr, port, env)
132         os.remove(os.path.dirname(sp) + '/pw.txt')
133         fixup_sp_httpd(os.path.dirname(conf))
134
135         print "Starting second SP's httpd server"
136         self.start_http_server(conf, env)
137
138 if __name__ == '__main__':
139
140     idpname = 'idp1'
141     sp1name = 'sp1'
142     sp2name = 'sp2'
143     user = pwd.getpwuid(os.getuid())[0]
144
145     testdir = os.environ['TESTDIR']
146
147     krb5conf = os.path.join(testdir, 'krb5.conf')
148     kenv = {'PATH': '/sbin:/bin:/usr/sbin:/usr/bin',
149             'KRB5_CONFIG': krb5conf,
150             'KRB5CCNAME': 'FILE:' + os.path.join(testdir, 'ccaches/user')}
151
152     for key in kenv:
153         os.environ[key] = kenv[key]
154
155     sess = HttpSessions()
156     sess.add_server(idpname, 'http://%s:45080' % WRAP_HOSTNAME, user,
157                     'ipsilon')
158     sess.add_server(sp1name, 'http://127.0.0.11:45081')
159     sess.add_server(sp2name, 'http://127.0.0.11:45082')
160
161     print "testgssapi: Authenticate to IDP ...",
162     try:
163         sess.auth_to_idp(idpname, krb=True)
164     except Exception, e:  # pylint: disable=broad-except
165         print >> sys.stderr, " ERROR: %s" % repr(e)
166         sys.exit(1)
167     print " SUCCESS"
168
169     print "testgssapi: Add first SP Metadata to IDP ...",
170     try:
171         sess.add_sp_metadata(idpname, sp1name)
172     except Exception, e:  # pylint: disable=broad-except
173         print >> sys.stderr, " ERROR: %s" % repr(e)
174         sys.exit(1)
175     print " SUCCESS"
176
177     print "testgssapi: Access first SP Protected Area ...",
178     try:
179         page = sess.fetch_page(idpname, 'http://127.0.0.11:45081/sp/')
180         page.expected_value('text()', 'WORKS!')
181     except ValueError, e:
182         print >> sys.stderr, " ERROR: %s" % repr(e)
183         sys.exit(1)
184     print " SUCCESS"
185
186     print "testgssapi: Access second SP Protected Area ...",
187     try:
188         page = sess.fetch_page(idpname, 'http://127.0.0.11:45082/sp/')
189         page.expected_value('text()', 'WORKS!')
190     except ValueError, e:
191         print >> sys.stderr, " ERROR: %s" % repr(e)
192         sys.exit(1)
193     print " SUCCESS"