Changes in storage_text.c [79e826a:28eda86]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
storage_text.c
r79e826a r28eda86 28 28 #include "crypting.h" 29 29 30 /* DO NOT USE THIS FUNCTION IN NEW CODE. This31 * function is here merely because the save/load code still uses32 * ids rather than names */33 static struct prpl *find_protocol_by_id(int id)34 {35 switch (id) {36 case 0: case 1: case 3: return find_protocol("oscar");37 case 4: return find_protocol("msn");38 case 2: return find_protocol("yahoo");39 case 8: return find_protocol("jabber");40 default: break;41 }42 return NULL;43 }44 45 static int find_protocol_id(const char *name)46 {47 if (!strcmp(name, "oscar")) return 1;48 if (!strcmp(name, "msn")) return 4;49 if (!strcmp(name, "yahoo")) return 2;50 if (!strcmp(name, "jabber")) return 8;51 52 return -1;53 }54 55 56 30 static void text_init (void) 57 31 { 58 32 if( access( global.conf->configdir, F_OK ) != 0 ) 59 log_message( LOGLVL_WARNING, "The configuration directory %s does not exist. Configuration won't be saved.", CONFIG);33 log_message( LOGLVL_WARNING, "The configuration directory %s does not exist. Configuration won't be saved.", global.conf->configdir ); 60 34 else if( access( global.conf->configdir, R_OK ) != 0 || access( global.conf->configdir, W_OK ) != 0 ) 61 35 log_message( LOGLVL_WARNING, "Permission problem: Can't read/write from/to %s.", global.conf->configdir ); … … 70 44 FILE *fp; 71 45 user_t *ru = user_find( irc, ROOT_NICK ); 46 account_t *acc, *acc_lookup[9]; 72 47 73 48 if( irc->status & USTATUS_IDENTIFIED ) … … 80 55 fscanf( fp, "%32[^\n]s", s ); 81 56 82 if (checkpass (password, s) != 0)57 if( checkpass( password, s ) != 0 ) 83 58 { 84 59 fclose( fp ); … … 100 75 fclose( fp ); 101 76 77 /* Build a list with the first listed account of every protocol 78 number. So if the user had nicks defined for a second account on 79 the same IM network, those nicks will be added to the wrong 80 account, and the user should rename those buddies again. But at 81 least from now on things will be saved properly. */ 82 memset( acc_lookup, 0, sizeof( acc_lookup ) ); 83 for( acc = irc->accounts; acc; acc = acc->next ) 84 { 85 if( acc_lookup[0] == NULL && strcmp( acc->prpl->name, "oscar" ) == 0 ) 86 acc_lookup[0] = acc_lookup[1] = acc_lookup[3] = acc; 87 else if( acc_lookup[2] == NULL && strcmp( acc->prpl->name, "yahoo" ) == 0 ) 88 acc_lookup[2] = acc; 89 else if( acc_lookup[4] == NULL && strcmp( acc->prpl->name, "msn" ) == 0 ) 90 acc_lookup[4] = acc; 91 else if( acc_lookup[8] == NULL && strcmp( acc->prpl->name, "jabber" ) == 0 ) 92 acc_lookup[8] = acc; 93 } 94 102 95 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, my_nick, ".nicks" ); 103 96 fp = fopen( s, "r" ); … … 105 98 while( fscanf( fp, "%s %d %s", s, &proto, nick ) > 0 ) 106 99 { 107 struct prpl *prpl; 108 109 prpl = find_protocol_by_id(proto); 110 111 if (!prpl) 100 if( ( acc = acc_lookup[proto] ) == NULL ) 112 101 continue; 113 102 114 103 http_decode( s ); 115 nick_set( irc, s, prpl, nick );104 nick_set( acc, s, nick ); 116 105 } 117 106 fclose( fp ); 118 119 if( set_getint( irc, "auto_connect" ) )120 {121 strcpy( s, "account on" ); /* Can't do this directly because r_c_s alters the string */122 root_command_string( irc, ru, s, 0 );123 }124 125 return STORAGE_OK;126 }127 128 static storage_status_t text_save( irc_t *irc, int overwrite )129 {130 char s[512];131 char path[512], new_path[512];132 char *line;133 nick_t *n;134 set_t *set;135 mode_t ou = umask( 0077 );136 account_t *a;137 FILE *fp;138 char *hash;139 140 if (!overwrite) {141 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" );142 if (access( path, F_OK ) != -1)143 return STORAGE_ALREADY_EXISTS;144 145 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );146 if (access( path, F_OK ) != -1)147 return STORAGE_ALREADY_EXISTS;148 }149 150 /*\151 * [SH] Nothing should be saved if no password is set, because the152 * password is not set if it was wrong, or if one is not identified153 * yet. This means that a malicious user could easily overwrite154 * files owned by someone else:155 * a Bad Thing, methinks156 \*/157 158 /* [WVG] No? Really? */159 160 /*\161 * [SH] Okay, okay, it wasn't really Wilmer who said that, it was162 * me. I just thought it was funny.163 \*/164 165 hash = hashpass( irc->password );166 if( hash == NULL )167 {168 irc_usermsg( irc, "Please register yourself if you want to save your settings." );169 return STORAGE_OTHER_ERROR;170 }171 172 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks~" );173 fp = fopen( path, "w" );174 if( !fp ) return STORAGE_OTHER_ERROR;175 for( n = irc->nicks; n; n = n->next )176 {177 strcpy( s, n->handle );178 s[169] = 0; /* Prevent any overflow (169 ~ 512 / 3) */179 http_encode( s );180 g_snprintf( s + strlen( s ), 510 - strlen( s ), " %d %s", find_protocol_id(n->proto->name), n->nick );181 if( fprintf( fp, "%s\n", s ) != strlen( s ) + 1 )182 {183 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );184 fclose( fp );185 return STORAGE_OTHER_ERROR;186 }187 }188 if( fclose( fp ) != 0 )189 {190 irc_usermsg( irc, "fclose() reported an error. Disk full?" );191 return STORAGE_OTHER_ERROR;192 }193 194 g_snprintf( new_path, 512, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );195 if( unlink( new_path ) != 0 )196 {197 if( errno != ENOENT )198 {199 irc_usermsg( irc, "Error while removing old .nicks file" );200 return STORAGE_OTHER_ERROR;201 }202 }203 if( rename( path, new_path ) != 0 )204 {205 irc_usermsg( irc, "Error while renaming new .nicks file" );206 return STORAGE_OTHER_ERROR;207 }208 209 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts~" );210 fp = fopen( path, "w" );211 if( !fp ) return STORAGE_OTHER_ERROR;212 if( fprintf( fp, "%s", hash ) != strlen( hash ) )213 {214 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );215 fclose( fp );216 return STORAGE_OTHER_ERROR;217 }218 g_free( hash );219 220 for( a = irc->accounts; a; a = a->next )221 {222 if( !strcmp(a->prpl->name, "oscar") )223 g_snprintf( s, sizeof( s ), "account add oscar \"%s\" \"%s\" %s", a->user, a->pass, a->server );224 else225 g_snprintf( s, sizeof( s ), "account add %s \"%s\" \"%s\" \"%s\"",226 a->prpl->name, a->user, a->pass, a->server ? a->server : "" );227 228 line = obfucrypt( s, irc->password );229 if( *line )230 {231 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )232 {233 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );234 fclose( fp );235 return STORAGE_OTHER_ERROR;236 }237 }238 g_free( line );239 }240 241 for( set = irc->set; set; set = set->next )242 {243 if( set->value && set->def )244 {245 g_snprintf( s, sizeof( s ), "set %s \"%s\"", set->key, set->value );246 line = obfucrypt( s, irc->password );247 if( *line )248 {249 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )250 {251 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );252 fclose( fp );253 return STORAGE_OTHER_ERROR;254 }255 }256 g_free( line );257 }258 }259 260 if( strcmp( irc->mynick, ROOT_NICK ) != 0 )261 {262 g_snprintf( s, sizeof( s ), "rename %s %s", ROOT_NICK, irc->mynick );263 line = obfucrypt( s, irc->password );264 if( *line )265 {266 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )267 {268 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );269 fclose( fp );270 return STORAGE_OTHER_ERROR;271 }272 }273 g_free( line );274 }275 if( fclose( fp ) != 0 )276 {277 irc_usermsg( irc, "fclose() reported an error. Disk full?" );278 return STORAGE_OTHER_ERROR;279 }280 281 g_snprintf( new_path, 512, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" );282 if( unlink( new_path ) != 0 )283 {284 if( errno != ENOENT )285 {286 irc_usermsg( irc, "Error while removing old .accounts file" );287 return STORAGE_OTHER_ERROR;288 }289 }290 if( rename( path, new_path ) != 0 )291 {292 irc_usermsg( irc, "Error while renaming new .accounts file" );293 return STORAGE_OTHER_ERROR;294 }295 296 umask( ou );297 107 298 108 return STORAGE_OK; … … 343 153 .check_pass = text_check_pass, 344 154 .remove = text_remove, 345 .load = text_load, 346 .save = text_save 155 .load = text_load 347 156 };
Note: See TracChangeset
for help on using the changeset viewer.