]>
jfr.im git - irc/SurrealServices/srsv.git/blob - branches/erry-devel/modules/serviceslibs/adminserv.pm
1 # This file is part of SurrealServices.
3 # SurrealServices is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 # SurrealServices is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with SurrealServices; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 use SrSv
:: Text
:: Format
qw(columnar) ;
25 use SrSv
:: User
qw(get_user_nick get_user_id) ;
26 use SrSv
:: User
:: Notice
;
27 use SrSv
:: Help
qw( sendhelp ) ;
31 use SrSv
:: NickReg
:: Flags
qw(NRF_NOHIGHLIGHT nr_chk_flag_user) ;
33 use SrSv
:: MySQL
' $dbh ' ;
42 # BE CAREFUL CHANGING THESE
54 my $allflags = ( 2 ** @flags ) - 1 ;
56 for ( my $i = 0 ; $i < @flags ; $i++ ) {
57 $flags { $flags [ $i ]} = 2 ** $i ;
60 our $asnick_default = 'AdminServ' ;
61 our $asnick = $asnick_default ;
62 our $asuser = { NICK
=> $asnick , ID
=> "123AAAAAG" };
63 our @levels = ( 'Normal User' , 'HelpOp' , 'Operator' , 'Administrator' , 'Root' );
66 $flags { HELP
}, # HelpOp
67 $flags { HELP
}| $flags { FJOIN
}| $flags { QLINE
}| $flags { SUPER
}| $flags { FREEZE
}| $flags { KILL
}, # Operator
68 $flags { HELP
}| $flags { FJOIN
}| $flags { QLINE
}| $flags { SUPER
}| $flags { FREEZE
}| $flags { HOLD
}| $flags { BOT
}| $flags { SERVOP
}| $flags { KILL
}, # Admin
73 $create_svsop , $delete_svsop , $rename_svsop ,
75 $get_svs_list , $get_all_svsops ,
77 $get_svs_level , $set_svs_level , $get_best_svs_level ,
79 $chk_pass , $get_pass , $set_pass
83 $create_svsop = $dbh -> prepare ( "INSERT IGNORE INTO svsop SELECT id, NULL, NULL FROM nickreg WHERE nick=?" );
84 $delete_svsop = $dbh -> prepare ( "DELETE FROM svsop USING svsop, nickreg WHERE nickreg.nick=? AND svsop.nrid=nickreg.id" );
86 $get_svs_list = $dbh -> prepare ( "SELECT nickreg.nick, svsop.adder FROM svsop, nickreg WHERE svsop.level=? AND svsop.nrid=nickreg.id ORDER BY nickreg.nick" );
87 $get_all_svsops = $dbh -> prepare ( "SELECT nickreg.nick, svsop.level, svsop.adder FROM svsop, nickreg WHERE svsop.nrid=nickreg.id ORDER BY svsop.level, nickreg.nick" );
89 $get_svs_level = $dbh -> prepare ( "SELECT svsop.level FROM svsop, nickalias WHERE nickalias.alias=? AND svsop.nrid=nickalias.nrid" );
90 $set_svs_level = $dbh -> prepare ( "UPDATE svsop, nickreg SET svsop.level=?, svsop.adder=? WHERE nickreg.nick=? AND svsop.nrid=nickreg.id" );
91 $get_best_svs_level = $dbh -> prepare ( "SELECT svsop.level, nickreg.nick FROM nickid, nickreg, svsop WHERE nickid.nrid=nickreg.id AND svsop.nrid=nickreg.id AND nickid.id=? ORDER BY level DESC LIMIT 1" );
93 $chk_pass = $dbh -> prepare ( "SELECT 1 FROM ircop WHERE nick=? AND pass=?" );
94 $get_pass = $dbh -> prepare ( "SELECT pass FROM ircop WHERE nick=?" );
95 $set_pass = $dbh -> prepare ( "UPDATE ircop SET pass=? WHERE nick=?" );
98 ### ADMINSERV COMMANDS ###
101 my ( $user , $dstUser , $msg ) = @_ ;
103 my @args = split ( /\s+/ , $msg );
104 my $cmd = shift @args ;
105 $user -> { AGENT
} = $dstUser ;
106 my $src = $user ->{ NICK
};
107 return unless ( lc $dstUser ->{ NICK
} eq lc $asnick );
108 services
:: ulog
( $asuser , LOG_INFO
(), "cmd: [ $msg ]" , $user );
110 unless ( is_svsop
( $user ) or is_ircop
( $user )) {
111 notice
( $user , $err_deny );
112 ircd
:: globops
( $asuser , " \002 $src \002 failed access to $asnick $msg " );
116 if ( $cmd =~ /^svsop$/i ) {
117 my $cmd2 = shift @args ;
119 if ( $cmd2 =~ /^add$/i ) {
120 if ( @args == 2 and $args [ 1 ] =~ /^[aoh]$/i ) {
121 as_svs_add
( $user , $args [ 0 ], num_level
( $args [ 1 ]));
123 notice
( $user , 'Syntax: SVSOP ADD <nick> <A|O|H>' );
126 elsif ( $cmd2 =~ /^del$/i ) {
128 as_svs_del
( $user , $args [ 0 ]);
130 notice
( $user , 'Syntax: SVSOP DEL <nick>' );
133 elsif ( $cmd2 =~ /^list$/i ) {
134 if ( @args == 1 and $args [ 0 ] =~ /^[raoh]$/i ) {
135 as_svs_list
( $user , num_level
( $args [ 0 ]));
137 notice
( $user , 'Syntax: SVSOP LIST <R|A|O|H>' );
141 notice
( $user , 'Syntax: SVSOP <ADD|DEL|LIST> [...]' );
144 elsif ( $cmd =~ /^whois$/i ) {
146 as_whois
( $user , $args [ 0 ]);
148 notice
( $user , 'Syntax: WHOIS <nick>' );
151 elsif ( $cmd =~ /^help$/i ) {
152 sendhelp
( $user , 'adminserv' , @args )
154 elsif ( $cmd =~ /^staff$/i ) {
159 notice
( $user , 'Syntax: STAFF' );
163 notice
( $user , "Unrecognized command. For help, type: \002 /msg adminserv help \002 " );
167 sub as_svs_add
( $$$ ) {
168 my ( $user , $nick , $level ) = @_ ;
169 my $src = get_user_nick
( $user );
171 my ( $root , $oper ) = validate_chg
( $user , $nick );
174 if ( get_svs_level
( $root ) >= S_ROOT
) {
175 notice
( $user , $err_deny );
179 $create_svsop -> execute ( $root );
180 $set_svs_level -> execute ( $level , $oper , $root );
182 notice
( $user , " \002 $nick \002 is now a \002 Services $levels [ $level ] \002 ." );
183 wlog
( $asuser , LOG_INFO
(), " $src added $root as a Services $levels [ $level ]." );
187 my ( $user , $nick ) = @_ ;
188 my $src = get_user_nick
( $user );
190 my ( $root , $oper ) = validate_chg
( $user , $nick );
193 if ( get_svs_level
( $root ) >= S_ROOT
) {
194 notice
( $user , $err_deny );
198 $delete_svsop -> execute ( $root );
199 notice
( $user , " \002 $nick \002 has been stripped of services rank." );
200 wlog
( $asuser , LOG_INFO
(), " $src stripped $root of services rank." )
203 sub as_svs_list
( $$ ) {
204 my ( $user , $level ) = @_ ;
207 $get_svs_list -> execute ( $level );
209 while ( my ( $nick , $adder ) = $get_svs_list -> fetchrow_array ) {
210 push @data , [ $nick , "( $adder )" ];
213 notice
( $user , columnar
({ TITLE
=> "Services $levels [ $level ] list:" ,
214 NOHIGHLIGHT
=> nr_chk_flag_user
( $user , NRF_NOHIGHLIGHT
)}, @data ));
218 my ( $user , $nick ) = @_ ;
220 my ( $level , $root ) = get_best_svs_level
({ NICK
=> $nick });
221 notice
( $user , " \002 $nick \002 is a Services $levels [ $level ]" .( $level ? ' due to identification to the nick ' . " \002 $root \002 ." : '' ));
228 $get_all_svsops -> execute ();
230 while ( my ( $nick , $level , $adder ) = $get_all_svsops -> fetchrow_array ) {
231 push @data , [ $nick , $levels [ $level ], "( $adder )" ];
234 notice
( $user , columnar
({ TITLE
=> 'Staff list:' ,
235 NOHIGHLIGHT
=> nr_chk_flag_user
( $user , NRF_NOHIGHLIGHT
)}, @data ));
239 ### DATABASE UTILITY FUNCTIONS ###
241 sub validate_chg
( $$ ) {
242 my ( $user , $nick ) = @_ ;
245 unless ( $oper = is_svsop
( $user , S_ROOT
)) {
246 notice
( $user , $err_deny );
250 my $root = nickserv
:: get_root_nick
( $nick );
252 notice
( $user , "The nick \002 $nick \002 is not registered." );
256 return ( $root , $oper );
260 my ( $user , $flag ) = @_ ;
261 my $nflag = $flags { $flag };
263 my ( $level , $nick ) = get_best_svs_level
( $user );
264 print ( "LEVELS $defflags [ $level ] $nflag " . " \n " );
265 if ( $defflags [ $level ] & $nflag ) {
266 return $nick if (( $nflag == $flags { 'HELP' }) or is_ircop
( $user ));
273 my ( $user , $rlev ) = @_ ;
275 my ( $level , $nick ) = get_best_svs_level
( $user );
276 return $nick if ( defined ( $level ) and ! defined ( $rlev ));
278 if ( $level >= $rlev ) {
279 return $nick ; #if (($rlev == S_HELP) or is_ircop($user)) FIXME - erry
280 #Problem is inspircd has a gay way of identifying opers, instead of umode +o it sends OPERTYPE crap.
289 return undef if is_agent
( $user ->{ NICK
});
291 return $user ->{ IRCOP
} if ( exists ( $user ->{ IRCOP
}));
293 my %umodes = modes
:: splitumodes
( nickserv
:: get_user_modes
( $user ));
295 no warnings
'deprecated' ;
296 if (( $umodes { 'o' } eq '+' ) or ( $umodes { 'S' } eq '+' )) {
303 return $user ->{ IRCOP
};
307 # detect if a user belongs to another service like NeoStats. only works if they set umode +S
308 # is_ircop() includes is_service(), so no reason to call both.
311 return undef if is_agent
( $user ->{ NICK
});
313 return $user ->{ SERVICE
} if ( exists ( $user ->{ SERVICE
}));
315 my %umodes = modes
:: splitumodes
( nickserv
:: get_user_modes
( $user ));
317 if ( $umodes { 'S' } eq '+' ) {
318 $user ->{ SERVICE
} = 1 ;
322 $user ->{ SERVICE
} = 0 ;
325 return $user ->{ SERVICE
};
328 sub get_svs_level
($) {
331 return undef if is_agent
( $nick );
333 $get_svs_level -> execute ( $nick );
334 my ( $level ) = $get_svs_level -> fetchrow_array ;
339 sub get_best_svs_level
($) {
342 return undef if is_agent
( $user ->{ NICK
});
344 if ( exists ( $user ->{ SVSOP_LEVEL
}) && exists ( $user ->{ SVSOP_NICK
})) {
346 return ( $user ->{ SVSOP_LEVEL
}, $user ->{ SVSOP_NICK
});
348 return $user ->{ SVSOP_LEVEL
};
352 my $uid = get_user_id
( $user );
353 $get_best_svs_level -> execute ( $uid );
354 my ( $level , $nick ) = $get_best_svs_level -> fetchrow_array ;
356 $user ->{ SVSOP_LEVEL
} = $level ; $user ->{ SVSOP_NICK
} = $nick ;
359 print "LEVEL $level \n " ;
360 return ( $level , $nick );
370 $x =~ tr/hoarHOAR/12341234/ ;