Blame
Date:
Sun Dec 27 01:56:09 2020 UTC
Message:
Updated p5-Class-DBI-SQLite-0.11p2
001
2020-10-11
jrmu
#!/usr/bin/perl
002
2020-10-11
jrmu
003
2020-10-11
jrmu
package Shell;
004
2020-10-11
jrmu
005
2020-10-11
jrmu
use strict;
006
2020-10-11
jrmu
use warnings;
007
2020-10-11
jrmu
use OpenBSD::Pledge;
008
2020-10-11
jrmu
use OpenBSD::Unveil;
009
2020-10-15
jrmu
use MIME::Base64;
010
2020-10-20
jrmu
use Data::Dumper;
011
2020-10-20
jrmu
use Digest::SHA qw(sha256_hex);
012
2020-10-20
jrmu
use lib './';
013
2020-11-15
jrmu
require "SQLite.pm";
014
2020-11-15
jrmu
require "Hash.pm";
015
2020-10-11
jrmu
016
2020-11-15
jrmu
my %conf = %main::conf;
017
2020-11-15
jrmu
my $chans = $conf{chans};
018
2020-11-15
jrmu
my $teamchans = $conf{teamchans};
019
2020-11-15
jrmu
my @teamchans = split /[,\s]+/m, $teamchans;
020
2020-11-15
jrmu
my $staff = $conf{staff};
021
2020-10-15
jrmu
my $captchaURL = "https://guava.ircnow.org/captcha.php?vhost=";
022
2020-11-15
jrmu
my $hostname = $conf{hostname};
023
2020-11-15
jrmu
my $terms = $conf{terms};
024
2020-11-15
jrmu
my $expires = $conf{expires};
025
2020-11-15
jrmu
my $mailfrom = $conf{mailfrom};
026
2020-11-15
jrmu
my $mailname = $conf{mailname};
027
2020-10-24
jrmu
my $passpath = "/etc/passwd";
028
2020-10-27
jrmu
my $httpdconfpath = "/etc/httpd.conf";
029
2020-10-27
jrmu
my $acmeconfpath = "/etc/acme-client.conf";
030
2020-11-15
jrmu
main::cbind("pub", "-", "shell", \&mshell);
031
2020-11-15
jrmu
main::cbind("msg", "-", "shell", \&mshell);
032
2020-10-15
jrmu
033
2020-10-11
jrmu
sub init {
034
2020-10-15
jrmu
#dependencies for figlet
035
2020-10-15
jrmu
unveil("/usr/local/bin/figlet", "rx") or die "Unable to unveil $!";
036
2020-10-15
jrmu
unveil("/usr/lib/libc.so.95.1", "r") or die "Unable to unveil $!";
037
2020-10-15
jrmu
unveil("/usr/libexec/ld.so", "r") or die "Unable to unveil $!";
038
2020-10-24
jrmu
#dependencies for shell account
039
2020-10-24
jrmu
unveil($passpath, "r") or die "Unable to unveil $!";
040
2020-10-27
jrmu
unveil($httpdconfpath, "rwxc") or die "Unable to unveil $!";
041
2020-10-27
jrmu
unveil($acmeconfpath, "rwxc") or die "Unable to unveil $!";
042
2020-10-27
jrmu
unveil("/usr/sbin/chown", "rx") or die "Unable to unveil $!";
043
2020-10-27
jrmu
unveil("/bin/chmod", "rx") or die "Unable to unveil $!";
044
2020-10-27
jrmu
unveil("/usr/sbin/groupadd", "rx") or die "Unable to unveil $!";
045
2020-10-27
jrmu
unveil("/usr/sbin/useradd", "rx") or die "Unable to unveil $!";
046
2020-10-27
jrmu
unveil("/usr/sbin/groupdel", "rx") or die "Unable to unveil $!";
047
2020-10-27
jrmu
unveil("/usr/sbin/userdel", "rx") or die "Unable to unveil $!";
048
2020-10-27
jrmu
unveil("/bin/mkdir", "rx") or die "Unable to unveil $!";
049
2020-10-27
jrmu
unveil("/bin/ln", "rx") or die "Unable to unveil $!";
050
2020-10-27
jrmu
unveil("/home/", "rwxc") or die "Unable to unveil $!";
051
2020-10-11
jrmu
}
052
2020-10-20
jrmu
053
2020-10-20
jrmu
# !shell <username> <email>
054
2020-10-20
jrmu
# !shell captcha <captcha>
055
2020-10-15
jrmu
sub mshell {
056
2020-10-15
jrmu
my ($bot, $nick, $host, $hand, @args) = @_;
057
2020-10-15
jrmu
my ($chan, $text);
058
2020-10-15
jrmu
if (@args == 2) {
059
2020-10-15
jrmu
($chan, $text) = ($args[0], $args[1]);
060
2020-10-15
jrmu
} else { $text = $args[0]; }
061
2020-10-15
jrmu
my $hostmask = "$nick!$host";
062
2020-10-15
jrmu
if (defined($chan) && $chans =~ /$chan/) {
063
2020-10-15
jrmu
main::putserv($bot, "PRIVMSG $chan :$nick: Please check private message");
064
2020-10-15
jrmu
}
065
2020-10-20
jrmu
if ($text =~ /^$/) {
066
2020-10-15
jrmu
main::putserv($bot, "PRIVMSG $nick :Type !help for new instructions");
067
2020-10-15
jrmu
foreach my $chan (@teamchans) {
068
2020-10-15
jrmu
main::putserv($bot, "PRIVMSG $chan :Help *$nick* on ".$bot->{name});
069
2020-10-15
jrmu
}
070
2020-10-20
jrmu
return;
071
2020-10-20
jrmu
} elsif ($staff =~ /$nick/ && $text =~ /^delete\s+([[:ascii:]]+)/) {
072
2020-10-20
jrmu
my $username = $1;
073
2020-10-20
jrmu
if (SQLite::deleterows("shell", "username", $username)) {
074
2020-10-20
jrmu
# TODO delete shell
075
2020-10-27
jrmu
deleteshell($bot, $username);
076
2020-10-20
jrmu
foreach my $chan (@teamchans) {
077
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $chan :$username deleted");
078
2020-10-20
jrmu
}
079
2020-10-15
jrmu
}
080
2020-10-20
jrmu
return;
081
2020-10-20
jrmu
}
082
2020-10-20
jrmu
### TODO: Check duplicate emails ###
083
2020-11-25
jrmu
my @rows = SQLite::selectrows("irc", "nick", $nick);
084
2020-10-20
jrmu
foreach my $row (@rows) {
085
2020-10-20
jrmu
my $password = SQLite::get("shell", "ircid", $row->{id}, "password");
086
2020-10-20
jrmu
if (defined($password)) {
087
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $nick :Sorry, only one account per person. Please contact staff if you need help.");
088
2020-10-20
jrmu
return;
089
2020-10-15
jrmu
}
090
2020-10-15
jrmu
}
091
2020-10-20
jrmu
if ($text =~ /^captcha\s+([[:alnum:]]+)/) {
092
2020-10-20
jrmu
my $text = $1;
093
2020-12-12
jrmu
my $ircid = SQLite::id("irc", "nick", $nick, $expires);
094
2020-10-20
jrmu
if (!defined($ircid)) { die "undefined ircid"; }
095
2020-10-20
jrmu
my $captcha = SQLite::get("shell", "ircid", $ircid, "captcha");
096
2020-10-20
jrmu
if ($text ne $captcha) {
097
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $nick :Wrong captcha. To get a new captcha, type !shell <username> <email>");
098
2020-10-20
jrmu
return;
099
2020-10-20
jrmu
}
100
2020-10-15
jrmu
my $pass = Hash::newpass();
101
2020-10-15
jrmu
chomp(my $encrypted = `encrypt $pass`);
102
2020-10-20
jrmu
my $username = SQLite::get("shell", "ircid", $ircid, "username");
103
2020-10-20
jrmu
my $email = SQLite::get("shell", "ircid", $ircid, "email");
104
2020-10-20
jrmu
my $version = SQLite::get("shell", "ircid", $ircid, "version");
105
2020-10-15
jrmu
my $bindhost = "$username.$hostname";
106
2020-10-20
jrmu
SQLite::set("shell", "ircid", $ircid, "password", $encrypted);
107
2020-10-15
jrmu
if (DNS::nextdns($username)) {
108
2020-10-15
jrmu
sleep(2);
109
2020-10-15
jrmu
createshell($bot, $username, $pass, $bindhost);
110
2020-10-20
jrmu
mailshell($username, $email, $pass, "shell", $version);
111
2020-10-24
jrmu
main::putserv($bot, "PRIVMSG $nick :Check your email!");
112
2020-10-20
jrmu
113
2020-10-15
jrmu
#www($newnick, $reply, $password, "bouncer");
114
2020-10-15
jrmu
} else {
115
2020-10-15
jrmu
foreach my $chan (@teamchans) {
116
2020-10-15
jrmu
main::putserv($bot, "PRIVMSG $chan :Assigning bindhost $bindhost failed");
117
2020-10-15
jrmu
}
118
2020-10-15
jrmu
}
119
2020-10-20
jrmu
return;
120
2020-10-20
jrmu
} elsif ($text =~ /^([[:alnum:]]+)\s+([[:ascii:]]+)/) {
121
2020-10-20
jrmu
my ($username, $email) = ($1, $2);
122
2020-10-24
jrmu
my @users = col($passpath, 1, ":");
123
2020-10-24
jrmu
my @matches = grep(/^$username$/i, @users);
124
2020-10-24
jrmu
if (scalar(@matches) > 0) {
125
2020-10-24
jrmu
main::putserv($bot, "PRIVMSG $nick :Sorry, username taken. Please choose another username, or contact staff for help.");
126
2020-10-27
jrmu
return;
127
2020-10-24
jrmu
}
128
2020-10-20
jrmu
# my $captcha = join'', map +(0..9,'a'..'z','A'..'Z')[rand(10+26*2)], 1..4;
129
2020-10-20
jrmu
my $captcha = int(rand(999));
130
2020-10-20
jrmu
my $ircid = int(rand(2147483647));
131
2020-10-20
jrmu
SQLite::set("irc", "id", $ircid, "localtime", time());
132
2020-10-20
jrmu
SQLite::set("irc", "id", $ircid, "date", main::date());
133
2020-10-20
jrmu
SQLite::set("irc", "id", $ircid, "hostmask", $hostmask);
134
2020-10-20
jrmu
SQLite::set("irc", "id", $ircid, "nick", $nick);
135
2020-10-20
jrmu
SQLite::set("shell", "ircid", $ircid, "username", $username);
136
2020-10-20
jrmu
SQLite::set("shell", "ircid", $ircid, "email", $email);
137
2020-10-20
jrmu
SQLite::set("shell", "ircid", $ircid, "captcha", $captcha);
138
2020-10-20
jrmu
main::whois($bot->{sock}, $nick);
139
2020-10-27
jrmu
main::ctcp($bot->{sock}, $nick);
140
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $nick :".`figlet $captcha`);
141
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $nick :$captchaURL".encode_base64($captcha));
142
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $nick :Type !shell captcha <text>");
143
2020-10-20
jrmu
foreach my $chan (@teamchans) {
144
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $chan :$nick\'s captcha is $captcha");
145
2020-10-20
jrmu
}
146
2020-10-15
jrmu
} else {
147
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $nick :Invalid username or email. Type !shell <username> <email> to try again.");
148
2020-10-20
jrmu
foreach my $chan (@teamchans) {
149
2020-10-20
jrmu
main::putserv($bot, "PRIVMSG $chan :Help *$nick* on ".$bot->{name});
150
2020-10-20
jrmu
}
151
2020-10-15
jrmu
}
152
2020-10-15
jrmu
}
153
2020-10-20
jrmu
sub mailshell {
154
2020-10-20
jrmu
my( $username, $email, $password, $service, $version )=@_;
155
2020-10-20
jrmu
my $passhash = sha256_hex("$username");
156
2020-10-20
jrmu
my $versionhash = encode_base64($version);
157
2020-10-20
jrmu
my $ports;
158
2020-10-20
jrmu
my $body = <<"EOF";
159
2020-10-20
jrmu
You created a shell account!
160
2020-10-20
jrmu
161
2020-10-20
jrmu
Username: $username
162
2020-10-20
jrmu
Password: $password
163
2020-10-20
jrmu
Server: $hostname
164
2020-10-20
jrmu
SSH Port: 22
165
2020-10-20
jrmu
Your Ports: $ports for plaintext
166
2020-10-20
jrmu
167
2020-10-20
jrmu
*IMPORTANT*: Verify your email address:
168
2020-10-20
jrmu
169
2020-10-20
jrmu
https://www.$hostname/register.php?id=$passhash&version=$versionhash
170
2020-10-20
jrmu
171
2020-10-20
jrmu
You *MUST* click on the link or your account will be deleted.
172
2020-10-20
jrmu
173
2020-10-20
jrmu
IRCNow
174
2020-10-20
jrmu
EOF
175
2020-10-20
jrmu
Mail::mail($mailfrom, $email, $mailname, "Verify IRCNow Account", $body);
176
2020-10-20
jrmu
}
177
2020-10-20
jrmu
178
2020-10-20
jrmu
179
2020-10-20
jrmu
#sub mregex {
180
2020-10-20
jrmu
# my ($bot, $nick, $host, $hand, $text) = @_;
181
2020-10-20
jrmu
# if ($staff !~ /$nick/) { return; }
182
2020-10-20
jrmu
# if ($text =~ /^ips?\s+([-_()|0-9A-Za-z:\.?*\s]{3,})$/) {
183
2020-10-20
jrmu
# my $ips = $1; # space-separated list of IPs
184
2020-10-20
jrmu
# main::putserv($bot, "PRIVMSG $nick :".regexlist($ips));
185
2020-10-20
jrmu
# } elsif ($text =~ /^users?\s+([-_()|0-9A-Za-z:\.?*\s]{3,})$/) {
186
2020-10-20
jrmu
# my $users = $1; # space-separated list of usernames
187
2020-10-20
jrmu
# main::putserv($bot, "PRIVMSG $nick :".regexlist($users));
188
2020-10-20
jrmu
# } elsif ($text =~ /^[-_()|0-9A-Za-z:,\.?*\s]{3,}$/) {
189
2020-10-20
jrmu
# my @lines = regex($text);
190
2020-10-20
jrmu
# foreach my $l (@lines) { print "$l\n"; }
191
2020-10-20
jrmu
# }
192
2020-10-11
jrmu
#}
193
2020-10-20
jrmu
#sub mforeach {
194
2020-10-20
jrmu
# my ($bot, $nick, $host, $hand, $text) = @_;
195
2020-10-20
jrmu
# if ($staff !~ /$nick/) { return; }
196
2020-10-20
jrmu
# if ($text =~ /^network\s+del\s+([[:graph:]]+)\s+(#[[:graph:]]+)$/) {
197
2020-10-20
jrmu
# my ($user, $chan) = ($1, $2);
198
2020-10-20
jrmu
# foreach my $n (@main::networks) {
199
2020-10-20
jrmu
# main::putserv($bot, "PRIVMSG *controlpanel :delchan $user $n->{name} $chan");
200
2020-10-20
jrmu
# }
201
2020-10-20
jrmu
# }
202
2020-10-20
jrmu
#}
203
2020-10-11
jrmu
204
2020-10-20
jrmu
#sub loadlog {
205
2020-10-20
jrmu
# open(my $fh, '<', "$znclog") or die "Could not read file 'znc.log' $!";
206
2020-10-20
jrmu
# chomp(@logs = <$fh>);
207
2020-10-20
jrmu
# close $fh;
208
2020-10-20
jrmu
#}
209
2020-10-11
jrmu
210
2020-10-20
jrmu
# return all lines matching a pattern
211
2020-10-20
jrmu
#sub regex {
212
2020-10-20
jrmu
# my ($pattern) = @_;
213
2020-10-20
jrmu
# if (!@logs) { loadlog(); }
214
2020-10-20
jrmu
# return grep(/$pattern/, @logs);
215
2020-10-20
jrmu
#}
216
2020-10-11
jrmu
217
2020-10-20
jrmu
# given a list of IPs, return matching users
218
2020-10-20
jrmu
# or given a list of users, return matching IPs
219
2020-10-20
jrmu
#sub regexlist {
220
2020-10-20
jrmu
# my ($items) = @_;
221
2020-10-20
jrmu
# my @items = split /[,\s]+/m, $items;
222
2020-10-20
jrmu
# my $pattern = "(".join('|', @items).")";
223
2020-10-20
jrmu
# if (!@logs) { loadlog(); }
224
2020-10-20
jrmu
# my @matches = grep(/$pattern/, @logs);
225
2020-10-20
jrmu
# my @results;
226
2020-10-20
jrmu
# foreach my $match (@matches) {
227
2020-10-20
jrmu
# if ($match =~ /^\[\d{4}-\d\d-\d\d \d\d:\d\d:\d\d\] \[([^]\/]+)(\/[^]]+)?\] connected to ZNC from (.*)/) {
228
2020-10-20
jrmu
# my ($user, $ip) = ($1, $3);
229
2020-10-20
jrmu
# if ($items =~ /[.:]/) { # items are IP addresses
230
2020-10-20
jrmu
# push(@results, $user);
231
2020-10-20
jrmu
# } else { # items are users
232
2020-10-20
jrmu
# push(@results, $ip);
233
2020-10-20
jrmu
# }
234
2020-10-20
jrmu
# }
235
2020-10-20
jrmu
# }
236
2020-10-20
jrmu
# my @sorted = sort @results;
237
2020-10-20
jrmu
# @results = do { my %seen; grep { !$seen{$_}++ } @sorted }; # uniq
238
2020-10-20
jrmu
# return join(' ', @results);
239
2020-10-20
jrmu
#}
240
2020-10-20
jrmu
241
2020-10-20
jrmu
sub createshell {
242
2020-10-20
jrmu
my ($bot, $username, $password, $bindhost) = @_;
243
2020-10-20
jrmu
my $netname = $bot->{name};
244
2020-10-27
jrmu
system "doas groupadd $username";
245
2020-10-27
jrmu
system "doas adduser -batch $username $username $username `encrypt $password`";
246
2020-10-27
jrmu
system "doas chmod 700 /home/$username /home/$username/.ssh";
247
2020-10-27
jrmu
system "doas chmod 600 /home/$username/{.Xdefaults,.cshrc,.cvsrc,.login,.mailrc,.profile}";
248
2020-10-27
jrmu
system "doas mkdir /var/www/htdocs/$username";
249
2020-10-27
jrmu
system "doas ln -s /var/www/htdocs/$username /home/$username/htdocs";
250
2020-10-27
jrmu
system "doas chown -R $username:www /var/www/htdocs/$username /home/$username/htdocs";
251
2020-10-27
jrmu
system "doas chmod -R o-rx /var/www/htdocs/$username /home/$username/htdocs";
252
2020-10-27
jrmu
system "doas chmod -R g+rwx /var/www/htdocs/$username /home/$username/htdocs";
253
2020-10-27
jrmu
my $block = <<"EOF";
254
2020-10-27
jrmu
server "$username.$hostname" {
255
2020-10-27
jrmu
listen on * tls port 443
256
2020-10-27
jrmu
tls {
257
2020-10-27
jrmu
certificate "/etc/ssl/$username.$hostname.fullchain.pem"
258
2020-10-27
jrmu
key "/etc/ssl/private/$username.$hostname.key"
259
2020-10-27
jrmu
}
260
2020-10-27
jrmu
location "/.well-known/acme-challenge/*" {
261
2020-10-27
jrmu
root "/acme"
262
2020-10-27
jrmu
}
263
2020-10-27
jrmu
location "*.php" {
264
2020-10-27
jrmu
fastcgi socket "/run/php-fpm.sock"
265
2020-10-27
jrmu
}
266
2020-10-27
jrmu
root "/htdocs/$username"
267
2020-10-27
jrmu
}
268
2020-10-27
jrmu
EOF
269
2020-10-27
jrmu
main::appendfile($httpdconfpath, $block);
270
2020-10-27
jrmu
$block = <<"EOF";
271
2020-10-27
jrmu
domain "$username.$hostname" {
272
2020-10-27
jrmu
domain key "/etc/ssl/private/$username.$hostname.key"
273
2020-10-27
jrmu
domain full chain certificate "/etc/ssl/$username.$hostname.fullchain.pem"
274
2020-10-27
jrmu
sign with letsencrypt
275
2020-10-27
jrmu
}
276
2020-10-27
jrmu
EOF
277
2020-10-27
jrmu
main::appendfile($acmeconfpath, $block);
278
2020-10-27
jrmu
#edquota $username
279
2020-10-27
jrmu
return 1;
280
2020-10-27
jrmu
}
281
2020-10-27
jrmu
282
2020-10-27
jrmu
sub deleteshell {
283
2020-10-27
jrmu
my ($bot, $username, $bindhost) = @_;
284
2020-10-27
jrmu
my $netname = $bot->{name};
285
2020-10-27
jrmu
system "doas groupdel $username";
286
2020-10-27
jrmu
system "doas userdel $username";
287
2020-10-27
jrmu
my $httpdconf = main::readstr($httpdconfpath);
288
2020-10-27
jrmu
my $block = <<"EOF";
289
2020-10-27
jrmu
server "$username.$hostname" {
290
2020-10-27
jrmu
listen on * tls port 443
291
2020-10-27
jrmu
tls {
292
2020-10-27
jrmu
certificate "/etc/ssl/$username.$hostname.fullchain.pem"
293
2020-10-27
jrmu
key "/etc/ssl/private/$username.$hostname.key"
294
2020-10-27
jrmu
}
295
2020-10-27
jrmu
location "/.well-known/acme-challenge/*" {
296
2020-10-27
jrmu
root "/acme"
297
2020-10-27
jrmu
}
298
2020-10-27
jrmu
location "*.php" {
299
2020-10-27
jrmu
fastcgi socket "/run/php-fpm.sock"
300
2020-10-27
jrmu
}
301
2020-10-27
jrmu
root "/htdocs/$username"
302
2020-10-27
jrmu
}
303
2020-10-27
jrmu
EOF
304
2020-10-27
jrmu
$block =~ s/{/\\{/gm;
305
2020-10-27
jrmu
$block =~ s/}/\\}/gm;
306
2020-10-27
jrmu
$block =~ s/\./\\./gm;
307
2020-10-27
jrmu
$block =~ s/\*/\\*/gm;
308
2020-10-27
jrmu
$httpdconf =~ s{$block}{}gm;
309
2020-10-27
jrmu
print $httpdconf;
310
2020-10-27
jrmu
main::writefile($httpdconfpath, $httpdconf);
311
2020-10-27
jrmu
312
2020-10-27
jrmu
my $acmeconf = main::readstr($acmeconfpath);
313
2020-10-27
jrmu
$block = <<"EOF";
314
2020-10-27
jrmu
domain "$username.$hostname" {
315
2020-10-27
jrmu
domain key "/etc/ssl/private/$username.$hostname.key"
316
2020-10-27
jrmu
domain full chain certificate "/etc/ssl/$username.$hostname.fullchain.pem"
317
2020-10-27
jrmu
sign with letsencrypt
318
2020-10-27
jrmu
}
319
2020-10-27
jrmu
EOF
320
2020-10-27
jrmu
$block =~ s/{/\\{/gm;
321
2020-10-27
jrmu
$block =~ s/}/\\}/gm;
322
2020-10-27
jrmu
$block =~ s/\./\\./gm;
323
2020-10-27
jrmu
$block =~ s/\*/\\*/gm;
324
2020-10-27
jrmu
$acmeconf =~ s{$block}{}gm;
325
2020-10-27
jrmu
main::writefile($acmeconfpath, $acmeconf);
326
2020-10-24
jrmu
return 1;
327
2020-10-24
jrmu
}
328
2020-10-24
jrmu
329
2020-10-24
jrmu
#TODO Fix for $i
330
2020-10-24
jrmu
# Return column $i from $filename as an array with file separator $FS
331
2020-10-24
jrmu
sub col {
332
2020-10-24
jrmu
my ($filename, $i, $FS) = @_;
333
2020-10-24
jrmu
my @rows = main::readarray($filename);
334
2020-10-24
jrmu
my @results;
335
2020-10-24
jrmu
foreach my $row (@rows) {
336
2020-10-24
jrmu
if ($row =~ /^(.*?)$FS/) {
337
2020-10-24
jrmu
push(@results, $1);
338
2020-10-24
jrmu
}
339
2020-10-24
jrmu
}
340
2020-10-24
jrmu
return @results;
341
2020-10-24
jrmu
}
342
2020-10-11
jrmu
#unveil("./newacct", "rx") or die "Unable to unveil $!";
343
2020-10-11
jrmu
1; # MUST BE LAST STATEMENT IN FILE