Tagging 2.4RC1 release.
[shibboleth/sp.git] / configs / metagen.sh
1 #! /bin/sh
2
3 DECLS=1
4
5 SAML1=0
6 SAML2=0
7 ARTIFACT=0
8 DS=0
9 LOGOUT=0
10 NAMEIDMGMT=0
11
12 SAML10PROT="urn:oasis:names:tc:SAML:1.0:protocol"
13 SAML11PROT="urn:oasis:names:tc:SAML:1.1:protocol"
14 SAML20PROT="urn:oasis:names:tc:SAML:2.0:protocol"
15
16 SAML20SOAP="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
17 SAML20REDIRECT="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
18 SAML20POST="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
19 SAML20POSTSS="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
20 SAML20ART="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
21 SAML20PAOS="urn:oasis:names:tc:SAML:2.0:bindings:PAOS"
22
23 SAML1POST="urn:oasis:names:tc:SAML:1.0:profiles:browser-post"
24 SAML1ART="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01"
25
26 while getopts a:c:e:f:h:n:o:s:t:u:12ADLNO c
27      do
28          case $c in
29            c)   CERTS[${#CERTS[*]}]=$OPTARG;;
30            e)   ENTITYID=$OPTARG;;
31            f)   FORMATS[${#FORMATS[*]}]=$OPTARG;;
32            h)   HOSTS[${#HOSTS[*]}]=$OPTARG;;
33            n)   NAKEDHOSTS[${#NAKEDHOSTS[*]}]=$OPTARG;;
34            o)   ORGNAME=$OPTARG;;
35            a)   ADMIN[${#ADMIN[*]}]=$OPTARG;;
36            s)   SUP[${#SUP[*]}]=$OPTARG;;
37            t)   TECH[${#TECH[*]}]=$OPTARG;;
38            u)   URL=$OPTARG;;
39            1)   SAML1=1;;
40            2)   SAML2=1;;
41            A)   ARTIFACT=1;;
42            D)   DS=1;;
43            L)   LOGOUT=1;;
44            N)   NAMEIDMGMT=1;;
45            O)   DECLS=0;;
46            \?)  echo metagen [-12ADLNO] -c cert1 [-c cert2 ...] -h host1 [-h host2 ...] [-e entityID]
47                 exit 1;;
48          esac
49      done
50
51 if [ ${#HOSTS[*]} -eq 0 -a ${#NAKEDHOSTS[*]} -eq 0 ] ; then
52     echo metagen [-12ADLN] -c cert1 [-c cert2 ...] -h host1 [-h host2 ...] [-e entityID]
53     exit 1
54 fi
55
56 if [ ${#CERTS[*]} -eq 0 ] ; then
57     CERTS[${#CERTS[*]}]=sp-cert.pem
58 fi
59
60 for c in ${CERTS[@]}
61 do
62     if  [ ! -s $c ] ; then
63         echo Certificate file $c does not exist! 
64         exit 2
65     fi
66 done
67
68 if [ -z $ENTITYID ] ; then
69     if [ ${#HOSTS[*]} -eq 0 ] ; then
70         ENTITYID=https://${NAKEDHOSTS[0]}/shibboleth
71     else
72         ENTITYID=https://${HOSTS[0]}/shibboleth
73     fi
74 fi
75
76 # Establish protocols and bindings.
77
78 if [ $SAML1 -eq 0 -a $SAML2 -eq 0 ] ; then
79     SAML1=1
80     SAML2=1
81 fi
82
83 if [ $LOGOUT -eq 1 -o $NAMEIDMGMT -eq 1 ] ; then
84     SAML2=1
85     SLO[${#SLO[*]}]=$SAML20SOAP
86     SLO[${#SLO[*]}]=$SAML20REDIRECT
87     SLO[${#SLO[*]}]=$SAML20POST
88     SLOLOC[${#SLOLOC[*]}]="SOAP"
89     SLOLOC[${#SLOLOC[*]}]="Redirect"
90     SLOLOC[${#SLOLOC[*]}]="POST"
91     if [ $ARTIFACT -eq 1 ] ; then
92         SLO[${#SLO[*]}]=$SAML20ART
93         SLOLOC[${#SLOLOC[*]}]="Artifact"
94     fi
95 fi
96
97 if [ $SAML1 -eq 1 -a $SAML2 -eq 1 ] ; then
98     PROTENUM="$SAML20PROT $SAML11PROT"
99 elif [ $SAML1 -eq 1 ] ; then
100     PROTENUM="$SAML11PROT"
101 else
102     PROTENUM="$SAML20PROT"
103 fi
104
105 if [ $SAML2 -eq 1 ] ; then
106     ACS[${#ACS[*]}]=$SAML20POST
107     ACSLOC[${#ACSLOC[*]}]="SAML2/POST"
108     ACS[${#ACS[*]}]=$SAML20POSTSS
109     ACSLOC[${#ACSLOC[*]}]="SAML2/POST-SimpleSign"
110     if [ $ARTIFACT -eq 1 ] ; then
111         ACS[${#ACS[*]}]=$SAML20ART
112         ACSLOC[${#ACSLOC[*]}]="SAML2/Artifact"
113     fi
114     ACS[${#ACS[*]}]=$SAML20PAOS
115     ACSLOC[${#ACSLOC[*]}]="SAML2/ECP"
116 fi
117
118 if [ $SAML1 -eq 1 ] ; then
119     ACS[${#ACS[*]}]=$SAML1POST
120     ACSLOC[${#ACSLOC[*]}]="SAML/POST"
121     if [ $ARTIFACT -eq 1 ] ; then
122         ACS[${#ACS[*]}]=$SAML1ART
123         ACSLOC[${#ACSLOC[*]}]="SAML/Artifact"
124     fi
125 fi
126
127 if [ $SAML2 -eq 1 ] ; then
128     ACS[${#ACS[*]}]=$SAML20PAOS
129     ACSLOC[${#ACSLOC[*]}]="SAML2/ECP"
130 fi
131
132 if [ $DECLS -eq 1 ] ; then
133     DECLS="xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" "
134     if [ $DS -eq 1 ] ; then
135         DECLS="${DECLS}xmlns:disco=\"urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol\" "
136     fi
137 else
138     DECLS=""
139 fi
140
141 cat <<EOF
142 <md:EntityDescriptor ${DECLS}entityID="${ENTITYID}">
143   <md:SPSSODescriptor protocolSupportEnumeration="${PROTENUM}">
144 EOF
145
146 # Discovery BEGIN
147 if [ $DS -eq 1 ] ; then
148
149 cat << EOF
150     <md:Extensions>
151 EOF
152
153 count=1
154 for h in ${HOSTS[@]}
155 do
156   cat << EOF
157       <disco:DiscoveryResponse Binding="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Location="https://$h/Shibboleth.sso/DS" index="$count"/>
158 EOF
159   let "count++"
160 done
161
162 for h in ${NAKEDHOSTS[@]}
163 do
164   cat << EOF
165       <disco:DiscoveryResponse xmlns="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Binding="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Location="http://$h/Shibboleth.sso/DS" index="$count"/>
166 EOF
167   let "count++"
168 done
169
170 cat << EOF
171     </md:Extensions>
172 EOF
173
174 fi
175 # Discovery END
176
177 for c in ${CERTS[@]}
178 do
179 cat << EOF
180     <md:KeyDescriptor>
181       <ds:KeyInfo>
182         <ds:X509Data>
183           <ds:X509Certificate>
184 EOF
185 grep -v ^- $c
186 cat << EOF
187           </ds:X509Certificate>
188         </ds:X509Data>
189       </ds:KeyInfo>
190     </md:KeyDescriptor>
191 EOF
192 done
193
194 for f in ${FORMATS[@]}
195 do
196 cat << EOF
197     <md:NameIDFormat>$f</md:NameIDFormat>
198 EOF
199 done
200
201 # Logout BEGIN
202 if [ $LOGOUT -eq 1 ] ; then
203
204 for h in ${HOSTS[@]}
205 do
206   count=0
207   while [ $count -lt ${#SLO[*]} ]
208   do
209     cat <<EOF
210     <md:SingleLogoutService Binding="${SLO[$count]}" Location="https://$h/Shibboleth.sso/SLO/${SLOLOC[$count]}"/>
211 EOF
212     let "count++"
213   done
214 done
215
216 for h in ${NAKEDHOSTS[@]}
217 do
218   count=0
219   while [ $count -lt ${#SLO[*]} ]
220   do
221     cat <<EOF
222     <md:SingleLogoutService Binding="${SLO[$count]}" Location="http://$h/Shibboleth.sso/SLO/${SLOLOC[$count]}"/>
223 EOF
224     let "count++"
225   done
226 done
227
228 fi
229 # Logout END
230
231 # NameID Mgmt BEGIN
232 if [ $NAMEIDMGMT -eq 1 ] ; then
233
234 for h in ${HOSTS[@]}
235 do
236   count=0
237   while [ $count -lt ${#SLO[*]} ]
238   do
239     cat <<EOF
240     <md:ManageNameIDService Binding="${SLO[$count]}" Location="https://$h/Shibboleth.sso/NIM/${SLOLOC[$count]}"/>
241 EOF
242     let "count++"
243   done
244 done
245
246 for h in ${NAKEDHOSTS[@]}
247 do
248   count=0
249   while [ $count -lt ${#SLO[*]} ]
250   do
251     cat <<EOF
252     <md:ManageNameIDService Binding="${SLO[$count]}" Location="http://$h/Shibboleth.sso/NIM/${SLOLOC[$count]}"/>
253 EOF
254     let "count++"
255   done
256 done
257
258 fi
259 # NameID Mgmt END
260
261 index=0
262 for h in ${HOSTS[@]}
263 do
264   count=0
265   while [ $count -lt ${#ACS[*]} ]
266   do
267     cat <<EOF
268     <md:AssertionConsumerService Binding="${ACS[$count]}" Location="https://$h/Shibboleth.sso/${ACSLOC[$count]}" index="$((index+1))"/>
269 EOF
270     let "count++"
271     let "index++"
272   done
273 done
274
275 for h in ${NAKEDHOSTS[@]}
276 do
277   count=0
278   while [ $count -lt ${#ACS[*]} ]
279   do
280     cat <<EOF
281     <md:AssertionConsumerService Binding="${ACS[$count]}" Location="http://$h/Shibboleth.sso/${ACSLOC[$count]}" index="$((index+1))"/>
282 EOF
283     let "count++"
284     let "index++"
285   done
286 done
287
288 cat <<EOF 
289   </md:SPSSODescriptor>
290 EOF
291
292 if [ -n "$ORGNAME" ] ; then
293   if [ -z "$URL" ] ; then
294     URL=$ENTITYID
295   fi
296   cat <<EOF
297   <md:Organization>
298     <md:OrganizationName xml:lang="en">$ORGNAME</md:OrganizationName>
299     <md:OrganizationDisplayName xml:lang="en">$ORGNAME</md:OrganizationDisplayName>
300     <md:OrganizationURL xml:lang="en">$URL</md:OrganizationURL>
301   </md:Organization>
302 EOF
303 fi
304
305 count=${#ADMIN[*]}
306 for (( i=0; i<count; i++ ))
307 do
308   IFS="/"; declare -a c=(${ADMIN[$i]})
309   cat <<EOF
310   <md:ContactPerson contactType="administrative">
311     <md:GivenName>${c[0]}</md:GivenName>
312     <md:SurName>${c[1]}</md:SurName>
313     <md:EmailAddress>${c[2]}</md:EmailAddress>
314   </md:ContactPerson>
315 EOF
316 done
317
318 count=${#SUP[*]}
319 for (( i=0; i<count; i++ ))
320 do
321   IFS="/"; declare -a c=(${SUP[$i]})
322   cat <<EOF
323   <md:ContactPerson contactType="support">
324     <md:GivenName>${c[0]}</md:GivenName>
325     <md:SurName>${c[1]}</md:SurName>
326     <md:EmailAddress>${c[2]}</md:EmailAddress>
327   </md:ContactPerson>
328 EOF
329 done
330
331 count=${#TECH[*]}
332 for (( i=0; i<count; i++ ))
333 do
334   IFS="/"; declare -a c=(${TECH[$i]})
335   cat <<EOF
336   <md:ContactPerson contactType="technical">
337     <md:GivenName>${c[0]}</md:GivenName>
338     <md:SurName>${c[1]}</md:SurName>
339     <md:EmailAddress>${c[2]}</md:EmailAddress>
340   </md:ContactPerson>
341 EOF
342 done
343
344 cat <<EOF 
345 </md:EntityDescriptor>
346
347 EOF