
Clone of suds 0.4 + suds-0.4-CVE-2013-2217.patch
概述
"Suds" 网络服务客户端是一个基于SOAP的轻量级Python客户端,采用LGPL许可证发布。
详细信息请访问:
版本 0.3.6 (04-31-09):
版本 0.3.5 (04-16-09):
版本 0.3.4 (02-24-09):
版本 0.3.3 (11-31-08):
版本 0.3.2 (11-7-08):
版本 0.3.1 (10-1-08):
版本 0.3 (9-30-08):
扩展了 0.2.9 中引入的多端口服务支持。此次新增功能支持多个服务定义 相同 的方法,suds 将正确处理。 请参见 '多端口服务' 一节。
添加对多文档 document/literal soap 绑定样式的支持。 请参见 '多文档 Document/Literal' 一节。
添加对 (xs:group, xs:attributeGroup) 标签的支持。
添加 Client.last_sent() 和 Client.last_received()。
版本 0.2.9 (9-09-08):
版本 0.2.8 (8-28-08):
更新 document/literal 绑定,始终发送由 引用的文档根元素。 在又一次仔细审查空间和用户输入后,似乎被引用的元素始终是文档根元素。
添加对 'binding' schemaLocation 到 namespace-uri 的支持。 这是针对那些没有指定 schemaLocation 但仍期望下载 schema 的导入。例如:Axis 引用了 'http://schemas.xmlsoap.org/soap/encoding/' 但没有提供 schemaLocation。因此,通过执行:
from suds.xsd.sxbasic import Import. Import.bind('http://schemas.xmlsoap.org/soap/encoding/')
该 schema 被绑定到一个 schemaLocation 并被下载。
基本解编组器不再需要 /schema/。 在重构期间本应移除但遗漏了。
更新客户端,将 kwargs 传递给 send(),并添加 /location/ kwarg 用于覆盖 wsdl 中的服务位置。
更新编组器,不为表示 同时 为可选且值为 None 的元素和/或属性的对象属性生成 XML。 * 更新工厂(构造器)以包含所有属性。 * 向 SchemaObject 添加 optional() 方法。
更新 wsdl,在指定了命名空间时覆盖操作中的命名空间。
修复 schema 加载问题——在处理导入前构建所有 schema。
更新打包,为提交到 fedora 做准备。
版本 0.2.7 (8-11-08):
版本 0.2.6 (8-5-08):
版本 0.2.5 (8-01-08):
对 (XSD) 包进行了大修。这种新的(合并)方法更简单,应该更可靠且更易维护。同时,由于合并后的 schema 通过字典查找进行查找,性能应会更好。
此次大修应能修复当前的 TypeNotFound 和 xs:extension/ 问题,希望如此 :-)。
修复 dateTime 打印错误。
为 builder.Builder 添加了针对自包含 xs 类型的无限递归预防。
版本 0.2.4 (7-28-08):
版本 0.2.3 (7-23-08):
版本 0.2.2 (7-8-08):
更新异常,通过使用 Exception.init() 设置 Exception.message 使其更符合标准的 Python 风格,如 ticket #14 所建议;更新绑定以引发 WebFault 并传递 (p)
在绑定中添加处理返回值中多个根节点的能力;以复合对象形式返回,与返回列表时不同。
修复 soapAction 未被引号括起的问题。
添加对 xs:all/ 的支持。
修复 SchemaObject 中的 unbounded() 方法。
将 schema 重构为新的 (xsd) 包。文件变得太大。向 Query 添加 execute() 方法,并改进 suds 使用 execute() 查询而不是直接使用 Schema.find()。 同时,将 schema 中简陋的 start() 方法以及查询递增逻辑移出。
添加 inject 关键字,用于注入传出的 SOAP 消息和/或传入的回复消息。 重构 SoapClient 并:
在 sax 中添加 Namespace 类,以更好地管理命名空间行为; 改进 suds 以导入并使用 Namespace。
更改用于解析引用类型(具有 @base="",@type="" 属性)的默认命名空间,以便在未指定前缀时使用 XML(节点)命名空间而非 targetNamespace。
按照 [email protected] 在 ticket #13 中的定义应用修复。
更新服务定义,以 " my_method(xs:int arg0, Person arg1) " 的形式显示服务方法,而不是 " my_method(arg0{xs:int}, arg1{Person}) ",这更接近传统的方法签名。
向解编组器添加 xsd/python 类型转换(仅 XBoolean);重构解编组器以使用 Content 类,这使 API 更简洁, 增加了编组器与解编组器之间的对称性,并为基于 schema 属性的类型转换提供了良好的机制。
使用 Appenders 重构编组器;向 resolve() 添加 nobuiltin 标志,以支持绑定中 returned_type() 和 returned_collection() 的修复。
添加对 (202,204) HTTP 状态码的支持。
添加 XBoolean 和映射;向 TreeResolver 添加 findattr() 以为类型转换做准备。
更新 schema 和 schema 属性加载(停止深度递归);更改导入的 schema,使其不再复制导入的 schema, 而是由导入代理将查找请求代理出去;添加 ServiceDefinition 类,提供更好的服务检查;同时提供命名空间映射并显示类型; schema 属性 API 简化;添加对 xs:any 和 xs:anyType 的支持;修复一些 schema 查找问题;对绑定类进行轻微重构; 添加大量调试日志(可能需要注释掉部分以提升性能,某些参数非常昂贵)。
添加 sudsobject.Property;属性是一个特殊的 Object,包含一个 (value) 属性,由构建器(工厂)返回给没有子元素的 schema 类型, 如 和 ;更新构建器、编组器和解析器以处理属性;同时更新解析器和 schema 以处理属性查找(之前缺失)。
为用户定义的 SOAP 头部打下基础。
根据 ticket #7 修复 elementFormDefault。
从绑定中移除未使用的 kwargs;在 wsdl 中缓存绑定;改进旧的 ServiceProxy 以委托给新的 Client API; 移除 nil_supported 关键字,改为通过 schema 中 的 'nillable' 属性自然处理。
添加对 属性标志(nillable 和 form)的支持。
添加 Proxy(第二代 API)类。
添加访问器/转换函数,使用户无需访问 x 属性。 同时添加 todict() 和 get_items() 以便于转换为字典和迭代。
在搜索引用时,先查找顶级元素的 @ref,然后再深入搜索。
向 SchemaObject 添加 derived()。这是为了确保所有派生类型(wsdl 类)都通过 xsi:type 限定, 而不必像 suds 早期版本那样为所有自定义类型手动指定 xsi:type。更新 literal 编组器,仅当需要指定类型时才添加 xsi:type。
版本 0.2.1 (5-8-08):
更新 schema.py 的 SchemaProperty 加载顺序,使 schema 分 3 步加载: 1) 构建原始树。 2) 解析诸如 @ref 和 @base 的依赖。 3) 根据需要提升孙节点以展平(反规范化)树。
wsdl 也被修改为仅加载 schema 一次并存储它。schema 集合被修改为分 2 步加载 schema: 1) 创建所有原始 schema 对象。 2) 加载 schema。
这确保了当本地 的 schema 被乱序引用时,可以找到它们。 sax.py 的 Element 接口已更改:attribute() 被 get() 和 set() 取代。 此外,可以使用 getitem 和 setitem 访问属性值。 sax.py 的 Epydocs 已更新。并且……最后 现在被正确支持。
修复日志记录:不要在 suds.init.logger() 中设置为 INFO;仅在根记录器上设置处理程序; 将记录器 (log) 从类移至模块,并使用 name 作为记录器名称。 注意:这意味着要启用 SOAP 消息日志记录,需执行: > > logging.getLogger('suds.serviceproxy').setLevel(logging.DEBUG) > -- 而不是 -- > > logging.getLogger('serviceproxy').setLevel(logging.DEBUG) >
添加对 (xsd) schema 节点的支持,这主要影响 Builder 返回的对象。
更新 serviceproxy.py:set_proxies() 以记录 DEBUG 而不是 INFO。
增强 schema str 以同时显示原始 XML 和模型(主要用于调试)。
版本 0.2 (04-28-08):
包含 rpc/encoded SOAP 样式的首次实现。
用 suds.sudsobject.Object 替换 Property 类。Property 类是很久以前开发的,目的略有不同。 suds 的 Object 是一种更简单(更直接)的方法,需要更少的代码,并且在调试器中工作得更好。
绑定(和编码)是按方法选择的,这与 wsdl 更一致。在 <= 0.1.7 中,绑定是在构造 ServiceProxy 时选择的,并用于所有服务方法。
绑定被存储为 self.binding。由于 WSDL 允许每个操作有不同的绑定样式和编码,Suds 需要以相同的方式工作。* (nil_supported) 和 (faults) 标志通过 **kwargs 传递给服务代理。除了这些标志外,还添加了 (http_proxy) 标志,并传递给 urllib2.Request 对象。支持以下参数:
faults = 引发服务器引发的故障(默认:True),否则从服务方法调用返回元组 (http code, object)。
nil_supported = 绑定将在值为 None 的节点上设置 xsi:nil="true",当此标志为 True 时(默认:True)。否则,发送空节点 <x/>。
proxy = 请求中指定的 http 代理(默认:{})。代理定义为 {protocol:proxy,}
支持 Http 代理(见上文)。
ServiceProxy 重构为委托给 SoapClient。由于服务代理通过 getattr() 公开 Web 服务,因此 ServiceProxy 类提供的任何属性(包括方法)都会隐藏 wsdl 定义的操作。因此,通过将所有内容移动到 SoapClient,wsdl 操作不再被隐藏,而无需在服务代理中使用 hoky 名称。相反,服务代理具有 __client__ 和 __factory__ 属性(实际上这些属性名称冲突风险很低)。目前,get_instance() 和 get_enum() 方法尚未移动以保持向后兼容性。不过,推荐的 API 变更应该是将:
version-0.1.7 (04-08-08):
添加了 Binding.nil_supported 来控制属性值(输出)为 None 和空标签(输入)的处理方式。
<x xsi:nil=true/>,而 <x/> 会被解组为 '',<x xsi:nil/> 会被解组为 None。<x/>,并且 <x/> 和 <x xsi:nil=true/> 都会被解组为 None。xsi:nil 实际上被忽略。Sax 处理器更新为处理 sax 解析器“分块”文本时的多个 character() 回调。当 node.text 为 None 时,将 node.text 设置为字符。否则,将字符追加。感谢 - [email protected]
将特殊的 (text) 属性替换为 __text__,以允许名为 "text" 的自然元素。
通过以下方式添加 unicode 支持:
__str__ 的类添加 __unicode__。__str__() 返回 __unicode__ 的 UTF-8 编码结果。对 schema.py 进行了重大重构。主要目标是为通过命名空间完全限定的类型查找做准备。完成后,属性值上的前缀将不再被剥离(清除)。 变更摘要:
__init__ 时创建,而不是按需创建。__cmp__ 排序。这确保具有相同名称的类型按以下顺序解析(Import, Complex, Simple, Element)。__init__ 时构建,而不是按需构建。<schema/> 节点效果更好,因为后者会切断与具有命名空间前缀映射的 wsdl 父元素的链接。<import/> 元素被正确处理,执行了对导入 schema 的 targetNamespace 和关联前缀映射的命名空间重新映射和前缀重新映射。
例如:SCHEMA-A 有前缀 (tns) 映射为 xmlns:tns=http://nsA,并且 targetNamespace=http://nsA。
SCHEMA-B 正在导入 schema A,并且有前缀 (abc) 映射为 xmlns:abc=http://nsABC。
SCHEMA-B 导入 A 为 <import namespace=http://nsB xxx schemaLocation=http://nsA/schema-a.xsd>。
因此,由于 SCHEMA-B 将使用前缀 (abc) 引用 SCHEMA-A 的元素,例如 abc:something,所以 SCHEMA-A 的 targetNamespace 必须更新为 http://nsABC,并且所有 type=tns:something 的元素必须更新为 type=abc:something,以便能够解析。修复了属性中节点以 (text, value) 形式添加时导致的解组问题。该问题是在重构绑定引入的。
修复了各种 Property 打印问题。
注意:
感谢 Coniuro 的 Jesper Noehr 提供了大部分 rpc/literal 绑定,并在 #suds 讨论中进行了大量合作。
version-0.1.6 (03-06-08):
<import namespace="" schemaLocation=""?>。当指定了 schemaLocation 时,会导入引用的 schema。version-0.1.5 (02-21-08):
version-0.1.4 (12-21-07):
version-0.1.3 (12-19-07):
version-0.1.2 (12-18-07):
此版本包含对 property 的更新,新增了:
__getitem__, __setitem__, __contans__version-0.1.1 (12-17-07):
此版本标志着在 fedora 托管下的第一个版本。
更改 sax 中的 ns 提升,防止在父节点已有该前缀时将其提升到父节点。
将绑定中的 returned_type() 更改为返回(未解析的)Element。
为了支持新功能并修复报告的错误,我正在进行 Suds 中提供输入/输出翻译的组件的重构和进化:
这次进化将在这些组件之间提供更好的对称性,如下所示:
Builder 和 Unmarshaller 将生成 python 对象(sudsobject.Object 的子类),这些对象具有:
并且
Marshaller(s) 在消费 Builder 或 Unmarshaller 生成的 python 对象时,将利用这些标准信息来生成适当的输出(XML/SOAP)。
0.2.1 的代码 大致 如此,但……并非完全如此。此外,实现中存在一些冗余。
在此过程中,将 Builder、Marshaller 和 Unmarshaller 类中常用的 schema 类型“查找”功能提取到一组“Resolver”类中是有意义的。这降低了 Builder、Marshaller 和 Unmarshaller 类的复杂性和冗余,并允许更好的模块化。一旦重构完成,literal/encoded Marshaller 之间的差异变得非常小。鉴于 bindings.literal 和 bindings.encoded 包中的代码量已经很小(并且还在变小),并且为了保持 Suds 代码库紧凑,我将所有编组类移到了 bindings.marshaller 模块。bindings.XX 子包将被移除。
最终效果:
Suds 的所有主要组件:
现在具有更好的:
……并更好地支持以下功能/错误修复:
*(修复)基于 属性的正确元素限定级别。这将确保当 elementFormDefault="qualified" 时,Suds 会为 literal 和 encoded 绑定在根元素上包含正确的命名空间。为了使这一点正常工作,literal 编组器(就像 encoded 编组器一样)需要感知 schema 类型。如果我没有采用上述重构而是向 literal 编组器添加与 encoded 编组器相同的 schema 类型查找,那么这两个类几乎会完全重复 :-(
Builder 和 Unmarshaller 使用 schema.Schema.find() 来解析 schema 类型。它们构建一个类似 "person.name.first" 的路径来在适当的上下文中解析类型。由于 Schema.find() 是无状态的,它在每次调用时都会解析中间的路径元素。新的 resolver 类是有状态的,并且以 更高 的效率解析子类型。
防止 sudsobject.Object 中的名称冲突,例如 items() 方法。我将所有方法(包括类方法)移到了一个 Factory 类中,该类作为类属性 ( factory ) 包含在 Object 类中。现在 所有 属性都遵循 Python 内置命名约定,我们不应该再有名称冲突。当然,这假设没有 wsdl/schema 实体名称会与 Python 内置命名约定冲突,但我必须在某个地方划清界限 :-)
service = ServiceProxy('myurl') person = service.get_instance('person')
... 替换为类似 ...
service = ServiceProxy('myurl') person = service.factory.get_instance('person')
经过几个版本,给用户时间切换到新 API 后,get_instance() 和 get_enum() 方法可能会被移除,届时会以大字通知。
修复了 wsdl 未定义 <schema/> 部分时,Suds 无法解析 http://www.w3.org/2001/XMLSchema 命名空间的前缀以检测内置类型(如 xs:string)的问题。
XML 输出编码为 UTF-8,与 HTTP 头部匹配并支持 unicode。
SchemaCollection 更改为提供 builtin() 和 custom() 方法。为了支持这一点,在 sax.py 的 Element 中添加了 findPrefixes() 方法。无论如何,这是一种更好的方法,因为 wsdl 和 schema 可能有许多指向 http://www.w3.org/2001/XMLSchema 的前缀。已在 doc/lit 和 rpc/lit 绑定上进行了测试。
重构了绑定包,从 document & rpc 改为 literal & encoded。
包含 完整 命名空间支持的完成,具体如下:
<import/> 导入的 Schema 应正确处理命名空间和前缀的映射以及根据需要重新映射。Property 按添加顺序维护属性名称(键)。这也意味着 get_item() 和 get_names() 返回有序的值。 (不过,我怀疑排序实际上应该在编组器中根据 wsdl/schema 中指定的顺序进行)