Esempio n. 1
0
    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)
Esempio n. 2
0
    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))
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)))
Esempio n. 8
0
    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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)
Esempio n. 11
0
    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)
Esempio n. 12
0
 def invalid_auth_token(self, *args, **kw):
     return api_render((False, 'INVALID_MLMMJADMIN_API_AUTH_TOKEN'))
Esempio n. 13
0
 def no_auth_token(self, *args, **kw):
     return api_render((False, 'NO_API_AUTH_TOKEN'))
Esempio n. 14
0
 def not_allowed_client(self, *args, **kw):
     return api_render((False, 'NOT_AUTHORIZED_API_CLIENT'))