def connect_cyrus(host=None, username=None, as_admin=True): """Connect to user's Cyrus and return IMAP object. Authentication is always as CYRUS_ADMIN, but if as_admin is True (default), authorise as admin user, not username. It is assumed the Cyrus server accepts SASL PLAIN and SSL. """ def auth_plain_cb(response): cyrus_pw = Utils.read_password(cereconf.CYRUS_ADMIN, cereconf.CYRUS_HOST) return "%s\0%s\0%s" % (username or cereconf.CYRUS_ADMIN, cereconf.CYRUS_ADMIN, cyrus_pw) if as_admin: username = cereconf.CYRUS_ADMIN try: imapconn = Utils.CerebrumIMAP4_SSL(host=host.name, ssl_version=ssl.PROTOCOL_TLSv1) except socket.gaierror as e: raise CyrusConnectError("%s@%s: %s" % (username, host.name, e)) try: imapconn.authenticate('PLAIN', auth_plain_cb) except (imapconn.error, socket.error) as e: raise CyrusConnectError("%s@%s: %s" % (username, host.name, e)) return imapconn
def _email_info_detail(self, acc): info = [] eq = Email.EmailQuota(self.db) try: eq.find_by_target_entity(acc.entity_id) et = Email.EmailTarget(self.db) et.find_by_target_entity(acc.entity_id) es = Email.EmailServer(self.db) es.find(et.email_server_id) # exchange-relatert-jazz # since Exchange-users will have a different kind of # server this code will not be affected at Exchange # roll-out It may, however, be removed as soon as # migration is completed (up to and including # "dis_quota_soft': eq.email_quota_soft})") if es.email_server_type == self.const.email_server_type_cyrus: pw = self.db._read_password(cereconf.CYRUS_HOST, cereconf.CYRUS_ADMIN) used = 'N/A' limit = None try: cyrus = Utils.CerebrumIMAP4_SSL( es.name, ssl_version=ssl.PROTOCOL_TLSv1) # IVR 2007-08-29 If the server is too busy, we do not want # to lock the entire bofhd. # 5 seconds should be enough cyrus.socket().settimeout(5) cyrus.login(cereconf.CYRUS_ADMIN, pw) res, quotas = cyrus.getquota("user." + acc.account_name) cyrus.socket().settimeout(None) if res == "OK": for line in quotas: try: folder, qtype, qused, qlimit = line.split() if qtype == "(STORAGE": used = str(int(qused)/1024) limit = int(qlimit.rstrip(")"))/1024 except ValueError: # line.split fails e.g. because quota isn't set # on server folder, junk = line.split() self.logger.warning("No IMAP quota set for %r", acc.account_name) used = "N/A" limit = None except (bofhd_uio_cmds.TimeoutException, socket.error): used = 'DOWN' except bofhd_uio_cmds.ConnectException as e: used = exc_to_text(e) except imaplib.IMAP4.error: used = 'DOWN' info.append({'quota_hard': eq.email_quota_hard, 'quota_soft': eq.email_quota_soft, 'quota_used': used}) if limit is not None and limit != eq.email_quota_hard: info.append({'quota_server': limit}) else: info.append({'dis_quota_hard': eq.email_quota_hard, 'dis_quota_soft': eq.email_quota_soft}) except Errors.NotFoundError: pass # exchange-relatert-jazz # delivery for exchange-mailboxes is not regulated through # LDAP, and LDAP should not be checked there my be some need # to implement support for checking if delivery is paused in # Exchange, but at this point only very vague explanation has # been given and priority is therefore low if acc.has_spread(self.const.spread_uit_exchange): return info # Check if the ldapservers have set mailPaused if self._is_email_delivery_stopped(acc.account_name): info.append({'status': 'Paused (migrating to new server)'}) return info