Blame


1 84c190b6 2021-12-17 jrmu #!/usr/bin/perl
2 84c190b6 2021-12-17 jrmu
3 84c190b6 2021-12-17 jrmu package VPN;
4 84c190b6 2021-12-17 jrmu
5 84c190b6 2021-12-17 jrmu use strict;
6 84c190b6 2021-12-17 jrmu use warnings;
7 84c190b6 2021-12-17 jrmu use OpenBSD::Pledge;
8 84c190b6 2021-12-17 jrmu use OpenBSD::Unveil;
9 177e2ac3 2023-07-29 jrmu require "DNS.pm";
10 177e2ac3 2023-07-29 jrmu require "SQLite.pm";
11 84c190b6 2021-12-17 jrmu
12 177e2ac3 2023-07-29 jrmu my %conf = %main::conf;
13 177e2ac3 2023-07-29 jrmu my $chans = $conf{chans};
14 177e2ac3 2023-07-29 jrmu my $teamchans = $conf{teamchans};
15 177e2ac3 2023-07-29 jrmu my @teamchans = split /[,\s]+/m, $teamchans;
16 177e2ac3 2023-07-29 jrmu my $staff = $conf{staff};
17 177e2ac3 2023-07-29 jrmu my $expires = $conf{expires};
18 177e2ac3 2023-07-29 jrmu my $ikedconf = $conf{ikedconf} || "/etc/iked.conf";
19 177e2ac3 2023-07-29 jrmu # File containing IRC networks
20 177e2ac3 2023-07-29 jrmu my $netpath = "networks";
21 177e2ac3 2023-07-29 jrmu my @networks;
22 177e2ac3 2023-07-29 jrmu
23 177e2ac3 2023-07-29 jrmu main::cbind("pub", "-", "vpn", \&vpn);
24 177e2ac3 2023-07-29 jrmu main::cbind("msg", "-", "vpn", \&vpn);
25 177e2ac3 2023-07-29 jrmu
26 84c190b6 2021-12-17 jrmu sub init {
27 177e2ac3 2023-07-29 jrmu # unveil("/usr/bin/rcctl", "rx") or die "Unable to unveil $!";
28 177e2ac3 2023-07-29 jrmu unveil($ikedconf, "crx") or die "Unable to unveil $!";
29 84c190b6 2021-12-17 jrmu }
30 177e2ac3 2023-07-29 jrmu
31 177e2ac3 2023-07-29 jrmu sub vpn {
32 177e2ac3 2023-07-29 jrmu my ($bot, $nick, $host, $hand, @args) = @_;
33 177e2ac3 2023-07-29 jrmu my ($chan, $text);
34 177e2ac3 2023-07-29 jrmu if (@args == 2) {
35 177e2ac3 2023-07-29 jrmu ($chan, $text) = ($args[0], $args[1]);
36 177e2ac3 2023-07-29 jrmu } else { $text = $args[0]; }
37 177e2ac3 2023-07-29 jrmu my $hostmask = "$nick!$host";
38 177e2ac3 2023-07-29 jrmu if (defined($chan) && $chans =~ /$chan/) {
39 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $chan :$nick: Please check private message");
40 177e2ac3 2023-07-29 jrmu }
41 177e2ac3 2023-07-29 jrmu if ($text =~ /^$/) {
42 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :Type !help for new instructions");
43 177e2ac3 2023-07-29 jrmu foreach my $chan (@teamchans) {
44 177e2ac3 2023-07-29 jrmu main::putservlocalnet($bot, "PRIVMSG $chan :$staff: Help *$nick* on network".$bot->{name});
45 177e2ac3 2023-07-29 jrmu }
46 177e2ac3 2023-07-29 jrmu return;
47 177e2ac3 2023-07-29 jrmu }
48 177e2ac3 2023-07-29 jrmu my @rows = SQLite::selectrows("irc", "nick", $nick);
49 177e2ac3 2023-07-29 jrmu foreach my $row (@rows) {
50 177e2ac3 2023-07-29 jrmu my $password = SQLite::get("vpn", "ircid", $row->{id}, "password");
51 177e2ac3 2023-07-29 jrmu if (defined($password)) {
52 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :Sorry, only one account per person. Please contact staff if you need help.");
53 177e2ac3 2023-07-29 jrmu return;
54 177e2ac3 2023-07-29 jrmu }
55 177e2ac3 2023-07-29 jrmu }
56 177e2ac3 2023-07-29 jrmu if ($text =~ /^captcha\s+([[:alnum:]]+)/) {
57 177e2ac3 2023-07-29 jrmu my $text = $1;
58 177e2ac3 2023-07-29 jrmu my $ircid = SQLite::id("irc", "nick", $nick, $expires);
59 177e2ac3 2023-07-29 jrmu if (!defined($ircid)) { die "undefined ircid"; }
60 177e2ac3 2023-07-29 jrmu my $captcha = SQLite::get("vpn", "ircid", $ircid, "captcha");
61 177e2ac3 2023-07-29 jrmu if ($text ne $captcha) {
62 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :Wrong captcha. To get a new captcha, type !vpn <username> <email>");
63 177e2ac3 2023-07-29 jrmu return;
64 177e2ac3 2023-07-29 jrmu }
65 177e2ac3 2023-07-29 jrmu my $pass = Hash::newpass();
66 177e2ac3 2023-07-29 jrmu chomp(my $encrypted = `encrypt $pass`);
67 177e2ac3 2023-07-29 jrmu my $username = SQLite::get("vpn", "ircid", $ircid, "username");
68 177e2ac3 2023-07-29 jrmu my $email = SQLite::get("vpn", "ircid", $ircid, "email");
69 177e2ac3 2023-07-29 jrmu my $version = SQLite::get("vpn", "ircid", $ircid, "version");
70 177e2ac3 2023-07-29 jrmu SQLite::set("vpn", "ircid", $ircid, "password", $encrypted);
71 177e2ac3 2023-07-29 jrmu
72 177e2ac3 2023-07-29 jrmu createvpn($username, $pass);
73 177e2ac3 2023-07-29 jrmu foreach my $chan (@teamchans) {
74 177e2ac3 2023-07-29 jrmu main::putservlocalnet($bot, "PRIVMSG $chan :$staff: vpn created for $username");
75 177e2ac3 2023-07-29 jrmu }
76 177e2ac3 2023-07-29 jrmu my $msg = <<"EOF";
77 177e2ac3 2023-07-29 jrmu Your vpn account has been created! Username: $username with password: $pass
78 177e2ac3 2023-07-29 jrmu Our official support channel is #vpn. To connect, please follow these instructions:
79 177e2ac3 2023-07-29 jrmu https://wiki.ircnow.org/Vpn/Vpn
80 177e2ac3 2023-07-29 jrmu EOF
81 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :$msg");
82 177e2ac3 2023-07-29 jrmu } elsif ($text =~ /^([[:alnum:]]+)\s+([[:ascii:]]+)/) {
83 177e2ac3 2023-07-29 jrmu my ($username, $email) = ($1, $2);
84 177e2ac3 2023-07-29 jrmu if ($staff !~ /$nick/) {
85 177e2ac3 2023-07-29 jrmu return;
86 177e2ac3 2023-07-29 jrmu }
87 177e2ac3 2023-07-29 jrmu my @users = col($ikedconf);
88 177e2ac3 2023-07-29 jrmu my @matches = grep(/^$username$/i, @users);
89 177e2ac3 2023-07-29 jrmu if (scalar(@matches) > 0) {
90 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :Sorry, username taken. Please choose another username, or contact staff for help.");
91 177e2ac3 2023-07-29 jrmu return;
92 177e2ac3 2023-07-29 jrmu }
93 177e2ac3 2023-07-29 jrmu
94 177e2ac3 2023-07-29 jrmu my $captcha = int(rand(999));
95 177e2ac3 2023-07-29 jrmu my $ircid = int(rand(2147483647));
96 177e2ac3 2023-07-29 jrmu SQLite::set("irc", "id", $ircid, "localtime", time());
97 177e2ac3 2023-07-29 jrmu SQLite::set("irc", "id", $ircid, "date", main::date());
98 177e2ac3 2023-07-29 jrmu SQLite::set("irc", "id", $ircid, "hostmask", $hostmask);
99 177e2ac3 2023-07-29 jrmu SQLite::set("irc", "id", $ircid, "nick", $nick);
100 177e2ac3 2023-07-29 jrmu SQLite::set("vpn", "ircid", $ircid, "username", $username);
101 177e2ac3 2023-07-29 jrmu SQLite::set("vpn", "ircid", $ircid, "email", $email);
102 177e2ac3 2023-07-29 jrmu SQLite::set("vpn", "ircid", $ircid, "captcha", $captcha);
103 bcee9bd5 2023-08-01 jrmu main::whois($bot, $nick);
104 bcee9bd5 2023-08-01 jrmu main::ctcp($bot, $nick);
105 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :".`figlet $captcha`);
106 177e2ac3 2023-07-29 jrmu # main::putserv($bot, "PRIVMSG $nick :$captchaURL".encode_base64($captcha));
107 177e2ac3 2023-07-29 jrmu main::putserv($bot, "PRIVMSG $nick :Type !vpn captcha <text>");
108 177e2ac3 2023-07-29 jrmu foreach my $chan (@teamchans) {
109 177e2ac3 2023-07-29 jrmu main::putservlocalnet($bot, "PRIVMSG $chan :$nick\'s captcha on $bot->{name} is $captcha");
110 177e2ac3 2023-07-29 jrmu }
111 177e2ac3 2023-07-29 jrmu }
112 177e2ac3 2023-07-29 jrmu }
113 177e2ac3 2023-07-29 jrmu sub createvpn {
114 177e2ac3 2023-07-29 jrmu my ($username, $password) = @_;
115 177e2ac3 2023-07-29 jrmu `doas sh -c 'echo "user $username $password" >> /etc/iked.conf'`;
116 177e2ac3 2023-07-29 jrmu `doas rcctl reload iked`;
117 177e2ac3 2023-07-29 jrmu }
118 177e2ac3 2023-07-29 jrmu sub col {
119 177e2ac3 2023-07-29 jrmu my ($filename) = @_;
120 177e2ac3 2023-07-29 jrmu my @rows = main::readarray($filename);
121 177e2ac3 2023-07-29 jrmu my @results;
122 177e2ac3 2023-07-29 jrmu foreach my $row (@rows) {
123 177e2ac3 2023-07-29 jrmu if ($row =~ /^user (.*?) /) {
124 177e2ac3 2023-07-29 jrmu push(@results, $1);
125 177e2ac3 2023-07-29 jrmu }
126 177e2ac3 2023-07-29 jrmu }
127 177e2ac3 2023-07-29 jrmu return @results;
128 177e2ac3 2023-07-29 jrmu }
129 177e2ac3 2023-07-29 jrmu
130 177e2ac3 2023-07-29 jrmu #sub init {
131 177e2ac3 2023-07-29 jrmu #}
132 84c190b6 2021-12-17 jrmu # if ($reply =~ /^!vpn (.*) ([-_0-9a-zA-Z]+)$/i) {
133 84c190b6 2021-12-17 jrmu # my $ircnick = $1;
134 84c190b6 2021-12-17 jrmu # my $newnick = $2;
135 84c190b6 2021-12-17 jrmu # if ($staff !~ /$sender/) {
136 84c190b6 2021-12-17 jrmu # return;
137 84c190b6 2021-12-17 jrmu # }
138 84c190b6 2021-12-17 jrmu # my $password = newpass();
139 84c190b6 2021-12-17 jrmu # createvpn($password, $newnick);
140 84c190b6 2021-12-17 jrmu # sendmsg($bot, $sender, "vpn created for $newnick");
141 84c190b6 2021-12-17 jrmu #my $msg = <<"EOF";
142 84c190b6 2021-12-17 jrmu #Your vpn account has been created! Username: $newnick with password: $password
143 84c190b6 2021-12-17 jrmu #Our official support channel is #vpn. To connect, please follow these instructions: https://ircnow.org/kb/doku.php?id=vpn:vpn .
144 84c190b6 2021-12-17 jrmu #EOF
145 84c190b6 2021-12-17 jrmu # sendmsg($bot, $ircnick, $msg);
146 84c190b6 2021-12-17 jrmu # }
147 84c190b6 2021-12-17 jrmu #sub createvpn {
148 84c190b6 2021-12-17 jrmu # my ($password, $username) = @_;
149 84c190b6 2021-12-17 jrmu # `doas sh -c 'echo "user '$username' '$password'" >> /etc/iked.conf'`;
150 84c190b6 2021-12-17 jrmu # `doas rcctl reload iked`;
151 84c190b6 2021-12-17 jrmu #}
152 84c190b6 2021-12-17 jrmu
153 84c190b6 2021-12-17 jrmu 1; # MUST BE LAST STATEMENT IN FILE