annotate irssi/scripts/cap_sasl.pl @ 198:cd732b11bbcd

Add some tmux plugins
author zegervdv <zegervdv@me.com>
date Sat, 15 Nov 2014 09:49:07 +0100
parents 4e92ca6c779a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
148
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2 use Irssi;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
3 use vars qw($VERSION %IRSSI);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
4 # $Id$
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
5
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
6 use MIME::Base64;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
7
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
8 $VERSION = "1.1";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
9
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
10 %IRSSI = (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
11 authors => 'Michael Tharp and Jilles Tjoelker',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
12 contact => '[email protected]',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
13 name => 'cap_sasl.pl',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
14 description => 'Implements PLAIN SASL authentication mechanism for use with charybdis ircds, and enables CAP MULTI-PREFIX',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
15 license => 'GNU General Public License',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
16 url => 'http://sasl.charybdis.be/',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
17 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
18
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
19 my %sasl_auth = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
20 my %mech = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
21
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
22 sub timeout;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
23
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
24 sub server_connected {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
25 my $server = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
26 $server->send_raw_now("CAP LS");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
27 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
28
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
29 sub event_cap {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
30 my ($server, $args, $nick, $address) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
31 my ($subcmd, $caps, $tosend);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
32
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
33 $tosend = '';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
34 if ($args =~ /^\S+ (\S+) :(.*)$/) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
35 $subcmd = uc $1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
36 $caps = ' '.$2.' ';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
37 if ($subcmd eq 'LS') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
38 $tosend .= ' multi-prefix' if $caps =~ / multi-prefix /i;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
39 $tosend .= ' sasl' if $caps =~ / sasl /i && defined($sasl_auth{$server->{tag}});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
40 $tosend =~ s/^ //;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
41 $server->print('', "CLICAP: supported by server:$caps");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
42 if (!$server->{connected}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
43 if ($tosend eq '') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
44 $server->send_raw_now("CAP END");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
45 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
46 $server->print('', "CLICAP: requesting: $tosend");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
47 $server->send_raw_now("CAP REQ :$tosend");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
48 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
49 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
50 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
51 } elsif ($subcmd eq 'ACK') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
52 $server->print('', "CLICAP: now enabled:$caps");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
53 if ($caps =~ / sasl /i) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
54 $sasl_auth{$server->{tag}}{buffer} = '';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
55 if($mech{$sasl_auth{$server->{tag}}{mech}}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
56 $server->send_raw_now("AUTHENTICATE " . $sasl_auth{$server->{tag}}{mech});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
57 Irssi::timeout_add_once(5000, \&timeout, $server->{tag});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
58 }else{
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
59 $server->print('', 'SASL: attempted to start unknown mechanism "' . $sasl_auth{$server->{tag}}{mech} . '"');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
60 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
61 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
62 elsif (!$server->{connected}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
63 $server->send_raw_now("CAP END");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
64 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
65 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
66 } elsif ($subcmd eq 'NAK') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
67 $server->print('', "CLICAP: refused:$caps");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
68 if (!$server->{connected}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
69 $server->send_raw_now("CAP END");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
70 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
71 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
72 } elsif ($subcmd eq 'LIST') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
73 $server->print('', "CLICAP: currently enabled:$caps");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
74 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
75 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
76 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
77 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
78
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
79 sub event_authenticate {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
80 my ($server, $args, $nick, $address) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
81 my $sasl = $sasl_auth{$server->{tag}};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
82 return unless $sasl && $mech{$sasl->{mech}};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
83
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
84 $sasl->{buffer} .= $args;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
85 return if length($args) == 400;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
86
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
87 my $data = $sasl->{buffer} eq '+' ? '' : decode_base64($sasl->{buffer});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
88 my $out = $mech{$sasl->{mech}}($sasl, $data);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
89 $out = '' unless defined $out;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
90 $out = $out eq '' ? '+' : encode_base64($out, '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
91
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
92 while(length $out >= 400) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
93 my $subout = substr($out, 0, 400, '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
94 $server->send_raw_now("AUTHENTICATE $subout");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
95 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
96 if(length $out) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
97 $server->send_raw_now("AUTHENTICATE $out");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
98 }else{ # Last piece was exactly 400 bytes, we have to send some padding to indicate we're done
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
99 $server->send_raw_now("AUTHENTICATE +");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
100 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
101
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
102 $sasl->{buffer} = '';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
103 Irssi::signal_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
104 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
105
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
106 sub event_saslend {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
107 my ($server, $args, $nick, $address) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
108
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
109 my $data = $args;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
110 $data =~ s/^\S+ :?//;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
111 # need this to see it, ?? -- jilles
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
112 $server->print('', $data);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
113 if (!$server->{connected}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
114 $server->send_raw_now("CAP END");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
115 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
116 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
117
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
118 sub timeout {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
119 my $tag = shift;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
120 my $server = Irssi::server_find_tag($tag);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
121 if(!$server->{connected}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
122 $server->print('', "SASL: authentication timed out");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
123 $server->send_raw_now("CAP END");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
124 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
125 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
126
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
127 sub cmd_sasl {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
128 my ($data, $server, $item) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
129
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
130 if ($data ne '') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
131 Irssi::command_runsub ('sasl', $data, $server, $item);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
132 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
133 cmd_sasl_show(@_);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
134 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
135 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
136
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
137 sub cmd_sasl_set {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
138 my ($data, $server, $item) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
139
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
140 if (my($net, $u, $p, $m) = $data =~ /^(\S+) (\S+) (\S+) (\S+)$/) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
141 if($mech{uc $m}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
142 $sasl_auth{$net}{user} = $u;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
143 $sasl_auth{$net}{password} = $p;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
144 $sasl_auth{$net}{mech} = uc $m;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
145 Irssi::print("SASL: added $net: [$m] $sasl_auth{$net}{user} *");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
146 }else{
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
147 Irssi::print("SASL: unknown mechanism $m");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
148 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
149 } elsif ($data =~ /^(\S+)$/) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
150 $net = $1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
151 if (defined($sasl_auth{$net})) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
152 delete $sasl_auth{$net};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
153 Irssi::print("SASL: deleted $net");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
154 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
155 Irssi::print("SASL: no entry for $net");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
156 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
157 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
158 Irssi::print("SASL: usage: /sasl set <net> <user> <password or keyfile> <mechanism>");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
159 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
160 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
161
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
162 sub cmd_sasl_show {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
163 #my ($data, $server, $item) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
164 my $net;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
165 my $count = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
166
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
167 foreach $net (keys %sasl_auth) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
168 Irssi::print("SASL: $net: [$sasl_auth{$net}{mech}] $sasl_auth{$net}{user} *");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
169 $count++;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
170 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
171 Irssi::print("SASL: no networks defined") if !$count;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
172 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
173
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
174 sub cmd_sasl_save {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
175 #my ($data, $server, $item) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
176 my $file = Irssi::get_irssi_dir()."/sasl.auth";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
177 open FILE, "> $file" or return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
178 foreach my $net (keys %sasl_auth) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
179 printf FILE ("%s\t%s\t%s\t%s\n", $net, $sasl_auth{$net}{user}, $sasl_auth{$net}{password}, $sasl_auth{$net}{mech});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
180 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
181 close FILE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
182 Irssi::print("SASL: auth saved to $file");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
183 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
184
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
185 sub cmd_sasl_load {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
186 #my ($data, $server, $item) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
187 my $file = Irssi::get_irssi_dir()."/sasl.auth";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
188
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
189 open FILE, "< $file" or return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
190 %sasl_auth = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
191 while (<FILE>) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
192 chomp;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
193 my ($net, $u, $p, $m) = split (/\t/, $_, 4);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
194 $m ||= "PLAIN";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
195 if($mech{uc $m}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
196 $sasl_auth{$net}{user} = $u;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
197 $sasl_auth{$net}{password} = $p;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
198 $sasl_auth{$net}{mech} = uc $m;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
199 }else{
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
200 Irssi::print("SASL: unknown mechanism $m");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
201 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
202 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
203 close FILE;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
204 Irssi::print("SASL: auth loaded from $file");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
205 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
206
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
207 sub cmd_sasl_mechanisms {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
208 Irssi::print("SASL: mechanisms supported: " . join(" ", keys %mech));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
209 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
210
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
211 Irssi::signal_add_first('server connected', \&server_connected);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
212 Irssi::signal_add('event cap', \&event_cap);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
213 Irssi::signal_add('event authenticate', \&event_authenticate);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
214 Irssi::signal_add('event 903', 'event_saslend');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
215 Irssi::signal_add('event 904', 'event_saslend');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
216 Irssi::signal_add('event 905', 'event_saslend');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
217 Irssi::signal_add('event 906', 'event_saslend');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
218 Irssi::signal_add('event 907', 'event_saslend');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
219
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
220 Irssi::command_bind('sasl', \&cmd_sasl);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
221 Irssi::command_bind('sasl load', \&cmd_sasl_load);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
222 Irssi::command_bind('sasl save', \&cmd_sasl_save);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
223 Irssi::command_bind('sasl set', \&cmd_sasl_set);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
224 Irssi::command_bind('sasl show', \&cmd_sasl_show);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
225 Irssi::command_bind('sasl mechanisms', \&cmd_sasl_mechanisms);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
226
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
227 $mech{PLAIN} = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
228 my($sasl, $data) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
229 my $u = $sasl->{user};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
230 my $p = $sasl->{password};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
231
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
232 join("\0", $u, $u, $p);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
233 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
234
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
235 eval {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
236 use Crypt::OpenSSL::Bignum;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
237 use Crypt::DH;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
238 use Crypt::Blowfish;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
239 use Math::BigInt;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
240 sub bin2bi { return Crypt::OpenSSL::Bignum->new_from_bin(shift)->to_decimal } # binary to BigInt
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
241 sub bi2bin { return Crypt::OpenSSL::Bignum->new_from_decimal((shift)->bstr)->to_bin } # BigInt to binary
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
242 $mech{'DH-BLOWFISH'} = sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
243 my($sasl, $data) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
244 my $u = $sasl->{user};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
245 my $pass = $sasl->{password};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
246
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
247 # Generate private key and compute secret key
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
248 my($p, $g, $y) = unpack("(n/a*)3", $data);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
249 my $dh = Crypt::DH->new(p => bin2bi($p), g => bin2bi($g));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
250 $dh->generate_keys;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
251
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
252 my $secret = bi2bin($dh->compute_secret(bin2bi($y)));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
253 my $pubkey = bi2bin($dh->pub_key);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
254
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
255 # Pad the password to the nearest multiple of blocksize and encrypt
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
256 $pass .= "\0";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
257 $pass .= chr(rand(256)) while length($pass) % 8;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
258
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
259 my $cipher = Crypt::Blowfish->new($secret);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
260 my $crypted = '';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
261 while(length $pass) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
262 my $clear = substr($pass, 0, 8, '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
263 $crypted .= $cipher->encrypt($clear);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
264 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
265
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
266 pack("n/a*Z*a*", $pubkey, $u, $crypted);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
267 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
268 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
269
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
270 cmd_sasl_load();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
271
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
272 # vim: ts=4