[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
VPN Patch for botnow
[Thread Prev] | [Thread Next]
- Subject: VPN Patch for botnow
- From: miniontoby@xxxxxxxxxx
- Date: Sun, 18 Jun 2023 12:19:34 -0000
- To: codeforce@xxxxxxxxxx
Dear reader, Here is my VPN Patch for botnow. I have copied the original email and pasted it on my ircnow.org email account since my mailserver doesn't want to send it. Greets Miniontoby ---------------------------- Original Message ---------------------------- Hey, Here's the patch for botnow for the VPN module! Greets Miniontoby diff --git a/VPN.pm b/VPN.pm index 1d5af6d..14db578 100644 --- a/VPN.pm +++ b/VPN.pm @@ -6,28 +6,126 @@ use strict; use warnings; use OpenBSD::Pledge; use OpenBSD::Unveil; +require "DNS.pm"; +require "SQLite.pm"; + +my %conf = %main::conf; +my $chans = $conf{chans}; +my $teamchans = $conf{teamchans}; +my @teamchans = split /[,\s]+/m, $teamchans; +my $staff = $conf{staff}; +my $expires = $conf{expires}; +my $ikedconf = $conf{ikedconf}; +# File containing IRC networks +my $netpath = "networks"; +my @networks; + +main::cbind("pub", "-", "vpn", \&vpn); +main::cbind("msg", "-", "vpn", \&vpn); sub init { + unveil("/usr/bin/rcctl", "rx") or die "Unable to unveil $!"; + unveil($ikedconf, "crx") or die "Unable to unveil $!"; +} + +sub vpn { + my ($bot, $nick, $host, $hand, @args) = @_; + my ($chan, $text); + if (@args == 2) { + ($chan, $text) = ($args[0], $args[1]); + } else { $text = $args[0]; } + my $hostmask = "$nick!$host"; + if (defined($chan) && $chans =~ /$chan/) { + main::putserv($bot, "PRIVMSG $chan :$nick: Please check private message"); + } + if ($text =~ /^$/) { + main::putserv($bot, "PRIVMSG $nick :Type !help for new instructions"); + foreach my $chan (@teamchans) { + main::putservlocalnet($bot, "PRIVMSG $chan :$staff: Help *$nick* on network ".$bot->{name}); + } + return; + } + my @rows = SQLite::selectrows("irc", "nick", $nick); + foreach my $row (@rows) { + my $password = SQLite::get("vpn", "ircid", $row->{id}, "password"); + if (defined($password)) { + main::putserv($bot, "PRIVMSG $nick :Sorry, only one account per person. Please contact staff if you need help."); + return; + } + } + if ($text =~ /^captcha\s+([[:alnum:]]+)/) { + my $text = $1; + my $ircid = SQLite::id("irc", "nick", $nick, $expires); + if (!defined($ircid)) { die "undefined ircid"; } + my $captcha = SQLite::get("vpn", "ircid", $ircid, "captcha"); + if ($text ne $captcha) { + main::putserv($bot, "PRIVMSG $nick :Wrong captcha. To get a new captcha, type !vpn "); + return; + } + + my $pass = Hash::newpass(); + chomp(my $encrypted = `encrypt $pass`); + my $username = SQLite::get("vpn", "ircid", $ircid, "username"); + my $email = SQLite::get("vpn", "ircid", $ircid, "email"); + my $version = SQLite::get("vpn", "ircid", $ircid, "version"); + SQLite::set("vpn", "ircid", $ircid, "password", $encrypted); + + createvpn($username, $pass); + foreach my $chan (@teamchans) { + main::putservlocalnet($bot, "PRIVMSG $chan :$staff: vpn created for $username"); + } + my $msg = 0) { + main::putserv($bot, "PRIVMSG $nick :Sorry, username taken. Please choose another username, or contact staff for help."); + return; + } + + my $captcha = int(rand(999)); + my $ircid = int(rand(2147483647)); + SQLite::set("irc", "id", $ircid, "localtime", time()); + SQLite::set("irc", "id", $ircid, "date", main::date()); + SQLite::set("irc", "id", $ircid, "hostmask", $hostmask); + SQLite::set("irc", "id", $ircid, "nick", $nick); + SQLite::set("vpn", "ircid", $ircid, "username", $username); + SQLite::set("vpn", "ircid", $ircid, "email", $email); + SQLite::set("vpn", "ircid", $ircid, "captcha", $captcha); + main::whois($bot->{sock}, $nick); + main::ctcp($bot->{sock}, $nick); + main::putserv($bot, "PRIVMSG $nick :".`figlet $captcha`); + # main::putserv($bot, "PRIVMSG $nick :$captchaURL".encode_base64($captcha)); + main::putserv($bot, "PRIVMSG $nick :Type !vpn captcha "); + foreach my $chan (@teamchans) { + main::putservlocalnet($bot, "PRIVMSG $chan :$nick\'s captcha on $bot->{name} is $captcha"); + } + } +} +sub createvpn { + my ($username, $password) = @_; + `doas sh -c 'echo "user $username $password" >> /etc/iked.conf'`; + `doas rcctl reload iked`; +} + +sub col { + my ($filename) = @_; + my @rows = main::readarray($filename); + my @results; + foreach my $row (@rows) { + if ($row =~ /^user (.*?) /) { + push(@results, $1); + } + } + return @results; } -# if ($reply =~ /^!vpn (.*) ([-_0-9a-zA-Z]+)$/i) { -# my $ircnick = $1; -# my $newnick = $2; -# if ($staff !~ /$sender/) { -# return; -# } -# my $password = newpass(); -# createvpn($password, $newnick); -# sendmsg($bot, $sender, "vpn created for $newnick"); -#my $msg = > /etc/doas.conf usermod -G _dovecot botnow chmod g+rw ${HOSTNAMEIF} cp captcha.png register.php ${HTDOCS}/ -cp LICENSE README botnow botnow.conf.example BNC.pm DNS.pm Mail.pm SQLite.pm Shell.pm table.sql Hash.pm Help.pm install networks captcha.png register.php words report ${HOMEDIR}/ +cp LICENSE README botnow botnow.conf.example BNC.pm DNS.pm Mail.pm SQLite.pm Shell.pm table.sql Hash.pm Help.pm VPN.pm install networks captcha.png register.php words report ${HOMEDIR}/ mkdir ${HOMEDIR}/backups/ chown -R ${USERNAME}:${USERNAME} ${HOMEDIR} chmod -R go-rx ${HOMEDIR} diff --git a/table.sql b/table.sql index 1b71f51..b9d4874 100644 --- a/table.sql +++ b/table.sql @@ -95,3 +95,15 @@ CREATE TABLE smtp ( mime VARCHAR(100), subject VARCHAR(100) ); +CREATE TABLE vpn ( + id INTEGER PRIMARY KEY, + hashid VARCHAR(100), + ircid INTEGER, + wwwid INTEGER, + smtpid INTEGER, + username VARCHAR(32), + email VARCHAR(100), + password VARCHAR(100), + localtime VARCHAR(100), + captcha INTEGER +);