diff --git a/weboob/applications/pastoob/pastoob.py b/weboob/applications/pastoob/pastoob.py index 0b0a2a6c..fb788d78 100644 --- a/weboob/applications/pastoob/pastoob.py +++ b/weboob/applications/pastoob/pastoob.py @@ -102,8 +102,8 @@ class Pastoob(ReplApplication): p.public = params.get('public') p.title = os.path.basename(filename) p.contents = contents - backend.post_paste(p) + backend.post_paste(p, max_age=params.get('max_age')) print 'Successfuly posted paste: %s' % p.page_url def _get_params(self): - return {'public': True} + return {'public': True, 'max_age': 3600*24*3} diff --git a/weboob/backends/pastealacon/backend.py b/weboob/backends/pastealacon/backend.py index 2ae390d5..57a79ce0 100644 --- a/weboob/backends/pastealacon/backend.py +++ b/weboob/backends/pastealacon/backend.py @@ -20,7 +20,7 @@ from __future__ import with_statement -from weboob.capabilities.paste import ICapPaste +from weboob.tools.capabilities.paste import BasePasteBackend from weboob.tools.backend import BaseBackend from weboob.capabilities.base import NotLoaded @@ -31,7 +31,7 @@ from .paste import PastealaconPaste __all__ = ['PastealaconBackend'] -class PastealaconBackend(BaseBackend, ICapPaste): +class PastealaconBackend(BaseBackend, BasePasteBackend): NAME = 'pastealacon' MAINTAINER = 'Laurent Bachelier' EMAIL = 'laurent@bachelier.name' @@ -40,12 +40,21 @@ class PastealaconBackend(BaseBackend, ICapPaste): LICENSE = 'AGPLv3+' BROWSER = PastealaconBrowser + EXPIRATIONS = { + 24*3600: 'd', + 24*3600*30: 'm', + False: 'f', + } + def new_paste(self, *args, **kwargs): return PastealaconPaste(*args, **kwargs) - def can_post(self, public=None): + def can_post(self, public=None, max_age=None): if public is False: return 0 + if max_age is not None: + if self.get_closest_expiration(max_age) is None: + return 0 return 1 def get_paste(self, _id): @@ -65,8 +74,12 @@ class PastealaconBackend(BaseBackend, ICapPaste): self.browser.fill_paste(paste) return paste - def post_paste(self, paste): + def post_paste(self, paste, max_age = None): + if max_age is not None: + expiration = self.get_closest_expiration(max_age) + else: + expiration = None with self.browser: - self.browser.post_paste(paste) + self.browser.post_paste(paste, expiration=self.EXPIRATIONS.get(expiration)) OBJECTS = {PastealaconPaste: fill_paste} diff --git a/weboob/backends/pastealacon/browser.py b/weboob/backends/pastealacon/browser.py index aa5f7fd1..c5291a1b 100644 --- a/weboob/backends/pastealacon/browser.py +++ b/weboob/backends/pastealacon/browser.py @@ -66,9 +66,9 @@ class PastealaconBrowser(BaseBrowser): except BrowserHTTPNotFound: raise PasteNotFound() - def post_paste(self, paste): + def post_paste(self, paste, expiration=None): self.home() - self.page.post(paste) + self.page.post(paste, expiration=expiration) if self.is_on_page(CaptchaPage): raise BrowserUnavailable("Detected as spam and unable to handle the captcha") paste.id = self.page.get_id() diff --git a/weboob/backends/pastealacon/pages.py b/weboob/backends/pastealacon/pages.py index c1dfabba..2d54a074 100644 --- a/weboob/backends/pastealacon/pages.py +++ b/weboob/backends/pastealacon/pages.py @@ -47,11 +47,12 @@ class PastePage(BasePage): return self.group_dict['id'] class PostPage(BasePage): - def post(self, paste): + def post(self, paste, expiration=None): self.browser.select_form(name='editor') self.browser['code2'] = paste.contents.encode(self.browser.ENCODING) self.browser['poster'] = paste.title.encode(self.browser.ENCODING) - self.browser['expiry'] = ['m'] + if expiration: + self.browser['expiry'] = [expiration] self.browser.submit() class CaptchaPage(BasePage): diff --git a/weboob/backends/pastealacon/test.py b/weboob/backends/pastealacon/test.py index b43000a1..cd6e190c 100644 --- a/weboob/backends/pastealacon/test.py +++ b/weboob/backends/pastealacon/test.py @@ -46,7 +46,7 @@ class PastealaconTest(BackendTest): def test_post(self): p = self.backend.new_paste(None, title='ouiboube', contents=u'Weboob Test héhéhé') - self.backend.post_paste(p) + self.backend.post_paste(p, max_age=3600*24) assert p.id self.backend.fill_paste(p, ['title']) assert p.title == 'ouiboube' @@ -83,3 +83,9 @@ class PastealaconTest(BackendTest): def test_can_post(self): assert 0 == self.backend.can_post(public=False) assert 1 == self.backend.can_post(public=True) + assert 0 == self.backend.can_post(public=True, max_age=600) + assert 1 == self.backend.can_post(public=True, max_age=3600*24) + assert 1 == self.backend.can_post(public=True, max_age=3600*24*3) + assert 1 == self.backend.can_post(public=True, max_age=False) + assert 1 == self.backend.can_post(public=None, max_age=False) + assert 1 == self.backend.can_post(public=True, max_age=3600*24*40) diff --git a/weboob/backends/pastebin/backend.py b/weboob/backends/pastebin/backend.py index 9fe26671..cbcc99c0 100644 --- a/weboob/backends/pastebin/backend.py +++ b/weboob/backends/pastebin/backend.py @@ -20,7 +20,7 @@ from __future__ import with_statement -from weboob.capabilities.paste import ICapPaste +from weboob.tools.capabilities.paste import BasePasteBackend from weboob.tools.backend import BaseBackend from weboob.capabilities.base import NotLoaded from weboob.tools.value import Value, ValuesDict @@ -32,7 +32,7 @@ from .paste import PastebinPaste __all__ = ['PastebinBackend'] -class PastebinBackend(BaseBackend, ICapPaste): +class PastebinBackend(BaseBackend, BasePasteBackend): NAME = 'pastebin' MAINTAINER = 'Laurent Bachelier' EMAIL = 'laurent@bachelier.name' @@ -44,10 +44,21 @@ class PastebinBackend(BaseBackend, ICapPaste): Value('apikey', label='Optional API key', default='', masked=True), ) + EXPIRATIONS = { + 600: '10M', + 3600: '1H', + 3600*24: '1D', + 3600*24*30: '1M', + False: 'N', + } + def new_paste(self, *args, **kwargs): return PastebinPaste(*args, **kwargs) - def can_post(self, public=None): + def can_post(self, public=None, max_age=None): + if max_age is not None: + if self.get_closest_expiration(max_age) is None: + return 0 return 1 def get_paste(self, _id): @@ -67,11 +78,15 @@ class PastebinBackend(BaseBackend, ICapPaste): self.browser.fill_paste(paste) return paste - def post_paste(self, paste): + def post_paste(self, paste, max_age=None): + if max_age is not None: + expiration = self.get_closest_expiration(max_age) + else: + expiration = None with self.browser: if self.config['apikey']: - self.browser.api_post_paste(self.config['apikey'], paste) + self.browser.api_post_paste(self.config['apikey'], paste, expiration=self.EXPIRATIONS.get(expiration)) else: - self.browser.post_paste(paste) + self.browser.post_paste(paste, expiration=self.EXPIRATIONS.get(expiration)) OBJECTS = {PastebinPaste: fill_paste} diff --git a/weboob/backends/pastebin/browser.py b/weboob/backends/pastebin/browser.py index 09f86181..f0cd63f9 100644 --- a/weboob/backends/pastebin/browser.py +++ b/weboob/backends/pastebin/browser.py @@ -70,12 +70,12 @@ class PastebinBrowser(BaseBrowser): except BrowserHTTPNotFound: raise PasteNotFound() - def post_paste(self, paste): + def post_paste(self, paste, expiration=None): self.home() - self.page.post(paste) + self.page.post(paste, expiration=expiration) paste.id = self.page.get_id() - def api_post_paste(self, dev_key, paste): + def api_post_paste(self, dev_key, paste, expiration=None): data = {'api_dev_key': dev_key, 'api_option': 'paste', 'api_paste_expire_date': '1M', @@ -84,6 +84,8 @@ class PastebinBrowser(BaseBrowser): } if paste.title: data['api_paste_name'] = paste.title.encode(self.ENCODING) + if expiration: + data['api_paste_expire_date'] = expiration res = self.readurl(self.API_URL, urllib.urlencode(data)).decode(self.ENCODING) self._validate_api_response(res) paste.id = re.match('^%s$' % self.PASTE_URL, res).groupdict()['id'] diff --git a/weboob/backends/pastebin/pages.py b/weboob/backends/pastebin/pages.py index 091feeaa..58592cef 100644 --- a/weboob/backends/pastebin/pages.py +++ b/weboob/backends/pastebin/pages.py @@ -48,10 +48,11 @@ class PastePage(BasePage): class PostPage(BasePage): - def post(self, paste): + def post(self, paste, expiration=None): self.browser.select_form(name='myform') self.browser['paste_code'] = paste.contents.encode(self.browser.ENCODING) self.browser['paste_name'] = paste.title.encode(self.browser.ENCODING) self.browser['paste_private'] = ['0' if paste.public else '1'] - self.browser['paste_expire_date'] = ['1M'] + if expiration: + self.browser['paste_expire_date'] = [expiration] self.browser.submit() diff --git a/weboob/backends/pastebin/test.py b/weboob/backends/pastebin/test.py index 80eabe37..365fddf2 100644 --- a/weboob/backends/pastebin/test.py +++ b/weboob/backends/pastebin/test.py @@ -44,7 +44,7 @@ class PastebinTest(BackendTest): def test_post(self): p = self.backend.new_paste(None, title='ouiboube', contents='Weboob Test', public=True) - self.backend.post_paste(p) + self.backend.post_paste(p, max_age=600) assert p.id self.backend.fill_paste(p, ['title']) assert p.title == 'ouiboube' @@ -54,7 +54,7 @@ class PastebinTest(BackendTest): def test_specialchars(self): # post a paste and get the contents through the HTML response p1 = self.backend.new_paste(None, title='ouiboube', contents=u'Weboob ¿¡', public=False) - self.backend.post_paste(p1) + self.backend.post_paste(p1, max_age=600) assert p1.id assert p1.public is False @@ -82,3 +82,9 @@ class PastebinTest(BackendTest): assert self.backend.can_post(public=None) > 0 assert self.backend.can_post(public=True) > 0 assert self.backend.can_post(public=False) > 0 + assert self.backend.can_post(public=True, max_age=600) > 0 + assert self.backend.can_post(public=True, max_age=3600*24) > 0 + assert self.backend.can_post(public=True, max_age=3600*24*3) > 0 + assert self.backend.can_post(public=True, max_age=False) > 0 + assert self.backend.can_post(public=None, max_age=False) > 0 + assert self.backend.can_post(public=True, max_age=3600*24*40) > 0 diff --git a/weboob/capabilities/paste.py b/weboob/capabilities/paste.py index d2136be4..2ce31f12 100644 --- a/weboob/capabilities/paste.py +++ b/weboob/capabilities/paste.py @@ -64,7 +64,7 @@ class ICapPaste(IBaseCap): """ raise NotImplementedError() - def can_post(self, public=None): + def can_post(self, public=None, max_age=None): """ Checks if the paste can be pasted by this backend. Some properties are considered required (public/private, max_age) while others @@ -89,7 +89,7 @@ class ICapPaste(IBaseCap): """ raise NotImplementedError() - def post_paste(self, _id): + def post_paste(self, paste, max_age=None): """ Post a paste.