Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • storage_text.c

    r79e826a r28eda86  
    2828#include "crypting.h"
    2929
    30 /* DO NOT USE THIS FUNCTION IN NEW CODE. This
    31  * function is here merely because the save/load code still uses
    32  * 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 
    5630static void text_init (void)
    5731{
    5832        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 );
    6034        else if( access( global.conf->configdir, R_OK ) != 0 || access( global.conf->configdir, W_OK ) != 0 )
    6135                log_message( LOGLVL_WARNING, "Permission problem: Can't read/write from/to %s.", global.conf->configdir );
     
    7044        FILE *fp;
    7145        user_t *ru = user_find( irc, ROOT_NICK );
     46        account_t *acc, *acc_lookup[9];
    7247       
    7348        if( irc->status & USTATUS_IDENTIFIED )
     
    8055        fscanf( fp, "%32[^\n]s", s );
    8156
    82         if (checkpass (password, s) != 0)
     57        if( checkpass( password, s ) != 0 )
    8358        {
    8459                fclose( fp );
     
    10075        fclose( fp );
    10176       
     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       
    10295        g_snprintf( s, 511, "%s%s%s", global.conf->configdir, my_nick, ".nicks" );
    10396        fp = fopen( s, "r" );
     
    10598        while( fscanf( fp, "%s %d %s", s, &proto, nick ) > 0 )
    10699        {
    107                 struct prpl *prpl;
    108 
    109                 prpl = find_protocol_by_id(proto);
    110 
    111                 if (!prpl)
     100                if( ( acc = acc_lookup[proto] ) == NULL )
    112101                        continue;
    113 
     102               
    114103                http_decode( s );
    115                 nick_set( irc, s, prpl, nick );
     104                nick_set( acc, s, nick );
    116105        }
    117106        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 the
    152          *  password is not set if it was wrong, or if one is not identified
    153          *  yet. This means that a malicious user could easily overwrite
    154          *  files owned by someone else:
    155          *  a Bad Thing, methinks
    156         \*/
    157 
    158         /* [WVG] No? Really? */
    159 
    160         /*\
    161          *  [SH] Okay, okay, it wasn't really Wilmer who said that, it was
    162          *  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                 else
    225                         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 );
    297107       
    298108        return STORAGE_OK;
     
    343153        .check_pass = text_check_pass,
    344154        .remove = text_remove,
    345         .load = text_load,
    346         .save = text_save
     155        .load = text_load
    347156};
Note: See TracChangeset for help on using the changeset viewer.