Projet

Général

Profil

0001-add-option-add_user_identifier-to-wscall-10806.patch

Benjamin Dauvergne, 06 juin 2016 12:55

Télécharger (5,49 ko)

Voir les différences:

Subject: [PATCH] add option add_user_identifier to wscall (#10806)

It adds the user first NameID of user's email as an URL parameter respectively
named NameID or email.
 help/fr/wf-wscall.page  |  7 +++++++
 tests/test_workflows.py | 32 ++++++++++++++++++++++++++++++++
 wcs/wf/wscall.py        | 20 +++++++++++++++++---
 3 files changed, 56 insertions(+), 3 deletions(-)
help/fr/wf-wscall.page
38 38
</p>
39 39

  
40 40
<p>
41
La case à cocher « Identifier l'utilisateur appelant » indique que l'identifiant
42
de fédération ou l'email si le premier est absent, doivent être ajoutés comme
43
paramètre d'URL. Le paramètre s'appelle <code>NameID</code> dans le premier cas
44
et <code>email</code> dans le second.
45
</p>
46

  
47
<p>
41 48
La case à cocher « Envoyer le formulaire (POST, en JSON) » indique que
42 49
l'ensemble des données du formulaire doivent être transmises, avec un appel de
43 50
type <code>POST</code>, dont le contenu correspondra au formulaire encodé au
tests/test_workflows.py
632 632
    formdef.fields = []
633 633
    formdef.store()
634 634

  
635
    user = pub.user_class()
636
    user.name_identifiers = ['xxx']
637
    user.store()
638

  
635 639
    formdata = formdef.data_class()()
640
    formdata.user = user
636 641
    formdata.just_created()
637 642
    formdata.store()
638 643

  
......
871 876
    assert qs['evalme'] == [formdata.get_display_id()]
872 877
    assert qs['str'] == ['abcd']
873 878

  
879
    item = WebserviceCallStatusItem()
880
    item.method = 'GET'
881
    item.post = False
882
    item.url = 'http://remote.example.net?in_url=1'
883
    item.add_user_identifier = True
884
    item.perform(formdata)
885
    assert http_requests.get_last('method') == 'GET'
886
    qs = urlparse.parse_qs(http_requests.get_last('url').split('?')[1])
887
    assert set(qs.keys()) == set(['in_url', 'NameID'])
888
    assert qs['in_url'] == ['1']
889
    assert qs['NameID'] == ['xxx']
890

  
891
    user.name_identifiers = []
892
    user.email = 'john.doe@example.com'
893
    user.store()
894
    item = WebserviceCallStatusItem()
895
    item.method = 'GET'
896
    item.post = False
897
    item.url = 'http://remote.example.net?in_url=1'
898
    item.add_user_identifier = True
899
    item.perform(formdata)
900
    assert http_requests.get_last('method') == 'GET'
901
    qs = urlparse.parse_qs(http_requests.get_last('url').split('?')[1])
902
    assert set(qs.keys()) == set(['in_url', 'email'])
903
    assert qs['in_url'] == ['1']
904
    assert qs['email'] == ['john.doe@example.com']
905

  
874 906

  
875 907
def test_timeout(pub):
876 908
    workflow = Workflow(name='timeout')
wcs/wf/wscall.py
109 109
    qs_data = None
110 110
    _method = None
111 111
    response_type = 'json'
112
    add_user_identifier = False
112 113

  
113 114
    action_on_4xx = ':stop'
114 115
    action_on_5xx = ':stop'
......
140 141
                'action_on_4xx', 'action_on_5xx', 'action_on_bad_data',
141 142
                'action_on_network_errors', 'notify_on_errors',
142 143
                'record_errors', 'label', 'method', 'response_type',
143
                'qs_data')
144
                'qs_data', 'add_user_identifier')
144 145

  
145 146
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
146 147
        if 'label' in parameters:
......
160 161
                    title=_('Query string data'),
161 162
                    value=self.qs_data or {},
162 163
                    element_value_type=ComputedExpressionWidget)
164
        if 'add_user_identifier' in parameters:
165
            form.add(CheckboxWidget, '%sadd_user_identifier' % prefix,
166
                    title=_('Add user identifier'),
167
                    value=self.add_user_identifier)
163 168
        methods = collections.OrderedDict(
164 169
                [('GET', _('GET')), ('POST', _('POST (JSON)'))])
165 170
        if 'method' in parameters:
......
244 249
            variables = get_publisher().substitutions.get_context_variables()
245 250
            url = get_variadic_url(url, variables)
246 251

  
247
        if self.qs_data:  # merge qs_data into url
252
        qs_data = self.qs_data or {}
253
        if self.add_user_identifier:
254
            user = formdata.get_user()
255
            if user:  # FIXME: what to I do if there is no user ? fail ? log ?
256
                if user.name_identifiers:
257
                    qs_data['NameID'] = user.name_identifiers[0]
258
                elif user.email:
259
                    qs_data['email'] = user.email
260
                # FIXME: what do I do if there is no identifier ? fail ? log ?
261
        if qs_data:  # merge qs_data into url
248 262
            publisher = get_publisher()
249 263
            parsed = urlparse.urlparse(url)
250 264
            qs = list(urlparse.parse_qsl(parsed.query))
251
            for key, value in self.qs_data.iteritems():
265
            for key, value in qs_data.iteritems():
252 266
                try:
253 267
                    value = self.compute(value, raises=True)
254 268
                    value = str(value)
255
-