Exemplo n.º 1
0
    def emit(self, context, request):
        # Get community in which event occurred and alert members
        community = find_community(context)
        if community is None:
            return  # Will be true for a mailin test trace
        profiles = find_profiles(context)
        all_names = community.member_names | community.moderator_names

        threaded = get_config_setting('use_threads_to_send_email', False) in (True, 'true', 'True')  # noqa
        mailer = getUtility(IMailDelivery)
        if threaded:
            mailer = ThreadedGeneratorMailDelivery()
        queue = []

        reply_enabled = get_setting(context, 'reply_by_email_enabled', True)

        for profile in [profiles[name] for name in all_names]:
            alert = getMultiAdapter((context, profile, request), IAlert)
            preference = profile.get_alerts_preference(community.__name__)
            alert = getMultiAdapter((context, profile, request), IAlert)

            alert.reply_enabled = reply_enabled

            if preference == IProfile.ALERT_IMMEDIATELY:
                if threaded:
                    queue.append(alert)
                else:
                    self._send_immediately(mailer, alert)
            elif preference in (IProfile.ALERT_DAILY_DIGEST,
                                IProfile.ALERT_WEEKLY_DIGEST,
                                IProfile.ALERT_BIWEEKLY_DIGEST):
                self._queue_digest(alert, profile, community.__name__)

        if queue:
            mailer.sendGenerator(_send_alert_queue, mailer, queue)
Exemplo n.º 2
0
    def bounce_message_throttled(self, message):
        mailer = getUtility(IMailDelivery)
        from_email = get_config_setting('postoffice.bounce_from_email')
        if from_email is None:
            from_email = get_setting(self.root, 'admin_email')

        bounce_message = Message()
        bounce_message['From'] = from_email
        bounce_message['To'] = message['From']
        bounce_message['Subject'] = 'Your submission to Karl has bounced.'
        bounce_message.set_type('text/html')
        bounce_message.set_payload(
            render(
                'templates/bounce_email_throttled.pt',
                dict(
                    subject=message.get('Subject'),
                    system_name=get_setting(self.root, 'title', 'KARL'),
                    admin_email=get_setting(self.root, 'admin_email'),
                ),
            ).encode('UTF-8'), 'UTF-8')

        self.queue.bounce(message,
                          wrap_send(mailer.bounce),
                          from_email,
                          bounce_message=bounce_message)
Exemplo n.º 3
0
 def dsn(self):
     dsn = self._v_dsn
     if dsn is None:
         dsn = get_config_setting('pgtextindex.dsn')
         if dsn is None:
             raise ValueError("Missing setting: pgtextindex.dsn")
         self._v_dsn = dsn
     return dsn
Exemplo n.º 4
0
 def dsn(self):
     dsn = self._v_dsn
     if dsn is None:
         dsn = get_config_setting('pgtextindex.dsn')
         if dsn is None:
             raise ValueError("Missing setting: pgtextindex.dsn")
         self._v_dsn = dsn
     return dsn
Exemplo n.º 5
0
 def quarantine_message(self, message):
     mailer = getUtility(IMailDelivery)
     from_email = get_config_setting('postoffice.bounce_from_email')
     if from_email is None:
         from_email = get_setting(self.root, 'admin_email')
     error = traceback.format_exc()
     self.queue.quarantine(message, error, wrap_send(mailer.bounce),
                           from_email)
     log.error("Message quarantined by mailin.", exc_info=True)
     return error
Exemplo n.º 6
0
 def quarantine_message(self, message):
     mailer = getUtility(IMailDelivery)
     from_email = get_config_setting('postoffice.bounce_from_email')
     if from_email is None:
         from_email = get_setting(self.root, 'admin_email')
     error = traceback.format_exc()
     self.queue.quarantine(message, error, wrap_send(mailer.bounce),
                           from_email)
     log.error("Message quarantined by mailin.", exc_info=True)
     return error
Exemplo n.º 7
0
Arquivo: login.py Projeto: lslaz1/karl
    def __call__(self):
        if self.request.params.get('form.submitted', None) is not None:
            resp = self.login()
            if resp:
                # if this returned with something, we deal with it
                return resp

        # Log in user seamlessly with kerberos if enabled
        try_kerberos = self.request.GET.get('try_kerberos', None)
        if try_kerberos:
            try_kerberos = asbool(try_kerberos)
        else:
            try_kerberos = asbool(get_config_setting('kerberos', 'False'))
        if try_kerberos:
            from karl.security.kerberos_auth import get_kerberos_userid
            userid = get_kerberos_userid(self.request)
            if userid:
                return remember_login(self.context, self.request, userid, None)

            # Break infinite loop if kerberos authorization fails
            if (self.request.authorization
                    and self.request.authorization[0] == 'Negotiate'):
                try_kerberos = False

        page_title = 'Login to %s' % get_setting(self.context, 'title')
        api = TemplateAPI(self.context, self.request, page_title)

        sso_providers = []
        sso = self.settings.get('sso')
        if sso:
            # importing here rather than in global scope allows to only require
            # velruse be installed for systems using it.
            from velruse import login_url
            for name in sso.split():
                provider = self.settings.get('sso.%s.provider' % name)
                title = self.settings.get('sso.%s.title' % name)
                sso_providers.append({
                    'title': title,
                    'name': name,
                    'url': login_url(self.request, provider)
                })

        api.status_message = self.request.params.get('reason', None)
        response = render_to_response(
            'templates/login.pt',
            dict(api=api,
                 nothing='',
                 try_kerberos=try_kerberos,
                 sso_providers=sso_providers,
                 came_from=self.request.params.get('came_from', ''),
                 app_url=self.request.application_url),
            request=self.request)
        forget_headers = forget(self.request)
        response.headers.extend(forget_headers)
        return response
Exemplo n.º 8
0
Arquivo: login.py Projeto: lslaz1/karl
    def __call__(self):
        if self.request.params.get('form.submitted', None) is not None:
            resp = self.login()
            if resp:
                # if this returned with something, we deal with it
                return resp

        # Log in user seamlessly with kerberos if enabled
        try_kerberos = self.request.GET.get('try_kerberos', None)
        if try_kerberos:
            try_kerberos = asbool(try_kerberos)
        else:
            try_kerberos = asbool(get_config_setting('kerberos', 'False'))
        if try_kerberos:
            from karl.security.kerberos_auth import get_kerberos_userid
            userid = get_kerberos_userid(self.request)
            if userid:
                return remember_login(self.context, self.request, userid, None)

            # Break infinite loop if kerberos authorization fails
            if (self.request.authorization and
                    self.request.authorization[0] == 'Negotiate'):
                try_kerberos = False

        page_title = 'Login to %s' % get_setting(self.context, 'title')
        api = TemplateAPI(self.context, self.request, page_title)

        sso_providers = []
        sso = self.settings.get('sso')
        if sso:
            # importing here rather than in global scope allows to only require
            # velruse be installed for systems using it.
            from velruse import login_url
            for name in sso.split():
                provider = self.settings.get('sso.%s.provider' % name)
                title = self.settings.get('sso.%s.title' % name)
                sso_providers.append({'title': title, 'name': name,
                                      'url': login_url(self.request, provider)})

        api.status_message = self.request.params.get('reason', None)
        response = render_to_response(
            'templates/login.pt',
            dict(
                api=api,
                nothing='',
                try_kerberos=try_kerberos,
                sso_providers=sso_providers,
                came_from=self.request.params.get('came_from', ''),
                app_url=self.request.application_url),
            request=self.request)
        forget_headers = forget(self.request)
        response.headers.extend(forget_headers)
        return response
Exemplo n.º 9
0
Arquivo: login.py Projeto: lslaz1/karl
def logout_view(context, request, reason='Logged out'):
    site = find_site(context)
    site_url = resource_url(site, request)
    request.session['came_from'] = site_url
    query = {'reason': reason}
    if asbool(get_config_setting('kerberos', 'False')):
        # If user explicitly logs out, don't try to log back in immediately
        # using kerberos.
        query['try_kerberos'] = 'False'
    login_url = resource_url(site, request, 'login.html', query=query)

    redirect = HTTPFound(location=login_url)
    redirect.headers.extend(forget(request))
    return redirect
Exemplo n.º 10
0
Arquivo: login.py Projeto: lslaz1/karl
def logout_view(context, request, reason='Logged out'):
    site = find_site(context)
    site_url = resource_url(site, request)
    request.session['came_from'] = site_url
    query = {'reason': reason}
    if asbool(get_config_setting('kerberos', 'False')):
        # If user explicitly logs out, don't try to log back in immediately
        # using kerberos.
        query['try_kerberos'] = 'False'
    login_url = resource_url(site, request, 'login.html', query=query)

    redirect = HTTPFound(location=login_url)
    redirect.headers.extend(forget(request))
    return redirect
Exemplo n.º 11
0
    def handle_submit(self, converted):
        context = self.context
        request = self.request
        system_name = get_setting(context, 'title', 'KARL')
        address = converted['email']
        if address:
            address = address.lower()

        search = getAdapter(context, ICatalogSearch)
        count, docids, resolver = search(interfaces=[IProfile],
                                         email=[address])

        users = find_users(context)
        for docid in docids:
            profile = resolver(docid)
            if profile is None:
                continue
            userid = profile.__name__
            user = users.get_by_id(userid)
            if user is None:
                continue
            # found the profile and user
            break
        else:
            raise ValidationError(
                **{
                    "email":
                    "%s has no account with the email address: %s" %
                    (system_name, address)
                })

        groups = user['groups']
        if groups and 'group.KarlStaff' in groups:
            # because staff accounts are managed centrally, staff
            # must use the forgot_password_url if it is set.
            forgot_password_url = get_config_setting('forgot_password_url')
            if forgot_password_url:
                came_from = resource_url(context, request, "login.html")
                request.session['came_from'] = came_from
                url = '%s?email=%s' % (forgot_password_url,
                                       urllib.quote_plus(address))
                return HTTPFound(location=url)

        request_password_reset(user, profile, request)

        url = resource_url(context, request, 'reset_sent.html') + (
            '?email=%s' % urllib.quote_plus(address))
        return HTTPFound(location=url)
Exemplo n.º 12
0
    def handle_submit(self, converted):
        context = self.context
        request = self.request
        system_name = get_setting(context, 'title', 'KARL')
        address = converted['email']
        if address:
            address = address.lower()

        search = getAdapter(context, ICatalogSearch)
        count, docids, resolver = search(
            interfaces=[IProfile], email=[address])

        users = find_users(context)
        for docid in docids:
            profile = resolver(docid)
            if profile is None:
                continue
            userid = profile.__name__
            user = users.get_by_id(userid)
            if user is None:
                continue
            # found the profile and user
            break
        else:
            raise ValidationError(**{
                "email": "%s has no account with the email address: %s" % (
                    system_name, address)})

        groups = user['groups']
        if groups and 'group.KarlStaff' in groups:
            # because staff accounts are managed centrally, staff
            # must use the forgot_password_url if it is set.
            forgot_password_url = get_config_setting('forgot_password_url')
            if forgot_password_url:
                came_from = resource_url(context, request, "login.html")
                request.session['came_from'] = came_from
                url = '%s?email=%s' % (
                    forgot_password_url, urllib.quote_plus(address))
                return HTTPFound(location=url)

        request_password_reset(user, profile, request)

        url = resource_url(context, request, 'reset_sent.html') + (
            '?email=%s' % urllib.quote_plus(address))
        return HTTPFound(location=url)
Exemplo n.º 13
0
def init_container(docid, path, repo, site):
    try:
        repo.container_contents(docid)
        # Already in repo
        return
    except NoResultFound:
        # Not in repo
        pass

    context = find_resource(site, path)
    if context.__name__ == 'TEMP':
        return

    container = queryAdapter(context, IContainerVersion)
    if container is not None:
        print "Updating container version for %s" % resource_path(context)
        user = getattr(context, 'creator', None)
        if user is None:
            user = get_config_setting('system_user', 'admin')
        repo.archive_container(container, user)

    context._p_deactivate()
Exemplo n.º 14
0
    def bounce_message_throttled(self, message):
        mailer = getUtility(IMailDelivery)
        from_email = get_config_setting('postoffice.bounce_from_email')
        if from_email is None:
            from_email = get_setting(self.root, 'admin_email')

        bounce_message = Message()
        bounce_message['From'] = from_email
        bounce_message['To'] = message['From']
        bounce_message['Subject'] = 'Your submission to Karl has bounced.'
        bounce_message.set_type('text/html')
        bounce_message.set_payload(render(
            'templates/bounce_email_throttled.pt',
            dict(subject=message.get('Subject'),
                 system_name=get_setting(self.root, 'title', 'KARL'),
                 admin_email=get_setting(self.root, 'admin_email'),
                 ),
        ).encode('UTF-8'), 'UTF-8')

        self.queue.bounce(
            message, wrap_send(mailer.bounce), from_email,
            bounce_message=bounce_message
        )
Exemplo n.º 15
0
    def emit(self, context, request):
        # Get community in which event occurred and alert members
        community = find_community(context)
        if community is None:
            return  # Will be true for a mailin test trace
        profiles = find_profiles(context)
        all_names = community.member_names | community.moderator_names

        threaded = get_config_setting('use_threads_to_send_email',
                                      False) in (True, 'true', 'True')  # noqa
        mailer = getUtility(IMailDelivery)
        if threaded:
            mailer = ThreadedGeneratorMailDelivery()
        queue = []

        reply_enabled = get_setting(context, 'reply_by_email_enabled', True)

        for profile in [profiles[name] for name in all_names]:
            alert = getMultiAdapter((context, profile, request), IAlert)
            preference = profile.get_alerts_preference(community.__name__)
            alert = getMultiAdapter((context, profile, request), IAlert)

            alert.reply_enabled = reply_enabled

            if preference == IProfile.ALERT_IMMEDIATELY:
                if threaded:
                    queue.append(alert)
                else:
                    self._send_immediately(mailer, alert)
            elif preference in (IProfile.ALERT_DAILY_DIGEST,
                                IProfile.ALERT_WEEKLY_DIGEST,
                                IProfile.ALERT_BIWEEKLY_DIGEST):
                self._queue_digest(alert, profile, community.__name__)

        if queue:
            mailer.sendGenerator(_send_alert_queue, mailer, queue)
Exemplo n.º 16
0
 def ts_config(self):
     ts_config = self._v_ts_config
     if ts_config is None:
         ts_config = get_config_setting('pgtextindex.ts_config', 'english')
         self._v_ts_config = ts_config
     return ts_config
Exemplo n.º 17
0
 def ts_config(self):
     ts_config = self._v_ts_config
     if ts_config is None:
         ts_config = get_config_setting('pgtextindex.ts_config', 'english')
         self._v_ts_config = ts_config
     return ts_config
Exemplo n.º 18
0
 def maxlen(self):
     maxlen = self._v_maxlen
     if maxlen is None:
         maxlen = int(get_config_setting('pgtextindex.maxlen', 1048575))
         self._v_maxlen = maxlen
     return maxlen
Exemplo n.º 19
0
 def bounce_message(self, message, error):
     mailer = getUtility(IMailDelivery)
     from_email = get_config_setting('postoffice.bounce_from_email')
     if from_email is None:
         from_email = get_setting(self.root, 'admin_email')
     self.queue.bounce(message, wrap_send(mailer.bounce), from_email, error)
Exemplo n.º 20
0
 def table(self):
     table = self._v_table
     if table is None:
         table = get_config_setting('pgtextindex.table', 'pgtextindex')
         self._v_table = table
     return table
Exemplo n.º 21
0
 def table(self):
     table = self._v_table
     if table is None:
         table = get_config_setting('pgtextindex.table', 'pgtextindex')
         self._v_table = table
     return table
Exemplo n.º 22
0
 def bounce_message(self, message, error):
     mailer = getUtility(IMailDelivery)
     from_email = get_config_setting('postoffice.bounce_from_email')
     if from_email is None:
         from_email = get_setting(self.root, 'admin_email')
     self.queue.bounce(message, wrap_send(mailer.bounce), from_email, error)
Exemplo n.º 23
0
 def maxlen(self):
     maxlen = self._v_maxlen
     if maxlen is None:
         maxlen = int(get_config_setting('pgtextindex.maxlen', 1048575))
         self._v_maxlen = maxlen
     return maxlen