diff options
| author | 2017-05-08 02:59:19 +0000 | |
|---|---|---|
| committer | 2017-05-08 02:59:19 +0000 | |
| commit | 9fa591cb0696bfc8f8af284bac9c4cd312fe293e (patch) | |
| tree | a1d898498b8d58de68be2343ad953415544f73e0 | |
| parent | f91039f7bee00876022107e015c07879e15638d4 (diff) | |
Revert "Move users to DB"
This reverts commit 7342c7f0e19e15ab3c7ba2133a56393c15989f08.
Turns out there are still issues after all.
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | config-default/settings.json | 2 | ||||
| -rw-r--r-- | cpanfile | 3 | ||||
| -rw-r--r-- | cpanfile.snapshot | 13 | ||||
| -rw-r--r-- | lib/ASM/Commander.pm | 338 | ||||
| -rw-r--r-- | lib/ASM/Config.pm | 7 | ||||
| -rw-r--r-- | lib/ASM/DB.pm | 2 | ||||
| -rw-r--r-- | lib/ASM/DB/Result/User.pm | 34 | ||||
| -rw-r--r-- | lib/ASM/DB/ResultSet/User.pm | 23 | ||||
| -rw-r--r-- | sql/_common/upgrade/3-4/002-convert_users.pl | 31 | ||||
| -rw-r--r-- | sql/_source/deploy/4/001-auto-__VERSION.yml | 91 | ||||
| -rw-r--r-- | sql/_source/deploy/4/001-auto.yml | 437 |
12 files changed, 170 insertions, 812 deletions
@@ -11,4 +11,3 @@ HTTP_ACCESS* # DBIx::Class::DeploymentHandler /sql/*/ !/sql/_source/ -!/sql/_common/ diff --git a/config-default/settings.json b/config-default/settings.json index 8fd2b24..c976383 100644 --- a/config-default/settings.json +++ b/config-default/settings.json @@ -29,10 +29,12 @@ "ssl" : "1", "username" : "MetaBot", "web" : { + "groupfile" : "/var/www/.htgroup", "shortener" : { "apikey" : "yoursecretkey", "domain" : "yourls.org", "secure" : "0" }, + "userfile" : "/var/www/.htpasswd" } } @@ -1,3 +1,5 @@ +requires 'Apache::Htgroup', '1.23'; +requires 'Apache::Htpasswd', '1.8'; requires 'Array::Utils', '0.5'; requires 'autovivification', '0.12'; requires 'Data::UUID', '1.219'; @@ -16,7 +18,6 @@ requires 'String::Interpolate', '0.32'; requires 'Text::LevenshteinXS', '0.03'; requires 'Tie::CPHash', '1.06'; requires 'URI::Escape', '3.31'; -requires 'Const::Fast', '0.014'; requires 'DBI', '1.63'; requires 'DBD::mysql', '4.025'; diff --git a/cpanfile.snapshot b/cpanfile.snapshot index 1c8bc89..0b08cc6 100644 --- a/cpanfile.snapshot +++ b/cpanfile.snapshot @@ -359,19 +359,6 @@ DISTRIBUTIONS Module::Pluggable::Object 3.6 Test::More 0 perl 5.006 - Const-Fast-0.014 - pathname: L/LE/LEONT/Const-Fast-0.014.tar.gz - provides: - Const::Fast 0.014 - requirements: - Carp 0 - Module::Build::Tiny 0.021 - Scalar::Util 0 - Storable 0 - Sub::Exporter::Progressive 0.001007 - perl 5.008 - strict 0 - warnings 0 Context-Preserve-0.01 pathname: J/JR/JROCKWAY/Context-Preserve-0.01.tar.gz provides: diff --git a/lib/ASM/Commander.pm b/lib/ASM/Commander.pm index 6de19fd..edad532 100644 --- a/lib/ASM/Commander.pm +++ b/lib/ASM/Commander.pm @@ -1,7 +1,6 @@ package ASM::Commander; no autovivification; -use v5.10; use warnings; use strict; use IO::All; @@ -9,60 +8,45 @@ use POSIX qw(strftime); use Data::Dumper; use URI::Escape; use ASM::Shortener; -use Const::Fast; no if $] >= 5.017011, warnings => 'experimental::smartmatch'; -const my $secret => 'flag_secret'; -const my $hilights => 'flag_hilights'; -const my $admin => 'flag_admin'; -const my $plugin => 'flag_plugin'; -const my $debug => 'flag_debug'; - -const my %letter_to_flag => ( - s => $secret, - h => $hilights, - a => $admin, - p => $plugin, - d => $debug, -); - -const my %flag_to_letter => reverse(%letter_to_flag); - my $cmdtbl = { '^;wallop' => { - 'flag' => $debug, + 'flag' => 'd', 'cmd' => \&cmd_wallop }, '^;;addwebuser (?<pass>.{6,})' => { - 'flag' => $secret, - 'txn' => 1, + 'flag' => 's', 'cmd' => \&cmd_addwebuser }, + '^;delwebuser (?<user>\S+)' => { + 'flag' => 'a', + 'cmd' => \&cmd_delwebuser }, '^;teredo (?<ip>\S+)' => { 'cmd' => \&cmd_teredo }, '^;status$' => { 'cmd' => \&cmd_status }, '^;mship (?<nick>\S+)' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_mship }, '^;source$' => { 'cmd' => \&cmd_source }, '^;monitor (?<chan>\S+) *$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_monitor }, '^;monitor (?<chan>\S+) ?(?<switch>yes|no)$' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_monitor2 }, '^;suppress (?<chan>\S+) *$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_suppress }, '^;unsuppress (?<chan>\S+) *$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_unsuppress }, '^;silence (?<chan>\S+) *$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_silence }, '^;silence (?<chan>\S+) (?<switch>yes|no) *$' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_silence2 }, '^;help$' => { 'cmd' => \&cmd_help }, @@ -73,88 +57,89 @@ my $cmdtbl = { '^;query (\S+) ?(\S+)?$' => { 'cmd' => \&cmd_query }, '^;investigate (?<nick>\S+) *$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_investigate }, '^;investigate2 (?<nick>\S+) ?(?<skip>\d*) *$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_investigate2 }, - '^;userx? (?:add|flags) (?<account>\S+) (?<flags>\S+)$' => { - 'flag' => $admin, - 'txn' => 1, - 'cmd' => \&cmd_user_set_flags }, + '^;userx? add (?<account>\S+) (?<flags>\S+)$' => { + 'flag' => 'a', + 'cmd' => \&cmd_user_add }, '^;userx? flags (?<account>\S+) ?$' => { - 'cmd' => \&cmd_user_get_flags }, + 'cmd' => \&cmd_user_flags }, + '^;userx? flags (?<account>\S+) (?<flags>\S+)$' => { + 'flag' => 'a', + 'cmd' => \&cmd_user_flags2 }, '^;userx? del (?<account>\S+)$' => { - 'flag' => $admin, - 'txn' => 1, + 'flag' => 'a', 'cmd' => \&cmd_user_del }, '^;target (?<chan>\S+) (?<nickchan>\S+) ?(?<level>[a-z]*)$' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_target }, '^;detarget (?<chan>\S+) (?<nickchan>\S+)' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_detarget }, '^;showhilights (?<nick>\S+) *$' => { - 'flag' => $hilights, + 'flag' => 'h', 'cmd' => \&cmd_showhilights }, '^;hilight (?<chan>\S+) (?<nicks>\S+) ?(?<level>[a-z]*)$' => { - 'flag' => $hilights, + 'flag' => 'h', 'cmd' => \&cmd_hilight }, '^;dehilight (?<chan>\S+) (?<nicks>\S+)' => { - 'flag' => $hilights, + 'flag' => 'h', 'cmd' => \&cmd_dehilight }, '^;join (?<chan>\S+)' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_join }, '^;part (?<chan>\S+)' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_part }, '^;sl (?<string>.+)' => { - 'flag' => $debug, + 'flag' => 'd', 'cmd' => \&cmd_sl }, '^;quit ?(?<reason>.*)' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_quit }, '^;ev (?<string>.*)' => { - 'flag' => $debug, + 'flag' => 'd', 'cmd' => \&cmd_ev }, '^;rehash$' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_rehash }, '^;restrict (?<type>nick|account|host) (?<who>\S+) (?<mode>\+|-)(?<restriction>[a-z0-9_-]+)$' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_restrict }, '^\s*\!ops ?(?<chan>#\S+)? ?(?<reason>.*)' => { 'nohush' => 'nohush', 'cmd' => \&cmd_ops }, '^;blacklist (?<string>.+)' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_blacklist }, '^;blacklistpcre (?<string>.+)' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_blacklistpcre }, '^;unblacklist (?<id>[0-9a-f]+)$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_unblacklist }, '^;plugin (?<chan>\S+) (?<risk>\S+) (?<reason>.*)' => { - 'flag' => $plugin, + 'flag' => 'p', 'cmd' => \&cmd_plugin }, '^;sync (?<chan>\S+)' => { - 'flag' => $admin, + 'flag' => 'a', 'cmd' => \&cmd_sync }, '^;ping\s*$' => { 'cmd' => \&cmd_ping }, '^;ping (?<string>\S.*)$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_ping2 }, '^;blreason (?<id>[0-9a-f]+) (?<reason>.*)' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_blreason }, '^;bllookup (?<id>[0-9a-f]+)$' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_bllookup }, '^;falsematch\b' => { - 'flag' => $secret, + 'flag' => 's', 'cmd' => \&cmd_falsematch }, '^;version$' => { 'cmd' => \&cmd_version }, @@ -189,50 +174,34 @@ sub command { unless ( (ASM::Util->speak($event->{to}->[0])) ) { next unless (defined($self->{cmdtbl}->{$command}->{nohush})); } + if (defined($self->{cmdtbl}->{$command}->{flag})) { #If the command is restricted, + if (!defined($acct)) { + $fail = 1; + } + elsif (!defined($::users->{person}->{$acct})) { #make sure the requester has an account + $fail = 1; + } + elsif (!defined($::users->{person}->{$acct}->{flags})) { #make sure the requester has flags defined + $fail = 1; + } + elsif (!(grep {$_ eq $self->{cmdtbl}->{$command}->{flag}} split('', $::users->{person}->{$acct}->{flags}))) { #make sure the requester has the needed flags + $fail = 1; + } + } if ($cmd=~/$command/) { my $where = $event->{to}[0]; if (index($where, '#') == -1) { $where = 'PM'; } ASM::Util->dprint("$event->{from} told me in $where: $cmd", "commander"); - if (!ASM::Util->notRestricted($nick, "nocommands")) { $fail = 1; } - - my $check_and_run_command = sub { - # If the command is restricted, - if ( my $flag = $self->{cmdtbl}->{$command}->{flag} ) { - # require an account - if (!defined($acct)) { - $fail = 1; - } - else { - # and check for the flag - my $user = $::db->resultset('User')->by_name($acct); - if (!defined $user || !$user->$flag) { - $fail = 1; - } - } - } - - if ($fail == 1) { - $conn->privmsg($nick, "You don't have permission to use that command, or you're not signed into nickserv."); - } else { - &{$self->{cmdtbl}->{$command}->{cmd}}($conn, $event); - } - }; - - # Do we need to wrap the entire command - including the permission check - in a transaction? - # Be careful; due to re-establishing a DB connection, this requires the command's code to - # be idempotent. See the DBIx::Class::Storage documentation on the txn_do method for details. - if ($self->{cmdtbl}{$command}{txn}) { - $::db->txn_do($check_and_run_command); - } - else { - $check_and_run_command->(); + if ($fail == 1) { + $conn->privmsg($nick, "You don't have permission to use that command, or you're not signed into nickserv."); + } else { + &{$self->{cmdtbl}->{$command}->{cmd}}($conn, $event); } - last; } } @@ -265,12 +234,30 @@ sub cmd_addwebuser { $conn->privmsg($event->replyto, "This command must be used in PM. Try again WITH A DIFFERENT PASSWORD!"); return; } - my $user = $::db->resultset('User')->by_name(lc $::sn{lc $event->{nick}}->{account}); - $user->passphrase($pass); - $user->update; + use Apache::Htpasswd; use Apache::Htgroup; + my $o_Htpasswd = new Apache::Htpasswd({passwdFile => $::settings->{web}->{userfile}, UseMD5 => 1}); + my $o_Htgroup = new Apache::Htgroup($::settings->{web}->{groupfile}); + my $user = lc $::sn{lc $event->{nick}}->{account}; + $o_Htpasswd->htDelete($user); + $o_Htpasswd->htpasswd($user, $pass); + $o_Htpasswd->writeInfo($user, strftime("%F %T", gmtime)); + $o_Htgroup->adduser($user, 'actionlogs'); + $o_Htgroup->save(); + $conn->privmsg($event->replyto, "Added $user to the list of authorized web users.") +} + +sub cmd_delwebuser { + my ($conn, $event) = @_; - my $name = $user->name; - $conn->privmsg($event->replyto, "Added $name to the list of authorized web users.") + my $user = lc $+{user}; + use Apache::Htpasswd; + use Apache::Htgroup; + my $o_Htpasswd = new Apache::Htpasswd({passwdFile => $::settings->{web}->{userfile}, UseMD5 => 1}); + my $o_Htgroup = new Apache::Htgroup($::settings->{web}->{groupfile}); + $o_Htpasswd->htDelete($user); + $o_Htgroup->deleteuser($user, 'actionlogs'); + $o_Htgroup->save(); + $conn->privmsg($event->replyto, "Removed $user from the list of authorized web users.") } sub cmd_teredo { @@ -607,89 +594,40 @@ sub cmd_investigate2 { $conn->privmsg($event->nick, "Only 10 results are shown at a time. For more, do ;investigate2 $nick " . ($skip+1) . '.'); } -sub get_user_flagstring { - my ($user) = @_; - - my $string = ''; - - for my $letter (sort keys %letter_to_flag) { - my $flag = $letter_to_flag{$letter}; - - $string .= $letter if $user->$flag; - } - - return $string; -} - -sub set_user_flagstring { - my ($user, $string) = @_; - - while (my ($letter, $flag) = each %letter_to_flag) { - if (index($string, $letter) != -1) { - $user->$flag(1); - } - else { - $user->$flag(0); - } - } -} - -sub is_flagstring_superset { - my ($super, $sub) = @_; - for my $letter (split //, $sub) { - return 0 if index($super, $letter) == -1; - } - return 1; -} - -sub cmd_user_set_flags { +sub cmd_user_add { my ($conn, $event) = @_; my $nick = lc $+{account}; my $account; my $flags = $+{flags}; - - # we need to be idempotent if interrupted halfway. - # TODO: this is rather ugly / error-prone. - state $sent_message = 0; - - if ( (defined($::sn{$nick}->{account})) && ( ($account = lc $::sn{$nick}->{account}) ne $nick ) ) { - $conn->privmsg($event->replyto, "I'm assuming you mean " . $nick . "'s nickserv account, " . $account . '.') - if !($sent_message++); - $nick = $account; + my %hasflagshash = (); + foreach my $item (split(//, $::users->{person}->{lc $::sn{lc $event->{nick}}->{account}}->{flags})) { + $hasflagshash{$item} = 1; } - - my $giver = $::db->resultset('User')->by_name( lc $::sn{lc $event->{nick}}{account} ); - - my $own_flags = get_user_flagstring($giver); - - if (!is_flagstring_superset($own_flags, $flags)) { - $conn->privmsg($event->replyto, "You can't give a flag you don't already have."); - $sent_message = 0; - return; + foreach my $flag (split(//, $flags)) { + if (!defined($hasflagshash{$flag})) { + $conn->privmsg($event->replyto, "You can't give a flag you don't already have."); + return; + } } if ($flags =~ /d/) { - $conn->privmsg($event->replyto, "The d flag may not be assigned over IRC. Edit the database manually."); - $sent_message = 0; + $conn->privmsg($event->replyto, "The d flag may not be assigned over IRC. Edit the configuration manually."); return; } - - my $target = $::db->resultset('User')->by_name_or_new( $nick ); - - if ($target->flag_debug) { - $conn->privmsg($event->replyto, "Users with the 'd' flag are untouchable. Edit the database manually."); - $sent_message = 0; + if ( (defined($::sn{$nick}->{account})) && ( ($account = lc $::sn{$nick}->{account}) ne $nick ) ) { + $conn->privmsg($event->replyto, "I'm assuming you mean " . $nick . "'s nickserv account, " . $account . '.'); + $nick = $account; + } + if (defined($::users->{person}->{$nick})) { + $conn->privmsg($event->replyto, "The user $nick already exists. Use ;user flags $nick $flags to set their flags"); return; } - - set_user_flagstring($target, $flags); - $target->update_or_insert; - - $sent_message = 0; + $::users->{person}->{$nick} = { 'flags' => $flags }; + ASM::Config->writeUsers(); $conn->privmsg($event->replyto, "Flags for NickServ account $nick set to $flags"); } -sub cmd_user_get_flags { +sub cmd_user_flags { my ($conn, $event) = @_; my $nick = lc $+{account}; @@ -699,32 +637,72 @@ sub cmd_user_get_flags { $nick = $account; } my $sayNick = substr($nick, 0, 1) . "\x02\x02" . substr($nick, 1); + if (defined($::users->{person}->{$nick}->{flags})) { + $conn->privmsg($event->replyto, "Flags for $sayNick: $::users->{person}->{$nick}->{flags}"); + } else { + $conn->privmsg($event->replyto, "$sayNick has no flags"); + } +} - my $user = $::db->resultset('User')->by_name($nick); +sub cmd_user_flags2 { + my ($conn, $event) = @_; - if (defined $user and length( my $flags = get_user_flagstring($user) )) { - $conn->privmsg($event->replyto, "Flags for $sayNick: $flags"); + my $nick = lc $+{account}; + my $flags = $+{flags}; + my $account; + my %hasflagshash = (); + foreach my $item (split(//, $::users->{person}->{lc $::sn{lc $event->{nick}}->{account}}->{flags})) { + $hasflagshash{$item} = 1; } - else { - $conn->privmsg($event->replyto, "$sayNick has no flags"); + foreach my $flag (split(//, $flags)) { + if (!defined($hasflagshash{$flag})) { + $conn->privmsg($event->replyto, "You can't give a flag you don't already have."); + return; + } + } + if ($flags =~ /d/) { + $conn->privmsg($event->replyto, "The d flag may not be assigned over IRC. Edit the configuration manually."); + return; } + if ( (defined($::sn{$nick}->{account})) && ( ($account = lc $::sn{$nick}->{account}) ne $nick ) ) { + $conn->privmsg($event->replyto, "I'm assuming you mean " . $nick . "'s nickserv account, " . $account . '.'); + $nick = $account; + } + if (defined($::users->{person}->{$nick}) && + defined($::users->{person}->{$nick}->{flags}) && + ($::users->{person}->{$nick}->{flags} =~ /d/)) { + return $conn->privmsg($event->replyto, "Users with the 'd' flag are untouchable. Edit the config file manually."); + } + if ($flags !~ /s/) { + use Apache::Htpasswd; use Apache::Htgroup; + my $o_Htpasswd = new Apache::Htpasswd({passwdFile => $::settings->{web}->{userfile}, UseMD5 => 1}); + my $o_Htgroup = new Apache::Htgroup($::settings->{web}->{groupfile}); + $o_Htpasswd->htDelete($nick); + $o_Htgroup->deleteuser($nick, 'actionlogs'); + $o_Htgroup->save(); + } + $::users->{person}->{$nick}->{flags} = $flags; + ASM::Config->writeUsers(); + $conn->privmsg($event->replyto, "Flags for $nick set to $flags"); } sub cmd_user_del { my ($conn, $event) = @_; my $nick = lc $+{account}; - - my $target = $::db->resultset('User')->by_name($nick); - if (!defined $target) { - $conn->privmsg($event->replyto, "I know no user by that name. Make sure you specified the account name."); - return; - } - if ($target->flag_debug) { - $conn->privmsg($event->replyto, "Users with the 'd' flag are untouchable. Edit the database manually."); - return; + if (defined($::users->{person}->{$nick}) && + defined($::users->{person}->{$nick}->{flags}) && + ($::users->{person}->{$nick}->{flags} =~ /d/)) { + return $conn->privmsg($event->replyto, "Users with the 'd' flag are untouchable. Edit the config file manually."); } - $target->delete; + delete($::users->{person}->{$nick}); + ASM::Config->writeUsers(); + use Apache::Htpasswd; use Apache::Htgroup; + my $o_Htpasswd = new Apache::Htpasswd({passwdFile => $::settings->{web}->{userfile}, UseMD5 => 1}); + my $o_Htgroup = new Apache::Htgroup($::settings->{web}->{groupfile}); + $o_Htpasswd->htDelete($nick); + $o_Htgroup->deleteuser($nick, 'actionlogs'); + $o_Htgroup->save(); $conn->privmsg($event->replyto, "Removed $nick from authorized users." . " MAKE SURE YOU PROVIDED a nickserv account to this command, rather than an altnick of the accountholder"); } diff --git a/lib/ASM/Config.pm b/lib/ASM/Config.pm index 8e336a3..ff6f745 100644 --- a/lib/ASM/Config.pm +++ b/lib/ASM/Config.pm @@ -19,6 +19,7 @@ sub deserialize { sub readConfig { $::settings = deserialize(io->file("$::cset/settings.json")->all); $::channels = deserialize(io->file("$::cset/channels.json")->all); + $::users = deserialize(io->file("$::cset/users.json")->all); $::mysql = deserialize(io->file("$::cset/mysql.json")->all); $::dnsbl = deserialize(io->file("$::cset/dnsbl.json")->all); $::rules = deserialize(io->file("$::cset/rules.json")->all); @@ -29,6 +30,7 @@ sub readConfig { sub writeConfig { writeMysql(); writeChannels(); + writeUsers(); writeSettings(); writeRestrictions(); writeBlacklist(); @@ -56,6 +58,11 @@ sub writeChannels { serialize($::channels) > io("$::cset/channels.json"); } +sub writeUsers { + $::settingschanged=1; + serialize($::users) > io("$::cset/users.json"); +} + sub writeSettings { $::settingschanged=1; serialize($::settings) > io("$::cset/settings.json"); diff --git a/lib/ASM/DB.pm b/lib/ASM/DB.pm index 5e1d44d..cc9906c 100644 --- a/lib/ASM/DB.pm +++ b/lib/ASM/DB.pm @@ -1,5 +1,5 @@ use utf8; -package ASM::DB 4; +package ASM::DB 3; use strict; use warnings; diff --git a/lib/ASM/DB/Result/User.pm b/lib/ASM/DB/Result/User.pm index 675ccba..5e5d17c 100644 --- a/lib/ASM/DB/Result/User.pm +++ b/lib/ASM/DB/Result/User.pm @@ -6,8 +6,6 @@ use warnings; use parent 'DBIx::Class::Core'; -use Authen::Passphrase::RejectAll; - __PACKAGE__->load_components('InflateColumn::DateTime', 'PassphraseColumn'); __PACKAGE__->table('users'); __PACKAGE__->add_columns( @@ -32,41 +30,9 @@ __PACKAGE__->add_columns( passphrase_check_method => 'check_password', is_nullable => 0, }, - flag_secret => { - data_type => 'boolean', - is_nullable => 0, - default_value => 0, - }, - flag_hilights => { - data_type => 'boolean', - is_nullable => 0, - default_value => 0, - }, - flag_admin => { - data_type => 'boolean', - is_nullable => 0, - default_value => 0, - }, - flag_plugin => { - data_type => 'boolean', - is_nullable => 0, - default_value => 0, - }, - flag_debug => { - data_type => 'boolean', - is_nullable => 0, - default_value => 0, - }, ); __PACKAGE__->set_primary_key('id'); __PACKAGE__->add_unique_constraint(uniq_user_name => ['name']); -sub new { - my $self = shift; - $_[0]{passphrase} //= Authen::Passphrase::RejectAll->new; - - $self->SUPER::new(@_); -} - 1; diff --git a/lib/ASM/DB/ResultSet/User.pm b/lib/ASM/DB/ResultSet/User.pm deleted file mode 100644 index 68c0871..0000000 --- a/lib/ASM/DB/ResultSet/User.pm +++ /dev/null @@ -1,23 +0,0 @@ -use utf8; - -package ASM::DB::ResultSet::User; - -use strict; -use warnings; - -use parent 'DBIx::Class::ResultSet'; -use namespace::autoclean; - -sub by_name { - my ( $self, $name ) = @_; - - return $self->find( { name => $name }, { key => 'uniq_user_name' } ); -} - -sub by_name_or_new { - my ( $self, $name ) = @_; - - return $self->find_or_new( { name => $name }, { key => 'uniq_user_name' } ); -} - -1; diff --git a/sql/_common/upgrade/3-4/002-convert_users.pl b/sql/_common/upgrade/3-4/002-convert_users.pl deleted file mode 100644 index 9631345..0000000 --- a/sql/_common/upgrade/3-4/002-convert_users.pl +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env perl -use v5.20; -use warnings; - -use DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator::ScriptHelpers 'schema_from_schema_loader'; -use Authen::Passphrase::RejectAll; - -schema_from_schema_loader({ naming => 'v4' }, sub { - my ($schema, $versions) = @_; - - while (my ($name, $user) = each %{ $::users->{person} }) { - my %flags; - for my $flag (split(//, $user->{flags})) { - $flags{$flag} = 1; - } - $schema->resultset('Users')->create({ - name => $name, - # We don't have the manually adjusted schema, so we need to - # pass the raw value for the passphrase column - passphrase => Authen::Passphrase::RejectAll->new->as_rfc2307, - flag_secret => $flags{s} // 0, - flag_admin => $flags{a} // 0, - flag_hilights => $flags{h} // 0, - flag_debug => $flags{d} // 0, - flag_plugin => $flags{p} // 0, - }); - } - - say "NOTE: The data from users.json has been moved to the database.\n" - . "You may remove users.json now, although keeping a backup is strongly recommended."; - }) diff --git a/sql/_source/deploy/4/001-auto-__VERSION.yml b/sql/_source/deploy/4/001-auto-__VERSION.yml deleted file mode 100644 index 907f443..0000000 --- a/sql/_source/deploy/4/001-auto-__VERSION.yml +++ /dev/null @@ -1,91 +0,0 @@ ---- -schema: - procedures: {} - tables: - dbix_class_deploymenthandler_versions: - constraints: - - deferrable: 1 - expression: '' - fields: - - id - match_type: '' - name: '' - on_delete: '' - on_update: '' - options: [] - reference_fields: [] - reference_table: '' - type: PRIMARY KEY - - deferrable: 1 - expression: '' - fields: - - version - match_type: '' - name: dbix_class_deploymenthandler_versions_version - on_delete: '' - on_update: '' - options: [] - reference_fields: [] - reference_table: '' - type: UNIQUE - fields: - ddl: - data_type: text - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: ddl - order: 3 - size: - - 0 - id: - data_type: int - default_value: ~ - is_auto_increment: 1 - is_nullable: 0 - is_primary_key: 1 - is_unique: 0 - name: id - order: 1 - size: - - 0 - upgrade_sql: - data_type: text - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: upgrade_sql - order: 4 - size: - - 0 - version: - data_type: varchar - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 1 - name: version - order: 2 - size: - - 50 - indices: [] - name: dbix_class_deploymenthandler_versions - options: [] - order: 1 - triggers: {} - views: {} -translator: - add_drop_table: 0 - filename: ~ - no_comments: 0 - parser_args: - sources: - - __VERSION - parser_type: SQL::Translator::Parser::DBIx::Class - producer_args: {} - producer_type: SQL::Translator::Producer::YAML - show_warnings: 0 - trace: 0 - version: 0.11021 diff --git a/sql/_source/deploy/4/001-auto.yml b/sql/_source/deploy/4/001-auto.yml deleted file mode 100644 index 8ae9ddc..0000000 --- a/sql/_source/deploy/4/001-auto.yml +++ /dev/null @@ -1,437 +0,0 @@ ---- -schema: - procedures: {} - tables: - actionlog: - constraints: - - deferrable: 1 - expression: '' - fields: - - index - match_type: '' - name: '' - on_delete: '' - on_update: '' - options: [] - reference_fields: [] - reference_table: '' - type: PRIMARY KEY - fields: - account: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: account - order: 11 - size: - - 17 - action: - data_type: varchar - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: action - order: 3 - size: - - 20 - byaccount: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: byaccount - order: 16 - size: - - 17 - bygecos: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: bygecos - order: 15 - size: - - 512 - byhost: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: byhost - order: 14 - size: - - 64 - bynick: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: bynick - order: 12 - size: - - 17 - byuser: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: byuser - order: 13 - size: - - 11 - channel: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: channel - order: 5 - size: - - 51 - gecos: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: gecos - order: 10 - size: - - 512 - host: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: host - order: 8 - size: - - 64 - index: - data_type: bigint - default_value: ~ - is_auto_increment: 1 - is_nullable: 0 - is_primary_key: 1 - is_unique: 0 - name: index - order: 1 - size: - - 0 - ip: - data_type: integer - default_value: ~ - extra: - unsigned: 1 - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: ip - order: 9 - size: - - 0 - nick: - data_type: varchar - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: nick - order: 6 - size: - - 17 - reason: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: reason - order: 4 - size: - - 512 - time: - data_type: timestamp - default_value: !!perl/ref - =: current_timestamp - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: time - order: 2 - size: - - 0 - user: - data_type: varchar - default_value: ~ - is_nullable: 1 - is_primary_key: 0 - is_unique: 0 - name: user - order: 7 - size: - - 11 - indices: [] - name: actionlog - options: [] - order: 1 - alertlog: - constraints: - - deferrable: 1 - expression: '' - fields: - - sqlid - match_type: '' - name: '' - on_delete: '' - on_update: '' - options: [] - reference_fields: [] - reference_table: '' - type: PRIMARY KEY - fields: - channel: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: channel - order: 2 - size: - - 0 - gecos: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: gecos - order: 6 - size: - - 0 - host: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: host - order: 5 - size: - - 0 - id: - data_type: tinytext - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: id - order: 8 - size: - - 0 - level: - data_type: tinytext - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: level - order: 7 - size: - - 0 - nick: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: nick - order: 3 - size: - - 0 - reason: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: reason - order: 9 - size: - - 0 - sqlid: - data_type: bigint - default_value: ~ - is_auto_increment: 1 - is_nullable: 0 - is_primary_key: 1 - is_unique: 0 - name: sqlid - order: 10 - size: - - 0 - time: - data_type: timestamp - default_value: !!perl/ref - =: current_timestamp - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: time - order: 1 - size: - - 0 - user: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: user - order: 4 - size: - - 0 - indices: [] - name: alertlog - options: [] - order: 2 - users: - constraints: - - deferrable: 1 - expression: '' - fields: - - id - match_type: '' - name: '' - on_delete: '' - on_update: '' - options: [] - reference_fields: [] - reference_table: '' - type: PRIMARY KEY - - deferrable: 1 - expression: '' - fields: - - name - match_type: '' - name: uniq_user_name - on_delete: '' - on_update: '' - options: [] - reference_fields: [] - reference_table: '' - type: UNIQUE - fields: - flag_admin: - data_type: boolean - default_value: 0 - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: flag_admin - order: 6 - size: - - 0 - flag_debug: - data_type: boolean - default_value: 0 - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: flag_debug - order: 8 - size: - - 0 - flag_hilights: - data_type: boolean - default_value: 0 - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: flag_hilights - order: 5 - size: - - 0 - flag_plugin: - data_type: boolean - default_value: 0 - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: flag_plugin - order: 7 - size: - - 0 - flag_secret: - data_type: boolean - default_value: 0 - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: flag_secret - order: 4 - size: - - 0 - id: - data_type: bigint - default_value: ~ - is_auto_increment: 1 - is_nullable: 0 - is_primary_key: 1 - is_unique: 0 - name: id - order: 1 - size: - - 0 - name: - data_type: varchar - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 1 - name: name - order: 2 - size: - - 20 - passphrase: - data_type: text - default_value: ~ - is_nullable: 0 - is_primary_key: 0 - is_unique: 0 - name: passphrase - order: 3 - size: - - 0 - indices: [] - name: users - options: [] - order: 3 - triggers: {} - views: {} -translator: - add_drop_table: 0 - filename: ~ - no_comments: 0 - parser_args: - sources: - - Actionlog - - Alertlog - - User - parser_type: SQL::Translator::Parser::DBIx::Class - producer_args: {} - producer_type: SQL::Translator::Producer::YAML - show_warnings: 0 - trace: 0 - version: 0.11021 |
