source: storage_text.c @ 5b52a48

Last change on this file since 5b52a48 was 5b52a48, checked in by Wilmer van der Gaast <wilmer@…>, at 2006-07-03T21:22:45Z

Implemented per-account nick lists instead of per-protocol nick lists.
nick_t is dead, instead nicks are just saves in a per-account_t GLib
hash table. While doing this, the import_buddies command finally died
and text_save() disappeared, because the old file format can't handle
most of the new features in this branch anyway.

Still have to implement support for the new nick lists in text_load()!

  • Property mode set to 100644
File size: 4.6 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2004 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* Storage backend that uses the same file format as <=1.0 */
8
9/*
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License with
21  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22  if not, write to the Free Software Foundation, Inc., 59 Temple Place,
23  Suite 330, Boston, MA  02111-1307  USA
24*/
25
26#define BITLBEE_CORE
27#include "bitlbee.h"
28#include "crypting.h"
29
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 */
33static 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
45static 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
56static void text_init (void)
57{
58        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 );
60        else if( access( global.conf->configdir, R_OK ) != 0 || access( global.conf->configdir, W_OK ) != 0 )
61                log_message( LOGLVL_WARNING, "Permission problem: Can't read/write from/to %s.", global.conf->configdir );
62}
63
64static storage_status_t text_load ( const char *my_nick, const char* password, irc_t *irc )
65{
66        char s[512];
67        char *line;
68        int proto;
69        char nick[MAX_NICK_LENGTH+1];
70        FILE *fp;
71        user_t *ru = user_find( irc, ROOT_NICK );
72       
73        if( irc->status & USTATUS_IDENTIFIED )
74                return( 1 );
75       
76        g_snprintf( s, 511, "%s%s%s", global.conf->configdir, my_nick, ".accounts" );
77        fp = fopen( s, "r" );
78        if( !fp ) return STORAGE_NO_SUCH_USER;
79       
80        fscanf( fp, "%32[^\n]s", s );
81
82        if (checkpass (password, s) != 0) 
83        {
84                fclose( fp );
85                return STORAGE_INVALID_PASSWORD;
86        }
87       
88        /* Do this now. If the user runs with AuthMode = Registered, the
89           account command will not work otherwise. */
90        irc->status |= USTATUS_IDENTIFIED;
91       
92        while( fscanf( fp, "%511[^\n]s", s ) > 0 )
93        {
94                fgetc( fp );
95                line = deobfucrypt( s, password );
96                if (line == NULL) return STORAGE_OTHER_ERROR;
97                root_command_string( irc, ru, line, 0 );
98                g_free( line );
99        }
100        fclose( fp );
101       
102        g_snprintf( s, 511, "%s%s%s", global.conf->configdir, my_nick, ".nicks" );
103        fp = fopen( s, "r" );
104        if( !fp ) return STORAGE_NO_SUCH_USER;
105        while( fscanf( fp, "%s %d %s", s, &proto, nick ) > 0 )
106        {
107                struct prpl *prpl;
108
109                prpl = find_protocol_by_id(proto);
110
111                if (!prpl)
112                        continue;
113
114                http_decode( s );
115                // FIXME!!!! nick_set( irc, s, prpl, nick );
116        }
117        fclose( fp );
118       
119        return STORAGE_OK;
120}
121
122static storage_status_t text_check_pass( const char *nick, const char *password )
123{
124        char s[512];
125        FILE *fp;
126       
127        g_snprintf( s, 511, "%s%s%s", global.conf->configdir, nick, ".accounts" );
128        fp = fopen( s, "r" );
129        if (!fp)
130                return STORAGE_NO_SUCH_USER;
131
132        fscanf( fp, "%32[^\n]s", s );
133        fclose( fp );
134
135        if (checkpass( password, s) == -1)
136                return STORAGE_INVALID_PASSWORD;
137
138        return STORAGE_OK;
139}
140
141static storage_status_t text_remove( const char *nick, const char *password )
142{
143        char s[512];
144        storage_status_t status;
145
146        status = text_check_pass( nick, password );
147        if (status != STORAGE_OK)
148                return status;
149
150        g_snprintf( s, 511, "%s%s%s", global.conf->configdir, nick, ".accounts" );
151        if (unlink( s ) == -1)
152                return STORAGE_OTHER_ERROR;
153       
154        g_snprintf( s, 511, "%s%s%s", global.conf->configdir, nick, ".nicks" );
155        if (unlink( s ) == -1)
156                return STORAGE_OTHER_ERROR;
157
158        return STORAGE_OK;
159}
160
161storage_t storage_text = {
162        .name = "text",
163        .init = text_init,
164        .check_pass = text_check_pass,
165        .remove = text_remove,
166        .load = text_load
167};
Note: See TracBrowser for help on using the repository browser.