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)
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)
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
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
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
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
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
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)
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)
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()
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 )
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
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
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)
def table(self): table = self._v_table if table is None: table = get_config_setting('pgtextindex.table', 'pgtextindex') self._v_table = table return table