Projet

Général

Profil

0001-workflows-let-anonymous-signed-calls-trigger-jumps-9.patch

Frédéric Péters, 14 janvier 2016 13:57

Télécharger (5,2 ko)

Voir les différences:

Subject: [PATCH] workflows: let anonymous signed calls trigger jumps (#9659)

 tests/test_api.py        | 40 ++++++++++++++++++++++++++++++++++++++++
 tests/test_form_pages.py | 44 ++++++++++++++++++++++++++++++++++++++++++++
 wcs/wf/jump.py           |  9 +++++----
 3 files changed, 89 insertions(+), 4 deletions(-)
tests/test_api.py
18 18
from wcs.categories import Category
19 19
from wcs.data_sources import NamedDataSource
20 20
from wcs.workflows import Workflow
21
from wcs.wf.jump import JumpWorkflowStatusItem
21 22
from wcs import fields
22 23
from wcs.api import sign_url
23 24

  
......
780 781
    assert len(resp.json['data']) == 1
781 782
    resp = get_app(pub).get(sign_uri('/api/users/?q=foobar'))
782 783
    assert len(resp.json['data']) == 0
784

  
785
def test_workflow_trigger(pub, local_user):
786
    workflow = Workflow(name='test')
787
    st1 = workflow.add_status('Status1', 'st1')
788
    jump = JumpWorkflowStatusItem()
789
    jump.trigger = 'XXX'
790
    jump.status = 'st2'
791
    st1.items.append(jump)
792
    jump.parent = st1
793
    st2 = workflow.add_status('Status2', 'st2')
794
    workflow.store()
795

  
796
    FormDef.wipe()
797
    formdef = FormDef()
798
    formdef.name = 'test'
799
    formdef.fields = []
800
    formdef.workflow_id = workflow.id
801
    formdef.store()
802

  
803
    formdef.data_class().wipe()
804
    formdata = formdef.data_class()()
805
    formdata.just_created()
806
    formdata.store()
807
    assert formdef.data_class().get(formdata.id).status == 'wf-st1'
808

  
809
    resp = get_app(pub).post(sign_uri(formdata.get_url() + 'jump/trigger/XXX'),
810
            status=200)
811
    assert formdef.data_class().get(formdata.id).status == 'wf-st2'
812

  
813
    Role.wipe()
814
    role = Role(name='xxx')
815
    role.store()
816

  
817
    jump.by = [role.id]
818
    workflow.store()
819

  
820
    formdata.store() # (will get back to wf-st1)
821
    resp = get_app(pub).post(sign_uri(formdata.get_url() + 'jump/trigger/XXX'),
822
            status=403)
tests/test_form_pages.py
2164 2164
    resp = get_app(pub).get('/test/')
2165 2165
    assert ').autocomplete({' in resp.body
2166 2166
    assert 'http://example.net' in resp.body
2167

  
2168
def test_form_workflow_trigger(pub):
2169
    user = create_user(pub)
2170

  
2171
    formdef = create_formdef()
2172
    formdef.fields = []
2173
    formdef.store()
2174

  
2175
    workflow = Workflow(name='test')
2176
    st1 = workflow.add_status('Status1', 'st1')
2177
    jump = JumpWorkflowStatusItem()
2178
    jump.trigger = 'XXX'
2179
    jump.status = 'st2'
2180
    st1.items.append(jump)
2181
    jump.parent = st1
2182
    st2 = workflow.add_status('Status2', 'st2')
2183
    workflow.store()
2184

  
2185
    formdef.workflow_id = workflow.id
2186
    formdef.store()
2187

  
2188
    formdef.data_class().wipe()
2189
    formdata = formdef.data_class()()
2190
    formdata.just_created()
2191
    formdata.store()
2192
    assert formdef.data_class().get(formdata.id).status == 'wf-st1'
2193

  
2194
    app = get_app(pub)
2195
    resp = login(app, username='foo', password='foo').get('/')
2196
    resp = app.post(formdata.get_url() + 'jump/trigger/XXX', status=403)
2197

  
2198
    Role.wipe()
2199
    role = Role(name='xxx')
2200
    role.store()
2201

  
2202
    jump.by = [role.id]
2203
    workflow.store()
2204
    resp = app.post(formdata.get_url() + 'jump/trigger/XXX', status=403)
2205

  
2206
    user.roles = [role.id]
2207
    user.store()
2208
    resp = app.post(formdata.get_url() + 'jump/trigger/XXX', status=302)
2209

  
2210
    assert formdef.data_class().get(formdata.id).status == 'wf-st2'
wcs/wf/jump.py
27 27
from qommon.cron import CronJob
28 28

  
29 29
from wcs.workflows import Workflow, WorkflowStatusJumpItem, register_item_class
30
from wcs.api import get_user_from_api_query_string
30
from wcs.api import get_user_from_api_query_string, is_url_signed
31 31

  
32 32
def jump_and_perform(formdata, status, workflow_data=None):
33 33
    if workflow_data:
......
62 62
        if not get_request().get_method() == 'POST':
63 63
            raise errors.AccessForbiddenError()
64 64

  
65
        signed_request = is_url_signed()
65 66
        user = get_user_from_api_query_string() or get_request().user
66
        if not user:
67
            raise errors.AccessForbiddenError()
68 67
        for item in self.wfstatus.items:
69 68
            if not isinstance(item, JumpWorkflowStatusItem):
70 69
                continue
71 70
            if not hasattr(item, 'trigger'):
72 71
                continue
73 72
            if component == item.trigger:
74
                if not item.check_auth(self.formdata, user):
73
                if signed_request and not item.by:
74
                    pass
75
                elif not item.check_auth(self.formdata, user):
75 76
                    raise errors.AccessForbiddenError()
76 77
                get_request().trigger_name = component
77 78
                workflow_data = None
78
-