def DELETE(self, mail): """Delete a mailing list account. curl -X DELETE ... https://<server>/api/mail # same as `archive=yes` curl -X DELETE ... https://<server>/api/mail?archive=yes curl -X DELETE ... https://<server>/api/mail?archive=no Optional parameters (appended to URL): @archive - If set to `yes` (or no such parameter appended in URL), only account in (SQL/LDAP/...) backend will be removed (so that MTA won't accept new emails for this email address), but data on file system will be kept (by renaming the mailing list directory to `<listname>-<timestamp>`. If set to `no`, account in (SQL/LDAP/...) backend AND all data of this account on file system will be removed. """ form = web.input() qr = backend.remove_maillist(mail=mail) if not qr[0]: return api_render(qr) _archive = form.get('archive') if _archive not in ['yes', 'no']: _archive = 'yes' qr = mlmmj.delete_ml(mail=mail, archive=_archive) return api_render(qr)
def GET(self, mail): """Get mailing list profiles.""" # Make sure mailing list account exists if not backend.is_maillist_exists(mail=mail): return api_render((False, 'NO_SUCH_ACCOUNT')) if not mlmmj.is_maillist_exists(mail): return api_render((False, 'NO_SUCH_ACCOUNT')) # Get specified profile parameters. # If parameters are given, get values of them instead of all profile # parameters. form = web.input() _web_params = form.get('params', '').lower().strip().replace(' ', '').split(',') _web_params = [ p for p in _web_params if p in settings.MLMMJ_WEB_PARAMS ] if _web_params: web_params = _web_params else: web_params = settings.MLMMJ_WEB_PARAMS kvs = {} for _param in web_params: qr = mlmmj.get_web_param_value(mail=mail, param=_param) if qr[0]: kvs[_param] = qr[1]['value'] return api_render((True, kvs))
def proxyfunc(self, *args, **kw): try: client_ip = web.ctx.ip except: # No `ip` attr before starting http service. return None if not _is_allowed_client(client_ip): logger.error( '[{0}] Blocked request from disallowed client.'.format( client_ip)) return api_render((False, 'NOT_AUTHORIZED_API_CLIENT')) _auth_token = get_auth_token() if not _auth_token: return api_render((False, 'NO_API_AUTH_TOKEN')) else: logger.debug('[{0}] API AUTH TOKEN: {1:.8}...'.format( client_ip, _auth_token)) if _auth_token not in settings.api_auth_tokens: logger.error( '[{0}] Blocked request with invalid auth token: {1}.'.format( client_ip, _auth_token)) return api_render((False, 'INVALID_MLMMJADMIN_API_AUTH_TOKEN')) return func(self, *args, **kw)
def POST(self, mail): """ Add multiple subscribers to given subscription version. :param mail: email address of the mailing list account Available form parameters: `subscribers`: subscribers' email addresses. Multiple subscribers must be separated by comma. `subscription`: subscription version. either `normal`, `digest` or `nomail`. """ form = web.input() if 'add_subscribers' in form: subscribers = form.get('add_subscribers', '').replace(' ', '').split(',') subscribers = [ str(i).lower() for i in subscribers if utils.is_email(i) ] require_confirm = True if form.get('require_confirm') != 'yes': require_confirm = False subscription = form.get('subscription', 'normal') if subscription not in ['normal', 'digest', 'nomail']: subscription = 'normal' qr = mlmmj.add_subscribers(mail=mail, subscribers=subscribers, subscription=subscription, require_confirm=require_confirm) if not qr[0]: return api_render(qr) if 'remove_subscribers' in form: if form.get('remove_subscribers') == 'ALL': qr = mlmmj.remove_all_subscribers(mail=mail) else: subscribers = form.get('remove_subscribers', '').replace(' ', '').split(',') subscribers = [ str(i).lower() for i in subscribers if utils.is_email(i) ] qr = mlmmj.remove_subscribers(mail=mail, subscribers=subscribers) if not qr[0]: return api_render(qr) return api_render(True)
def PUT(self, mail): """ Update a mailing list account. curl -X PUT -d "name='new name'&disable_subscription=yes" https://<server>/api/mail """ form = web.input() qr = backend.update_maillist(mail=mail, form=form) if not qr[0]: return api_render(qr) qr = mlmmj.update_web_form_params(mail=mail, form=form) return api_render(qr)
def POST(self, mail): """Create a new mailing list account.""" mail = str(mail).lower() form = web.input() # Create account in backend qr = backend.add_maillist(mail=mail, form=form) if not qr[0]: return api_render(qr) # Create account in mlmmj qr = mlmmj.add_maillist_from_web_form(mail=mail, form=form) return api_render(qr)
def GET(self, subscriber): """Get mailing lists which the given subscriber subscribed to. :param subscriber: subscriber's email address. HTTP form parameters: `email_only`: if set to `yes`, return list of email addresses of subscribed lists. `query_all_lists`: If set to 'yes', will check all available mailing lists on server. If 'no', check only lists under same domain. """ subscriber = str(subscriber).lower() domain = subscriber.split('@', 1)[-1] form = web.input() email_only = False if form.get('email_only') == 'yes': email_only = True # Get mail addresses of existing accounts if form.get('query_all_lists') == 'yes': qr = backend.get_existing_maillists(domains=None) else: qr = backend.get_existing_maillists(domains=[domain]) if not qr[0]: return api_render(qr) existing_lists = qr[1] if not existing_lists: return api_render((True, [])) subscribed_lists = [] for i in existing_lists: qr = mlmmj.has_subscriber(mail=i, subscriber=subscriber, subscription=None) if qr: if email_only: subscribed_lists.append(i) else: subscribed_lists.append({'subscription': qr[1], 'mail': i}) return api_render((True, list(subscribed_lists)))
def GET(self, mail, subscriber): """Check whether given subscriber is member of given mailing list.""" mail = str(mail).lower() subscriber = str(subscriber).lower() qr = mlmmj.has_subscriber(mail=mail, subscriber=subscriber, subscription=None) return api_render(qr)
def GET(self, mail): """ Get subscribers of different subscription versions. If no version given, return subscribers of all subscription versions. :param mail: email address of the mailing list account Available HTTP query parameters: :param email_only: if set to `yes`, return a list of subscribers' mail addresses. otherwise return a dict: {'<subscription1>': [<mail>, <mail>, ...], '<subscription2>': [<mail>, <mail>, ...], '<subscription3>': [<mail>, <mail>, ...]} """ # Get extra parameters. qr = mlmmj.get_subscribers(mail=mail) return api_render(qr)
def GET(self, mail): """ Get subscribers of different subscription versions. If no version given, return subscribers of all subscription versions. :param mail: email address of the mailing list account Available HTTP query parameters: `email_only`: if present, return a list of subscribers' mail addresses. otherwise return a dict: {'<subscription1>': [<mail>, <mail>, ...], '<subscription2>': [<mail>, <mail>, ...], '<subscription3>': [<mail>, <mail>, ...]} """ # Get extra parameters. form = web.input() email_only = ('email_only' in form) qr = mlmmj.get_subscribers(mail=mail, email_only=email_only) return api_render(qr)
def POST(self, subscriber): """ Add one subscriber to multiple mailing lists. :param subscriber: email address of the subscriber Available form parameters: `lists`: mailing lists. Multilple mailing lists must be separated by comma. `require_confirm`: [yes|no]. If set to `no`, will not send subscription confirm to subscriber. Defaults to `yes`. `subscription`: possible subscription versions: normal, digest, nomail. """ subscriber = str(subscriber).lower() form = web.input() subscription = form.get('subscription', 'normal') if subscription not in mlmmj.subscription_versions: subscription = 'normal' # Get mailing lists lists = form.get('lists', '').replace(' ', '').split(',') lists = [str(i).lower() for i in lists if utils.is_email(i)] require_confirm = True if form.get('require_confirm') == 'no': require_confirm = False qr = mlmmj.subscribe_to_lists(subscriber=subscriber, lists=lists, subscription=subscription, require_confirm=require_confirm) return api_render(qr)
def invalid_auth_token(self, *args, **kw): return api_render((False, 'INVALID_MLMMJADMIN_API_AUTH_TOKEN'))
def no_auth_token(self, *args, **kw): return api_render((False, 'NO_API_AUTH_TOKEN'))
def not_allowed_client(self, *args, **kw): return api_render((False, 'NOT_AUTHORIZED_API_CLIENT'))