<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'> <xs:element name='glsa' type='glsaType'/> <!-- elements --> <xs:complexType name='glsaType'> <xs:sequence> <xs:element name='title' type='xs:token'/> <xs:element name='synopsis' type='xs:token'/> <xs:element name='product' type='productType'/> <xs:element name='announced' type='xs:date'/> <xs:element name='revised' type='revisedType'/> <xs:element name='bug' type='xs:positiveInteger' minOccurs='0' maxOccurs='unbounded'/> <xs:element name='access' type='xs:token' minOccurs='0' maxOccurs='1'/> <xs:element name='affected' type='affectedType'/> <xs:element name='background' type='partialHTMLType' minOccurs='0' maxOccurs='1'/> <xs:element name='description' type='partialHTMLType'/> <xs:element name='impact' type='impactType'/> <xs:element name='workaround' type='partialHTMLType'/> <xs:element name='resolution' type='partialHTMLType'/> <xs:element name='references' type='referencesType'/> <xs:element name='license' type='licenseType' minOccurs='0' maxOccurs='1'/> <xs:element name='metadata' type='metadataType' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> <xs:attribute name='id' type='glsaIdType' use='required'/> </xs:complexType> <xs:complexType name='productType'> <xs:simpleContent> <xs:extension base="xs:token"> <xs:attribute name='type' type='productTypeType' use='required'/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name='revisedType'> <xs:simpleContent> <xs:extension base='xs:date'> <xs:attribute name='count' type='xs:positiveInteger' default='1'/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name='affectedType'> <xs:sequence> <xs:element name='package' type='affectedPackageType' minOccurs='0' maxOccurs='unbounded'/> <xs:element name='service' type='affectedServiceType' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> <xs:complexType name='affectedPackageType'> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element name='vulnerable' type='affectedPackageVulnerableType'/> <xs:element name='unaffected' type='affectedPackageUnaffectedType'/> </xs:choice> <xs:attribute name='name' type='pkgType' use='required'/> <xs:attribute name='auto' type='yesNoType' use='required'/> <xs:attribute name='arch' type='archType' use='required'/> </xs:complexType> <xs:complexType name='affectedServiceType'> <xs:simpleContent> <xs:extension base='serviceURLType'> <xs:attribute name='type' type='serviceTypeType' use='required'/> <xs:attribute name='fixed' type='yesNoType' default='no'/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name='affectedPackageVulnerableType'> <xs:simpleContent> <xs:extension base='versionType'> <xs:attribute name='range' type='versionRangeType' use='required'/> <xs:attribute name='slot' type='slotType' default='*'/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name='affectedPackageUnaffectedType'> <xs:simpleContent> <xs:extension base='versionType'> <xs:attribute name='range' type='versionRangeType' use='required'/> <xs:attribute name='slot' type='slotType' default='*'/> <xs:attribute name='name' type='pkgType'/> </xs:extension> </xs:simpleContent> </xs:complexType> <!-- value types --> <xs:simpleType name='glsaIdType'> <xs:restriction base='xs:token'> <!-- YYYYMM-NN --> <xs:pattern value="[0-9]{4}(0[1-9]|1[0-2])-[0-9]{2}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name='productTypeType'> <xs:restriction base='xs:token'> <xs:enumeration value='ebuild'/> <xs:enumeration value='informational'/> <xs:enumeration value='infrastructure'/> </xs:restriction> </xs:simpleType> <xs:simpleType name='yesNoType'> <xs:restriction base='xs:token'> <xs:enumeration value='yes'/> <xs:enumeration value='no'/> </xs:restriction> </xs:simpleType> <xs:simpleType name='archType'> <xs:restriction base='xs:token'> <!-- '*' or 1+ arches --> <xs:pattern value="[*]|[a-z0-9-]+(\s+[a-z0-9-]+)*"/> </xs:restriction> </xs:simpleType> <xs:simpleType name='versionRangeType'> <xs:restriction base='xs:token'> <xs:enumeration value='le'/> <xs:enumeration value='lt'/> <xs:enumeration value='eq'/> <xs:enumeration value='gt'/> <xs:enumeration value='ge'/> <xs:enumeration value='rle'/> <xs:enumeration value='rlt'/> <xs:enumeration value='rgt'/> <xs:enumeration value='rge'/> </xs:restriction> </xs:simpleType> <xs:simpleType name='serviceURLType'> <xs:restriction base='xs:token'> <!-- TODO: improve this? --> <xs:pattern value="((https?|ftps?|rsync)://\S+)?"/> </xs:restriction> </xs:simpleType> <xs:simpleType name='serviceTypeType'> <xs:restriction base='xs:token'> <xs:enumeration value='rsync'/> <xs:enumeration value='web'/> <xs:enumeration value='mirror'/> </xs:restriction> </xs:simpleType> <xs:complexType name='impactType'> <xs:complexContent> <xs:extension base="partialHTMLType"> <xs:attribute name='type' type='xs:token' use='required'/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name='referencesType'> <xs:sequence> <xs:element name='uri' type='htmlURIType' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> <xs:complexType name='licenseType'> <!-- empty by design --> </xs:complexType> <xs:complexType name='metadataType'> <xs:simpleContent> <xs:extension base='xs:token'> <!-- TODO: enumerate allowed values? --> <xs:attribute name='tag' type='xs:token' use='required'/> <xs:attribute name='revision' type='xs:token'/> <xs:attribute name='author' type='xs:token'/> <xs:attribute name='timestamp' type='xs:dateTime'/> </xs:extension> </xs:simpleContent> </xs:complexType> <!-- PMS types --> <xs:simpleType name='pkgType'> <xs:restriction base='xs:token'> <!-- PMS 3.1.1 Category Names + 3.1.2 Package Names --> <!-- note: this does not enforce the 'anything matching the version syntax' requirement --> <xs:pattern value="[A-Za-z0-9_][A-Za-z0-9+_.-]*/[A-Za-z0-9_][A-Za-z0-9+_-]*"/> </xs:restriction> </xs:simpleType> <xs:simpleType name='versionType'> <xs:restriction base='xs:token'> <!-- PMS 3.2 Version Specifications --> <!-- (optionally followed by '*', for 'eq' operator --> <xs:pattern value="[0-9]+(\.[0-9]+)*[a-z]?((_alpha|_beta|_pre|_rc|_p)[0-9]*)*(-r[0-9]+)?[*]?"/> </xs:restriction> </xs:simpleType> <xs:simpleType name='slotType'> <xs:restriction base='xs:token'> <!-- PMS 3.1.3 Slot Names + special value '*' --> <xs:pattern value="[A-Za-z0-9_][A-Za-z0-9+_.-]*|[*]"/> </xs:restriction> </xs:simpleType> <!-- Horrible HTML-like mixed-text --> <xs:complexType name='partialHTMLType'> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element name='p' type='htmlPType'/> <xs:element name='ul' type='htmlListType'/> <xs:element name='ol' type='htmlListType'/> <xs:element name='code' type='xs:string'/> </xs:choice> </xs:complexType> <xs:complexType name='htmlPType' mixed='true'> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element name='mail' type='htmlMailType'/> <xs:element name='uri' type='htmlURIType'/> <xs:element name='b' type='xs:token'/> <xs:element name='i' type='xs:token'/> <xs:element name='br' type='htmlBRType'/> </xs:choice> </xs:complexType> <xs:complexType name='htmlListType'> <xs:sequence> <xs:element name='li' type='xs:token' minOccurs='1' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> <xs:complexType name='htmlBRType'> <!-- empty --> </xs:complexType> <xs:complexType name='htmlMailType'> <xs:simpleContent> <xs:extension base="xs:token"> <xs:attribute name='link' type='mailLinkType' use='required'/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name='htmlURIType'> <xs:simpleContent> <xs:extension base="xs:token"> <xs:attribute name='link' type='uriLinkType' use='required'/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:simpleType name='mailLinkType'> <xs:restriction base='xs:token'> <!-- TODO: improve? --> <xs:pattern value="[^@]+@[^.\s]+\.\S+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name='uriLinkType'> <xs:restriction base='xs:token'> <!-- TODO: improve? --> <xs:pattern value="(http|ftp)s?://\S+"/> </xs:restriction> </xs:simpleType> </xs:schema>