source:
ralphm-patches/pubsub-request-options-form.patch
@
28:4692e23155a3
Last change on this file since 28:4692e23155a3 was 27:a9704141033a, checked in by Ralph Meijer <ralphm@…>, 13 years ago | |
---|---|
File size: 9.9 KB |
-
wokkel/pubsub.py
Make PubSubRequest.options be a form and use new form type checking diff -r fac816de459a wokkel/pubsub.py
a b 356 356 """ 357 357 form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG) 358 358 if form: 359 if form.formType == 'submit': 360 self.options = form.getValues() 361 elif form.formType == 'cancel': 362 self.options = {} 359 if form.formType in ('submit', 'cancel'): 360 self.options = form 363 361 else: 364 raise BadRequest(text= "Unexpected form type %r" % form.formType)362 raise BadRequest(text=u"Unexpected form type '%s'" % form.formType) 365 363 else: 366 364 raise BadRequest(text="Missing configuration form") 367 365 … … 413 411 414 412 415 413 def _parse_options(self, verbElement): 414 """ 415 Parse options form out of a subscription options request. 416 """ 416 417 form = data_form.findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS) 417 418 if form: 418 if form.formType == 'submit': 419 self.options = form.getValues() 420 elif form.formType == 'cancel': 421 self.options = {} 419 if form.formType in ('submit', 'cancel'): 420 self.options = form 422 421 else: 423 raise BadRequest(text= "Unexpected form type %r" % form.formType)422 raise BadRequest(text=u"Unexpected form type '%s'" % form.formType) 424 423 else: 425 424 raise BadRequest(text="Missing options form") 426 425 426 427 427 def parseElement(self, element): 428 428 """ 429 429 Parse the publish-subscribe verb and parameters out of a request. … … 892 892 d = self.getNodes(requestor, target) 893 893 else: 894 894 d = defer.succeed([]) 895 896 897 895 898 896 d.addCallback(lambda nodes: [disco.DiscoItem(target, node) 899 897 for node in nodes]) … … 932 930 handlerName, argNames = self._legacyHandlers[request.verb] 933 931 handler = getattr(self, handlerName) 934 932 args = [getattr(request, arg) for arg in argNames] 933 if 'options' in argNames: 934 args[argNames.index('options')] = request.options.getValues() 935 935 d = handler(*args) 936 936 937 937 # If needed, translate the result into a response … … 996 996 return form 997 997 998 998 999 def _checkConfiguration(self, resource, values): 1000 options = resource.getConfigurationOptions() 1001 processedValues = {} 1002 1003 for key, value in values.iteritems(): 1004 if key not in options: 1005 continue 1006 1007 option = {'var': key} 1008 option.update(options[key]) 1009 field = data_form.Field.fromDict(option) 1010 if isinstance(value, list): 1011 field.values = value 1012 else: 1013 field.value = value 1014 field.typeCheck() 1015 1016 if isinstance(value, list): 1017 processedValues[key] = field.values 1018 else: 1019 processedValues[key] = field.value 1020 1021 return processedValues 999 def _checkConfiguration(self, resource, form): 1000 fieldDefs = resource.getConfigurationOptions() 1001 form.typeCheck(fieldDefs, filterUnknown=True) 1022 1002 1023 1003 1024 1004 def _preProcess_default(self, resource, request): … … 1049 1029 1050 1030 1051 1031 def _preProcess_configureSet(self, resource, request): 1052 if request.options: 1053 request.options = self._checkConfiguration(resource, 1054 request.options) 1032 if request.options.formType == 'cancel': 1033 return None 1034 else: 1035 self._checkConfiguration(resource, request.options) 1055 1036 return request 1056 else:1057 return None1058 1037 1059 1038 1060 1039 def _toResponse_items(self, result, resource, request): -
wokkel/test/test_pubsub.py
diff -r fac816de459a wokkel/test/test_pubsub.py
a b 1 # Copyright (c) 2003-20 09Ralph Meijer1 # Copyright (c) 2003-2010 Ralph Meijer 2 2 # See LICENSE for details. 3 3 4 4 """ … … 805 805 self.assertEqual(JID('pubsub.example.org'), request.recipient) 806 806 self.assertEqual('test', request.nodeIdentifier) 807 807 self.assertEqual(JID('user@example.org/Home'), request.subscriber) 808 self.assertEqual({'pubsub#deliver': '1'}, request.options )808 self.assertEqual({'pubsub#deliver': '1'}, request.options.getValues()) 809 809 810 810 811 811 def test_fromElementOptionsSetCancel(self): … … 825 825 """ 826 826 827 827 request = pubsub.PubSubRequest.fromElement(parseXml(xml)) 828 self.assertEqual( {}, request.options)828 self.assertEqual('cancel', request.options.formType) 829 829 830 830 831 831 def test_fromElementOptionsSetBadFormType(self): … … 840 840 <options node='test' jid='user@example.org/Home'> 841 841 <x xmlns='jabber:x:data' type='result'> 842 842 <field var='FORM_TYPE' type='hidden'> 843 <value>http://jabber.org/protocol/pubsub# node_config</value>843 <value>http://jabber.org/protocol/pubsub#subscribe_options</value> 844 844 </field> 845 845 <field var='pubsub#deliver'><value>1</value></field> 846 846 </x> … … 853 853 pubsub.PubSubRequest.fromElement, 854 854 parseXml(xml)) 855 855 self.assertEqual('bad-request', err.condition) 856 self.assertEqual("Unexpected form type 'result'", err.text) 856 857 self.assertEqual(None, err.appCondition) 857 858 858 859 … … 1053 1054 self.assertEqual(JID('pubsub.example.org'), request.recipient) 1054 1055 self.assertEqual('test', request.nodeIdentifier) 1055 1056 self.assertEqual({'pubsub#deliver_payloads': '0', 1056 'pubsub#persist_items': '1'}, request.options) 1057 'pubsub#persist_items': '1'}, 1058 request.options.getValues()) 1057 1059 1058 1060 1059 1061 def test_fromElementConfigureSetCancel(self): … … 1073 1075 """ 1074 1076 1075 1077 request = pubsub.PubSubRequest.fromElement(parseXml(xml)) 1076 self.assertEqual( {}, request.options)1078 self.assertEqual('cancel', request.options.formType) 1077 1079 1078 1080 1079 1081 def test_fromElementConfigureSetBadFormType(self): … … 1102 1104 pubsub.PubSubRequest.fromElement, 1103 1105 parseXml(xml)) 1104 1106 self.assertEqual('bad-request', err.condition) 1107 self.assertEqual("Unexpected form type 'result'", err.text) 1105 1108 self.assertEqual(None, err.appCondition) 1106 1109 1107 1110 … … 1895 1898 return defer.succeed({'pubsub#deliver_payloads': '0', 1896 1899 'pubsub#persist_items': '1', 1897 1900 'pubsub#owner': JID('user@example.org'), 1898 'x-myfield': ['a', 'b']})1901 'x-myfield': 'a'}) 1899 1902 1900 1903 def cb(element): 1901 1904 self.assertEqual('pubsub', element.name) … … 1968 1971 1969 1972 def configureSet(request): 1970 1973 self.assertEqual({'pubsub#deliver_payloads': False, 1971 'pubsub#persist_items': True}, request.options) 1974 'pubsub#persist_items': True}, 1975 request.options.getValues()) 1972 1976 return defer.succeed(None) 1973 1977 1974 1978 self.resource.getConfigurationOptions = getConfigurationOptions … … 2040 2044 2041 2045 def configureSet(request): 2042 2046 self.assertEquals(['pubsub#deliver_payloads'], 2043 request.options. keys())2047 request.options.fields.keys()) 2044 2048 2045 2049 self.resource.getConfigurationOptions = getConfigurationOptions 2046 2050 self.resource.configureSet = configureSet … … 2072 2076 2073 2077 def cb(result): 2074 2078 self.assertEquals('bad-request', result.condition) 2079 self.assertEqual("Unexpected form type 'result'", result.text) 2075 2080 2076 2081 d = self.handleRequest(xml) 2077 2082 self.assertFailure(d, error.StanzaError) … … 2595 2600 return d 2596 2601 2597 2602 2603 def test_setConfigurationOptionsDict(self): 2604 """ 2605 Options should be passed as a dictionary, not a form. 2606 """ 2607 2608 xml = """ 2609 <iq type='set' to='pubsub.example.org' 2610 from='user@example.org'> 2611 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2612 <configure node='test'> 2613 <x xmlns='jabber:x:data' type='submit'> 2614 <field var='FORM_TYPE' type='hidden'> 2615 <value>http://jabber.org/protocol/pubsub#node_config</value> 2616 </field> 2617 <field var='pubsub#deliver_payloads'><value>0</value></field> 2618 <field var='pubsub#persist_items'><value>1</value></field> 2619 </x> 2620 </configure> 2621 </pubsub> 2622 </iq> 2623 """ 2624 2625 def getConfigurationOptions(): 2626 return { 2627 "pubsub#persist_items": 2628 {"type": "boolean", 2629 "label": "Persist items to storage"}, 2630 "pubsub#deliver_payloads": 2631 {"type": "boolean", 2632 "label": "Deliver payloads with event notifications"} 2633 } 2634 2635 def setConfiguration(requestor, service, nodeIdentifier, options): 2636 self.assertEquals({'pubsub#deliver_payloads': False, 2637 'pubsub#persist_items': True}, options) 2638 2639 2640 self.service.getConfigurationOptions = getConfigurationOptions 2641 self.service.setConfiguration = setConfiguration 2642 return self.handleRequest(xml) 2643 2644 2598 2645 def test_items(self): 2599 2646 """ 2600 2647 Non-overridden L{PubSubService.items} yields unsupported error.
Note: See TracBrowser
for help on using the repository browser.