source: perl/lib/BarnOwl/Message/Zephyr.pm @ 176c22b

Last change on this file since 176c22b was 176c22b, checked in by David Benjamin <davidben@mit.edu>, 9 years ago
Fix display of pseudologins After b9517cf7ce2959a6e86a52d25a98b1d03df56d58, they lost fields and auth keys. They're faked, so they don't really have fields or auth, but put them in anyway to appease existing styles. Reported-By: Kevin Chen <kchen@mit.edu>
  • Property mode set to 100644
File size: 5.7 KB
Line 
1use strict;
2use warnings;
3
4package BarnOwl::Message::Zephyr;
5
6use constant WEBZEPHYR_PRINCIPAL => "daemon/webzephyr.mit.edu";
7use constant WEBZEPHYR_CLASS     => "webzephyr";
8use constant WEBZEPHYR_OPCODE    => "webzephyr";
9
10use base qw( BarnOwl::Message );
11
12sub strip_realm {
13    my $sender = shift;
14    my $realm = BarnOwl::zephyr_getrealm();
15    $sender =~ s/\@\Q$realm\E$//;
16    return $sender;
17}
18
19sub principal_realm {
20    my $principal = shift;
21    my ($user, $realm) = split(/@/,$principal);
22    return $realm;
23}
24
25sub login_type {
26    return (shift->zsig eq "") ? "(PSEUDO)" : "";
27}
28
29sub login_extra {
30    my $m = shift;
31    return undef if (!$m->is_loginout);
32    my $s = lc($m->host);
33    $s .= " " . $m->login_tty if defined $m->login_tty;
34    return $s;
35}
36
37sub long_sender {
38    my $m = shift;
39    return $m->zsig;
40}
41
42sub context {
43    return shift->class;
44}
45
46sub subcontext {
47    return shift->instance;
48}
49
50sub login_tty {
51    my ($m) = @_;
52    return undef if (!$m->is_loginout);
53    return undef if (!defined($m->fields));
54    return $m->fields->[2];
55}
56
57sub login_host {
58    my ($m) = @_;
59    return undef if (!$m->is_loginout);
60    return undef if (!defined($m->fields));
61    return $m->fields->[0];
62}
63
64sub zwriteline  { return shift->{"zwriteline"}; }
65
66sub is_ping     { return (lc(shift->opcode) eq "ping"); }
67
68sub is_personal {
69    my ($m) = @_;
70    return ((lc($m->class) eq "message")
71            && $m->is_private);
72}
73
74sub is_mail {
75    my ($m) = @_;
76    return ((lc($m->class) eq "mail") && $m->is_private);
77}
78
79sub pretty_sender {
80    my ($m) = @_;
81    return strip_realm($m->sender);
82}
83
84sub pretty_recipient {
85    my ($m) = @_;
86    return strip_realm($m->recipient);
87}
88
89# Portion of the reply command that preserves the context
90sub context_reply_cmd {
91    my $mclass = shift;
92    my $minstance = shift;
93    my @class;
94    if (lc($mclass) ne "message") {
95        @class = ('-c', $mclass);
96    }
97    my @instance;
98    if (lc($minstance) ne "personal") {
99        @instance = ('-i', $minstance);
100    }
101    return (@class, @instance);
102}
103
104sub personal_context {
105    my ($m) = @_;
106    return BarnOwl::quote(context_reply_cmd($m->class, $m->instance));
107}
108
109sub short_personal_context {
110    my ($m) = @_;
111    if(lc($m->class) eq 'message')
112    {
113        if(lc($m->instance) eq 'personal')
114        {
115            return '';
116        } else {
117            return $m->instance;
118        }
119    } else {
120        return $m->class;
121    }
122}
123
124# These are arguably zephyr-specific
125sub class       { return shift->{"class"}; }
126sub instance    { return shift->{"instance"}; }
127sub realm       { return shift->{"realm"}; }
128sub opcode      { return shift->{"opcode"}; }
129sub host        { return shift->{"hostname"}; }
130sub hostname    { return shift->{"hostname"}; }
131sub header      { return shift->{"header"}; }
132sub auth        { return shift->{"auth"}; }
133sub fields      { return shift->{"fields"}; }
134sub zsig        { return shift->{"zsig"}; }
135
136sub zephyr_cc {
137    my $self = shift;
138    return $1 if $self->body =~ /^\s*cc:\s+([^\n]+)/i;
139    return undef;
140}
141
142sub replycmd {
143    my $self = shift;
144    my $sender = shift;
145    $sender = 0 unless defined $sender;
146    my ($class, $instance, $to, $cc);
147    if($self->is_outgoing) {
148        return $self->{zwriteline};
149    }
150
151    if($sender && $self->opcode eq WEBZEPHYR_OPCODE) {
152        $class = WEBZEPHYR_CLASS;
153        $instance = $self->pretty_sender;
154        $instance =~ s/-webzephyr$//;
155        $to = WEBZEPHYR_PRINCIPAL;
156    } elsif($self->class eq WEBZEPHYR_CLASS
157            && $self->is_loginout) {
158        $class = WEBZEPHYR_CLASS;
159        $instance = $self->instance;
160        $to = WEBZEPHYR_PRINCIPAL;
161    } elsif($self->is_loginout) {
162        $class = 'MESSAGE';
163        $instance = 'PERSONAL';
164        $to = $self->sender;
165    } elsif($sender && !$self->is_private) {
166        # Possible future feature: (Optionally?) include the class and/or
167        # instance of the message being replied to in the instance of the
168        # outgoing personal reply
169        $class = 'MESSAGE';
170        $instance = 'PERSONAL';
171        $to = $self->sender;
172    } else {
173        $class = $self->class;
174        $instance = $self->instance;
175        if ($self->recipient eq '' || $self->recipient =~ /^@/) {
176            $to = $self->recipient;
177        } else {
178            $to = $self->sender;
179            $cc = $self->zephyr_cc();
180        }
181    }
182
183    my @cmd;
184    if(lc $self->opcode eq 'crypt' and ( not $sender or $self->is_private)) {
185        # Responses to zcrypted messages should be zcrypted, so long as we
186        # aren't switching to personals
187        @cmd = ('zcrypt');
188    } else {
189        @cmd = ('zwrite');
190    }
191
192    push @cmd, context_reply_cmd($class, $instance);
193
194    if ($to ne '') {
195        $to = strip_realm($to);
196        if (defined $cc and not $sender) {
197            my @cc = grep /^[^-]/, ($to, split /\s+/, $cc);
198            my %cc = map {$_ => 1} @cc;
199            # this isn't quite right - it doesn't strip off the
200            # user if the message was addressed to them by fully qualified
201            # name
202            delete $cc{strip_realm(BarnOwl::zephyr_getsender())};
203            @cc = keys %cc;
204
205            my $sender_realm = principal_realm($self->sender);
206            if (BarnOwl::zephyr_getrealm() ne $sender_realm) {
207                @cc = map {
208                    if($_ !~ /@/) {
209                       "${_}\@${sender_realm}";
210                    } else {
211                        $_;
212                    }
213                } @cc;
214            }
215            push @cmd, '-C', @cc;
216        } else {
217            if(BarnOwl::getvar('smartstrip') eq 'on') {
218                $to = BarnOwl::zephyr_smartstrip_user($to);
219            }
220            push @cmd, $to;
221        }
222    }
223    return BarnOwl::quote(@cmd);
224}
225
226sub replysendercmd {
227    my $self = shift;
228    return $self->replycmd(1);
229}
230
231
2321;
Note: See TracBrowser for help on using the repository browser.