]>
jfr.im git - irc/quakenet/newserv.git/blob - trusts/trusts_commands.c
2 #include "../control/control.h"
3 #include "../lib/irc_string.h"
6 int trusts_migration_start ( TrustDBMigrationCallback
, void *);
7 void trusts_migration_stop ( void );
8 static void registercommands ( int , void *);
9 static void deregistercommands ( int , void *);
11 static void migrate_status ( int errcode
, void * tag
) {
12 long sender
= ( long ) tag
;
13 nick
* np
= getnickbynumeric ( sender
);
18 if (! errcode
|| errcode
== MIGRATION_LASTERROR
) {
20 controlreply ( np
, "Migration complete." );
21 controlreply ( np
, "Attempting to reload database. . ." );
23 controlreply ( np
, "An error occured after the database was unloaded, attempting reload. . ." );
26 controlreply ( np
, "Database reloaded successfully." );
28 controlreply ( np
, "An error occured, please reload the module manually." );
31 controlreply ( np
, "Error %d occured during migration, commands reregistered." , errcode
);
32 registercommands ( 0 , NULL
);
36 static int trusts_cmdmigrate ( void * source
, int cargc
, char ** cargv
) {
37 nick
* sender
= source
;
40 /* iffy but temporary */
41 ret
= trusts_migration_start ( migrate_status
, ( void *)( sender
-> numeric
));
43 controlreply ( sender
, "Migration started, commands deregistered." );
44 deregistercommands ( 0 , NULL
);
46 controlreply ( sender
, "Error %d starting migration." , ret
);
52 static int trusts_cmdtrustlist ( void * source
, int cargc
, char ** cargv
) {
53 nick
* sender
= source
;
61 tg
= tg_strtotg ( cargv
[ 0 ]);
63 controlreply ( sender
, "Couldn't find a trustgroup with that id." );
69 /* abusing the ternary operator a bit :( */
70 controlreply ( sender
, "Name: : %s " , tg
-> name
-> content
);
71 controlreply ( sender
, "Trusted for : %d " , tg
-> trustedfor
);
72 controlreply ( sender
, "Currently using : %d " , tg
-> count
);
73 controlreply ( sender
, "Clients per user : %d ( %s enforcing ident)" , tg
-> maxperident
, tg
-> mode
? "" : "not " );
74 controlreply ( sender
, "Contact: : %s " , tg
-> contact
-> content
);
75 controlreply ( sender
, "Expires in : %s " , ( tg
-> expires
> t
)? longtoduration ( tg
-> expires
- t
, 2 ): "(the past -- BUG)" );
76 controlreply ( sender
, "Last changed by : %s " , tg
-> createdby
-> content
);
77 controlreply ( sender
, "Comment: : %s " , tg
-> comment
-> content
);
78 controlreply ( sender
, "ID: : %u " , tg
-> id
);
79 controlreply ( sender
, "Last used : %s " , ( tg
-> count
> 0 )? "(now)" :(( tg
-> lastseen
> 0 )? trusts_timetostr ( tg
-> lastseen
): "(never)" ));
80 controlreply ( sender
, "Max usage : %d " , tg
-> maxusage
);
81 controlreply ( sender
, "Last max reset : %s " , tg
-> lastmaxuserreset
? trusts_timetostr ( tg
-> lastmaxuserreset
): "(never)" );
83 controlreply ( sender
, "Host Current Max Last seen" );
85 for ( th
= tg
-> hosts
; th
; th
= th
-> next
)
86 controlreply ( sender
, " %-20s %-10d %-10d %s " , trusts_cidr2str ( th
-> ip
, th
-> mask
), th
-> count
, th
-> maxusage
, ( th
-> count
> 0 )? "(now)" :(( th
-> lastseen
> 0 )? trusts_timetostr ( th
-> lastseen
): "(never)" ));
88 controlreply ( sender
, "End of list." );
93 static int trusts_cmdtrustadd ( void * source
, int cargc
, char ** cargv
) {
95 nick
* sender
= source
;
103 tg
= tg_strtotg ( cargv
[ 0 ]);
105 controlreply ( sender
, "Couldn't look up trustgroup." );
110 if (! trusts_str2cidr ( host
, & ip
, & mask
)) {
111 controlreply ( sender
, "Invalid host." );
115 th
= th_getbyhost ( ip
);
117 if ( mask
== th
-> mask
) {
118 controlreply ( sender
, "This host already exists with the same mask." );
121 if ( mask
> th
-> mask
) {
122 /* this mask is a closer fit */
124 controlreply ( sender
, "Warning: this host will override another ( %s ), as it has smaller prefix (group: %s )." , trusts_cidr2str ( th
-> ip
, th
-> mask
), th
-> group
-> name
-> content
);
125 controlreply ( sender
, "Adding anyway..." );
128 th
= th_getsupersetbyhost ( ip
, mask
);
130 controlreply ( sender
, "Warning: this host is already covered by a smaller prefix ( %s ), which will remain part of that group: %s " , trusts_cidr2str ( th
-> ip
, th
-> mask
), th
-> group
-> name
-> content
);
131 controlreply ( sender
, "Adding anyway..." );
135 th
= th_new ( tg
, host
);
137 controlreply ( sender
, "An error occured adding the host to the group." );
141 controlreply ( sender
, "Host added." );
142 /* TODO: controlwall */
147 static int trusts_cmdtrustgroupadd ( void * source
, int cargc
, char ** cargv
) {
148 nick
* sender
= source
;
149 char * name
, * contact
, * comment
, createdby
[ ACCOUNTLEN
+ 2 ];
150 unsigned int howmany
, maxperident
, enforceident
;
158 howmany
= strtoul ( cargv
[ 1 ], NULL
, 10 );
159 if (! howmany
|| ( howmany
> 50000 )) {
160 controlreply ( sender
, "Bad value maximum number of clients." );
164 howlong
= durationtolong ( cargv
[ 2 ]);
165 if (( howlong
<= 0 ) || ( howlong
> 365 * 86400 * 20 )) {
166 controlreply ( sender
, "Invalid duration supplied." );
170 maxperident
= strtoul ( cargv
[ 3 ], NULL
, 10 );
171 if (! howmany
|| ( maxperident
> 1000 )) {
172 controlreply ( sender
, "Bad value for max per ident." );
176 if ( cargv
[ 4 ][ 0 ] != '1' && cargv
[ 4 ][ 0 ] != '0' ) {
177 controlreply ( sender
, "Bad value for enforce ident (use 0 or 1)." );
180 enforceident
= cargv
[ 4 ][ 0 ] == '1' ;
185 comment
= "(no comment)" ;
190 /* don't allow #id or id forms */
191 if (( name
[ 0 ] == '#' ) || strtoul ( name
, NULL
, 10 )) {
192 controlreply ( sender
, "Invalid trustgroup name." );
196 tg
= tg_strtotg ( name
);
198 controlreply ( sender
, "A group with that name already exists" );
202 snprintf ( createdby
, sizeof ( createdby
), "# %s " , sender
-> authname
);
204 tg
= tg_new ( name
, howmany
, enforceident
, maxperident
, howlong
+ time ( NULL
), createdby
, contact
, comment
);
206 controlreply ( sender
, "An error occured adding the trustgroup." );
210 controlreply ( sender
, "Group added." );
211 /* TODO: controlwall */
216 static int commandsregistered
;
218 static void registercommands ( int hooknum
, void * arg
) {
219 if ( commandsregistered
)
221 commandsregistered
= 1 ;
223 registercontrolhelpcmd ( "trustmigrate" , NO_DEVELOPER
, 0 , trusts_cmdmigrate
, "Usage: trustmigrate \n Copies trust data from O and reloads the database." );
224 registercontrolhelpcmd ( "trustlist" , NO_OPER
, 1 , trusts_cmdtrustlist
, "Usage: trustlist <#id|name|id> \n Shows trust data for the specified trust group." );
225 registercontrolhelpcmd ( "trustgroupadd" , NO_OPER
, 6 , trusts_cmdtrustgroupadd
, "Usage: trustgroupadd <name> <howmany> <howlong> <maxperident> <enforceident> <contact> ?comment?" );
226 registercontrolhelpcmd ( "trustadd" , NO_OPER
, 2 , trusts_cmdtrustadd
, "Usage: trustadd <#id|name|id> <host>" );
229 static void deregistercommands ( int hooknum
, void * arg
) {
230 if (! commandsregistered
)
232 commandsregistered
= 0 ;
234 deregistercontrolcmd ( "trustmigrate" , trusts_cmdmigrate
);
235 deregistercontrolcmd ( "trustlist" , trusts_cmdtrustlist
);
236 deregistercontrolcmd ( "trustgroupadd" , trusts_cmdtrustgroupadd
);
237 deregistercontrolcmd ( "trustadd" , trusts_cmdtrustadd
);
241 registerhook ( HOOK_TRUSTS_DB_LOADED
, registercommands
);
242 registerhook ( HOOK_TRUSTS_DB_CLOSED
, deregistercommands
);
245 registercommands ( 0 , NULL
);
249 deregisterhook ( HOOK_TRUSTS_DB_LOADED
, registercommands
);
250 deregisterhook ( HOOK_TRUSTS_DB_CLOSED
, deregistercommands
);
252 trusts_migration_stop ();
254 deregistercommands ( 0 , NULL
);