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