source: perl/lib/BarnOwl/Message/Zephyr.pm @ 7869e48

Last change on this file since 7869e48 was 7869e48, checked in by Jason Gross <jgross@mit.edu>, 11 years ago
Remove trailing whitespace This commit was made with the command sequence for i in $(git ls-files | tr '\n' ' '); do echo $i; sed -i s'/\s\+$//g' "$(readlink -f $i)"; done
  • 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.