示例#1
0
    def send_mail(self, data):
        portal = api.portal.get()
        storage = IDownloadTokenStorage(portal)
        mail_template = self.context.restrictedTraverse('@@mail_downloadtoken')

        comment = data['comment']
        subject = translate(_(u'mail_subject',
                              default=u'[${title}] Download link',
                              mapping={'title': self.context.Title().decode(
                                  'utf-8')}),
                            context=self.request)

        for email in data['recipients']:
            downloadtoken = storage.add(self.context, email)

            options = {'user': api.user.get_current(),
                       'date': DateTime(),
                       'link': storage.url(downloadtoken),
                       'comment': comment}
            mail = mail_template(**options)

            composer = HTMLComposer(
                message=mail,
                subject=subject,
                to_addresses=[(email, email)])
            composed = composer.render()

            mh = api.portal.get_tool(name='MailHost')
            mh.send(composed.as_string(),
                    mto=composed['To'],
                    mfrom=composed['From'])
        notify(DownloadlinkSent(self.context, data['recipients'], comment))
    def test_remove_item_from_storage(self):
        storage = IDownloadTokenStorage(self.portal)
        file_ = create(Builder('file'))

        added = storage.add(file_, '*****@*****.**')
        storage.remove(added)

        self.assertFalse(len(storage.get_storage()),
                         'Storage should be empty.')
    def test_downloadtoken_url(self):
        storage = IDownloadTokenStorage(self.portal)
        file_ = create(Builder('file'))

        added = storage.add(file_, '*****@*****.**')

        url = '{0}/download-token?token={1}'.format(
            self.portal.portal_url(),
            added.token)

        self.assertEquals(url, storage.url(added))
    def __call__(self):
        token = self.request.get('token', None)
        if token is None:
            raise BadRequest('No token')

        storage = IDownloadTokenStorage(self.context)
        downloadtoken = storage.get_downloadtoken(token)

        if downloadtoken is None:
            raise BadRequest('No valid token')

        return self.download_file(downloadtoken)
    def test_add_new_item_to_storage(self):
        storage = IDownloadTokenStorage(self.portal)
        file_ = create(Builder('file'))

        added = storage.add(file_, '*****@*****.**')

        self.assertEquals(1,
                          len(storage.get_storage()),
                          'Expect one item in storage')
        self.assertTrue(
            isinstance(storage.get_storage()[0], DownloadToken),
            'Item is not a DownloadToken instance.')
        self.assertEquals(added, storage.get_storage()[0])
示例#6
0
    def setUp(self):
        self.portal = self.layer['portal']
        self.storage = IDownloadTokenStorage(self.portal)

        wftool = getToolByName(self.portal, 'portal_workflow')
        wftool.setChainForPortalTypes(('Folder',),
                                      ('plone_workflow',))
示例#7
0
    def setUp(self):
        self.portal = self.layer['portal']
        self.mails = Mailing(self.portal)
        self.mails.set_up()

        self.storage = IDownloadTokenStorage(self.portal)

        wftool = getToolByName(self.portal, 'portal_workflow')
        wftool.setChainForPortalTypes(('Folder',),
                                      ('plone_workflow',))
        transaction.commit()

        folder = create(Builder('folder').in_state('private'))
        self.file_ = create(Builder('file')
            .titled('\xc3\xa4 file')
            .with_dummy_content()
            .within(folder))
    def test_storage_cleanup(self):
        storage = IDownloadTokenStorage(self.portal)
        file_ = create(Builder('file'))
        expiredtoken1 = storage.add(file_, '*****@*****.**')
        expiredtoken2 = storage.add(file_, '*****@*****.**')

        expiredtoken1.expiration_date = datetime.now() - timedelta(days=10)
        expiredtoken2.expiration_date = datetime.now() - timedelta(days=20)

        self.assertEquals(2,
                          len(storage.get_storage()),
                          'Expect two items')

        validtoken = storage.add(file_, '*****@*****.**')

        self.assertEquals(1,
                          len(storage.get_storage()),
                          'Expect only the last added item. The others are '
                          'expired and removed.')
        self.assertEquals(validtoken.token,
                          storage.get_storage()[0].token,
                          'Found the wrong token.')
    def test_get_inexistend_downloadtoken(self):
        storage = IDownloadTokenStorage(self.portal)
        file_ = create(Builder('file'))

        storage.add(file_, '*****@*****.**')
        self.assertIsNone(storage.get_downloadtoken('12345'))
示例#10
0
    def test_get_downloadtoken_by_token(self):
        storage = IDownloadTokenStorage(self.portal)
        file_ = create(Builder('file'))

        added = storage.add(file_, '*****@*****.**')
        self.assertEquals(added, storage.get_downloadtoken(added.token))
示例#11
0
    def test_extend_strorage(self):
        storage = IDownloadTokenStorage(self.portal)

        storage.get_storage().append('data')
        self.assertEquals(1, len(storage.get_storage()))
示例#12
0
    def test_initialize_storage(self):
        storage = IDownloadTokenStorage(self.portal)

        self.assertTrue(isinstance(storage.get_storage(), PersistentList),
                        'It has to be something persistent.')
示例#13
0
class TestStorage(TestCase):

    layer = FTW_DOWNLOADTOKEN_FUNCTIONAL_TESTING

    def setUp(self):
        self.portal = self.layer['portal']
        self.mails = Mailing(self.portal)
        self.mails.set_up()

        self.storage = IDownloadTokenStorage(self.portal)

        wftool = getToolByName(self.portal, 'portal_workflow')
        wftool.setChainForPortalTypes(('Folder',),
                                      ('plone_workflow',))
        transaction.commit()

        folder = create(Builder('folder').in_state('private'))
        self.file_ = create(Builder('file')
            .titled('\xc3\xa4 file')
            .with_dummy_content()
            .within(folder))

    def tearDown(self):
        Mailing(self.layer['portal']).tear_down()

    @browsing
    def test_send_mail_form(self, browser):
        browser.login().visit(self.file_, view='send-mail-form')
        browser.fill({'Recipients': '*****@*****.**'})
        browser.find('Send').click()

        self.assertEquals(1,
                          len(self.mails.get_messages()),
                          'Expect one message')

        self.assertEquals('{0}/view'.format(self.file_.absolute_url()),
                          browser.url)

    @browsing
    def test_send_mail_journalized(self, browser):
        eventtesting.clearEvents()
        browser.login().visit(self.file_, view='send-mail-form')
        browser.fill({'Recipients': '*****@*****.**',
                      'Comment': 'Test'})
        browser.find('Send').click()
        events = [e for e in eventtesting.getEvents()
                  if IJournalEntryEvent.providedBy(e)]
        self.assertEqual(1, len(events))
        self.assertIn(
            '*****@*****.**',
            self.file_.translate(events[0].action))
        self.assertEqual(u'Test', events[0].comment)

    @browsing
    def test_cancel_send_mail_form(self, browser):
        browser.login().visit(self.file_, view='send-mail-form')
        browser.find('Cancel').click()

        self.assertEquals(0,
                          len(self.mails.get_messages()),
                          'Expect one message')

        self.assertEquals('{0}/view'.format(self.file_.absolute_url()),
                          browser.url)

    @browsing
    def test_link_in_mail(self, browser):
        browser.login().visit(self.file_, view='send-mail-form')
        browser.fill({'Recipients': '*****@*****.**'})
        browser.find('Send').click()

        mail = self.mails.pop()
        url = get_link_from_email(mail)
        browser.logout().open(url)
        self.assertEquals('Test data', browser.contents)

        with self.assertRaises(Unauthorized):
            browser.visit(self.file_)

    @browsing
    def test_multiple_recipients(self, browser):
        browser.login().visit(self.file_, view='send-mail-form')
        browser.fill({'Recipients': '[email protected]\[email protected]'})
        browser.find('Send').click()

        self.assertEquals(2,
                          len(self.mails.get_messages()),
                          'Expect two messages')

        self.assertEquals(2,
                          len(self.storage.get_storage()),
                          'Expect two items')

    @browsing
    def test_send_mail_form_valid_email_addresses(self, browser):
        browser.login().visit(self.file_, view='send-mail-form')
        browser.fill({'Recipients': 'email@example\[email protected]'})
        browser.find('Send').click()

        statusmessages.error_messages()
        self.assertFalse(len(self.storage.get_storage()), 'Expect no tokens.')

        browser.fill({'Recipients': u'em\xe4il@example'})
        statusmessages.error_messages()
示例#14
0
class TestStorage(TestCase):

    layer = FTW_DOWNLOADTOKEN_FUNCTIONAL_TESTING

    def setUp(self):
        self.portal = self.layer['portal']
        self.storage = IDownloadTokenStorage(self.portal)

        wftool = getToolByName(self.portal, 'portal_workflow')
        wftool.setChainForPortalTypes(('Folder',),
                                      ('plone_workflow',))

    @browsing
    def test_download_fails_if_not_token_given(self, browser):
        with self.assertRaises(BadRequest):
            browser.visit(view='download-token')

    @browsing
    def test_download_fails_invalid_token_given(self, browser):
        url = self.portal.portal_url() + '/download-token?token=12345'
        with self.assertRaises(BadRequest):
            browser.open(url)

    @browsing
    def test_download_file_by_token(self, browser):
        folder = create(Builder('folder').in_state('private'))
        file_ = create(Builder('file')
                       .with_dummy_content()
                       .within(folder))

        with self.assertRaises(Unauthorized):
            browser.visit(file_)

        downloadtoken = self.storage.add(file_, '*****@*****.**')
        url = self.storage.url(downloadtoken)
        transaction.commit()

        browser.open(url)
        self.assertEquals('Test data', browser.contents)

    @browsing
    def test_download_file_by_token_journal(self, browser):
        eventtesting.clearEvents()
        folder = create(Builder('folder').in_state('private'))
        file_ = create(Builder('file')
                       .with_dummy_content()
                       .within(folder))

        with self.assertRaises(Unauthorized):
            browser.visit(file_)

        downloadtoken = self.storage.add(file_, '*****@*****.**')
        url = self.storage.url(downloadtoken)
        transaction.commit()
        browser.open(url)
        events = [e for e in eventtesting.getEvents()
                  if IJournalEntryEvent.providedBy(e)]
        self.assertEqual(1, len(events))
        self.assertEqual(u'*****@*****.**', events[0].actor)

    @browsing
    def test_download_fails_if_file_is_deleted(self, browser):
        folder = create(Builder('folder').in_state('private'))
        file_ = create(Builder('file')
                       .with_dummy_content()
                       .within(folder))

        downloadtoken = self.storage.add(file_, '*****@*****.**')
        url = self.storage.url(downloadtoken)

        folder.manage_delObjects([file_.getId()])
        transaction.commit()

        with self.assertRaises(NotFound):
            browser.open(url)