parent $text parent $mail_root object $mail var $root child_index 18 var $root owners [$mail] var $root owned [$mail] var $root fertile 1 var $root inited 1 var $located location $creation var $has_verbs verbs #[] var $mail readers [] var $root info [] var $ text [] var $root manager $mail var $root writable [$mail] var $root readable ['parameters, 'methods, 'code] var $root dbref 'mail var $mail header #[] var $mail delivered 0 method del_recipient disallow_overrides; arg whom; var rcpts; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); rcpts = setremove(header['rcpt], whom); if (!rcpts) .destroy(); else header = header.add('rcpt, rcpts); . method add_recipient disallow_overrides; arg whom; var current; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); current = (| header['rcpt] |) || []; if ((| whom in current |)) throw(~type, "Recipient is already in the list of recipients"); header = header.add('rcpt, current.union([whom])); . method letter disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); return dict_add(.header(), 'text, .text()); . method readers disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); return readers; . method did_read disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); readers = [@readers, sender()]; . method set_time disallow_overrides; arg time; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); header = header.add('time, time); . method set_recipients disallow_overrides; arg whom; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); header = header.add('rcpt, whom); . method set_subject disallow_overrides; arg what; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); header = header.add('subj, what); . method set_from disallow_overrides; arg whom; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); header = dict_add(header, 'from, whom); . method add_reader disallow_overrides; arg who; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); readers = readers.union([who]); . method recipients disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); return (| header['rcpt] |) || [$no_one]; . method from disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); return (| header['from] |) || $no_one; . method subject disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); return (| header['subj] |) || "<none>"; . method time disallow_overrides; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); return (| header['time] |) || 0; . method format disallow_overrides; var output, names, o, h; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); h = .header(); output = ["From: " + ((h['from]).namef('ref))]; names = ((h['rcpt]).omap($mail_utils, 'mail_name)).to_english(); output = [@output, "To: " + names]; output = [@output, "When: " + ($time.date(h['time]))]; output = [@output, "Subject: " + (h['subj])]; output = [@output, "---", @.text(), "---"]; return output; . method header disallow_overrides; var h, d; (> .perms(sender()) <); h = #[['from, $no_one], ['rcpt, [$no_one]], ['subj, "<none>"], ['time, 0]]; for d in (header) h = h.add(@d); return h; . method uninit_mail disallow_overrides; var r; (> .perms(caller(), $root) <); for r in (.recipients()) (| r.del_mail(this(), (| (.from()) || this() |)) |); header = #[]; readers = []; . method init_mail disallow_overrides; (> .perms(caller(), $root) <); header = #[]; readers = []; .set_readable([]); . method has_read disallow_overrides; arg who; return who in readers; . method text return (> pass() <) || ["", "(no message)", ""]; . method send arg [recips]; var r, valid, invalid; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); if (delivered) throw(~delivered, "This mail has already been delivered."); if (!recips) recips = .recipients(); if ((listlen(recips) == 1) && ((recips[1]) == $no_one)) throw(~norcpt, "No recipients specified."); valid = []; invalid = []; for r in (recips) { if (r.has_ancestor($mail_list)) valid = [@valid, r]; else invalid = [@invalid, r]; } if (invalid) throw(~invrcpt, "Invalid mail recipients: " + (invalid.map('name)), invalid); recips = valid; invalid = []; // ok, now that we have that cleared up, lets set pertinent info... .set_time(time()); .set_from(sender()); // and now to finalize the recipients for r in (recips) { if (r.list_is_sendable_by(sender())) { r.add_mail(); .add_recipient(r); } else { invalid = [@invalid, r]; } } delivered = 1; return invalid; . method new_mail var new; if (!($mail_utils.has_mail_perms(caller()))) (> .perms(sender()) <); if (definer() != $mail) throw(~perm, "Only spawn mail from $mail."); new = .spawn(); new.add_writer(sender()); new.set_manager(new); return new; .