
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. См. раздел 'МНОГОДОКУМЕНТНЫЙ 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' schemaLocations к URI пространства имён.
Это для импортов, которые не указывают schemaLocation, но всё равно ожидают загрузки схемы.
Например: Axis ссылается на 'http://schemas.xmlsoap.org/soap/encoding/'
без schemaLocation. Таким образом, выполнив:
from suds.xsd.sxbasic import Import. Import.bind('http://schemas.xmlsoap.org/soap/encoding/')
Схема привязывается к schemaLocation и загружается.
Базовый демаршаллер не требует /schema/. Должен был быть удалён при рефакторинге, но был пропущен.
Обновлён клиент: передаёт kwargs в send() и добавлен /location/ kwarg для переопределения расположения сервиса в WSDL.
Обновлён маршаллер: НЕ создавать XML для атрибутов объектов, которые представляют элементы и/или атрибуты, являющиеся одновременно необязательными и имеющими значение None. * Обновлён factory (builder) для включения всех атрибутов. * Добавлен метод optional() в SchemaObject.
Обновлён wsdl для переопределения пространства имён в операции, если оно указано.
Исправлена проблема загрузки схемы — все схемы строятся до обработки импортов.
Обновлена упаковка в рамках подготовки к отправке в Fedora.
версия 0.2.7 (8-11-08):
версия 0.2.6 (8-5-08):
версия 0.2.5 (8-01-08):
Переработан пакет (XSD). Этот новый (сливающий) подход проще, надёжнее и проще в сопровождении. Также он должен обеспечить лучшую производительность, поскольку объединённая схема выполняет поиск через словарь.
Эта переработка должна исправить текущие проблемы TypeNotFound и xs:extension/, надеюсь :-).
Исправлена ошибка печати dateTime.
Добавлено предотвращение бесконечной рекурсии в builder.Builder для типов xsd, которые содержат сами себя.
версия 0.2.4 (7-28-08):
версия 0.2.3 (7-23-08):
версия 0.2.2 (7-8-08):
Обновлены исключения — теперь они более «стандартные» для Python за счёт использования Exception.init() для установки Exception.message, как предложено в запросе #14; обновлены привязки для генерации WebFault с передачей (p).
Добавлена возможность в привязках обрабатывать несколько корневых узлов в возвращаемых значениях; возвращаются как составной объект, в отличие от случая, когда возвращаются списки.
Исправлено soapAction — теперь заключается в кавычки.
Добавлена поддержка xs:all/.
Исправлен метод unbounded() в SchemaObject.
Выполнен рефакторинг схемы в новый пакет (xsd). Файлы стали слишком большими. В Query добавлен метод execute(),
и suds переведён на использование execute() запроса вместо прямого использования Schema.find().
Также перенесены кустарные методы start() из schema, а также инкремент запроса.
Добавлено ключевое слово inject, используемое для внедрения исходящих SOAP-сообщений и/или входящих ответных сообщений. Выполнен рефакторинг SoapClient:
Добавлен класс Namespace в sax для лучшего управления поведением пространств имён; suds переведён на импорт и использование Namespace.
Изменено пространство имён по умолчанию, используемое для разрешения ссылочных типов (имеющих атрибуты @base, @type) так, чтобы при отсутствии префикса использовалось пространство имён XML (узла) вместо targetNamespace.
Применено исправление, предложенное [email protected] в запросе #13.
Обновлено определение сервиса — теперь при выводе методы отображаются как ' my_method(xs:int arg0, Person arg1) ' вместо ' my_method(arg0{xs:int}, arg1{Person}) ', что больше похоже на традиционные сигнатуры методов.
Добавлено преобразование типов xsd/python в демаршаллер (только XBoolean); проведён рефакторинг демаршаллера с использованием класса Content, что делает API чище, добавляет симметрию между маршаллером(ами) и демаршаллером(ами), обеспечивает хороший механизм для преобразований типов на основе свойств схемы.
Выполнен рефакторинг маршаллера с Appenders; добавлен флаг nobuiltin в resolve() для поддержки исправления returned_type() и returnes_collection() в привязках.
Добавлена поддержка HTTP-кодов (202, 204).
Добавлен XBoolean и отображения; добавлен findattr() в TreeResolver в рамках подготовки к преобразованиям типов.
версия 0.2.1 (5-8-08):
Обновлена последовательность загрузки свойств схемы в schema.py: схема загружается в 3 этапа: 1) построить сырое дерево. 2) разрешить зависимости, такие как @ref и @base. 3) при необходимости продвигать внуков для сглаживания (денормализации) дерева.
WSDL также был изменён: схема загружается только один раз и сохраняется. Коллекция схем была изменена для загрузки схем в 2 этапа: 1) создать все сырые объекты схем. 2) загрузить схемы.
Это гарантирует, что локальные импортированные схемы могут быть найдены, даже если на них ссылаются не по порядку. Интерфейс Element в sax.py изменён: attribute() заменено на get() и set(). Также getitem и setitem могут использоваться для доступа к значениям атрибутов. Обновлены эпидоки для sax.py. И ... наконец, теперь поддерживается правильно.
Исправлено логирование: НЕ устанавливается уровень INFO в suds.init.logger(); обработчик устанавливается только на корневой логгер; логгер (log) перенесён из классов в модули, и для имени логгера используется name. ПРИМЕЧАНИЕ: Это означает, что для включения логирования SOAP-сообщений: > > logger('suds.serviceproxy').setLevel(logging.DEBUG) > -- вместо -- > > logger('serviceproxy').setLevel(logging.DEBUG) >
Добавлена поддержка узлов в схеме (xsd), что в первую очередь влияет на объекты, возвращаемые Builder.
Обновлён serviceproxy.py:set_proxies() — теперь логирует DEBUG вместо INFO.
Улучшена строка str схемы — показывает как сырой XML, так и модель (в основном для отладки).
версия-0.2 (04-28-08):
Содержит первую версию стиля rpc/encoded SOAP.
Класс Property заменён на suds.sudsobject.Object. Класс Property был разработан давно с несколько иной целью. Объект suds — это более простой (более прямой) подход, требующий меньше кода и лучше работающий в отладчике.
Привязка (Binding) (и кодировка) выбирается для каждого метода, что более согласовано с WSDL. В версиях <= 0.1.7 привязка выбиралась при создании ServiceProxy и использовалась для всех методов сервиса. Привязка хранилась как self.binding. Поскольку WSDL предусматривает отдельный стиль привязки и кодировку для каждой операции, Suds необходимо было изменить, чтобы работать таким же образом.* Флаги (nil_supported) и (faults) передаются в прокси службы через **kwargs. В дополнение к этим флагам был добавлен флаг (http_proxy), который передаётся объекту urllib2.Request. Поддерживаются следующие аргументы:
Поддержка HTTP-прокси (см. выше).
ServiceProxy рефакторинг для делегирования SoapClient. Поскольку прокси службы предоставляет веб-службы через getattr(), любой атрибут (включая методы), предоставляемый классом ServiceProxy, скрывает операции WS, определённые в WSDL. Итак, перенеся всё в SoapClient, операции WSDL больше не скрываются без необходимости использовать хитрые имена для атрибутов и методов в прокси службы. Вместо этого прокси службы имеет атрибуты client и factory (которые действительно должны иметь низкий риск коллизии имён). На данный момент методы get_instance() и get_enum() не были перенесены для сохранения обратной совместимости. Хотя предпочтительным изменением API было бы заменить:
service = ServiceProxy('myurl') person = service.get_instance('person')
... на что-то вроде ...
service = ServiceProxy('myurl') person = service.factory.get_instance('person')
После нескольких релизов, дающих пользователям время для перехода на новый API, методы get_instance() и get_enum() могут быть удалены с уведомлением большими буквами.
Исправлена проблема, когда WSDL не определяет раздел , и Suds не может разрешить префиксы для пространства имён http://www.w3.org/2001/XMLSchema для обнаружения встроенных типов, таких как (xs:string).
version-0.1.7 (04-08-08):
Добавлен Binding.nil_supported для управления обработкой значений свойств (out) = None и пустых тегов (in).
Обновлён обработчик SAX для обработки множественных обратных вызовов character(), когда анализатор SAX «разбивает» текст. Если node.text равен None, node.text устанавливается в символы. В противном случае символы добавляются. Спасибо - [email protected]
Заменён специальный атрибут (text) на text для возможности использования естественных элементов с именем «text»
Добавлена поддержка Unicode:
Вывод XML кодируется в UTF-8, что соответствует HTTP-заголовку и поддерживает Unicode.
SchemaCollection изменён для предоставления методов builtin() и custom(). Для поддержки этого в Element в sax.py был добавлен findPrefixes(). Это лучший подход, поскольку WSDL и схемы могут содержать много префиксов для http://www.w3.org/2001/XMLSchema. Протестировано с привязками doc/lit и rpc/lit
Рефакторинг пакетов привязок с document & rpc на literal & encoded
Содержит завершение полной поддержки пространств имён:
Property сохраняет имена атрибутов (ключи) в порядке добавления. Это также означает, что get_item() и get_names() возвращают упорядоченные значения. (Хотя я подозреваю, что упорядочивание действительно должно выполняться в маршалировщике с использованием порядка, указанного в WSDL/схеме)
Крупный рефакторинг schema.py. Основная цель — подготовка к поиску типов, полностью квалифицированных по пространству имён. После завершения префиксы на значениях атрибутов больше не будут удаляться (очищаться). Сводка изменений: 1) Классы наложения SchemaProperty создаются в init вместо создания по требованию. 2) Импорт схем выполняется новым классом Import вместо Schema. 3) Schema загружает свойства верхнего уровня с помощью фабрики. 4) Все списки /children/ SchemaProperty сортируются по cmp в производных классах SchemaProperty. Это гарантирует, что типы с одинаковыми именами разрешаются в следующем порядке: (Import, Complex, Simple, Element). 5) Все списки /children/ SchemaProperty создаются в init вместо создания по требованию. 6) Создан SchemaGroup и обновлён класс WSDL. Это лучше, чем агрегирование узлов в WSDL, что разрывает связь с родительским элементом WSDL, имеющим отображение префиксов пространств имён. 7) Элемент обрабатывается правильно: выполняется как переотображение пространства имён, так и переотображение префикса targetNamespace импортированной схемы и связанного с ним отображения префикса. Например: SCHEMA-A имеет префикс (tns), отображённый как xmlns:tns=http://nsA, и targetNamespace=http://nsA. SCHEMA-B импортирует схему A и имеет префикс (abc), отображённый как xmlns:abc=http://nsABC. SCHEMA-B импортирует A как <import namespace=http://nsB xxx schemaLocation=http://nsA/schema-a.xsd>. Итак, поскольку SCHEMA-B будет ссылаться на элементы SCHEMA-A с префиксом (abc), например abc:something, targetNamespace SCHEMA-A должен быть обновлён как http://nsABC, и все элементы с type=tns:something должны быть обновлены до type=abc:something, чтобы они могли быть разрешены.
Исправлена проблема демаршализации, когда узлы добавлялись в свойство как (text, value). Это было введено при рефакторинге привязок.
Исправлены различные проблемы печати Property.
Примечания:
Благодарность Jesper Noehr из Coniuro за большую часть привязки rpc/literal и за активное сотрудничество в #suds.
version-0.1.6 (03-06-08):
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):
Этот релиз содержит обновление для добавления свойств: * поддержка метаданных * переопределения: getitem, setitem, contans * изменения property(reader|writer) для использования property.metadata для обработки пространств имён XML-документов. * исправлены зависимости в setup.py.
version-0.1.1 (12-17-07):
Этот релиз знаменует первый релиз, размещённый на fedora hosted.
Обновлена загрузка схемы и свойств схемы (глубокая рекурсия остановлена); Изменены импортированные схемы: они больше не копируют импортированные схемы, вместо этого импорт проксирует запросы на поиск; Добавлен класс ServiceDefinition, обеспечивающий лучшую инспекцию сервиса; также предоставляет отображение пространств имён и показывает типы; упрощён API свойств схемы; добавлена поддержка xs:any и xs:anyType; исправлены некоторые проблемы поиска в схеме; незначительно реорганизованы классы привязок; добавлено много отладочного логирования (возможно, придётся закомментировать часть для производительности — некоторые аргументы дорогие).
Добавлен suds object.Property; свойство — это специальный объект, содержащий атрибут (value), возвращаемый Builder (factory) для типов схем без дочерних элементов, таких как: и ; Builder, Marshaller и Resolver обновлены для обработки Properties; Resolver, Schema также обновлены для обработки поиска атрибутов (этого не хватало).
Добавлена основа для пользовательских SOAP-заголовков.
Исправлен elementFormDefault согласно запросу #7.
Удалены неиспользуемые kwargs из привязок; кэшированы привязки в wsdl; выполнен перевод legacy ServiceProxy для делегирования {новому} API клиента; удалено ключевое слово nil_supported в пользу естественной обработки через атрибут 'nillable' на внутри схем.
Добавлена поддержка флагов атрибутов (nillable и form).
Добавлен класс Proxy (API второго поколения).
Добавлены функции доступа/преобразования, чтобы пользователю не приходилось обращаться к атрибутам x. Также добавлены todict() и get_items() для удобного преобразования в словарь и итерации.
Поиск элементов верхнего уровня по @ref выполняется до более глубокого поиска.
Добавлен derived() в SchemaObject. Это необходимо для того, чтобы все производные типы (классы wsdl) квалифицировались посредством xsi:type без необходимости указывать xsi:type для всех пользовательских типов, как это делалось в ранних версиях suds. Обновлён литеральный маршаллер: он теперь добавляет xsi:type только тогда, когда тип действительно нужно указать.
Изменено продвижение ns в sax для предотвращения продвижения ns к родителю, когда у родителя уже есть этот префикс.
Изменён returned_type() в привязках — теперь возвращается (неразрешённый) Element.
Для поддержки новых функций и исправления сообщённых ошибок я выполняю рефакторинг и, надеюсь, эволюцию компонентов Suds, которые обеспечивают преобразования ввода/вывода:
Эта эволюция обеспечит лучшую симметрию между этими компонентами следующим образом:
Builder и Unmarshaller будут создавать python-объекты (подкласс sudsobject.Object) со следующими атрибутами:
и
Marshaller(ы), потребляя python-объекты, созданные Builder или Unmarshaller, будут использовать эту стандартную информацию для создания соответствующего вывода (XML/SOAP).
Код версии 0.2.1 в основном ведёт себя так, но ... не совсем. Кроме того, реализации имеют некоторую избыточность.
При выполнении этой работы имело смысл вынести общую функциональность поиска типа схемы, используемую классами Builder, Marshaller и Unmarshaller, в иерархию классов «Resolver». Это снижает сложность и избыточность классов Builder, Marshaller и Unmarshaller и позволяет улучшить модульность. После завершения этого рефакторинга разница между литеральным и кодированным Marshaller стала очень маленькой. Учитывая, что объём кода в пакетах bindings.literal и bindings.encoded был небольшим (и становился ещё меньше), и в интересах компактности кодовой базы Suds, я перенёс все классы маршаллинга в модуль bindings.marshaller. Все подпакеты bindings.XX будут удалены.
Чистый эффект:
Все основные компоненты Suds:
Теперь обладают лучшей:
... и лучше обеспечивают следующие функции/исправления ошибок:
Builder и unmarshaller использовали Schema.find() для разрешения типов схем. Они строили путь вида "person.name.first" для разрешения типов в соответствующем контексте. Поскольку Schema.find() не имел состояния, он разрешал промежуточные элементы пути при каждом вызове. Новые классы resolver имеют состояние и разрешают дочерние типы гораздо эффективнее.
Предотвращение коллизий имён в sudsobject.Object, например, с методом items(). Я перенёс все методы (включая методы класса) в фабричный класс Factory, который включается в класс Object как атрибут класса ( factory ). Теперь, когда все атрибуты имеют встроенные имена Python, у нас больше не должно быть коллизий имён. Это, конечно, предполагает, что ни одно имя сущности wsdl/schema не будет иметь имя в соответствии с соглашением о встроенных именах Python, но где-то нужно провести черту :-)