source: trunk/packages/xen-3.1/xen-3.1/tools/security/python/xensec_gen/cgi-bin/policy.cgi @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

  • Property svn:mime-type set to text/script
File size: 62.2 KB
Line 
1#!/usr/bin/python
2#
3# The Initial Developer of the Original Code is International
4# Business Machines Corporation. Portions created by IBM
5# Corporation are Copyright (C) 2005, 2006 International Business
6# Machines Corporation. All Rights Reserved.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License,
11# or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21#
22
23import os
24import cgi
25import cgitb; cgitb.enable( )
26import time
27import xml.dom.minidom
28import xml.sax
29import xml.sax.handler
30from StringIO import StringIO
31from sets import Set
32
33def getSavedData( ):
34        global formData, policyXml
35        global formVariables, formCSNames, formVmNames, formResNames
36        global allCSMTypes, allVmChWs, allVmStes, allResStes
37
38        # Process the XML upload policy file
39        if formData.has_key( 'i_policy' ):
40                dataList = formData.getlist( 'i_policy' )
41                if len( dataList ) > 0:
42                        policyXml  = dataList[0]
43
44        # Process all the hidden input variables (if present)
45        for formVar in formVariables:
46                if formVar[2] == '':
47                        continue
48
49                if formData.has_key( formVar[2] ):
50                        dataList = formData.getlist( formVar[2] )
51                        if len( dataList ) > 0:
52                                if isinstance( formVar[1], list ):
53                                        exec 'formVar[1] = ' + dataList[0]
54                                else:
55                                        formVar[1] = dataList[0]
56
57        # The form can contain any number of "Conflict Sets"
58        #   so update the list of form variables to include
59        #   each conflict set (hidden input variable)
60        for csName in formCSNames[1]:
61                newCS( csName )
62                if formData.has_key( allCSMTypes[csName][2] ):
63                        dataList = formData.getlist( allCSMTypes[csName][2] )
64                        if len( dataList ) > 0:
65                                exec 'allCSMTypes[csName][1] = ' + dataList[0]
66
67        # The form can contain any number of "Virtual Machines"
68        #   so update the list of form variables to include
69        #   each virtual machine (hidden input variable)
70        for vmName in formVmNames[1]:
71                newVm( vmName )
72
73                vmFormVar = allVmChWs[vmName]
74                if (vmFormVar[2] != '') and formData.has_key( vmFormVar[2] ):
75                        dataList = formData.getlist( vmFormVar[2] )
76                        if len( dataList ) > 0:
77                                if isinstance( vmFormVar[1], list ):
78                                        exec 'vmFormVar[1] = ' + dataList[0]
79                                else:
80                                        vmFormVar[1] = dataList[0]
81
82                vmFormVar = allVmStes[vmName]
83                if (vmFormVar[2] != '') and formData.has_key( vmFormVar[2] ):
84                        dataList = formData.getlist( vmFormVar[2] )
85                        if len( dataList ) > 0:
86                                if isinstance( vmFormVar[1], list ):
87                                        exec 'vmFormVar[1] = ' + dataList[0]
88                                else:
89                                        vmFormVar[1] = dataList[0]
90
91        # The form can contain any number of "Resources"
92        #   so update the list of form variables to include
93        #   each resource (hidden input variable)
94        for resName in formResNames[1]:
95                newRes( resName )
96
97                resFormVar = allResStes[resName]
98                if (resFormVar[2] != '') and formData.has_key( resFormVar[2] ):
99                        dataList = formData.getlist( resFormVar[2] )
100                        if len( dataList ) > 0:
101                                if isinstance( resFormVar[1], list ):
102                                        exec 'resFormVar[1] = ' + dataList[0]
103                                else:
104                                        resFormVar[1] = dataList[0]
105
106
107def getCurrentTime( ):
108        return time.strftime( '%Y-%m-%d %H:%M:%S', time.localtime( ) )
109
110def getName( domNode ):
111        nameNodes = domNode.getElementsByTagName( 'Name' )
112        if len( nameNodes ) == 0:
113                formatXmlError( '"<Name>" tag is missing' )
114                return None
115
116        name = ''
117        for childNode in nameNodes[0].childNodes:
118                if childNode.nodeType == xml.dom.Node.TEXT_NODE:
119                        name = name + childNode.data
120        return name
121
122def getPolicyName( domNode ):
123        nameNodes = domNode.getElementsByTagName( 'PolicyName' )
124        if len( nameNodes ) == 0:
125                formatXmlError( '"<PolicyName>" tag is missing' )
126                return None
127
128        name = ''
129        for childNode in nameNodes[0].childNodes:
130                if childNode.nodeType == xml.dom.Node.TEXT_NODE:
131                        name = name + childNode.data
132
133        return name
134
135def getUrl( domNode ):
136        urlNodes = domNode.getElementsByTagName( 'PolicyUrl' )
137        if len( urlNodes ) == 0:
138                return ''
139
140        url = ''
141        for childNode in urlNodes[0].childNodes:
142                if childNode.nodeType == xml.dom.Node.TEXT_NODE:
143                        url = url + childNode.data
144
145        return url
146
147def getRef( domNode ):
148        refNodes = domNode.getElementsByTagName( 'Reference' )
149        if len( refNodes ) == 0:
150                return ''
151
152        ref = ''
153        for childNode in refNodes[0].childNodes:
154                if childNode.nodeType == xml.dom.Node.TEXT_NODE:
155                        ref = ref + childNode.data
156
157        return ref
158
159def getDate( domNode ):
160        dateNodes = domNode.getElementsByTagName( 'Date' )
161        if len( dateNodes ) == 0:
162                return ''
163
164        date = ''
165        for childNode in dateNodes[0].childNodes:
166                if childNode.nodeType == xml.dom.Node.TEXT_NODE:
167                        date = date + childNode.data
168
169        return date
170
171def getNSUrl( domNode ):
172        urlNodes = domNode.getElementsByTagName( 'NameSpaceUrl' )
173        if len( urlNodes ) == 0:
174                return ''
175
176        url = ''
177        for childNode in urlNodes[0].childNodes:
178                if childNode.nodeType == xml.dom.Node.TEXT_NODE:
179                        url = url + childNode.data
180
181        return url
182
183def getSteTypes( domNode, missingIsError = 0 ):
184        steNodes = domNode.getElementsByTagName( 'SimpleTypeEnforcementTypes' )
185        if len( steNodes ) == 0:
186                if missingIsError == 1:
187                        formatXmlError( '"<SimpleTypeEnforcementTypes>" tag is missing' )
188                        return None
189                else:
190                        return []
191
192        return getTypes( steNodes[0] )
193
194def getChWTypes( domNode, missingIsError = 0 ):
195        chwNodes = domNode.getElementsByTagName( 'ChineseWallTypes' )
196        if len( chwNodes ) == 0:
197                if missingIsError == 1:
198                        formatXmlError( '"<ChineseWallTypes>" tag is missing' )
199                        return None
200                else:
201                        return []
202
203        return getTypes( chwNodes[0] )
204
205def getTypes( domNode ):
206        types = []
207
208        domNodes = domNode.getElementsByTagName( 'Type' )
209        if len( domNodes ) == 0:
210                formatXmlError( '"<Type>" tag is missing' )
211                return None
212
213        for domNode in domNodes:
214                typeText = ''
215                for childNode in domNode.childNodes:
216                        if childNode.nodeType == xml.dom.Node.TEXT_NODE:
217                                typeText = typeText + childNode.data
218
219                if typeText == '':
220                        formatXmlError( 'No text associated with the "<Type>" tag' )
221                        return None
222
223                types.append( typeText )
224
225        return types
226
227def formatXmlError( msg, xml = '', lineNum = -1, colNum = -1 ):
228        global xmlMessages, xmlError
229
230        xmlError = 1
231        addMsg = cgi.escape( msg )
232
233        if lineNum != -1:
234                sio = StringIO( xml )
235                for xmlLine in sio:
236                        lineNum = lineNum - 1
237                        if lineNum == 0:
238                                break;
239
240                addMsg += '<BR><PRE>' + cgi.escape( xmlLine.rstrip( ) )
241
242                if colNum != -1:
243                        errLine = ''
244                        for i in range( colNum ):
245                                errLine = errLine + '-'
246
247                        addMsg += '\n' + errLine + '^'
248
249                addMsg += '</PRE>'
250
251        xmlMessages.append( addMsg )
252
253def formatXmlGenError( msg ):
254        global xmlMessages, xmlIncomplete
255
256        xmlIncomplete = 1
257        xmlMessages.append( cgi.escape( msg ) )
258
259def parseXml( xmlInput ):
260        xmlParser = xml.sax.make_parser( )
261        try:
262                domDoc = xml.dom.minidom.parseString( xmlInput, xmlParser )
263
264        except xml.sax.SAXParseException, xmlErr:
265                msg = ''
266                msg = msg + 'XML parsing error occurred at line '
267                msg = msg + `xmlErr.getLineNumber( )`
268                msg = msg + ', column '
269                msg = msg + `xmlErr.getColumnNumber( )`
270                msg = msg + ': reason = "'
271                msg = msg + xmlErr.getMessage( )
272                msg = msg + '"'
273                formatXmlError( msg, xmlInput, xmlErr.getLineNumber( ), xmlErr.getColumnNumber( ) )
274                return None
275
276        except xml.sax.SAXException, xmlErr:
277                msg = ''
278                msg = msg + 'XML Parsing error: ' + `xmlErr`
279                formatXmlError( msg, xmlInput, xmlErr.getLineNumber( ), xmlErr.getColumnNumber( ) )
280                return None
281
282        return domDoc
283
284def parsePolicyXml( ):
285        global policyXml
286        global formPolicyName, formPolicyUrl, formPolicyRef, formPolicyDate, formPolicyNSUrl
287        global formPolicyOrder
288        global formSteTypes, formChWallTypes, formVmNames, formVmNameDom0
289        global allCSMTypes, allVmStes, allVmChWs
290
291        domDoc = parseXml( policyXml )
292        if domDoc == None:
293                return
294
295        # Process the PolicyHeader
296        domRoot    = domDoc.documentElement
297        domHeaders = domRoot.getElementsByTagName( 'PolicyHeader' )
298        if len( domHeaders ) == 0:
299                msg = ''
300                msg = msg + '"<PolicyHeader>" tag is missing.\n'
301                msg = msg + 'Please validate the Policy file used.'
302                formatXmlError( msg )
303                return
304
305        pName = getPolicyName( domHeaders[0] )
306        if pName == None:
307                msg = ''
308                msg = msg + 'Error processing the Policy header information.\n'
309                msg = msg + 'Please validate the Policy file used.'
310                formatXmlError( msg )
311                return
312
313        formPolicyName[1]  = pName
314        formPolicyUrl[1]   = getUrl( domHeaders[0] )
315        formPolicyRef[1]   = getRef( domHeaders[0] )
316        formPolicyDate[1]  = getDate( domHeaders[0] )
317        formPolicyNSUrl[1] = getNSUrl( domHeaders[0] )
318
319        # Process the STEs
320        pOrder = ''
321        domStes = domRoot.getElementsByTagName( 'SimpleTypeEnforcement' )
322        if len( domStes ) > 0:
323                if domStes[0].hasAttribute( 'priority' ):
324                        if domStes[0].getAttribute( 'priority' ) != 'PrimaryPolicyComponent':
325                                msg = ''
326                                msg = msg + 'Error processing the "<SimpleTypeEnforcement>" tag.\n'
327                                msg = msg + 'The "priority" attribute value is not valid.\n'
328                                msg = msg + 'Please validate the Policy file used.'
329                                formatXmlError( msg )
330                                return
331
332                        pOrder = 'v_Ste'
333
334                steTypes = getSteTypes( domStes[0], 1 )
335                if steTypes == None:
336                        msg = ''
337                        msg = msg + 'Error processing the SimpleTypeEnforcement types.\n'
338                        msg = msg + 'Please validate the Policy file used.'
339                        formatXmlError( msg )
340                        return
341
342                formSteTypes[1] = steTypes
343
344        # Process the ChineseWalls and Conflict Sets
345        domChWalls = domRoot.getElementsByTagName( 'ChineseWall' )
346        if len( domChWalls ) > 0:
347                if domChWalls[0].hasAttribute( 'priority' ):
348                        if domChWalls[0].getAttribute( 'priority' ) != 'PrimaryPolicyComponent':
349                                msg = ''
350                                msg = msg + 'Error processing the "<ChineseWall>" tag.\n'
351                                msg = msg + 'The "priority" attribute value is not valid.\n'
352                                msg = msg + 'Please validate the Policy file used.'
353                                formatXmlError( msg )
354                                return
355
356                        if pOrder != '':
357                                msg = ''
358                                msg = msg + 'Error processing the "<ChineseWall>" tag.\n'
359                                msg = msg + 'The "priority" attribute has been previously specified.\n'
360                                msg = msg + 'Please validate the Policy file used.'
361                                formatXmlError( msg )
362                                return
363
364                        pOrder = 'v_ChWall'
365
366                chwTypes = getChWTypes( domChWalls[0], 1 )
367                if chwTypes == None:
368                        msg = ''
369                        msg = msg + 'Error processing the ChineseWall types.\n'
370                        msg = msg + 'Please validate the Policy file used.'
371                        formatXmlError( msg )
372                        return
373
374                formChWallTypes[1] = chwTypes
375
376                csNodes = domChWalls[0].getElementsByTagName( 'ConflictSets' )
377                if csNodes and (len( csNodes ) > 0):
378                        cNodes = csNodes[0].getElementsByTagName( 'Conflict' )
379                        if not cNodes or len( cNodes ) == 0:
380                                msg = ''
381                                msg = msg + 'Required "<Conflict>" tag missing.\n'
382                                msg = msg + 'Please validate the Policy file used.'
383                                formatXmlError( msg )
384                                return
385
386                        for cNode in cNodes:
387                                csName = cNode.getAttribute( 'name' )
388                                newCS( csName, 1 )
389
390                                csMemberList = getTypes( cNode )
391                                if csMemberList == None:
392                                        msg = ''
393                                        msg = msg + 'Error processing the Conflict Set members.\n'
394                                        msg = msg + 'Please validate the Policy file used.'
395                                        formatXmlError( msg )
396                                        return
397
398                                # Verify the conflict set members are valid types
399                                ctSet = Set( formChWallTypes[1] )
400                                csSet = Set( csMemberList )
401                                if not csSet.issubset( ctSet ):
402                                        msg = ''
403                                        msg = msg + 'Error processing Conflict Set "' + csName + '".\n'
404                                        msg = msg + 'Members of the conflict set are not valid '
405                                        msg = msg + 'Chinese Wall types.\n'
406                                        msg = msg + 'Please validate the Policy file used.'
407                                        formatXmlError( msg )
408
409                                allCSMTypes[csName][1] = csMemberList
410
411        if pOrder != '':
412                formPolicyOrder[1] = pOrder
413        else:
414                if (len( domStes ) > 0) or (len( domChWalls ) > 0):
415                        msg = ''
416                        msg = msg + 'The "priority" attribute has not been specified.\n'
417                        msg = msg + 'It must be specified on one of the access control types.\n'
418                        msg = msg + 'Please validate the Policy file used.'
419                        formatXmlError( msg )
420                        return
421
422        # Process the Labels
423        domLabels = domRoot.getElementsByTagName( 'SecurityLabelTemplate' )
424        if not domLabels or (len( domLabels ) == 0):
425                msg = ''
426                msg = msg + '<SecurityLabelTemplate> tag is missing.\n'
427                msg = msg + 'Please validate the Policy file used.'
428                formatXmlError( msg )
429                return
430
431
432        # Process the VMs
433        domSubjects = domLabels[0].getElementsByTagName( 'SubjectLabels' )
434        if len( domSubjects ) > 0:
435                formVmNameDom0[1] = domSubjects[0].getAttribute( 'bootstrap' )
436                domNodes = domSubjects[0].getElementsByTagName( 'VirtualMachineLabel' )
437                for domNode in domNodes:
438                        vmName = getName( domNode )
439                        if vmName == None:
440                                msg = ''
441                                msg = msg + 'Error processing the VirtualMachineLabel name.\n'
442                                msg = msg + 'Please validate the Policy file used.'
443                                formatXmlError( msg )
444                                continue
445
446                        steTypes = getSteTypes( domNode )
447                        if steTypes == None:
448                                msg = ''
449                                msg = msg + 'Error processing the SimpleTypeEnforcement types.\n'
450                                msg = msg + 'Please validate the Policy file used.'
451                                formatXmlError( msg )
452                                return
453
454                        chwTypes = getChWTypes( domNode )
455                        if chwTypes == None:
456                                msg = ''
457                                msg = msg + 'Error processing the ChineseWall types.\n'
458                                msg = msg + 'Please validate the Policy file used.'
459                                formatXmlError( msg )
460                                return
461
462                        newVm( vmName, 1 )
463                        allVmStes[vmName][1] = steTypes
464                        allVmChWs[vmName][1] = chwTypes
465
466        # Process the Resources
467        domObjects = domLabels[0].getElementsByTagName( 'ObjectLabels' )
468        if len( domObjects ) > 0:
469                domNodes = domObjects[0].getElementsByTagName( 'ResourceLabel' )
470                for domNode in domNodes:
471                        resName = getName( domNode )
472                        if resName == None:
473                                msg = ''
474                                msg = msg + 'Error processing the ResourceLabel name.\n'
475                                msg = msg + 'Please validate the Policy file used.'
476                                formatXmlError( msg )
477                                continue
478
479                        steTypes = getSteTypes( domNode )
480                        if steTypes == None:
481                                msg = ''
482                                msg = msg + 'Error processing the SimpleTypeEnforcement types.\n'
483                                msg = msg + 'Please validate the Policy file used.'
484                                formatXmlError( msg )
485                                return
486
487                        newRes( resName, 1 )
488                        allResStes[resName][1] = steTypes
489
490def modFormTemplate( formTemplate, suffix ):
491        formVar = [x for x in formTemplate]
492
493        if formVar[2] != '':
494                formVar[2] = formVar[2] + suffix
495        if formVar[3] != '':
496                formVar[3] = formVar[3] + suffix
497        if (formVar[0] != 'button') and (formVar[4] != ''):
498                formVar[4] = formVar[4] + suffix
499
500        return formVar;
501
502def removeDups( curList ):
503        newList = []
504        curSet  = Set( curList )
505        for x in curSet:
506                newList.append( x )
507        newList.sort( )
508
509        return newList
510
511def newCS( csName, addToList = 0 ):
512        global formCSNames
513        global templateCSDel, allCSDel
514        global templateCSMTypes, templateCSMDel, templateCSMType, templateCSMAdd
515        global allCSMTypes, allCSMDel, allCSMType, allCSMAdd
516
517        csSuffix = '_' + csName
518
519        # Make sure we have an actual name and check one of the 'all'
520        # variables to be sure it hasn't been previously defined
521        if (len( csName ) > 0) and (not allCSMTypes.has_key( csName )):
522                allCSDel[csName]    = modFormTemplate( templateCSDel,    csSuffix )
523                allCSMTypes[csName] = modFormTemplate( templateCSMTypes, csSuffix )
524                allCSMDel[csName]   = modFormTemplate( templateCSMDel,   csSuffix )
525                allCSMType[csName]  = modFormTemplate( templateCSMType,  csSuffix )
526                allCSMAdd[csName]   = modFormTemplate( templateCSMAdd,   csSuffix )
527                if addToList == 1:
528                        formCSNames[1].append( csName )
529                        formCSNames[1] = removeDups( formCSNames[1] )
530
531def newVm( vmName, addToList = 0 ):
532        global formVmNames
533        global templateVmDel, allVmDel, templateVmDom0, allVmDom0
534        global templateVmChWs, templateVmChWDel, templateVmChW, templateVmChWAdd
535        global allVmChWs, allVmChWDel, allVmChWType, allVmChWAdd
536        global templateVmStes, templateVmSteDel, templateVmSte, templateVmSteAdd
537        global allVmStes, allVmSteDel, allVmSteType, allVmSteAdd
538
539        # Make sure we have an actual name and check one of the 'all'
540        # variables to be sure it hasn't been previously defined
541        if (len( vmName ) > 0) and (not allVmDom0.has_key( vmName )):
542                vmSuffix = '_' + vmName
543                allVmDom0[vmName]   = modFormTemplate( templateVmDom0,   vmSuffix )
544                allVmDel[vmName]    = modFormTemplate( templateVmDel,    vmSuffix )
545                allVmChWs[vmName]   = modFormTemplate( templateVmChWs,   vmSuffix )
546                allVmChWDel[vmName] = modFormTemplate( templateVmChWDel, vmSuffix )
547                allVmChW[vmName]    = modFormTemplate( templateVmChW,    vmSuffix )
548                allVmChWAdd[vmName] = modFormTemplate( templateVmChWAdd, vmSuffix )
549                allVmStes[vmName]   = modFormTemplate( templateVmStes,   vmSuffix )
550                allVmSteDel[vmName] = modFormTemplate( templateVmSteDel, vmSuffix )
551                allVmSte[vmName]    = modFormTemplate( templateVmSte,    vmSuffix )
552                allVmSteAdd[vmName] = modFormTemplate( templateVmSteAdd, vmSuffix )
553                if addToList == 1:
554                        formVmNames[1].append( vmName )
555                        formVmNames[1] = removeDups( formVmNames[1] )
556
557def newRes( resName, addToList = 0 ):
558        global formResNames
559        global templateResDel, allResDel
560        global templateResStes, templateResSteDel, templateResSte, templateResSteAdd
561        global allResStes, allResSteDel, allResSteType, allResSteAdd
562
563        # Make sure we have an actual name and check one of the 'all'
564        # variables to be sure it hasn't been previously defined
565        if (len( resName ) > 0) and (not allResDel.has_key( resName )):
566                resSuffix = '_' + resName
567                allResDel[resName]    = modFormTemplate( templateResDel,    resSuffix )
568                allResStes[resName]   = modFormTemplate( templateResStes,   resSuffix )
569                allResSteDel[resName] = modFormTemplate( templateResSteDel, resSuffix )
570                allResSte[resName]    = modFormTemplate( templateResSte,    resSuffix )
571                allResSteAdd[resName] = modFormTemplate( templateResSteAdd, resSuffix )
572                if addToList == 1:
573                        formResNames[1].append( resName )
574                        formResNames[1] = removeDups( formResNames[1] )
575
576def updateInfo( ):
577        global formData, formPolicyName, formPolicyUrl, formPolicyRef, formPolicyDate, formPolicyNSUrl
578        global formPolicyOrder
579
580        if formData.has_key( formPolicyName[3] ):
581                formPolicyName[1] = formData[formPolicyName[3]].value
582        elif formData.has_key( formPolicyUpdate[3] ):
583                formPolicyName[1] = ''
584
585        if formData.has_key( formPolicyUrl[3] ):
586                formPolicyUrl[1] = formData[formPolicyUrl[3]].value
587        elif formData.has_key( formPolicyUpdate[3] ):
588                formPolicyUrl[1] = ''
589
590        if formData.has_key( formPolicyRef[3] ):
591                formPolicyRef[1] = formData[formPolicyRef[3]].value
592        elif formData.has_key( formPolicyUpdate[3] ):
593                formPolicyRef[1] = ''
594
595        if formData.has_key( formPolicyDate[3] ):
596                formPolicyDate[1] = formData[formPolicyDate[3]].value
597        elif formData.has_key( formPolicyUpdate[3] ):
598                formPolicyDate[1] = ''
599
600        if formData.has_key( formPolicyNSUrl[3] ):
601                formPolicyNSUrl[1] = formData[formPolicyNSUrl[3]].value
602        elif formData.has_key( formPolicyUpdate[3] ):
603                formPolicyNSUrl[1] = ''
604
605        if formData.has_key( formPolicyOrder[3] ):
606                formPolicyOrder[1] = formData[formPolicyOrder[3]].value
607
608def addSteType( ):
609        global formData, formSteType, formSteTypes
610
611        if (formData.has_key( formDefaultButton[3] )) or (formData.has_key( formSteAdd[3] )):
612                if formData.has_key( formSteType[3] ):
613                        type = formData[formSteType[3]].value
614                        type = type.strip( )
615                        if len( type ) > 0:
616                                formSteTypes[1].append( type )
617                                formSteTypes[1] = removeDups( formSteTypes[1] )
618
619
620def delSteType( ):
621        global formData, formSteTypes
622
623        if formData.has_key( formSteTypes[3] ):
624                typeList = formData.getlist( formSteTypes[3] )
625                for type in typeList:
626                        type = type.strip( )
627                        formSteTypes[1].remove( type )
628
629def addChWallType( ):
630        global formData, formChWallType, formChWallTypes
631
632        if (formData.has_key( formDefaultButton[3] )) or (formData.has_key( formChWallAdd[3] )):
633                if formData.has_key( formChWallType[3] ):
634                        type = formData[formChWallType[3]].value
635                        type = type.strip( )
636                        if len( type ) > 0:
637                                formChWallTypes[1].append( type )
638                                formChWallTypes[1] = removeDups( formChWallTypes[1] )
639
640def delChWallType( ):
641        global formData, formChWallTypes
642
643        if formData.has_key( formChWallTypes[3] ):
644                typeList = formData.getlist( formChWallTypes[3] )
645                for type in typeList:
646                        type = type.strip( )
647                        formChWallTypes[1].remove( type )
648
649def addCS( ):
650        global formData, formCSNames
651
652        if (formData.has_key( formDefaultButton[3] )) or (formData.has_key( formCSAdd[3] )):
653                if formData.has_key( formCSName[3] ):
654                        csName = formData[formCSName[3]].value
655                        csName = csName.strip( )
656                        newCS( csName, 1 )
657
658def delCS( csName ):
659        global formData, formCSNames, allCSDel
660        global allCSMTypes, allCSMDel, allCSMType, allCSMAdd
661
662        csName = csName.strip( )
663        formCSNames[1].remove( csName )
664        del allCSDel[csName]
665        del allCSMTypes[csName]
666        del allCSMDel[csName]
667        del allCSMType[csName]
668        del allCSMAdd[csName]
669
670def addCSMember( csName ):
671        global formData, allCSMType, allCSMTypes
672
673        formVar = allCSMType[csName]
674        if formData.has_key( formVar[3] ):
675                csmList = formData.getlist( formVar[3] )
676                formVar = allCSMTypes[csName]
677                for csm in csmList:
678                        csm = csm.strip( )
679                        formVar[1].append( csm )
680                        formVar[1] = removeDups( formVar[1] )
681
682def delCSMember( csName ):
683        global formData, allCSMTypes
684
685        formVar = allCSMTypes[csName]
686        if formData.has_key( formVar[3] ):
687                csmList = formData.getlist( formVar[3] )
688                for csm in csmList:
689                        csm = csm.strip( )
690                        formVar[1].remove( csm )
691
692def addVm( ):
693        global formData, fromVmName, formVmNames, formVmNameDom0
694
695        if (formData.has_key( formDefaultButton[3] )) or (formData.has_key( formVmAdd[3] )):
696                if formData.has_key( formVmName[3] ):
697                        vmName = formData[formVmName[3]].value
698                        vmName = vmName.strip( )
699                        newVm( vmName, 1 )
700                        if formVmNameDom0[1] == '':
701                                formVmNameDom0[1] = vmName
702
703def delVm( vmName ):
704        global formVmNames, formVmNameDom0
705        global allVmDel, allVmDom0
706        global allVmChWs, allVmChWDel, allVmChWType, allVmChWAdd
707        global allVmStes, allVmSteDel, allVmSteType, allVmSteAdd
708
709        vmName = vmName.strip( )
710        formVmNames[1].remove( vmName )
711        del allVmDom0[vmName]
712        del allVmDel[vmName]
713        del allVmChWs[vmName]
714        del allVmChWDel[vmName]
715        del allVmChW[vmName]
716        del allVmChWAdd[vmName]
717        del allVmStes[vmName]
718        del allVmSteDel[vmName]
719        del allVmSte[vmName]
720        del allVmSteAdd[vmName]
721
722        if formVmNameDom0[1] == vmName:
723                if len( formVmNames[1] ) > 0:
724                        formVmNameDom0[1] = formVmNames[1][0]
725                else:
726                        formVmNameDom0[1] = ''
727
728def makeVmDom0( vmName ):
729        global formVmNameDom0
730
731        vmName = vmName.strip( )
732        formVmNameDom0[1] = vmName
733
734def addVmChW( vmName ):
735        global formData, allVmChW, allVmChWs
736
737        formVar = allVmChW[vmName]
738        if formData.has_key( formVar[3] ):
739                chwList = formData.getlist( formVar[3] )
740                formVar = allVmChWs[vmName]
741                for chw in chwList:
742                        chw = chw.strip( )
743                        formVar[1].append( chw )
744                        formVar[1] = removeDups( formVar[1] )
745
746def delVmChW( vmName ):
747        global formData, allVmChWs
748
749        formVar = allVmChWs[vmName]
750        if formData.has_key( formVar[3] ):
751                chwList = formData.getlist( formVar[3] )
752                for chw in chwList:
753                        chw = chw.strip( )
754                        formVar[1].remove( chw )
755
756def addVmSte( vmName ):
757        global formData, allVmSte, allVmStes
758
759        formVar = allVmSte[vmName]
760        if formData.has_key( formVar[3] ):
761                steList = formData.getlist( formVar[3] )
762                formVar = allVmStes[vmName]
763                for ste in steList:
764                        ste = ste.strip( )
765                        formVar[1].append( ste )
766                        formVar[1] = removeDups( formVar[1] )
767
768def delVmSte( vmName ):
769        global formData, allVmStes
770
771        formVar = allVmStes[vmName]
772        if formData.has_key( formVar[3] ):
773                steList = formData.getlist( formVar[3] )
774                for ste in steList:
775                        ste = ste.strip( )
776                        formVar[1].remove( ste )
777
778def addRes( ):
779        global formData, fromResName, formResNames
780
781        if (formData.has_key( formDefaultButton[3] )) or (formData.has_key( formResAdd[3] )):
782                if formData.has_key( formResName[3] ):
783                        resName = formData[formResName[3]].value
784                        resName = resName.strip( )
785                        newRes( resName, 1 )
786
787def delRes( resName ):
788        global formResNames
789        global allResDel
790        global allResStes, allResSteDel, allResSteType, allResSteAdd
791
792        resName = resName.strip( )
793        formResNames[1].remove( resName )
794        del allResDel[resName]
795        del allResStes[resName]
796        del allResSteDel[resName]
797        del allResSte[resName]
798        del allResSteAdd[resName]
799
800def addResSte( vmName ):
801        global formData, allResSte, allResStes
802
803        formVar = allResSte[vmName]
804        if formData.has_key( formVar[3] ):
805                steList = formData.getlist( formVar[3] )
806                formVar = allResStes[vmName]
807                for ste in steList:
808                        ste = ste.strip( )
809                        formVar[1].append( ste )
810                        formVar[1] = removeDups( formVar[1] )
811
812def delResSte( vmName ):
813        global formData, allResStes
814
815        formVar = allResStes[vmName]
816        if formData.has_key( formVar[3] ):
817                steList = formData.getlist( formVar[3] )
818                for ste in steList:
819                        ste = ste.strip( )
820                        formVar[1].remove( ste )
821
822def processRequest( ):
823        global policyXml
824        global formData, formPolicyUpdate
825        global formSteAdd, formSteDel
826        global formChWallAdd, formChWallDel
827        global formCSAdd, allCSDel
828        global formCSNames, allCSMAdd, allCSMDel
829        global formVmAdd
830        global formVmNames, allVmDel, allVmDom0
831        global allVmChWAdd, allVmChWDel, allVmSteAdd, allVmSteDel
832        global formResAdd
833        global formResNames, allResDel
834        global allResSteAdd, allResSteDel
835
836        if policyXml != '':
837                parsePolicyXml( )
838
839        # Allow the updating of the header information whenever
840        # an action is performed
841        updateInfo( )
842
843        # Allow the adding of types/sets/vms if the user has hit the
844        # enter key when attempting to add a type/set/vm
845        addSteType( )
846        addChWallType( )
847        addCS( )
848        addVm( )
849        addRes( )
850
851        if formData.has_key( formSteDel[3] ):
852                delSteType( )
853
854        elif formData.has_key( formChWallDel[3] ):
855                delChWallType( )
856
857        else:
858                for csName in formCSNames[1]:
859                        if formData.has_key( allCSDel[csName][3] ):
860                                delCS( csName )
861                                continue
862
863                        if formData.has_key( allCSMAdd[csName][3] ):
864                                addCSMember( csName )
865
866                        elif formData.has_key( allCSMDel[csName][3] ):
867                                delCSMember( csName )
868
869        for vmName in formVmNames[1]:
870                if formData.has_key( allVmDel[vmName][3] ):
871                        delVm( vmName )
872                        continue
873
874                if formData.has_key( allVmDom0[vmName][3] ):
875                        makeVmDom0( vmName )
876
877                if formData.has_key( allVmChWAdd[vmName][3] ):
878                        addVmChW( vmName )
879
880                elif formData.has_key( allVmChWDel[vmName][3] ):
881                        delVmChW( vmName )
882
883                elif formData.has_key( allVmSteAdd[vmName][3] ):
884                        addVmSte( vmName )
885
886                elif formData.has_key( allVmSteDel[vmName][3] ):
887                        delVmSte( vmName )
888
889        for resName in formResNames[1]:
890                if formData.has_key( allResDel[resName][3] ):
891                        delRes( resName )
892                        continue
893
894                if formData.has_key( allResSteAdd[resName][3] ):
895                        addResSte( resName )
896
897                elif formData.has_key( allResSteDel[resName][3] ):
898                        delResSte( resName )
899
900def makeName( name, suffix='' ):
901        rName = name
902        if suffix != '':
903                rName = rName + '_' + suffix
904
905        return rName
906
907def makeNameAttr( name, suffix='' ):
908        return 'name="' + makeName( name, suffix ) + '"'
909
910def makeValue( value, suffix='' ):
911        rValue = value
912
913        if isinstance( value, list ):
914                rValue = '['
915                for val in value:
916                        rValue = rValue + '\'' + val
917                        if suffix != '':
918                                rValue = rValue + '_' + suffix
919                        rValue = rValue + '\','
920                rValue = rValue + ']'
921
922        else:
923                if suffix != '':
924                        rValue = rValue + '_' + suffix
925
926        return rValue
927
928def makeValueAttr( value, suffix='' ):
929        return 'value="' + makeValue( value, suffix ) + '"'
930
931def sendHtmlFormVar( formVar, attrs='', rb_select=0 ):
932        nameAttr  = ''
933        valueAttr = ''
934        htmlText  = ''
935
936        if formVar[0] == 'text':
937                if formVar[3] != '':
938                        nameAttr = makeNameAttr( formVar[3] )
939                valueAttr = makeValueAttr( formVar[1] )
940
941                print '<INPUT type="text"', nameAttr, valueAttr, attrs, '>'
942
943        elif formVar[0] == 'list':
944                if formVar[3] != '':
945                        nameAttr = makeNameAttr( formVar[3] )
946
947                print '<SELECT', nameAttr, attrs, '>'
948                for option in formVar[1]:
949                        print '<OPTION>' + option + '</OPTION>'
950                print '</SELECT>'
951
952        elif formVar[0] == 'button':
953                if formVar[3] != '':
954                        nameAttr = makeNameAttr( formVar[3] )
955                if formVar[4] != '':
956                        valueAttr = makeValueAttr( formVar[4] )
957
958                print '<INPUT type="submit"', nameAttr, valueAttr, attrs, '>'
959
960        elif formVar[0] == 'radiobutton':
961                if formVar[3] != '':
962                        nameAttr  = makeNameAttr( formVar[3] )
963                        valueAttr = makeValueAttr( formVar[4][rb_select] )
964                        htmlText  = formVar[5][rb_select]
965                        if formVar[4][rb_select] == formVar[1]:
966                                checked = 'checked'
967                        else:
968                                checked = ''
969
970                        print '<INPUT type="radio"', nameAttr, valueAttr, attrs, checked, '>', htmlText
971
972        elif formVar[0] == 'radiobutton-all':
973                if formVar[3] != '':
974                        nameAttr = makeNameAttr( formVar[3] )
975                        buttonVals  = formVar[4]
976                        buttonTexts = formVar[5]
977                        for i, buttonVal in enumerate( buttonVals ):
978                                htmlText = ''
979                                addAttrs = ''
980                                checked  = ''
981
982                                valueAttr = makeValueAttr( buttonVal )
983                                if formVar[5] != '':
984                                        htmlText = formVar[5][i]
985                                if attrs != '':
986                                        addAttrs = attrs[i]
987                                if buttonVal == formVar[1]:
988                                        checked = 'checked'
989
990                                print '<INPUT type="radio"', nameAttr, valueAttr, addAttrs, checked, '>', htmlText, '<BR>'
991
992        if ( formVar[2] != '' ) and ( rb_select == 0 ):
993                nameAttr = makeNameAttr( formVar[2] )
994                valueAttr = makeValueAttr( formVar[1] )
995                print '<INPUT type="hidden"', nameAttr, valueAttr, '>'
996
997def sendHtmlHeaders( ):
998        # HTML headers
999        print 'Content-Type: text/html'
1000        print
1001
1002def sendPolicyHtml( ):
1003        global xmlError, xmlIncomplete, xmlMessages
1004        global formDefaultButton, formXmlGen
1005        global formVmNameDom0
1006
1007        print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'
1008        print '  "http://www.w3.org/TR/html4/loose.dtd">'
1009
1010        print '<HTML>'
1011
1012        sendHtmlHead( )
1013
1014        print '<BODY>'
1015
1016        # An input XML file was specified that had errors, output the
1017        # error information
1018        if xmlError == 1:
1019                print '<P>'
1020                print 'An error has been encountered while processing the input '
1021                print 'XML file:'
1022                print '<UL>'
1023                for msg in xmlMessages:
1024                        print '<LI>'
1025                        print msg
1026                print '</UL>'
1027                print '</BODY>'
1028                print '</HTML>'
1029                return
1030
1031        # When attempting to generate the XML output, all required data was not
1032        # present, output the error information
1033        if xmlIncomplete == 1:
1034                print '<P>'
1035                print 'An error has been encountered while validating the data'
1036                print 'required for the output XML file:'
1037                print '<UL>'
1038                for msg in xmlMessages:
1039                        print '<LI>'
1040                        print msg
1041                print '</UL>'
1042                print '</BODY>'
1043                print '</HTML>'
1044                return
1045
1046        print '<CENTER>'
1047        print '<FORM action="' + os.environ['SCRIPT_NAME'] + '" method="post">'
1048        print '<TABLE class="container">'
1049        print '  <COLGROUP>'
1050        print '    <COL width="100%">'
1051        print '  </COLGROUP>'
1052
1053        print '  <TR>'
1054        print '    <TD>'
1055        print '      <TABLE>'
1056        print '        <TR>'
1057        print '          <TD>'
1058        sendHtmlFormVar( formDefaultButton, 'class="hidden"' )
1059        print '          </TD>'
1060        print '        </TR>'
1061        print '        <TR>'
1062        print '          <TD>'
1063        sendHtmlFormVar( formXmlGen )
1064        print '          </TD>'
1065        print '        </TR>'
1066        print '      </TABLE>'
1067        print '    </TD>'
1068        print '  </TR>'
1069
1070        # Policy header
1071        print '  <TR>'
1072        print '    <TD>'
1073        sendPHeaderHtml( )
1074        print '    </TD>'
1075        print '  </TR>'
1076
1077        # Separator
1078        print '  <TR><TD><HR></TD></TR>'
1079
1080        # Policy (types)
1081        print '  <TR>'
1082        print '    <TD>'
1083        print '      <TABLE class="full">'
1084        print '        <COLGROUP>'
1085        print '          <COL width="49%">'
1086        print '          <COL width="2%">'
1087        print '          <COL width="49%">'
1088        print '        </COLGROUP>'
1089        print '        <TR>'
1090        print '          <TD>'
1091        sendPSteHtml( )
1092        print '          </TD>'
1093        print '          <TD>&nbsp;</TD>'
1094        print '          <TD>'
1095        sendPChWallHtml( )
1096        print '          </TD>'
1097        print '        </TR>'
1098        print '      </TABLE>'
1099        print '    </TD>'
1100        print '  </TR>'
1101
1102        # Separator
1103        print '  <TR>'
1104        print '    <TD>'
1105        print '      <HR>'
1106        print '    </TD>'
1107        print '  </TR>'
1108
1109        # Policy Labels (vms)
1110        print '  <TR>'
1111        print '    <TD>'
1112        print '      <TABLE class="full">'
1113        print '        <COLGROUP>'
1114        print '          <COL width="100%">'
1115        print '        </COLGROUP>'
1116        print '        <TR>'
1117        print '          <TD>'
1118        sendPLSubHtml( )
1119        print '          </TD>'
1120        print '        </TR>'
1121        print '      </TABLE>'
1122        print '    </TD>'
1123        print '  </TR>'
1124
1125        # Separator
1126        print '  <TR>'
1127        print '    <TD>'
1128        print '      <HR>'
1129        print '    </TD>'
1130        print '  </TR>'
1131
1132        # Policy Labels (resources)
1133        print '  <TR>'
1134        print '    <TD>'
1135        print '      <TABLE class="full">'
1136        print '        <COLGROUP>'
1137        print '          <COL width="100%">'
1138        print '        </COLGROUP>'
1139        print '        <TR>'
1140        print '          <TD>'
1141        sendPLObjHtml( )
1142        print '          </TD>'
1143        print '        </TR>'
1144        print '      </TABLE>'
1145        print '    </TD>'
1146        print '  </TR>'
1147
1148        print '</TABLE>'
1149
1150        # Send some data that needs to be available across sessions
1151        sendHtmlFormVar( formVmNameDom0 )
1152
1153        print '</FORM>'
1154        print '</CENTER>'
1155
1156        print '</BODY>'
1157
1158        print '</HTML>'
1159
1160def sendHtmlHead( ):
1161        global headTitle
1162
1163        print '<HEAD>'
1164        print '<STYLE type="text/css">'
1165        print '<!--'
1166        print 'BODY            {background-color: #EEEEFF;}'
1167        print 'TABLE.container {width:  90%; border: 1px solid black; border-collapse: seperate;}'
1168        print 'TABLE.full      {width: 100%; border: 0px solid black; border-collapse: collapse; border-spacing: 3px;}'
1169        print 'TABLE.fullbox   {width: 100%; border: 0px solid black; border-collapse: collapse; border-spacing: 3px;}'
1170        print 'THEAD           {font-weight: bold; font-size: larger;}'
1171        print 'TD              {border: 0px solid black; vertical-align: top;}'
1172        print 'TD.heading      {border: 0px solid black; vertical-align: top; font-weight: bold; font-size: larger;}'
1173        print 'TD.subheading   {border: 0px solid black; vertical-align: top; font-size: smaller;}'
1174        print 'TD.fullbox      {border: 1px solid black; vertical-align: top;}'
1175        print 'SELECT.full     {width: 100%;}'
1176        print 'INPUT.full      {width: 100%;}'
1177        print 'INPUT.link      {cursor: pointer; background-color: #EEEEFF; border: 0px; text-decoration: underline; color: blue;}'
1178        print 'INPUT.hidden    {visibility: hidden; width: 1px; height: 1px;}'
1179        print ':link           {color: blue;}'
1180        print ':visited        {color: red;}'
1181        print '-->'
1182        print '</STYLE>'
1183        print '<TITLE>', headTitle, '</TITLE>'
1184        print '</HEAD>'
1185
1186def sendPHeaderHtml( ):
1187        global formPolicyName, formPolicyUrl, formPolicyRef, formPolicyDate, formPolicyNSUrl
1188        global formPolicyOrder, formPolicyUpdate
1189
1190        # Policy header definition
1191        print '<TABLE class="full">'
1192        print '  <COLGROUP>'
1193        print '    <COL width="20%">'
1194        print '    <COL width="80%">'
1195        print '  </COLGROUP>'
1196        print '  <TR>'
1197        print '    <TD align="center" colspan="2" class="heading">Policy Information</TD>'
1198        print '  </TR>'
1199        print '  <TR>'
1200        print '    <TD align="right">Name:</TD>'
1201        print '    <TD align="left">'
1202        sendHtmlFormVar( formPolicyName, 'class="full"' )
1203        print '    </TD>'
1204        print '  </TR>'
1205        print '  <TR>'
1206        print '    <TD align="right">Url:</TD>'
1207        print '    <TD align="left">'
1208        sendHtmlFormVar( formPolicyUrl, 'class="full"' )
1209        print '    </TD>'
1210        print '  </TR>'
1211        print '  <TR>'
1212        print '    <TD align="right">Reference:</TD>'
1213        print '    <TD align="left">'
1214        sendHtmlFormVar( formPolicyRef, 'class="full"' )
1215        print '    </TD>'
1216        print '  </TR>'
1217        print '  <TR>'
1218        print '    <TD align="right">Date:</TD>'
1219        print '    <TD align="left">'
1220        sendHtmlFormVar( formPolicyDate, 'class="full"' )
1221        print '    </TD>'
1222        print '  </TR>'
1223        print '  <TR>'
1224        print '    <TD align="right">NameSpace URL:</TD>'
1225        print '    <TD align="left">'
1226        sendHtmlFormVar( formPolicyNSUrl, 'class="full"' )
1227        print '    </TD>'
1228        print '  </TR>'
1229        print '  <TR>'
1230        print '    <TD align="right">Primary Policy:</TD>'
1231        print '    <TD align="left">'
1232        sendHtmlFormVar( formPolicyOrder )
1233        print '    </TD>'
1234        print '  </TR>'
1235        print '  <TR>'
1236        print '    <TD align="center" colspan="2">'
1237        sendHtmlFormVar( formPolicyUpdate )
1238        print '    </TD>'
1239        print '  </TR>'
1240        print '  <TR>'
1241        print '    <TD align="center" colspan="2" class="subheading">'
1242        print '      (The Policy Information is updated whenever an action is performed'
1243        print '       or it can be updated separately using the "Update" button)'
1244        print '    </TD>'
1245        print '  </TR>'
1246        print '</TABLE>'
1247
1248def sendPSteHtml( ):
1249        global formSteTypes, formSteDel, formSteType, formSteAdd
1250
1251        # Simple Type Enforcement...
1252        print '<TABLE class="full">'
1253        print '  <COLGROUP>'
1254        print '    <COL width="20%">'
1255        print '    <COL width="80%">'
1256        print '  </COLGROUP>'
1257        print '  <TR>'
1258        print '    <TD align="center" colspan="2" class="heading">Simple Type Enforcement Types</TD>'
1259        print '  </TR>'
1260        print '  <TR>'
1261        print '    <TD colspan="2">'
1262        sendHtmlFormVar( formSteTypes, 'class="full" size="4" multiple' )
1263        print '    </TD>'
1264        print '  </TR>'
1265        print '  <TR>'
1266        print '    <TD>'
1267        sendHtmlFormVar( formSteDel, 'class="full"' )
1268        print '    </TD>'
1269        print '    <TD>'
1270        print '      Delete the type(s) selected above'
1271        print '    </TD>'
1272        print '  </TR>'
1273        print '  <TR>'
1274        print '    <TD colspan="2">'
1275        sendHtmlFormVar( formSteType, 'class="full"' )
1276        print '    </TD>'
1277        print '  </TR>'
1278        print '  <TR>'
1279        print '    <TD>'
1280        sendHtmlFormVar( formSteAdd, 'class="full"' )
1281        print '    </TD>'
1282        print '    <TD>'
1283        print '      Create a new type with the above name'
1284        print '    </TD>'
1285        print '  </TR>'
1286        print '</TABLE>'
1287
1288def sendPChWallHtml( ):
1289        global formChWallTypes, formChWallDel, formChWallType, formChWallAdd
1290        global formCSNames, formCSName, formCSAdd, allCSDel
1291        global allCSMTypes, allCSMDel, allCSMType, allCSMAdd
1292
1293        # Chinese Wall...
1294        print '<TABLE class="full">'
1295        print '  <COLGROUP>'
1296        print '    <COL width="20%">'
1297        print '    <COL width="80%">'
1298        print '  </COLGROUP>'
1299        print '  <TR>'
1300        print '    <TD align="center" colspan="2" class="heading">Chinese Wall Types</TD>'
1301        print '  </TR>'
1302        print '  <TR>'
1303        print '    <TD colspan="2">'
1304        sendHtmlFormVar( formChWallTypes, 'class="full" size="4" multiple' )
1305        print '    </TD>'
1306        print '  </TR>'
1307        print '  <TR>'
1308        print '    <TD>'
1309        sendHtmlFormVar( formChWallDel, 'class="full"' )
1310        print '    </TD>'
1311        print '    <TD>'
1312        print '      Delete the type(s) selected above'
1313        print '    </TD>'
1314        print '  </TR>'
1315        print '  <TR>'
1316        print '    <TD colspan="2">'
1317        sendHtmlFormVar( formChWallType, 'class="full"' )
1318        print '    </TD>'
1319        print '  </TR>'
1320        print '  <TR>'
1321        print '    <TD>'
1322        sendHtmlFormVar( formChWallAdd, 'class="full"' )
1323        print '    </TD>'
1324        print '    <TD>'
1325        print '      Create a new type with the above name'
1326        print '    </TD>'
1327        print '  </TR>'
1328
1329        # Chinese Wall Conflict Sets...
1330        print '  <TR>'
1331        print '    <TD colspan="2">'
1332        print '      <TABLE class="full">'
1333        print '        <COLGROUP>'
1334        print '          <COL width="20%">'
1335        print '          <COL width="30%">'
1336        print '          <COL width="50%">'
1337        print '        </COLGROUP>'
1338        print '        <THEAD>'
1339        print '          <TR>'
1340        print '            <TD align="center" colspan="3"><HR></TD>'
1341        print '          </TR>'
1342        print '          <TR>'
1343        print '            <TD align="center" colspan="3">Chinese Wall Conflict Sets</TD>'
1344        print '          </TR>'
1345        print '        </THEAD>'
1346        print '        <TR>'
1347        print '          <TD colspan="3">'
1348        sendHtmlFormVar( formCSName, 'class="full"' )
1349        sendHtmlFormVar( formCSNames )
1350        print '          </TD>'
1351        print '        </TR>'
1352        print '        <TR>'
1353        print '          <TD>'
1354        sendHtmlFormVar( formCSAdd, 'class="full"' )
1355        print '          </TD>'
1356        print '          <TD colspan="2">'
1357        print '            Create a new conflict set with the above name'
1358        print '          </TD>'
1359        print '        </TR>'
1360        print '      </TABLE>'
1361        print '    </TD>'
1362        print '  </TR>'
1363        if len( formCSNames[1] ) > 0:
1364                print '  <TR>'
1365                print '    <TD colspan="2">'
1366                print '      &nbsp;'
1367                print '    </TD>'
1368                print '  </TR>'
1369                print '  <TR>'
1370                print '    <TD colspan="2">'
1371                print '      <TABLE class="fullbox">'
1372                print '        <COLGROUP>'
1373                print '          <COL width="50%">'
1374                print '          <COL width="50%">'
1375                print '        </COLGROUP>'
1376                print '        <THEAD>'
1377                print '          <TR>'
1378                print '            <TD class="fullbox">Name</TD>'
1379                print '            <TD class="fullbox">Actions</TD>'
1380                print '          </TR>'
1381                print '        </THEAD>'
1382                for i, csName in enumerate( formCSNames[1] ):
1383                        print '        <TR>'
1384                        print '          <TD class="fullbox">' + csName + '</TD>'
1385                        print '          <TD class="fullbox">'
1386                        print '            <A href="#' + csName + '">Edit</A>'
1387                        formVar = allCSDel[csName]
1388                        sendHtmlFormVar( formVar, 'class="link"' )
1389                        print '          </TD>'
1390                print '      </TABLE>'
1391                print '    </TD>'
1392                print '  </TR>'
1393                for csName in formCSNames[1]:
1394                        print '  <TR><TD colspan="2"><HR></TD></TR>'
1395                        print '  <TR>'
1396                        print '    <TD align="center" colspan="2" class="heading"><A name="' + csName + '">Conflict Set: ' + csName + '</A></TD>'
1397                        print '  </TR>'
1398                        print '  <TR>'
1399                        print '    <TD colspan="2">'
1400                        formVar = allCSMTypes[csName];
1401                        sendHtmlFormVar( formVar, 'class="full" size="4" multiple"' )
1402                        print '    </TD>'
1403                        print '  </TR>'
1404                        print '  <TR>'
1405                        print '    <TD>'
1406                        formVar = allCSMDel[csName]
1407                        sendHtmlFormVar( formVar, 'class="full"' )
1408                        print '    </TD>'
1409                        print '    <TD>'
1410                        print '      Delete the type(s) selected above'
1411                        print '    </TD>'
1412                        print '  </TR>'
1413                        print '  <TR>'
1414                        print '    <TD colspan="2">'
1415                        ctSet = Set( formChWallTypes[1] )
1416                        csSet = Set( allCSMTypes[csName][1] )
1417                        formVar = allCSMType[csName]
1418                        formVar[1] = []
1419                        for chwallType in ctSet.difference( csSet ):
1420                                formVar[1].append( chwallType )
1421                        formVar[1].sort( )
1422                        sendHtmlFormVar( formVar, 'class="full" size="2" multiple' )
1423                        print '    </TD>'
1424                        print '  </TR>'
1425                        print '  <TR>'
1426                        print '    <TD>'
1427                        formVar = allCSMAdd[csName]
1428                        sendHtmlFormVar( formVar, 'class="full"' )
1429                        print '    </TD>'
1430                        print '    <TD>'
1431                        print '      Add the type(s) selected above'
1432                        print '    </TD>'
1433                        print '  </TR>'
1434
1435        print '</TABLE>'
1436
1437def sendPLSubHtml( ):
1438        global formVmNames, formVmDel, formVmName, formVmAdd
1439        global allVmDel, allVmDom0
1440        global allVmChWs, allVmChWDel, allVmChW, allVmChWAdd
1441        global allVmStes, allVmSteDel, allVmSte, allVmSteAdd
1442        global formSteTypes, formChWallTypes
1443
1444        print '<TABLE class="full">'
1445        print '  <COLGROUP>'
1446        print '    <COL width="100%">'
1447        print '  </COLGROUP>'
1448
1449        # Virtual Machines...
1450        print '  <TR>'
1451        print '    <TD>'
1452        print '      <TABLE class="full">'
1453        print '        <COLGROUP>'
1454        print '          <COL width="10%">'
1455        print '          <COL width="40%">'
1456        print '          <COL width="50%">'
1457        print '        </COLGROUP>'
1458        print '        <TR>'
1459        print '          <TD class="heading" align="center" colspan="3">Virtual Machine Classes</TD>'
1460        print '        </TR>'
1461        print '        <TR>'
1462        print '          <TD colspan="2">'
1463        sendHtmlFormVar( formVmName, 'class="full"' )
1464        sendHtmlFormVar( formVmNames )
1465        print '          </TD>'
1466        print '          <TD>&nbsp;</TD>'
1467        print '        </TR>'
1468        print '        <TR>'
1469        print '          <TD>'
1470        sendHtmlFormVar( formVmAdd, 'class="full"' )
1471        print '          </TD>'
1472        print '          <TD colspan="2">'
1473        print '            Create a new VM class with the above name'
1474        print '          </TD>'
1475        print '        </TR>'
1476        print '      </TABLE>'
1477        print '    </TD>'
1478        print '  </TR>'
1479        if len( formVmNames[1] ) > 0:
1480                print '  <TR>'
1481                print '    <TD colspan="1">'
1482                print '      &nbsp;'
1483                print '    </TD>'
1484                print '  </TR>'
1485                print '  <TR>'
1486                print '    <TD>'
1487                print '      <TABLE class="fullbox">'
1488                print '        <COLGROUP>'
1489                print '          <COL width="10%">'
1490                print '          <COL width="40%">'
1491                print '          <COL width="50%">'
1492                print '        </COLGROUP>'
1493                print '        <THEAD>'
1494                print '          <TR>'
1495                print '            <TD class="fullbox">Dom 0?</TD>'
1496                print '            <TD class="fullbox">Name</TD>'
1497                print '            <TD class="fullbox">Actions</TD>'
1498                print '          </TR>'
1499                print '        </THEAD>'
1500                for i, vmName in enumerate( formVmNames[1] ):
1501                        print '        <TR>'
1502                        print '          <TD class="fullbox">'
1503                        if formVmNameDom0[1] == vmName:
1504                                print 'Yes'
1505                        else:
1506                                print '&nbsp;'
1507                        print '          </TD>'
1508                        print '          <TD class="fullbox">' + vmName + '</TD>'
1509                        print '          <TD class="fullbox">'
1510                        print '            <A href="#' + vmName + '">Edit</A>'
1511                        formVar = allVmDel[vmName]
1512                        sendHtmlFormVar( formVar, 'class="link"' )
1513                        formVar = allVmDom0[vmName]
1514                        sendHtmlFormVar( formVar, 'class="link"' )
1515                        print '          </TD>'
1516                        print '        </TR>'
1517                print '      </TABLE>'
1518                print '    </TD>'
1519                print '  </TR>'
1520                for vmName in formVmNames[1]:
1521                        print '  <TR>'
1522                        print '    <TD>'
1523                        print '      <HR>'
1524                        print '    </TD>'
1525                        print '  </TR>'
1526                        print '  <TR>'
1527                        print '    <TD>'
1528                        print '      <TABLE class="full">'
1529                        print '        <COLGROUP>'
1530                        print '          <COL width="10%">'
1531                        print '          <COL width="39%">'
1532                        print '          <COL width="2%">'
1533                        print '          <COL width="10%">'
1534                        print '          <COL width="39%">'
1535                        print '        </COLGROUP>'
1536                        print '        <TR>'
1537                        print '          <TD colspan="5" align="center" class="heading">'
1538                        print '            <A name="' + vmName + '">Virtual Machine Class: ' + vmName + '</A>'
1539                        print '          </TD>'
1540                        print '        </TR>'
1541                        print '        <TR>'
1542                        print '          <TD colspan="2" align="center">Simple Type Enforcement Types</TD>'
1543                        print '          <TD>&nbsp;</TD>'
1544                        print '          <TD colspan="2" align="center">Chinese Wall Types</TD>'
1545                        print '        </TR>'
1546                        print '        <TR>'
1547                        print '          <TD colspan="2">'
1548                        formVar = allVmStes[vmName];
1549                        sendHtmlFormVar( formVar, 'class="full" size="4" multiple"' )
1550                        print '          </TD>'
1551                        print '          <TD>&nbsp;</TD>'
1552                        print '          <TD colspan="2">'
1553                        formVar = allVmChWs[vmName];
1554                        sendHtmlFormVar( formVar, 'class="full" size="4" multiple"' )
1555                        print '          </TD>'
1556                        print '        </TR>'
1557                        print '        <TR>'
1558                        print '          <TD>'
1559                        formVar = allVmSteDel[vmName];
1560                        sendHtmlFormVar( formVar, 'class="full"' )
1561                        print '          </TD>'
1562                        print '          <TD>'
1563                        print '            Delete the type(s) selected above'
1564                        print '          </TD>'
1565                        print '          <TD>&nbsp;</TD>'
1566                        print '          <TD>'
1567                        formVar = allVmChWDel[vmName];
1568                        sendHtmlFormVar( formVar, 'class="full"' )
1569                        print '          </TD>'
1570                        print '          <TD>'
1571                        print '            Delete the type(s) selected above'
1572                        print '          </TD>'
1573                        print '        </TR>'
1574                        print '        <TR>'
1575                        print '          <TD colspan="2">'
1576                        stSet = Set( formSteTypes[1] )
1577                        vmSet = Set( allVmStes[vmName][1] )
1578                        formVar = allVmSte[vmName]
1579                        formVar[1] = []
1580                        for steType in stSet.difference( vmSet ):
1581                                formVar[1].append( steType )
1582                        formVar[1].sort( )
1583                        sendHtmlFormVar( formVar, 'class="full" size="2" multiple"' )
1584                        print '          </TD>'
1585                        print '          <TD>&nbsp;</TD>'
1586                        print '          <TD colspan="2">'
1587                        ctSet = Set( formChWallTypes[1] )
1588                        vmSet = Set( allVmChWs[vmName][1] )
1589                        formVar = allVmChW[vmName]
1590                        formVar[1] = []
1591                        for chwallType in ctSet.difference( vmSet ):
1592                                formVar[1].append( chwallType )
1593                        formVar[1].sort( )
1594                        sendHtmlFormVar( formVar, 'class="full" size="2" multiple"' )
1595                        print '          </TD>'
1596                        print '        </TR>'
1597                        print '        <TR>'
1598                        print '          <TD>'
1599                        formVar = allVmSteAdd[vmName];
1600                        sendHtmlFormVar( formVar, 'class="full"' )
1601                        print '          </TD>'
1602                        print '          <TD>'
1603                        print '            Add the type(s) selected above'
1604                        print '          </TD>'
1605                        print '          <TD>&nbsp;</TD>'
1606                        print '          <TD>'
1607                        formVar = allVmChWAdd[vmName];
1608                        sendHtmlFormVar( formVar, 'class="full"' )
1609                        print '          </TD>'
1610                        print '          <TD>'
1611                        print '            Add the type(s) selected above'
1612                        print '          </TD>'
1613                        print '        </TR>'
1614                        print '      </TABLE>'
1615                        print '    </TD>'
1616                        print '  </TR>'
1617
1618        print '</TABLE>'
1619
1620def sendPLObjHtml( ):
1621        global formResNames, formResDel, formResName, formResAdd
1622        global allResDel
1623        global allResStes, allResSteDel, allResSte, allResSteAdd
1624        global formSteTypes, formChWallTypes
1625
1626        print '<TABLE class="full">'
1627        print '  <COLGROUP>'
1628        print '    <COL width="100%">'
1629        print '  </COLGROUP>'
1630
1631        # Resources...
1632        print '  <TR>'
1633        print '    <TD>'
1634        print '      <TABLE class="full">'
1635        print '        <COLGROUP>'
1636        print '          <COL width="10%">'
1637        print '          <COL width="40%">'
1638        print '          <COL width="50%">'
1639        print '        </COLGROUP>'
1640        print '        <TR>'
1641        print '          <TD class="heading" align="center" colspan="3">Resource Classes</TD>'
1642        print '        </TR>'
1643        print '        <TR>'
1644        print '          <TD colspan="2">'
1645        sendHtmlFormVar( formResName, 'class="full"' )
1646        sendHtmlFormVar( formResNames )
1647        print '          </TD>'
1648        print '          <TD>&nbsp;</TD>'
1649        print '        </TR>'
1650        print '        <TR>'
1651        print '          <TD>'
1652        sendHtmlFormVar( formResAdd, 'class="full"' )
1653        print '          </TD>'
1654        print '          <TD colspan="2">'
1655        print '            Create a new Resource class with the above name'
1656        print '          </TD>'
1657        print '        </TR>'
1658        print '      </TABLE>'
1659        print '    </TD>'
1660        print '  </TR>'
1661        if len( formResNames[1] ) > 0:
1662                print '  <TR>'
1663                print '    <TD colspan="1">'
1664                print '      &nbsp;'
1665                print '    </TD>'
1666                print '  </TR>'
1667                print '  <TR>'
1668                print '    <TD>'
1669                print '      <TABLE class="fullbox">'
1670                print '        <COLGROUP>'
1671                print '          <COL width="50%">'
1672                print '          <COL width="50%">'
1673                print '        </COLGROUP>'
1674                print '        <THEAD>'
1675                print '          <TR>'
1676                print '            <TD class="fullbox">Name</TD>'
1677                print '            <TD class="fullbox">Actions</TD>'
1678                print '          </TR>'
1679                print '        </THEAD>'
1680                for i, resName in enumerate( formResNames[1] ):
1681                        print '        <TR>'
1682                        print '          <TD class="fullbox">' + resName + '</TD>'
1683                        print '          <TD class="fullbox">'
1684                        print '            <A href="#' + resName + '">Edit</A>'
1685                        formVar = allResDel[resName]
1686                        sendHtmlFormVar( formVar, 'class="link"' )
1687                        print '          </TD>'
1688                        print '        </TR>'
1689                print '      </TABLE>'
1690                print '    </TD>'
1691                print '  </TR>'
1692                for resName in formResNames[1]:
1693                        print '  <TR>'
1694                        print '    <TD>'
1695                        print '      <HR>'
1696                        print '    </TD>'
1697                        print '  </TR>'
1698                        print '  <TR>'
1699                        print '    <TD>'
1700                        print '      <TABLE class="full">'
1701                        print '        <COLGROUP>'
1702                        print '          <COL width="10%">'
1703                        print '          <COL width="90%">'
1704                        print '        </COLGROUP>'
1705                        print '        <TR>'
1706                        print '          <TD colspan="2" align="center" class="heading">'
1707                        print '            <A name="' + resName + '">Resource Class: ' + resName + '</A>'
1708                        print '          </TD>'
1709                        print '        </TR>'
1710                        print '        <TR>'
1711                        print '          <TD colspan="2" align="center">Simple Type Enforcement Types</TD>'
1712                        print '        </TR>'
1713                        print '        <TR>'
1714                        print '          <TD colspan="2">'
1715                        formVar = allResStes[resName];
1716                        sendHtmlFormVar( formVar, 'class="full" size="4" multiple"' )
1717                        print '          </TD>'
1718                        print '        </TR>'
1719                        print '        <TR>'
1720                        print '          <TD>'
1721                        formVar = allResSteDel[resName];
1722                        sendHtmlFormVar( formVar, 'class="full"' )
1723                        print '          </TD>'
1724                        print '          <TD>'
1725                        print '            Delete the type(s) selected above'
1726                        print '          </TD>'
1727                        print '        </TR>'
1728                        print '        <TR>'
1729                        print '          <TD colspan="2">'
1730                        stSet = Set( formSteTypes[1] )
1731                        resSet = Set( allResStes[resName][1] )
1732                        formVar = allResSte[resName]
1733                        formVar[1] = []
1734                        for steType in stSet.difference( resSet ):
1735                                formVar[1].append( steType )
1736                        formVar[1].sort( )
1737                        sendHtmlFormVar( formVar, 'class="full" size="2" multiple"' )
1738                        print '          </TD>'
1739                        print '        </TR>'
1740                        print '        <TR>'
1741                        print '          <TD>'
1742                        formVar = allResSteAdd[resName];
1743                        sendHtmlFormVar( formVar, 'class="full"' )
1744                        print '          </TD>'
1745                        print '          <TD>'
1746                        print '            Add the type(s) selected above'
1747                        print '          </TD>'
1748                        print '        </TR>'
1749                        print '      </TABLE>'
1750                        print '    </TD>'
1751                        print '  </TR>'
1752
1753        print '</TABLE>'
1754
1755def checkXmlData( ):
1756        global xmlIncomplete
1757        global formPolicyName, formPolicyOrder
1758        global formChWallTypes, formSteTypes, formCSNames
1759
1760        # Validate the Policy Header requirements
1761        if ( len( formPolicyName[1] ) == 0 ):
1762                msg = ''
1763                msg = msg + 'The XML policy schema requires that the Policy '
1764                msg = msg + 'Information Name field have a value.'
1765                formatXmlGenError( msg )
1766
1767        if formPolicyOrder[1] == 'v_ChWall':
1768                if len( formChWallTypes[1] ) == 0:
1769                        msg = ''
1770                        msg = msg + 'You have specified the primary policy to be '
1771                        msg = msg + 'Chinese Wall but have not created any Chinese '
1772                        msg = msg + 'Wall types.  Please create some Chinese Wall '
1773                        msg = msg + 'types or change the primary policy.'
1774                        formatXmlGenError( msg )
1775
1776        if formPolicyOrder[1] == 'v_Ste':
1777                if len( formSteTypes[1] ) == 0:
1778                        msg = ''
1779                        msg = msg + 'You have specified the primary policy to be '
1780                        msg = msg + 'Simple Type Enforcement but have not created '
1781                        msg = msg + 'any Simple Type Enforcement types.  Please create '
1782                        msg = msg + 'some Simple Type Enforcement types or change the '
1783                        msg = msg + 'primary policy.'
1784                        formatXmlGenError( msg )
1785
1786def sendXmlHeaders( ):
1787        # HTML headers
1788        print 'Content-Type: text/xml'
1789        print 'Content-Disposition: attachment; filename=security_policy.xml'
1790        print
1791
1792def sendPolicyXml( ):
1793        print '<?xml version="1.0"?>'
1794
1795        print '<SecurityPolicyDefinition xmlns="http://www.ibm.com"'
1796        print '                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
1797        print '                          xsi:schemaLocation="http://www.ibm.com security_policy.xsd">'
1798
1799        # Policy header
1800        sendPHeaderXml( )
1801
1802        # Policy (types)
1803        sendPSteXml( )
1804        sendPChWallXml( )
1805
1806        # Policy Labels (subjects and objects)
1807        print '<SecurityLabelTemplate>'
1808        sendPLSubXml( )
1809        sendPLObjXml( )
1810        print '</SecurityLabelTemplate>'
1811        print '</SecurityPolicyDefinition>'
1812
1813def sendPHeaderXml( ):
1814        global formPolicyName, formPolicyUrl, formPolicyRef, formPolicyDate, formPolicyNSUrl
1815
1816        # Policy header definition
1817        print '<PolicyHeader>'
1818        print '  <PolicyName>' + formPolicyName[1] + '</PolicyName>'
1819        print '  <Version>1.0</Version>'
1820        if len( formPolicyUrl[1] ) > 0:
1821                print '  <PolicyUrl>' + formPolicyUrl[1] + '</PolicyUrl>'
1822        if len( formPolicyRef[1] ) > 0:
1823                print '  <Reference>' + formPolicyRef[1] + '</Reference>'
1824        if len( formPolicyDate[1] ) > 0:
1825                print '  <Date>' + formPolicyDate[1] + '</Date>'
1826        if len( formPolicyNSUrl[1] ) > 0:
1827                print '  <NameSpaceUrl>' + formPolicyNSUrl[1] + '</NameSpaceUrl>'
1828        print '</PolicyHeader>'
1829
1830def sendPSteXml( ):
1831        global formPolicyOrder, formSteTypes
1832
1833        # Simple Type Enforcement...
1834        if len( formSteTypes[1] ) == 0:
1835                return
1836
1837        if formPolicyOrder[1] == 'v_Ste':
1838                print '<SimpleTypeEnforcement priority="PrimaryPolicyComponent">'
1839        else:
1840                print '<SimpleTypeEnforcement>'
1841
1842        print '  <SimpleTypeEnforcementTypes>'
1843        for steType in formSteTypes[1]:
1844                print '    <Type>' + steType + '</Type>'
1845        print '  </SimpleTypeEnforcementTypes>'
1846
1847        print '</SimpleTypeEnforcement>'
1848
1849def sendPChWallXml( ):
1850        global formPolicyOrder, formChWallTypes
1851        global formCSNames, allCSMTypes
1852
1853        # Chinese Wall...
1854        if len( formChWallTypes[1] ) == 0:
1855                return
1856
1857        if formPolicyOrder[1] == 'v_ChWall':
1858                print '<ChineseWall priority="PrimaryPolicyComponent">'
1859        else:
1860                print '<ChineseWall>'
1861
1862        print '  <ChineseWallTypes>'
1863        for chWallType in formChWallTypes[1]:
1864                print '    <Type>' + chWallType + '</Type>'
1865        print '  </ChineseWallTypes>'
1866
1867        # Chinese Wall Conflict Sets (if any) ...
1868        if len( formCSNames[1] ) > 0:
1869                print '  <ConflictSets>'
1870                for cs in formCSNames[1]:
1871                        formVar = allCSMTypes[cs]
1872                        if len( formVar[1] ) == 0:
1873                                continue
1874                        print '    <Conflict name="' + cs + '">'
1875                        for csm in formVar[1]:
1876                                print '      <Type>' + csm + '</Type>'
1877                        print '    </Conflict>'
1878                print '  </ConflictSets>'
1879
1880        print '</ChineseWall>'
1881
1882def sendPLSubXml( ):
1883        global formVmNames, allVmChWs, allVmStes
1884
1885        # Virtual machines...
1886        if len( formVmNames[1] ) == 0:
1887                return
1888
1889        print '  <SubjectLabels bootstrap="' + formVmNameDom0[1] + '">'
1890        for vmName in formVmNames[1]:
1891                print '    <VirtualMachineLabel>'
1892                print '      <Name>' + vmName + '</Name>'
1893                formVar = allVmStes[vmName]
1894                if len( formVar[1] ) > 0:
1895                        print '      <SimpleTypeEnforcementTypes>'
1896                        for ste in formVar[1]:
1897                                print '      <Type>' + ste + '</Type>'
1898                        print '      </SimpleTypeEnforcementTypes>'
1899
1900                formVar = allVmChWs[vmName]
1901                if len( formVar[1] ) > 0:
1902                        print '      <ChineseWallTypes>'
1903                        for chw in formVar[1]:
1904                                print '        <Type>' + chw + '</Type>'
1905                        print '      </ChineseWallTypes>'
1906
1907                print '    </VirtualMachineLabel>'
1908
1909        print '  </SubjectLabels>'
1910
1911def sendPLObjXml( ):
1912        global formResNames, allResStes
1913
1914        # Resources...
1915        if len( formResNames[1] ) == 0:
1916                return
1917
1918        print '  <ObjectLabels>'
1919        for resName in formResNames[1]:
1920                print '    <ResourceLabel>'
1921                print '      <Name>' + resName + '</Name>'
1922                formVar = allResStes[resName]
1923                if len( formVar[1] ) > 0:
1924                        print '      <SimpleTypeEnforcementTypes>'
1925                        for ste in formVar[1]:
1926                                print '        <Type>' + ste + '</Type>'
1927                        print '      </SimpleTypeEnforcementTypes>'
1928
1929                print '    </ResourceLabel>'
1930
1931        print '  </ObjectLabels>'
1932
1933
1934# Set up initial HTML variables
1935headTitle = 'Xen Policy Generation'
1936
1937# Form variables
1938#   The format of these variables is as follows:
1939#   [ p0, p1, p2, p3, p4, p5 ]
1940#     p0 = input type
1941#     p1 = the current value of the variable
1942#     p2 = the hidden input name attribute
1943#     p3 = the name attribute
1944#     p4 = the value attribute
1945#     p5 = text to associate with the tag
1946formPolicyName    = [ 'text',
1947                        '',
1948                        'h_policyName',
1949                        'i_policyName',
1950                        '',
1951                        '',
1952                    ]
1953formPolicyUrl     = [ 'text',
1954                        '',
1955                        'h_policyUrl',
1956                        'i_policyUrl',
1957                        '',
1958                        '',
1959                        ]
1960formPolicyRef    = [ 'text',
1961                        '',
1962                        'h_policyRef',
1963                        'i_policyRef',
1964                        '',
1965                        '',
1966                        ]
1967formPolicyDate    = [ 'text',
1968                        getCurrentTime( ),
1969                        'h_policyDate',
1970                        'i_policyDate',
1971                        '',
1972                        '',
1973                    ]
1974formPolicyNSUrl   = [ 'text',
1975                        '',
1976                        'h_policyNSUrl',
1977                        'i_policyNSUrl',
1978                        '',
1979                        '',
1980                        ]
1981formPolicyOrder   = [ 'radiobutton-all',
1982                        'v_ChWall',
1983                        'h_policyOrder',
1984                        'i_policyOrder',
1985                        [ 'v_Ste', 'v_ChWall' ],
1986                        [ 'Simple Type Enforcement', 'Chinese Wall' ],
1987                    ]
1988formPolicyUpdate  = [ 'button',
1989                        '',
1990                        '',
1991                        'i_PolicyUpdate',
1992                        'Update',
1993                        '',
1994                    ]
1995
1996formSteTypes      = [ 'list',
1997                        [],
1998                        'h_steTypes',
1999                        'i_steTypes',
2000                        '',
2001                        '',
2002                    ]
2003formSteDel        = [ 'button',
2004                        '',
2005                        '',
2006                        'i_steDel',
2007                        'Delete',
2008                        '',
2009                    ]
2010formSteType       = [ 'text',
2011                        '',
2012                        '',
2013                        'i_steType',
2014                        '',
2015                        '',
2016                    ]
2017formSteAdd        = [ 'button',
2018                        '',
2019                        '',
2020                        'i_steAdd',
2021                        'New',
2022                        '',
2023                    ]
2024
2025formChWallTypes   = [ 'list',
2026                        [],
2027                        'h_chwallTypes',
2028                        'i_chwallTypes',
2029                        '',
2030                        '',
2031                    ]
2032formChWallDel     = [ 'button',
2033                        '',
2034                        '',
2035                        'i_chwallDel',
2036                        'Delete',
2037                        '',
2038                    ]
2039formChWallType    = [ 'text',
2040                        '',
2041                        '',
2042                        'i_chwallType',
2043                        '',
2044                        '',
2045                    ]
2046formChWallAdd     = [ 'button',
2047                        '',
2048                        '',
2049                        'i_chwallAdd',
2050                        'New',
2051                        '',
2052                    ]
2053
2054formCSNames       = [ '',
2055                        [],
2056                        'h_csNames',
2057                        '',
2058                        '',
2059                        '',
2060                    ]
2061formCSName        = [ 'text',
2062                        '',
2063                        '',
2064                        'i_csName',
2065                        '',
2066                        '',
2067                    ]
2068formCSAdd         = [ 'button',
2069                        '',
2070                        '',
2071                        'i_csAdd',
2072                        'New',
2073                        '',
2074                    ]
2075
2076formXmlGen          = [ 'button',
2077                        '',
2078                        '',
2079                        'i_xmlGen',
2080                        'Generate XML',
2081                        '',
2082                    ]
2083
2084formDefaultButton = [ 'button',
2085                        '',
2086                        '',
2087                        'i_defaultButton',
2088                        '.',
2089                        '',
2090                    ]
2091
2092# This is a set of templates used for each conflict set
2093#   Each conflict set is initially assigned these templates,
2094#   then each form attribute value is changed to append
2095#   "_conflict-set-name" for uniqueness
2096templateCSDel     = [ 'button',
2097                        '',
2098                        '',
2099                        'i_csDel',
2100                        'Delete',
2101                        '',
2102                    ]
2103allCSDel          = {};
2104
2105templateCSMTypes  = [ 'list',
2106                        [],
2107                        'h_csmTypes',
2108                        'i_csmTypes',
2109                        '',
2110                        '',
2111                    ]
2112templateCSMDel    = [ 'button',
2113                        '',
2114                        '',
2115                        'i_csmDel',
2116                        'Delete',
2117                        '',
2118                    ]
2119templateCSMType   = [ 'list',
2120                        [],
2121                        '',
2122                        'i_csmType',
2123                        '',
2124                        '',
2125                    ]
2126templateCSMAdd    = [ 'button',
2127                        '',
2128                        '',
2129                        'i_csmAdd',
2130                        'Add',
2131                        '',
2132                    ]
2133allCSMTypes       = {};
2134allCSMDel         = {};
2135allCSMType        = {};
2136allCSMAdd         = {};
2137
2138formVmNames       = [ '',
2139                        [],
2140                        'h_vmNames',
2141                        '',
2142                        '',
2143                        '',
2144                    ]
2145formVmDel         = [ 'button',
2146                        '',
2147                        '',
2148                        'i_vmDel',
2149                        'Delete',
2150                        '',
2151                    ]
2152formVmName        = [ 'text',
2153                        '',
2154                        '',
2155                        'i_vmName',
2156                        '',
2157                        '',
2158                    ]
2159formVmAdd         = [ 'button',
2160                        '',
2161                        '',
2162                        'i_vmAdd',
2163                        'New',
2164                        '',
2165                    ]
2166
2167formVmNameDom0    = [ '',
2168                        '',
2169                        'h_vmDom0',
2170                        '',
2171                        '',
2172                        '',
2173                    ]
2174
2175# This is a set of templates used for each virtual machine
2176#   Each virtual machine is initially assigned these templates,
2177#   then each form attribute value is changed to append
2178#   "_virtual-machine-name" for uniqueness.
2179templateVmDel     = [ 'button',
2180                        '',
2181                        '',
2182                        'i_vmDel',
2183                        'Delete',
2184                        '',
2185                    ]
2186templateVmDom0    = [ 'button',
2187                        '',
2188                        '',
2189                        'i_vmDom0',
2190                        'SetDom0',
2191                        '',
2192                    ]
2193allVmDel          = {};
2194allVmDom0         = {};
2195
2196templateVmChWs    = [ 'list',
2197                        [],
2198                        'h_vmChWs',
2199                        'i_vmChWs',
2200                        '',
2201                        '',
2202                    ]
2203templateVmChWDel  = [ 'button',
2204                        '',
2205                        '',
2206                        'i_vmChWDel',
2207                        'Delete',
2208                        '',
2209                    ]
2210templateVmChW     = [ 'list',
2211                        [],
2212                        '',
2213                        'i_vmChW',
2214                        '',
2215                        '',
2216                    ]
2217templateVmChWAdd  = [ 'button',
2218                        '',
2219                        '',
2220                        'i_vmChWAdd',
2221                        'Add',
2222                        '',
2223                    ]
2224allVmChWs         = {};
2225allVmChWDel       = {};
2226allVmChW          = {};
2227allVmChWAdd       = {};
2228
2229templateVmStes    = [ 'list',
2230                        [],
2231                        'h_vmStes',
2232                        'i_vmStes',
2233                        '',
2234                        '',
2235                    ]
2236templateVmSteDel  = [ 'button',
2237                        '',
2238                        '',
2239                        'i_vmSteDel',
2240                        'Delete',
2241                        '',
2242                    ]
2243templateVmSte     = [ 'list',
2244                        [],
2245                        '',
2246                        'i_vmSte',
2247                        '',
2248                        '',
2249                    ]
2250templateVmSteAdd  = [ 'button',
2251                        '',
2252                        '',
2253                        'i_vmSteAdd',
2254                        'Add',
2255                        '',
2256                    ]
2257allVmStes         = {};
2258allVmSteDel       = {};
2259allVmSte          = {};
2260allVmSteAdd       = {};
2261
2262formResNames      = [ '',
2263                        [],
2264                        'h_resNames',
2265                        '',
2266                        '',
2267                        '',
2268                    ]
2269formResDel        = [ 'button',
2270                        '',
2271                        '',
2272                        'i_resDel',
2273                        'Delete',
2274                        '',
2275                    ]
2276formResName       = [ 'text',
2277                        '',
2278                        '',
2279                        'i_resName',
2280                        '',
2281                        '',
2282                    ]
2283formResAdd        = [ 'button',
2284                        '',
2285                        '',
2286                        'i_resAdd',
2287                        'New',
2288                        '',
2289                    ]
2290
2291# This is a set of templates used for each resource
2292#   Each resource is initially assigned these templates,
2293#   then each form attribute value is changed to append
2294#   "_resource-name" for uniqueness.
2295templateResDel    = [ 'button',
2296                        '',
2297                        '',
2298                        'i_resDel',
2299                        'Delete',
2300                        '',
2301                    ]
2302allResDel         = {};
2303
2304templateResStes   = [ 'list',
2305                        [],
2306                        'h_resStes',
2307                        'i_resStes',
2308                        '',
2309                        '',
2310                    ]
2311templateResSteDel = [ 'button',
2312                        '',
2313                        '',
2314                        'i_resSteDel',
2315                        'Delete',
2316                        '',
2317                    ]
2318templateResSte    = [ 'list',
2319                        [],
2320                        '',
2321                        'i_resSte',
2322                        '',
2323                        '',
2324                    ]
2325templateResSteAdd = [ 'button',
2326                        '',
2327                        '',
2328                        'i_resSteAdd',
2329                        'Add',
2330                        '',
2331                    ]
2332allResStes        = {};
2333allResSteDel      = {};
2334allResSte         = {};
2335allResSteAdd      = {};
2336
2337# A list of all form variables used for saving info across requests
2338formVariables     = [ formPolicyName,
2339                        formPolicyUrl,
2340                        formPolicyRef,
2341                        formPolicyDate,
2342                        formPolicyNSUrl,
2343                        formPolicyOrder,
2344                        formSteTypes,
2345                        formChWallTypes,
2346                        formCSNames,
2347                        formVmNames,
2348                        formVmNameDom0,
2349                        formResNames,
2350                    ]
2351
2352policyXml         = ''
2353xmlError          = 0
2354xmlIncomplete     = 0
2355xmlMessages       = []
2356
2357
2358# Extract any form data
2359formData = cgi.FieldStorage( )
2360
2361# Process the form
2362getSavedData( )
2363processRequest( )
2364
2365if formData.has_key( formXmlGen[3] ):
2366        # Generate and send the XML file
2367        checkXmlData( )
2368
2369        if xmlIncomplete == 0:
2370                sendXmlHeaders( )
2371                sendPolicyXml( )
2372
2373if (not formData.has_key( formXmlGen[3] )) or (xmlIncomplete == 1 ):
2374        # Send HTML to continue processing the form
2375        sendHtmlHeaders( )
2376        sendPolicyHtml( )
Note: See TracBrowser for help on using the repository browser.