a i-@sdZgdZddlmZddlmmZddlZddlmZddl m Z ddl m Z ddl m Z Gdd d eZGd d d eZGd d d eZGdddeZGdddejjZGdddejZddZddZddZddZdS)z5Generic io_object handler, io specific check methods.) IO_ObjectIO_Object_ContentHandlerIO_Object_XMLGenerator check_port check_tcpudpcheck_protocol check_addressN) OrderedDict) functions)errors) FirewallErrorc@seZdZdZdZdZgZiZiZddZ ddZ dd Z d d Z d d Z ddZifddZddZddZddZddZdS)rz; Abstract IO_Object as base for icmptype, service and zone z()cCs"d|_d|_d|_d|_d|_dS)NF)filenamepathnamedefaultZbuiltinselfr r >/usr/lib/python3.9/site-packages/firewall/core/io/io_object.py__init__-s zIO_Object.__init__c Cs2g}|jD]}|tt||dq t|S)Nr)IMPORT_EXPORT_STRUCTUREappendcopydeepcopygetattrtuple)rretxr r r export_config4s zIO_Object.export_configcCsTi}tdd|jD}|D]2}t||s:tt||trtt||||<q|S)NcSsg|]}|d|dfqSrr .0rr r r <z0IO_Object.export_config_dict..)dictrr isinstanceboolrr)rconf type_formatskeyr r rexport_config_dict:s zIO_Object.export_config_dictc Cs|||t|jD]z\}\}}t||trzg}t}||D] }||vrB||||qB~t||t |qt||t ||qdSN) check_config enumeraterr'listsetraddsetattrrr) rr)all_io_objectsielementZdummyZ_confZ_setrr r r import_configBs    zIO_Object.import_configc Cs|||||D]f}t||s0ttjd|t||tr`t||tt t ||qt||t ||qdS)Nz-Internal error. '{}' is not a valid attribute) check_config_dicthasattrr r Z UNKNOWN_ERRORformatr'r0r3r fromkeysrr)rr)r4r+r r rimport_config_dictRs  "zIO_Object.import_config_dictcCstt|ts(ttjd|tdt|ft|dkr@ttjd|D]*}|sD||j vrDttjd||fqDdS)N'%s' not of type %s, but %srr!zname can't be emptyz'%s' is not allowed in '%s') r'strr r INVALID_TYPEtypelenZ INVALID_NAMEisalnumADDITIONAL_ALNUM_CHARS)rrcharr r r check_name^s     zIO_Object.check_namecCsht|t|jkr0ttjdt|t|jfi}t|jD]\}\}}||||<q>|||dS)Nz structure size mismatch %d != %d)rArr r r?r/r8)rr)r4Z conf_dictr5ryr r rr.kszIO_Object.check_configcCsptdd|jD}|D]R}|dd|jDvrBttjd||||||||||||qdS)NcSsg|]}|d|dfqSr r r"r r rr$wr%z/IO_Object.check_config_dict..cSsg|] \}}|qSr r )r#rrFr r rr$yr%zoption '{}' is not valid)r&rr r ZINVALID_OPTIONr:_check_config_structure _check_config)rr)r4r*r+r r rr8vs zIO_Object.check_config_dictcCsdSr-r )rZdummy1Zdummy2Zdummy3Zdummy4r r rrH~szIO_Object._check_configc CsTt|t|s,ttjd|t|t|ft|trnt|dkrRttjd||D]}|||dqVnt|trt|t|krttjd|t|ft |D]\}}||||qnt|t rPt| d\}}| D]b\}}t|t|s"ttjd|t|t|ft|t|sttjd|t|t|fqdS)Nr=r!zlen('%s') != 1rzlen('%s') != %d) r'r@r r r?r0rArGrr/r&items) rr)Z structurerr5valueZskeyZsvaluer+r r rrGsJ    z!IO_Object._check_config_structurecCs|}d}||jvr`d}|j|dur`|j|D],}||vrJ||q2ttjd||fq2||jvrd}|j|D]}||vrx||qx|sttjd||D]}ttjd||fqdS)NFTzMissing attribute %s for %szUnexpected element %sz%s: Unexpected attribute %s)ZgetNamesPARSER_REQUIRED_ELEMENT_ATTRSremover r Z PARSE_ERRORPARSER_OPTIONAL_ELEMENT_ATTRS)rrattrsZ_attrsfoundrr r rparser_check_element_attrss2      z$IO_Object.parser_check_element_attrsN)__name__ __module__ __qualname____doc__rZDBUS_SIGNATURErCrKrMrrr,r7r<rEr.r8rHrGrPr r r rr$s"  !rcs$eZdZfddZddZZS)UnexpectedElementErrorcstt|||_dSr-)superrUrrrr __class__r rrszUnexpectedElementError.__init__cCs d|jS)NzUnexpected element '%s')rrr r r__str__szUnexpectedElementError.__str__rQrRrSrrZ __classcell__r r rXrrUs rUcs$eZdZfddZddZZS)MissingAttributeErrorcstt|||_||_dSr-)rVr]rr attributerrr^rXr rrszMissingAttributeError.__init__cCsd|j|jfS)Nz$Element '%s': missing '%s' attributerr^rr r rrZs zMissingAttributeError.__str__r[r r rXrr]s r]cs$eZdZfddZddZZS)UnexpectedAttributeErrorcstt|||_||_dSr-)rVrarrr^r_rXr rrsz!UnexpectedAttributeError.__init__cCsd|j|jfS)Nz'Element '%s': unexpected attribute '%s'r`rr r rrZs z UnexpectedAttributeError.__str__r[r r rXrras rac@s4eZdZddZddZddZddZd d Zd S) rcCs||_d|_dSNr)item_element)rrcr r rrsz!IO_Object_ContentHandler.__init__cCs d|_dSrbrdrr r r startDocumentsz&IO_Object_ContentHandler.startDocumentcCs d|_dSrbre)rrrNr r r startElementsz%IO_Object_ContentHandler.startElementcCs*|dkr|j|j_n|dkr&|j|j_dS)Nshort description)rdrcrhrirWr r r endElements z#IO_Object_ContentHandler.endElementcCs|j|dd7_dS)N  )rdreplace)rZcontentr r r characterssz#IO_Object_ContentHandler.charactersN)rQrRrSrrfrgrjrnr r r rrs rc@seZdZddZddZdS)rcCsNtjj||j|_|j|_ig|_|jd|_ g|_ d|_ d|_ d|_ dS)Nzutf-8F)saxhandlerContentHandlerrwrite_writeflushZ_flushZ _ns_contextsZ_current_contextZ_undeclared_ns_maps _encodingZ_pending_start_elementZ_short_empty_elements)routr r rrs zIO_Object_XMLGenerator.__init__cCsF|d||D] \}}|d|t|fq|ddS)z* slightly modified startElement() N)rtrIsaxutilsZ quoteattr)rrrNrJr r r simpleElementsz$IO_Object_XMLGenerator.simpleElementN)rQrRrSrrzr r r rrsrcCst|}|dkr$ttjd|n`|dkr>ttjd|nF|durXttjd|n,t|dkr|d|dkrttjd|dS) Nzport number in '%s' is too bigroz'%s' is invalid port rangezport range '%s' is ambiguousrr!)r Z getPortRanger r Z INVALID_PORTrA)portZ port_ranger r rrs" rcCs|dvrttjd|dS)N)ZtcpZudpZsctpZdccpz)'%s' not from {'tcp'|'udp'|'sctp'|'dccp'})r r INVALID_PROTOCOLZprotocolr r rrs rcCst|sttj|dSr-)r Z checkProtocolr r r~rr r rrs rcCs$t||s ttjd||fdS)Nz'%s' is not valid %s address)r rr r Z INVALID_ADDR)Zipvaddrr r rr s  r)rT__all__Zxml.saxrpZxml.sax.saxutilsryr collectionsr Zfirewallr r Zfirewall.errorsr objectr ExceptionrUr]rarqrrrZ XMLGeneratorrrrrrr r r rs&