new object $mail_list: $mail_root, $has_name; var $has_name name = ['uniq, "mail_list", "the mail_list"]; var $mail_list last_received_on = 0; var $mail_list mail = []; var $mail_list notify = [$mail_list]; var $mail_list readers = 1; var $mail_list senders = 1; var $root created_on = 796268969; var $root flags = ['methods, 'code, 'core, 'variables]; var $root inited = 1; var $root managed = [$mail_list]; var $root manager = $mail_list; var $root trusted_by = [$mail_db]; protected method ._announce_new_mail() { arg new_mail; var line, who, n; if (!notify) return; line = ((((.mail_name()) + " has been sent new mail by ") + ((new_mail.from()).name())) + ": ") + (new_mail.subject()); for who in (notify) (| who.tell(line.chop(who.linelen())) |); }; public method .add_mail() { var new_mail; (> .perms(caller(), $mail_message) <); last_received_on = time(); new_mail = sender(); // make sure we do not already have it if (new_mail in mail) return; // add it mail = mail.add(new_mail); ._announce_new_mail(new_mail); }; public method .add_sender_to_notification() { var who; who = sender(); if (!(who.has_ancestor($user))) throw(~type, "Sender is not a user."); if (!(.has_flag('sender, who))) throw(~perm, ((who.name()) + " cannot read ") + (.mail_name())); notify = setadd(notify, who); }; root method .core_mail_list() { var o; if (type(senders) == 'list) senders = filter o in (senders) where (valid(o)); if (type(notify) == 'list) notify = filter o in (notify) where (valid(o)); if (type(readers) == 'list) readers = filter o in (readers) where (valid(o)); }; public method .del_mail() { arg old_mail, @sender; // what the hell am I thinking? [(sender ?= sender())] = sender; if (!($mail_lib.has_mail_perms(caller()))) throw(~perm, ((caller().namef('xref)) + " cannot remove ") + (old_mail.mail_name())); if (old_mail == (mail.last())) last_received_on = (| (mail[(mail.length()) - 1]).time() |) || 0; (| old_mail.del_recipient(this()) |); mail = mail.del(old_mail); }; public method .del_sender_from_notification() { var who; who = sender(); if (!(who.has_ancestor($user))) throw(~type, "Sender is not a user."); if (!(.has_flag('sender, who))) throw(~perm, ((who.name()) + " cannot read ") + (.mail_name())); notify = notify.setremove(who); }; root method .init_mail_list() { mail = []; senders = 1; readers = [.manager()]; notify = [.manager()]; if (!(.has_ancestor($user))) { readers = 1; (| $mail_db.insert(.name(), this()) |); } else { readers = [.manager()]; } }; public method .last_received_on() { return last_received_on; }; public method .list_is_readable_by() { arg who; if (.is_writable_by(who)) return 1; if (type(readers) == 'list) return who in readers; return readers; }; public method .list_is_sendable_by() { arg who; if (.is_writable_by(who)) return 1; if (type(senders) == 'list) return who in senders; return senders; }; public method .mail() { // if (!.list_is_sendable_by(sender())) // throw(~perm, "Sender cannot read " + .mail_name() + "."); return mail; }; public method .mail_list_next() { arg cur; if (!(.list_is_readable_by(sender()))) throw(~perm, "Sender cannot read this list."); return (> mail[(cur in mail) + 1] <); }; public method .mail_list_prev() { arg cur; if (!(.list_is_readable_by(sender()))) throw(~perm, "Sender cannot read this list."); return (> mail[(cur in mail) - 1] <); }; public method .mail_name() { return $mail_lib.mail_name(this()); }; public method .notify() { (> .perms(sender(), 'manager) <); return notify; }; public method .notify_bad_mail() { arg badmail; // this is a hack, we shouldn't ever get bad mail if things worked right (> .perms(caller(), $mail_ui) <); mail = setremove(mail, badmail); }; public method .recent_mail() { arg @diff; if (!(.list_is_readable_by(sender()))) throw(~perm, ("Sender cannot read " + (.mail_name())) + "."); [(diff ?= 20)] = diff; if ((mail.length()) < diff) return [0, mail]; return [((mail.length()) - diff) - 1, mail.subrange((mail.length()) - diff)]; }; public method .senders() { (> .perms(sender(), 'manager) <); return senders; }; public method .set_name() { arg new_name, @args; var old_name; old_name = .name(); if (new_name && ((new_name[1]) == "*")) new_name = new_name.subrange(2); (> pass(new_name, @args) <); (| $mail_db.key_changed(old_name, new_name) |); }; public method .set_notify() { arg new_value; (> .perms(sender(), 'manager) <); if ((type(new_value) != 'integer) && (type(new_value) != 'list)) throw(~type, "new value must be submitted as a list of users or boolean integer."); notify = new_value; }; public method .set_senders() { arg new_value; (> .perms(sender(), 'manager) <); if ((type(new_value) != 'integer) && (type(new_value) != 'list)) throw(~type, "new value must be submitted as a list of users or boolean integer."); senders = new_value; }; public method .start() { if (!(.list_is_readable_by(sender()))) throw(~perm, ("Sender cannot read " + (.mail_name())) + "."); if (mail) return mail[1]; return 0; }; root method .uninit_mail_list() { var m; for m in (mail) .del_mail(let[1]); mail = []; senders = 1; readers = [.manager()]; notify = []; if (!(.has_ancestor($user))) (| $mail_db.remove(.name()) |); $smtp.remove_aliases(); };