Changeset 1ee6c18
- Timestamp:
- 2005-12-08T13:41:53Z (19 years ago)
- Branches:
- master
- Children:
- a1f17d4
- Parents:
- d636233
- Files:
-
- 3 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
rd636233 r1ee6c18 10 10 11 11 # Program variables 12 objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o log.o nick.o query.o set.o unix.o url.o user.o 12 objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o log.o nick.o query.o set.o unix.o url.o user.o storage_text.o storage.o 13 13 subdirs = protocols 14 14 -
bitlbee.c
rd636233 r1ee6c18 27 27 #include "bitlbee.h" 28 28 #include "commands.h" 29 #include "crypting.h"30 29 #include "protocols/nogaim.h" 31 30 #include "help.h" … … 244 243 } 245 244 246 int bitlbee_load( irc_t *irc, char* password )247 {248 char s[512];249 char *line;250 int proto;251 char nick[MAX_NICK_LENGTH+1];252 FILE *fp;253 user_t *ru = user_find( irc, ROOT_NICK );254 255 if( irc->status == USTATUS_IDENTIFIED )256 return( 1 );257 258 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" );259 fp = fopen( s, "r" );260 if( !fp ) return( 0 );261 262 fscanf( fp, "%32[^\n]s", s );263 if( setpass( irc, password, s ) < 0 )264 {265 fclose( fp );266 return( -1 );267 }268 269 /* Do this now. If the user runs with AuthMode = Registered, the270 account command will not work otherwise. */271 irc->status = USTATUS_IDENTIFIED;272 273 while( fscanf( fp, "%511[^\n]s", s ) > 0 )274 {275 fgetc( fp );276 line = deobfucrypt( irc, s );277 root_command_string( irc, ru, line, 0 );278 g_free( line );279 }280 fclose( fp );281 282 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );283 fp = fopen( s, "r" );284 if( !fp ) return( 0 );285 while( fscanf( fp, "%s %d %s", s, &proto, nick ) > 0 )286 {287 http_decode( s );288 nick_set( irc, s, proto, nick );289 }290 fclose( fp );291 292 if( set_getint( irc, "auto_connect" ) )293 {294 strcpy( s, "account on" ); /* Can't do this directly because r_c_s alters the string */295 root_command_string( irc, ru, s, 0 );296 }297 298 return( 1 );299 }300 301 int bitlbee_save( irc_t *irc )302 {303 char s[512];304 char path[512], new_path[512];305 char *line;306 nick_t *n;307 set_t *set;308 mode_t ou = umask( 0077 );309 account_t *a;310 FILE *fp;311 char *hash;312 313 /*\314 * [SH] Nothing should be saved if no password is set, because the315 * password is not set if it was wrong, or if one is not identified316 * yet. This means that a malicious user could easily overwrite317 * files owned by someone else:318 * a Bad Thing, methinks319 \*/320 321 /* [WVG] No? Really? */322 323 /*\324 * [SH] Okay, okay, it wasn't really Wilmer who said that, it was325 * me. I just thought it was funny.326 \*/327 328 hash = hashpass( irc );329 if( hash == NULL )330 {331 irc_usermsg( irc, "Please register yourself if you want to save your settings." );332 return( 0 );333 }334 335 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks~" );336 fp = fopen( path, "w" );337 if( !fp ) return( 0 );338 for( n = irc->nicks; n; n = n->next )339 {340 strcpy( s, n->handle );341 s[169] = 0; /* Prevent any overflow (169 ~ 512 / 3) */342 http_encode( s );343 g_snprintf( s + strlen( s ), 510 - strlen( s ), " %d %s", n->proto, n->nick );344 if( fprintf( fp, "%s\n", s ) != strlen( s ) + 1 )345 {346 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );347 fclose( fp );348 return( 0 );349 }350 }351 if( fclose( fp ) != 0 )352 {353 irc_usermsg( irc, "fclose() reported an error. Disk full?" );354 return( 0 );355 }356 357 g_snprintf( new_path, 512, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );358 if( unlink( new_path ) != 0 )359 {360 if( errno != ENOENT )361 {362 irc_usermsg( irc, "Error while removing old .nicks file" );363 return( 0 );364 }365 }366 if( rename( path, new_path ) != 0 )367 {368 irc_usermsg( irc, "Error while renaming new .nicks file" );369 return( 0 );370 }371 372 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts~" );373 fp = fopen( path, "w" );374 if( !fp ) return( 0 );375 if( fprintf( fp, "%s", hash ) != strlen( hash ) )376 {377 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );378 fclose( fp );379 return( 0 );380 }381 g_free( hash );382 383 for( a = irc->accounts; a; a = a->next )384 {385 if( a->protocol == PROTO_OSCAR || a->protocol == PROTO_ICQ || a->protocol == PROTO_TOC )386 g_snprintf( s, sizeof( s ), "account add oscar \"%s\" \"%s\" %s", a->user, a->pass, a->server );387 else388 g_snprintf( s, sizeof( s ), "account add %s \"%s\" \"%s\" \"%s\"",389 proto_name[a->protocol], a->user, a->pass, a->server ? a->server : "" );390 391 line = obfucrypt( irc, s );392 if( *line )393 {394 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )395 {396 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );397 fclose( fp );398 return( 0 );399 }400 }401 g_free( line );402 }403 404 for( set = irc->set; set; set = set->next )405 {406 if( set->value && set->def )407 {408 g_snprintf( s, sizeof( s ), "set %s \"%s\"", set->key, set->value );409 line = obfucrypt( irc, s );410 if( *line )411 {412 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )413 {414 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );415 fclose( fp );416 return( 0 );417 }418 }419 g_free( line );420 }421 }422 423 if( strcmp( irc->mynick, ROOT_NICK ) != 0 )424 {425 g_snprintf( s, sizeof( s ), "rename %s %s", ROOT_NICK, irc->mynick );426 line = obfucrypt( irc, s );427 if( *line )428 {429 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )430 {431 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );432 fclose( fp );433 return( 0 );434 }435 }436 g_free( line );437 }438 if( fclose( fp ) != 0 )439 {440 irc_usermsg( irc, "fclose() reported an error. Disk full?" );441 return( 0 );442 }443 444 g_snprintf( new_path, 512, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" );445 if( unlink( new_path ) != 0 )446 {447 if( errno != ENOENT )448 {449 irc_usermsg( irc, "Error while removing old .accounts file" );450 return( 0 );451 }452 }453 if( rename( path, new_path ) != 0 )454 {455 irc_usermsg( irc, "Error while renaming new .accounts file" );456 return( 0 );457 }458 459 umask( ou );460 461 return( 1 );462 }463 464 245 void bitlbee_shutdown( gpointer data ) 465 246 { -
bitlbee.h
rd636233 r1ee6c18 100 100 101 101 #include "irc.h" 102 #include "storage.h" 102 103 #include "set.h" 103 104 #include "protocols/nogaim.h" … … 115 116 help_t *help; 116 117 conf_t *conf; 118 storage_t *storage; 117 119 char *helpfile; 118 120 GMainLoop *loop; … … 127 129 int root_command_string( irc_t *irc, user_t *u, char *command, int flags ); 128 130 int root_command( irc_t *irc, char *command[] ); 129 int bitlbee_load( irc_t *irc, char *password );130 int bitlbee_save( irc_t *irc );131 131 void bitlbee_shutdown( gpointer data ); 132 132 double gettime( void ); -
commands.c
rd636233 r1ee6c18 86 86 int cmd_identify( irc_t *irc, char **cmd ) 87 87 { 88 int checkie = bitlbee_load( irc, cmd[1]);88 int checkie = global.storage->load( irc->nick, cmd[1], irc ); 89 89 90 90 if( checkie == -1 ) … … 110 110 int cmd_register( irc_t *irc, char **cmd ) 111 111 { 112 int checkie;113 char path[512];114 115 112 if( global.conf->authmode == AUTHMODE_REGISTERED ) 116 113 { … … 118 115 return( 0 ); 119 116 } 120 121 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" ); 122 checkie = access( path, F_OK ); 123 124 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" ); 125 checkie += access( path, F_OK ); 126 127 if( checkie == -2 ) 117 118 if( !global.storage->exists( irc->nick )) 128 119 { 129 120 setpassnc( irc, cmd[1] ); … … 141 132 int cmd_drop( irc_t *irc, char **cmd ) 142 133 { 143 char s[512]; 144 FILE *fp; 145 146 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" ); 147 fp = fopen( s, "r" ); 148 if( !fp ) 134 if( ! global.storage->exists (irc->nick) ) 149 135 { 150 136 irc_usermsg( irc, "That account does not exist" ); 151 137 return( 0 ); 152 138 } 153 154 fscanf( fp, "%32[^\n]s", s ); 155 fclose( fp ); 156 if( setpass( irc, cmd[1], s ) < 0 ) 157 { 158 irc_usermsg( irc, "Incorrect password" ); 159 return( 0 ); 160 } 161 162 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" ); 163 unlink( s ); 164 165 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" ); 166 unlink( s ); 139 140 if ( global.storage->check_pass (irc->nick, cmd[1]) ) 141 { 142 irc_usermsg( irc, "Password invalid" ); 143 return( 0 ); 144 } 145 146 global.storage->remove (irc->nick); 167 147 168 148 setpassnc( irc, NULL ); … … 634 614 int cmd_save( irc_t *irc, char **cmd ) 635 615 { 636 if( bitlbee_save( irc ) )616 if( global.storage->save( irc ) ) 637 617 irc_usermsg( irc, "Configuration saved" ); 638 618 else -
conf.c
rd636233 r1ee6c18 50 50 conf->nofork = 0; 51 51 conf->verbose = 0; 52 conf->storage = "text"; 52 53 conf->runmode = RUNMODE_INETD; 53 54 conf->authmode = AUTHMODE_OPEN; … … 198 199 conf->motdfile = g_strdup( ini->value ); 199 200 } 201 else if( g_strcasecmp( ini->key, "storage" ) == 0 ) 202 { 203 g_free( conf->storage ); 204 conf->storage = g_strdup( ini->value ); 205 } 200 206 else if( g_strcasecmp( ini->key, "pinginterval" ) == 0 ) 201 207 { -
conf.h
rd636233 r1ee6c18 42 42 char *configdir; 43 43 char *motdfile; 44 char *storage; 44 45 int ping_interval; 45 46 int ping_timeout; -
crypting.c
rd636233 r1ee6c18 67 67 /* USE WITH CAUTION! 68 68 Sets pass without checking */ 69 void setpassnc (irc_t *irc, char *pass) { 69 void setpassnc (irc_t *irc, const char *pass) 70 { 70 71 if (!set_find (irc, "password")) 71 72 set_add (irc, "password", NULL, passchange); … … 86 87 } 87 88 88 int setpass (irc_t *irc, c har *pass, char* md5sum) {89 int setpass (irc_t *irc, const char *pass, char* md5sum) { 89 90 md5_state_t md5state; 90 91 md5_byte_t digest[16]; -
crypting.h
rd636233 r1ee6c18 24 24 */ 25 25 26 void setpassnc (irc_t *irc, c har *pass); /* USE WITH CAUTION! */26 void setpassnc (irc_t *irc, const char *pass); /* USE WITH CAUTION! */ 27 27 char *passchange (irc_t *irc, void *set, char *value); 28 int setpass (irc_t *irc, c har *pass, char* md5sum);28 int setpass (irc_t *irc, const char *pass, char* md5sum); 29 29 char *hashpass (irc_t *irc); 30 30 char *obfucrypt (irc_t *irc, char *line); -
irc.c
rd636233 r1ee6c18 154 154 155 155 if( irc->status >= USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) ) 156 if( ! bitlbee_save( irc ) )156 if( !global.storage->save( irc ) ) 157 157 irc_usermsg( irc, "Error while saving settings!" ); 158 158 -
unix.c
rd636233 r1ee6c18 52 52 53 53 global.helpfile = g_strdup( HELP_FILE ); 54 54 55 55 global.conf = conf_load( argc, argv ); 56 56 if( global.conf == NULL ) 57 57 return( 1 ); 58 58 59 59 60 if( global.conf->runmode == RUNMODE_INETD ) 60 61 { … … 70 71 if( i != 0 ) 71 72 return( i ); 73 74 global.storage = storage_init( global.conf->storage ); 75 if ( global.storage == NULL) { 76 log_message( LOGLVL_ERROR, "No such storage backend '%s'", global.conf->storage ); 77 return( 1 ); 78 } 79 72 80 73 81 /* Catch some signals to tell the user what's happening before quitting */ … … 87 95 if( !getuid() || !geteuid() ) 88 96 log_message( LOGLVL_WARNING, "BitlBee is running with root privileges. Why?" ); 89 if( access( global.conf->configdir, F_OK ) != 0 )90 log_message( LOGLVL_WARNING, "The configuration directory %s does not exist. Configuration won't be saved.", CONFIG );91 else if( access( global.conf->configdir, R_OK ) != 0 || access( global.conf->configdir, W_OK ) != 0 )92 log_message( LOGLVL_WARNING, "Permission problem: Can't read/write from/to %s.", global.conf->configdir );93 97 if( help_init( &(global.help) ) == NULL ) 94 98 log_message( LOGLVL_WARNING, "Error opening helpfile %s.", HELP_FILE );
Note: See TracChangeset
for help on using the changeset viewer.