3 # Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
5 from helpers.common import IpsilonTestBase # pylint: disable=relative-import
6 from helpers.http import HttpSessions # pylint: disable=relative-import
11 from string import Template
16 idpaddr = '127.0.0.10'
23 idp_g = {'TEMPLATES': '${TESTDIR}/templates/install',
24 'CONFDIR': '${TESTDIR}/etc',
25 'DATADIR': '${TESTDIR}/lib',
26 'HTTPDCONFD': '${TESTDIR}/${NAME}/conf.d',
27 'STATICDIR': '${ROOTDIR}',
28 'BINDIR': '${ROOTDIR}/ipsilon',
29 'WSGI_SOCKET_PREFIX': '${TESTDIR}/${NAME}/logs/wsgi'}
32 idp_a = {'hostname': '${ADDRESS}:${PORT}',
33 'admin_user': '${TEST_USER}',
34 'system_user': '${TEST_USER}',
35 'instance': '${NAME}',
41 'server_debugging': 'True'}
45 global enabled = testauth
47 global enabled = openid,saml2
48 openid endpoint url = ${IDPURI}/openid/
49 openid identity_url_template = ${IDPURI}/openid/id/%(username)s
50 saml2 idp key file = ${TESTDIR}/lib/${NAME}/saml2/idp.key
51 saml2 idp storage path = ${TESTDIR}/lib/${NAME}/saml2
52 saml2 idp metadata file = metadata.xml
53 saml2 idp certificate file = ${TESTDIR}/lib/${NAME}/saml2/idp.pem
54 saml2 idp nameid salt = ${IDPSALT}
56 811d0231-9362-46c9-a105-a01a64818904 id = http://${SPADDR}:${SPPORT}/saml2
57 811d0231-9362-46c9-a105-a01a64818904 type = SP
58 811d0231-9362-46c9-a105-a01a64818904 name = ${SPNAME}
59 811d0231-9362-46c9-a105-a01a64818904 metadata = ${SPMETA}
62 sp_g = {'HTTPDCONFD': '${TESTDIR}/${NAME}/conf.d',
63 'SAML2_TEMPLATE': '${TESTDIR}/templates/install/saml2/sp.conf',
64 'SAML2_CONFFILE': '${TESTDIR}/${NAME}/conf.d/ipsilon-saml.conf',
65 'SAML2_HTTPDIR': '${TESTDIR}/${NAME}/saml2'}
68 sp_a = {'hostname': '${ADDRESS}:${PORT}',
69 'saml_idp_metadata': '${TESTDIR}/lib/idp1/saml2/metadata.xml',
70 'saml_secure_setup': 'False',
72 'httpd_user': '${TEST_USER}'}
75 def fixup_sp_httpd(httpdir):
78 Alias /sp ${HTTPDIR}/sp
80 <Directory ${HTTPDIR}/sp>
86 t = Template(location)
87 text = t.substitute({'HTTPDIR': httpdir})
88 with open(httpdir + '/conf.d/ipsilon-saml.conf', 'a') as f:
91 os.mkdir(httpdir + '/sp')
92 with open(httpdir + '/sp/index.html', 'w') as f:
96 def fixup_idp_conf(testdir):
98 with open(os.path.join(testdir, spname, 'saml2',
99 '%s:%s' % (spaddr, spport), 'metadata.xml')) as f:
101 spmeta = spmeta.replace("\n", "")
103 idpuri = "http://%s:%s/%s" % (idpaddr, idpport, idpname)
105 idpsalt = uuid.uuid4().hex
106 t = Template(idp_file_conf)
107 text = t.substitute({'NAME': idpname, 'IDPURI': idpuri,
108 'SPNAME': spname, 'SPADDR': spaddr, 'SPPORT': spport,
109 'SPMETA': spmeta, 'TESTDIR': testdir,
112 adminconf = os.path.join(testdir, 'etc/admin.conf')
113 with open(adminconf, 'w+') as f:
116 ipsilonconf = os.path.join(testdir, 'etc', idpname, 'ipsilon.conf')
117 newconf = ConfigParser.ConfigParser()
118 with open(ipsilonconf, 'r') as f:
120 with open(ipsilonconf, 'w+') as f:
121 newconf.set('global', 'admin.config.db',
122 '"configfile://%s"' % adminconf)
125 os.remove(os.path.join(testdir, 'lib', idpname, 'adminconfig.sqlite'))
128 class IpsilonTest(IpsilonTestBase):
131 super(IpsilonTest, self).__init__('fconf', __file__)
133 def setup_servers(self, env=None):
134 print "Installing IDP server"
135 idp = self.generate_profile(idp_g, idp_a, idpname, idpaddr, idpport)
136 idpconf = self.setup_idp_server(idp, idpname, idpaddr, idpport, env)
138 print "Installing SP server"
139 sp = self.generate_profile(sp_g, sp_a, spname, spaddr, spport)
140 spconf = self.setup_sp_server(sp, spname, spaddr, spport, env)
141 fixup_sp_httpd(os.path.dirname(spconf))
143 fixup_idp_conf(self.testdir)
145 print "Starting IDP's httpd server"
146 self.start_http_server(idpconf, env)
148 print "Starting SP's httpd server"
149 self.start_http_server(spconf, env)
152 if __name__ == '__main__':
154 user = pwd.getpwuid(os.getuid())[0]
156 sess = HttpSessions()
157 sess.add_server(idpname, 'http://127.0.0.10:45080', user, 'ipsilon')
158 sess.add_server(spname, 'http://127.0.0.11:45081')
160 print "test1: Access SP Protected Area ...",
162 page = sess.fetch_page(idpname, 'http://127.0.0.11:45081/sp/')
163 page.expected_value('text()', 'WORKS!')
164 except ValueError, e:
165 print >> sys.stderr, " ERROR: %s" % repr(e)