~ubuntu-branches/ubuntu/saucy/clamav/saucy-backports

« back to all changes in this revision

Viewing changes to libclamav/dconf.c

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman
  • Date: 2014-07-15 01:08:10 UTC
  • mfrom: (0.35.47 sid)
  • Revision ID: package-import@ubuntu.com-20140715010810-ru66ek4fun2iseba
Tags: 0.98.4+dfsg-2~ubuntu13.10.1
No-change backport to saucy (LP: #1341962)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 *  Copyright (C) 2007-2008 Sourcefire, Inc.
 
2
 *  Copyright (C) 2014 Cisco and/or its affiliates. All rights reserved.
 
3
 *  Copyright (C) 2007-2013 Sourcefire, Inc.
3
4
 *
4
5
 *  Authors: Tomasz Kojm
5
6
 *
28
29
#include <ctype.h>
29
30
#include <zlib.h>
30
31
 
 
32
#include <openssl/ssl.h>
 
33
#include <openssl/err.h>
 
34
#include "libclamav/crypto.h"
 
35
 
31
36
#include "clamav.h"
32
37
#include "cltypes.h"
33
38
#include "dconf.h"
38
43
#include "mpool.h"
39
44
 
40
45
struct dconf_module {
41
 
    const char  *mname;     /* module name */
42
 
    const char  *sname;     /* submodule name */
43
 
    uint32_t    bflag;      /* bit flag */
44
 
    uint8_t     state;      /* default state (on/off) */
 
46
    const char  *mname;     /* module name */
 
47
    const char  *sname;     /* submodule name */
 
48
    uint32_t    bflag;      /* bit flag */
 
49
    uint8_t state;      /* default state (on/off) */
45
50
};
46
51
 
47
52
#ifdef CL_EXPERIMENTAL
52
57
 
53
58
static struct dconf_module modules[] = {
54
59
 
55
 
    { "PE",         "PARITE",       PE_CONF_PARITE,         1 },
56
 
    { "PE",         "KRIZ",         PE_CONF_KRIZ,           1 },
57
 
    { "PE",         "MAGISTR",      PE_CONF_MAGISTR,        1 },
58
 
    { "PE",         "POLIPOS",      PE_CONF_POLIPOS,        1 },
59
 
    { "PE",         "MD5SECT",      PE_CONF_MD5SECT,        1 },
60
 
    { "PE",         "UPX",          PE_CONF_UPX,            1 },
61
 
    { "PE",         "FSG",          PE_CONF_FSG,            1 },
62
 
    { "PE",         "SWIZZOR",      PE_CONF_SWIZZOR,        1 },
63
 
 
64
 
    { "PE",         "PETITE",       PE_CONF_PETITE,         1 },
65
 
    { "PE",         "PESPIN",       PE_CONF_PESPIN,         1 },
66
 
    { "PE",         "YC",           PE_CONF_YC,             1 },
67
 
    { "PE",         "WWPACK",       PE_CONF_WWPACK,         1 },
68
 
 
69
 
    { "PE",         "NSPACK",       PE_CONF_NSPACK,         1 },
70
 
    { "PE",         "MEW",          PE_CONF_MEW,            1 },
71
 
    { "PE",         "UPACK",        PE_CONF_UPACK,          1 },
72
 
    { "PE",         "ASPACK",       PE_CONF_ASPACK,         1 },
73
 
    { "PE",         "CATALOG",      PE_CONF_CATALOG,        1 },
 
60
    { "PE",     "PARITE",       PE_CONF_PARITE,     1 },
 
61
    { "PE",     "KRIZ",     PE_CONF_KRIZ,       1 },
 
62
    { "PE",     "MAGISTR",      PE_CONF_MAGISTR,        1 },
 
63
    { "PE",     "POLIPOS",      PE_CONF_POLIPOS,        1 },
 
64
    { "PE",     "MD5SECT",      PE_CONF_MD5SECT,        1 },
 
65
    { "PE",     "UPX",      PE_CONF_UPX,        1 },
 
66
    { "PE",     "FSG",      PE_CONF_FSG,        1 },
 
67
    { "PE",     "SWIZZOR",      PE_CONF_SWIZZOR,        1 },
 
68
 
 
69
    { "PE",     "PETITE",       PE_CONF_PETITE,     1 },
 
70
    { "PE",     "PESPIN",       PE_CONF_PESPIN,     1 },
 
71
    { "PE",     "YC",       PE_CONF_YC,         1 },
 
72
    { "PE",     "WWPACK",       PE_CONF_WWPACK,     1 },
 
73
 
 
74
    { "PE",     "NSPACK",       PE_CONF_NSPACK,     1 },
 
75
    { "PE",     "MEW",      PE_CONF_MEW,        1 },
 
76
    { "PE",     "UPACK",        PE_CONF_UPACK,      1 },
 
77
    { "PE",     "ASPACK",       PE_CONF_ASPACK,     1 },
 
78
    { "PE",     "CATALOG",      PE_CONF_CATALOG,        1 },
74
79
    { "PE",     "DISABLECERT",  PE_CONF_DISABLECERT,    0 },
75
80
    { "PE",     "DUMPCERT",     PE_CONF_DUMPCERT,       0 },
76
 
 
77
 
    { "ELF",        NULL,           0x1,                    1 },
78
 
 
79
 
    { "MACHO",      NULL,           0x1,                    1 },
80
 
 
81
 
    { "ARCHIVE",    "RAR",          ARCH_CONF_RAR,          1 },
82
 
    { "ARCHIVE",    "ZIP",          ARCH_CONF_ZIP,          1 },
83
 
    { "ARCHIVE",    "GZIP",         ARCH_CONF_GZ,           1 },
84
 
    { "ARCHIVE",    "BZIP",         ARCH_CONF_BZ,           1 },
85
 
    { "ARCHIVE",    "ARJ",          ARCH_CONF_ARJ,          1 },
86
 
    { "ARCHIVE",    "SZDD",         ARCH_CONF_SZDD,         1 },
87
 
    { "ARCHIVE",    "CAB",          ARCH_CONF_CAB,          1 },
88
 
    { "ARCHIVE",    "CHM",          ARCH_CONF_CHM,          1 },
89
 
    { "ARCHIVE",    "OLE2",         ARCH_CONF_OLE2,         1 },
90
 
    { "ARCHIVE",    "TAR",          ARCH_CONF_TAR,          1 },
91
 
    { "ARCHIVE",    "CPIO",         ARCH_CONF_CPIO,         1 },
92
 
    { "ARCHIVE",    "BINHEX",       ARCH_CONF_BINHEX,       1 },
93
 
    { "ARCHIVE",    "SIS",          ARCH_CONF_SIS,          1 },
94
 
    { "ARCHIVE",    "NSIS",         ARCH_CONF_NSIS,         1 },
95
 
    { "ARCHIVE",    "AUTOIT",       ARCH_CONF_AUTOIT,       1 },
96
 
    { "ARCHIVE",    "ISHIELD",      ARCH_CONF_ISHIELD,      1 },
97
 
    { "ARCHIVE",    "7zip",         ARCH_CONF_7Z,           1 },
98
 
    { "ARCHIVE",    "ISO9660",      ARCH_CONF_ISO9660,      1 },
99
 
    { "ARCHIVE",    "DMG",          ARCH_CONF_DMG,          1 },
100
 
    { "ARCHIVE",    "XAR",          ARCH_CONF_XAR,          1 },
101
 
    { "ARCHIVE",    "HFSPLUS",      ARCH_CONF_HFSPLUS,      1 },
102
 
    { "ARCHIVE",    "XZ",           ARCH_CONF_XZ,           1 },
103
 
 
104
 
    { "DOCUMENT",   "HTML",         DOC_CONF_HTML,          1 },
105
 
    { "DOCUMENT",   "RTF",          DOC_CONF_RTF,           1 },
106
 
    { "DOCUMENT",   "PDF",          DOC_CONF_PDF,           1 },
107
 
    { "DOCUMENT",   "SCRIPT",       DOC_CONF_SCRIPT,        1 },
 
81
    { "PE",     "MATCHICON",     PE_CONF_MATCHICON,       1 },
 
82
 
 
83
    { "ELF",        NULL,       0x1,            1 },
 
84
 
 
85
    { "MACHO",      NULL,       0x1,            1 },
 
86
 
 
87
    { "ARCHIVE",    "RAR",      ARCH_CONF_RAR,      1 },
 
88
    { "ARCHIVE",    "ZIP",      ARCH_CONF_ZIP,      1 },
 
89
    { "ARCHIVE",    "GZIP",     ARCH_CONF_GZ,       1 },
 
90
    { "ARCHIVE",    "BZIP",     ARCH_CONF_BZ,       1 },
 
91
    { "ARCHIVE",    "ARJ",          ARCH_CONF_ARJ,      1 },
 
92
    { "ARCHIVE",    "SZDD",     ARCH_CONF_SZDD,     1 },
 
93
    { "ARCHIVE",    "CAB",      ARCH_CONF_CAB,      1 },
 
94
    { "ARCHIVE",    "CHM",      ARCH_CONF_CHM,      1 },
 
95
    { "ARCHIVE",    "OLE2",     ARCH_CONF_OLE2,     1 },
 
96
    { "ARCHIVE",    "TAR",      ARCH_CONF_TAR,      1 },
 
97
    { "ARCHIVE",    "CPIO",     ARCH_CONF_CPIO,     1 },
 
98
    { "ARCHIVE",    "BINHEX",       ARCH_CONF_BINHEX,       1 },
 
99
    { "ARCHIVE",    "SIS",      ARCH_CONF_SIS,      1 },
 
100
    { "ARCHIVE",    "NSIS",     ARCH_CONF_NSIS,     1 },
 
101
    { "ARCHIVE",    "AUTOIT",       ARCH_CONF_AUTOIT,       1 },
 
102
    { "ARCHIVE",    "ISHIELD",      ARCH_CONF_ISHIELD,      1 },
 
103
    { "ARCHIVE",    "7zip",     ARCH_CONF_7Z,       1 },
 
104
    { "ARCHIVE",    "ISO9660",      ARCH_CONF_ISO9660,      1 },
 
105
    { "ARCHIVE",    "DMG",      ARCH_CONF_DMG,      1 },
 
106
    { "ARCHIVE",    "XAR",      ARCH_CONF_XAR,      1 },
 
107
    { "ARCHIVE",    "HFSPLUS",      ARCH_CONF_HFSPLUS,      1 },
 
108
    { "ARCHIVE",    "XZ",       ARCH_CONF_XZ,       1 },
 
109
 
 
110
    { "DOCUMENT",   "HTML",     DOC_CONF_HTML,      1 },
 
111
    { "DOCUMENT",   "RTF",      DOC_CONF_RTF,       1 },
 
112
    { "DOCUMENT",   "PDF",      DOC_CONF_PDF,       1 },
 
113
    { "DOCUMENT",   "SCRIPT",       DOC_CONF_SCRIPT,        1 },
108
114
    { "DOCUMENT",   "HTMLSKIPRAW",  DOC_CONF_HTML_SKIPRAW,  1 },
109
115
    { "DOCUMENT",   "JSNORM",       DOC_CONF_JSNORM,        1 },
110
 
    { "DOCUMENT",   "SWF",          DOC_CONF_SWF,           1 },
111
 
 
112
 
    { "MAIL",       "MBOX",         MAIL_CONF_MBOX,         1 },
113
 
    { "MAIL",       "TNEF",         MAIL_CONF_TNEF,         1 },
114
 
 
115
 
    { "OTHER",      "UUENCODED",    OTHER_CONF_UUENC,       1 },
116
 
    { "OTHER",      "SCRENC",       OTHER_CONF_SCRENC,      1 },
117
 
    { "OTHER",      "RIFF",         OTHER_CONF_RIFF,        1 },
118
 
    { "OTHER",      "JPEG",         OTHER_CONF_JPEG,        1 },
119
 
    { "OTHER",      "CRYPTFF",      OTHER_CONF_CRYPTFF,     1 },
120
 
    { "OTHER",      "DLP",          OTHER_CONF_DLP,         1 },
121
 
    { "OTHER",      "MYDOOMLOG",    OTHER_CONF_MYDOOMLOG,   1 },
 
116
    { "DOCUMENT",   "SWF",      DOC_CONF_SWF,       1 },
 
117
 
 
118
    { "MAIL",       "MBOX",     MAIL_CONF_MBOX,     1 },
 
119
    { "MAIL",       "TNEF",     MAIL_CONF_TNEF,     1 },
 
120
 
 
121
    { "OTHER",      "UUENCODED",    OTHER_CONF_UUENC,       1 },
 
122
    { "OTHER",      "SCRENC",       OTHER_CONF_SCRENC,      1 },
 
123
    { "OTHER",      "RIFF",     OTHER_CONF_RIFF,        1 },
 
124
    { "OTHER",      "JPEG",     OTHER_CONF_JPEG,        1 },
 
125
    { "OTHER",      "CRYPTFF",      OTHER_CONF_CRYPTFF,     1 },
 
126
    { "OTHER",      "DLP",      OTHER_CONF_DLP,     1 },
 
127
    { "OTHER",      "MYDOOMLOG",    OTHER_CONF_MYDOOMLOG,   1 },
122
128
    { "OTHER",      "PREFILTERING", OTHER_CONF_PREFILTERING,1 },
123
129
    { "OTHER",      "PDFNAMEOBJ",   OTHER_CONF_PDFNAMEOBJ,  1 },
 
130
    { "OTHER",      "PRTNINTXN",   OTHER_CONF_PRTNINTXN,  1 },
124
131
 
125
132
    { "PHISHING",   "ENGINE",       PHISHING_CONF_ENGINE,   1 },
126
133
    { "PHISHING",   "ENTCONV",      PHISHING_CONF_ENTCONV,  1 },
130
137
    { "BYTECODE",   "JIT PPC",      BYTECODE_JIT_PPC,       1 },
131
138
    { "BYTECODE",   "JIT ARM",      BYTECODE_JIT_ARM,       0 },
132
139
 
133
 
    { NULL,         NULL,           0,                      0 }
 
140
    { "STATS",      "DISABLED",     DCONF_STATS_DISABLED,   0 },
 
141
    { "STATS",      "PESECTION DISABLED", DCONF_STATS_PE_SECTION_DISABLED, 0 },
 
142
 
 
143
    { NULL,     NULL,       0,              0 }
134
144
};
135
145
 
136
146
#ifdef USE_MPOOL 
139
149
struct cli_dconf *cli_dconf_init(void)
140
150
#endif
141
151
{
142
 
        unsigned int i;
143
 
        struct cli_dconf *dconf;
 
152
    unsigned int i;
 
153
    struct cli_dconf *dconf;
144
154
 
145
155
    dconf = (struct cli_dconf *) mpool_calloc(mempool, sizeof(struct cli_dconf), 1);
146
156
    if(!dconf)
147
 
        return NULL;
 
157
        return NULL;
148
158
 
149
159
    for(i = 0; modules[i].mname; i++) {
150
 
        if(!strcmp(modules[i].mname, "PE")) {
151
 
            if(modules[i].state)
152
 
                dconf->pe |= modules[i].bflag;
153
 
 
154
 
        } else if(!strcmp(modules[i].mname, "ELF")) {
155
 
            if(modules[i].state)
156
 
                dconf->elf |= modules[i].bflag;
157
 
 
158
 
        } else if(!strcmp(modules[i].mname, "MACHO")) {
159
 
            if(modules[i].state)
160
 
                dconf->macho |= modules[i].bflag;
161
 
 
162
 
        } else if(!strcmp(modules[i].mname, "ARCHIVE")) {
163
 
            if(modules[i].state)
164
 
                dconf->archive |= modules[i].bflag;
165
 
 
166
 
        } else if(!strcmp(modules[i].mname, "DOCUMENT")) {
167
 
            if(modules[i].state)
168
 
                dconf->doc |= modules[i].bflag;
169
 
 
170
 
        } else if(!strcmp(modules[i].mname, "MAIL")) {
171
 
            if(modules[i].state)
172
 
                dconf->mail |= modules[i].bflag;
173
 
 
174
 
        } else if(!strcmp(modules[i].mname, "OTHER")) {
175
 
            if(modules[i].state)
176
 
                dconf->other |= modules[i].bflag;
177
 
        } else if(!strcmp(modules[i].mname, "PHISHING")) {
178
 
            if(modules[i].state)
179
 
                dconf->phishing |= modules[i].bflag;
180
 
        } else if(!strcmp(modules[i].mname, "BYTECODE")) {
181
 
            if (modules[i].state)
182
 
                dconf->bytecode |= modules[i].bflag;
183
 
        }
 
160
        if(!strcmp(modules[i].mname, "PE")) {
 
161
            if(modules[i].state)
 
162
                dconf->pe |= modules[i].bflag;
 
163
 
 
164
        } else if(!strcmp(modules[i].mname, "ELF")) {
 
165
            if(modules[i].state)
 
166
                dconf->elf |= modules[i].bflag;
 
167
 
 
168
        } else if(!strcmp(modules[i].mname, "MACHO")) {
 
169
            if(modules[i].state)
 
170
                dconf->macho |= modules[i].bflag;
 
171
 
 
172
        } else if(!strcmp(modules[i].mname, "ARCHIVE")) {
 
173
            if(modules[i].state)
 
174
                dconf->archive |= modules[i].bflag;
 
175
 
 
176
        } else if(!strcmp(modules[i].mname, "DOCUMENT")) {
 
177
            if(modules[i].state)
 
178
                dconf->doc |= modules[i].bflag;
 
179
 
 
180
        } else if(!strcmp(modules[i].mname, "MAIL")) {
 
181
            if(modules[i].state)
 
182
                dconf->mail |= modules[i].bflag;
 
183
 
 
184
        } else if(!strcmp(modules[i].mname, "OTHER")) {
 
185
            if(modules[i].state)
 
186
                dconf->other |= modules[i].bflag;
 
187
        } else if(!strcmp(modules[i].mname, "PHISHING")) {
 
188
            if(modules[i].state)
 
189
                dconf->phishing |= modules[i].bflag;
 
190
        } else if(!strcmp(modules[i].mname, "BYTECODE")) {
 
191
            if (modules[i].state)
 
192
                dconf->bytecode |= modules[i].bflag;
 
193
        } else if (!strcmp(modules[i].mname, "STATS")) {
 
194
            if (modules[i].state)
 
195
                dconf->stats |= modules[i].bflag;
 
196
        }
184
197
    }
185
198
 
186
199
    return dconf;
188
201
 
189
202
void cli_dconf_print(struct cli_dconf *dconf)
190
203
{
191
 
        unsigned int pe = 0, elf = 0, macho = 0, arch = 0, doc = 0, mail = 0;
192
 
        unsigned int other = 0, phishing = 0, i, bytecode=0;
 
204
    unsigned int pe = 0, elf = 0, macho = 0, arch = 0, doc = 0, mail = 0;
 
205
    unsigned int other = 0, phishing = 0, i, bytecode=0, stats=0;
193
206
 
194
207
 
195
208
    cli_dbgmsg("Dynamic engine configuration settings:\n");
196
209
    cli_dbgmsg("--------------------------------------\n");
197
210
 
198
211
    for(i = 0; modules[i].mname; i++) {
199
 
        if(!strcmp(modules[i].mname, "PE")) {
200
 
            if(!pe) {
201
 
                cli_dbgmsg("Module PE: %s\n", dconf->pe ? "On" : "Off");
202
 
                pe = 1;
203
 
            }
204
 
            if(dconf->pe)
205
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->pe & modules[i].bflag) ? "On" : "** Off **");
206
 
            else
207
 
                continue;
208
 
 
209
 
        } else if(!strcmp(modules[i].mname, "ELF")) {
210
 
            if(!elf) {
211
 
                cli_dbgmsg("Module ELF: %s\n", dconf->elf ? "On" : "Off");
212
 
                elf = 1;
213
 
            }
214
 
 
215
 
        } else if(!strcmp(modules[i].mname, "MACHO")) {
216
 
            if(!macho) {
217
 
                cli_dbgmsg("Module MACHO: %s\n", dconf->elf ? "On" : "Off");
218
 
                macho = 1;
219
 
            }
220
 
 
221
 
        } else if(!strcmp(modules[i].mname, "ARCHIVE")) {
222
 
            if(!arch) {
223
 
                cli_dbgmsg("Module ARCHIVE: %s\n", dconf->archive ? "On" : "Off");
224
 
                arch = 1;
225
 
            }
226
 
            if(dconf->archive)
227
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->archive & modules[i].bflag) ? "On" : "** Off **");
228
 
            else
229
 
                continue;
230
 
 
231
 
        } else if(!strcmp(modules[i].mname, "DOCUMENT")) {
232
 
            if(!doc) {
233
 
                cli_dbgmsg("Module DOCUMENT: %s\n", dconf->doc ? "On" : "Off");
234
 
                doc = 1;
235
 
            }
236
 
            if(dconf->doc)
237
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->doc & modules[i].bflag) ? "On" : "** Off **");
238
 
            else
239
 
                continue;
240
 
 
241
 
        } else if(!strcmp(modules[i].mname, "MAIL")) {
242
 
            if(!mail) {
243
 
                cli_dbgmsg("Module MAIL: %s\n", dconf->mail ? "On" : "Off");
244
 
                mail = 1;
245
 
            }
246
 
            if(dconf->mail)
247
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->mail & modules[i].bflag) ? "On" : "** Off **");
248
 
            else
249
 
                continue;
250
 
 
251
 
        } else if(!strcmp(modules[i].mname, "OTHER")) {
252
 
            if(!other) {
253
 
                cli_dbgmsg("Module OTHER: %s\n", dconf->other ? "On" : "Off");
254
 
                other = 1;
255
 
            }
256
 
            if(dconf->other)
257
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->other & modules[i].bflag) ? "On" : "** Off **");
258
 
            else
259
 
                continue;
260
 
        } else if(!strcmp(modules[i].mname, "PHISHING")) {
261
 
            if(!phishing) {
262
 
                cli_dbgmsg("Module PHISHING %s\n", dconf->phishing ? "On" : "Off");
263
 
                phishing = 1;
264
 
            }
265
 
            if(dconf->phishing)
266
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->phishing & modules[i].bflag) ? "On" : "** Off **");
267
 
            else
268
 
                continue;
269
 
        } else if(!strcmp(modules[i].mname, "BYTECODE")) {
270
 
            if(!bytecode) {
271
 
                cli_dbgmsg("Module BYTECODE %s\n", dconf->bytecode ? "On" : "Off");
272
 
                bytecode = 1;
273
 
            }
274
 
            if(dconf->bytecode)
275
 
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->bytecode & modules[i].bflag) ? "On" : "** Off **");
276
 
            else
277
 
                continue;
278
 
        }
 
212
        if(!strcmp(modules[i].mname, "PE")) {
 
213
            if(!pe) {
 
214
                cli_dbgmsg("Module PE: %s\n", dconf->pe ? "On" : "Off");
 
215
                pe = 1;
 
216
            }
 
217
 
 
218
            if(dconf->pe)
 
219
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->pe & modules[i].bflag) ? "On" : "** Off **");
 
220
            else
 
221
                continue;
 
222
        } else if(!strcmp(modules[i].mname, "ELF")) {
 
223
            if(!elf) {
 
224
                cli_dbgmsg("Module ELF: %s\n", dconf->elf ? "On" : "Off");
 
225
                elf = 1;
 
226
            }
 
227
        } else if(!strcmp(modules[i].mname, "MACHO")) {
 
228
            if(!macho) {
 
229
                cli_dbgmsg("Module MACHO: %s\n", dconf->elf ? "On" : "Off");
 
230
                macho = 1;
 
231
            }
 
232
        } else if(!strcmp(modules[i].mname, "ARCHIVE")) {
 
233
            if(!arch) {
 
234
                cli_dbgmsg("Module ARCHIVE: %s\n", dconf->archive ? "On" : "Off");
 
235
                arch = 1;
 
236
            }
 
237
 
 
238
            if(dconf->archive)
 
239
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->archive & modules[i].bflag) ? "On" : "** Off **");
 
240
            else
 
241
                continue;
 
242
        } else if(!strcmp(modules[i].mname, "DOCUMENT")) {
 
243
            if(!doc) {
 
244
                cli_dbgmsg("Module DOCUMENT: %s\n", dconf->doc ? "On" : "Off");
 
245
                doc = 1;
 
246
            }
 
247
 
 
248
            if(dconf->doc)
 
249
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->doc & modules[i].bflag) ? "On" : "** Off **");
 
250
            else
 
251
                continue;
 
252
        } else if(!strcmp(modules[i].mname, "MAIL")) {
 
253
            if(!mail) {
 
254
                cli_dbgmsg("Module MAIL: %s\n", dconf->mail ? "On" : "Off");
 
255
                mail = 1;
 
256
            }
 
257
 
 
258
            if(dconf->mail)
 
259
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->mail & modules[i].bflag) ? "On" : "** Off **");
 
260
            else
 
261
                continue;
 
262
        } else if(!strcmp(modules[i].mname, "OTHER")) {
 
263
            if(!other) {
 
264
                cli_dbgmsg("Module OTHER: %s\n", dconf->other ? "On" : "Off");
 
265
                other = 1;
 
266
            }
 
267
 
 
268
            if(dconf->other)
 
269
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->other & modules[i].bflag) ? "On" : "** Off **");
 
270
            else
 
271
                continue;
 
272
        } else if(!strcmp(modules[i].mname, "PHISHING")) {
 
273
            if(!phishing) {
 
274
                cli_dbgmsg("Module PHISHING %s\n", dconf->phishing ? "On" : "Off");
 
275
                phishing = 1;
 
276
            }
 
277
 
 
278
            if(dconf->phishing)
 
279
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->phishing & modules[i].bflag) ? "On" : "** Off **");
 
280
            else
 
281
                continue;
 
282
        } else if(!strcmp(modules[i].mname, "BYTECODE")) {
 
283
            if(!bytecode) {
 
284
                cli_dbgmsg("Module BYTECODE %s\n", dconf->bytecode ? "On" : "Off");
 
285
                bytecode = 1;
 
286
            }
 
287
 
 
288
            if(dconf->bytecode)
 
289
                cli_dbgmsg("   * Submodule %10s:\t%s\n", modules[i].sname, (dconf->bytecode & modules[i].bflag) ? "On" : "** Off **");
 
290
            else
 
291
                continue;
 
292
        } else if (!strcmp(modules[i].mname, "STATS")) {
 
293
            if (!stats) {
 
294
                cli_dbgmsg("Module STATS %s\n", dconf->stats ? "On" : "Off");
 
295
                stats = 1;
 
296
            }
 
297
 
 
298
            if (dconf->stats)
 
299
                cli_dbgmsg("    * Submodule %10s:\t%s\n", modules[i].sname, (dconf->stats & modules[i].bflag) ? "On" : "** Off **");
 
300
            else
 
301
                continue;
 
302
        }
279
303
    }
280
304
}
281
305
 
282
306
static int chkflevel(const char *entry, int field)
283
307
{
284
 
        char *pt;
 
308
    char *pt;
285
309
 
286
310
 
287
311
    if((pt = cli_strtok(entry, field, ":"))) { /* min version */
288
 
        if(!isdigit(*pt)) {
289
 
            free(pt);
290
 
            return 0;
291
 
        }
292
 
 
293
 
        if((unsigned int) atoi(pt) > CL_FLEVEL_DCONF) {
294
 
            free(pt);
295
 
            return 0;
296
 
        }
297
 
 
298
 
        free(pt);
299
 
 
300
 
        if((pt = cli_strtok(entry, field + 1, ":"))) { /* max version */
301
 
            if(!isdigit(*pt)) {
302
 
                free(pt);
303
 
                return 0;
304
 
            }
305
 
 
306
 
            if((unsigned int) atoi(pt) < CL_FLEVEL_DCONF) {
307
 
                free(pt);
308
 
                return 0;
309
 
            }
310
 
 
311
 
            free(pt);
312
 
        }
 
312
        if(!isdigit(*pt)) {
 
313
            free(pt);
 
314
            return 0;
 
315
        }
 
316
 
 
317
        if((unsigned int) atoi(pt) > CL_FLEVEL_DCONF) {
 
318
            free(pt);
 
319
            return 0;
 
320
        }
 
321
 
 
322
        free(pt);
 
323
 
 
324
        if((pt = cli_strtok(entry, field + 1, ":"))) { /* max version */
 
325
            if(!isdigit(*pt)) {
 
326
                free(pt);
 
327
                return 0;
 
328
            }
 
329
 
 
330
            if((unsigned int) atoi(pt) < CL_FLEVEL_DCONF) {
 
331
                free(pt);
 
332
                return 0;
 
333
            }
 
334
 
 
335
            free(pt);
 
336
        }
313
337
    }
314
338
 
315
339
    return 1;
317
341
 
318
342
int cli_dconf_load(FILE *fs, struct cl_engine *engine, unsigned int options, struct cli_dbio *dbio)
319
343
{
320
 
        char buffer[FILEBUFF];
321
 
        unsigned int line = 0;
322
 
        int ret = 0;
323
 
        uint32_t val;
 
344
    char buffer[FILEBUFF];
 
345
    unsigned int line = 0;
 
346
    int ret = 0;
 
347
    uint32_t val;
324
348
 
325
349
 
326
350
    while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
327
 
        line++;
328
 
        cli_chomp(buffer);
329
 
 
330
 
        if(!strncmp(buffer, "PE:", 3) && chkflevel(buffer, 2)) {
331
 
            if(sscanf(buffer + 3, "0x%x", &val) == 1) {
332
 
                engine->dconf->pe = val;
333
 
            } else {
334
 
                ret = CL_EMALFDB;
335
 
                break;
336
 
            }
337
 
        }
338
 
 
339
 
        if(!strncmp(buffer, "ELF:", 4) && chkflevel(buffer, 2)) {
340
 
            if(sscanf(buffer + 4, "0x%x", &val) == 1) {
341
 
                engine->dconf->elf = val;
342
 
            } else {
343
 
                ret = CL_EMALFDB;
344
 
                break;
345
 
            }
346
 
        }
347
 
 
348
 
        if(!strncmp(buffer, "MACHO:", 4) && chkflevel(buffer, 2)) {
349
 
            if(sscanf(buffer + 4, "0x%x", &val) == 1) {
350
 
                engine->dconf->macho = val;
351
 
            } else {
352
 
                ret = CL_EMALFDB;
353
 
                break;
354
 
            }
355
 
        }
356
 
 
357
 
        if(!strncmp(buffer, "ARCHIVE:", 8) && chkflevel(buffer, 2)) {
358
 
            if(sscanf(buffer + 8, "0x%x", &val) == 1) {
359
 
                engine->dconf->archive = val;
360
 
            } else {
361
 
                ret = CL_EMALFDB;
362
 
                break;
363
 
            }
364
 
        }
365
 
 
366
 
        if(!strncmp(buffer, "DOCUMENT:", 9) && chkflevel(buffer, 2)) {
367
 
            if(sscanf(buffer + 9, "0x%x", &val) == 1) {
368
 
                engine->dconf->doc = val;
369
 
            } else {
370
 
                ret = CL_EMALFDB;
371
 
                break;
372
 
            }
373
 
        }
374
 
 
375
 
        if(!strncmp(buffer, "MAIL:", 5) && chkflevel(buffer, 2)) {
376
 
            if(sscanf(buffer + 5, "0x%x", &val) == 1) {
377
 
                engine->dconf->mail = val;
378
 
            } else {
379
 
                ret = CL_EMALFDB;
380
 
                break;
381
 
            }
382
 
        }
383
 
 
384
 
        if(!strncmp(buffer, "OTHER:", 6) && chkflevel(buffer, 2)) {
385
 
            if(sscanf(buffer + 6, "0x%x", &val) == 1) {
386
 
                engine->dconf->other = val;
387
 
            } else {
388
 
                ret = CL_EMALFDB;
389
 
                break;
390
 
            }
391
 
        }
392
 
 
393
 
        if(!strncmp(buffer, "PHISHING:", 9) && chkflevel(buffer, 2)) {
394
 
            if(sscanf(buffer + 9, "0x%x", &val) == 1) {
395
 
                engine->dconf->phishing = val;
396
 
            } else {
397
 
                ret = CL_EMALFDB;
398
 
                break;
399
 
            }
400
 
        }
401
 
 
402
 
        if(!strncmp(buffer, "BYTECODE:", 9) && chkflevel(buffer, 2)) {
403
 
            if(sscanf(buffer + 9, "0x%x", &val) == 1) {
404
 
                engine->dconf->bytecode = val;
405
 
            } else {
406
 
                ret = CL_EMALFDB;
407
 
                break;
408
 
            }
409
 
        }
 
351
        line++;
 
352
        cli_chomp(buffer);
 
353
 
 
354
        if(!strncmp(buffer, "PE:", 3) && chkflevel(buffer, 2)) {
 
355
            if(sscanf(buffer + 3, "0x%x", &val) == 1) {
 
356
                engine->dconf->pe = val;
 
357
            } else {
 
358
                ret = CL_EMALFDB;
 
359
                break;
 
360
            }
 
361
        }
 
362
 
 
363
        if(!strncmp(buffer, "ELF:", 4) && chkflevel(buffer, 2)) {
 
364
            if(sscanf(buffer + 4, "0x%x", &val) == 1) {
 
365
                engine->dconf->elf = val;
 
366
            } else {
 
367
                ret = CL_EMALFDB;
 
368
                break;
 
369
            }
 
370
        }
 
371
 
 
372
        if(!strncmp(buffer, "MACHO:", 4) && chkflevel(buffer, 2)) {
 
373
            if(sscanf(buffer + 4, "0x%x", &val) == 1) {
 
374
                engine->dconf->macho = val;
 
375
            } else {
 
376
                ret = CL_EMALFDB;
 
377
                break;
 
378
            }
 
379
        }
 
380
 
 
381
        if(!strncmp(buffer, "ARCHIVE:", 8) && chkflevel(buffer, 2)) {
 
382
            if(sscanf(buffer + 8, "0x%x", &val) == 1) {
 
383
                engine->dconf->archive = val;
 
384
            } else {
 
385
                ret = CL_EMALFDB;
 
386
                break;
 
387
            }
 
388
        }
 
389
 
 
390
        if(!strncmp(buffer, "DOCUMENT:", 9) && chkflevel(buffer, 2)) {
 
391
            if(sscanf(buffer + 9, "0x%x", &val) == 1) {
 
392
                engine->dconf->doc = val;
 
393
            } else {
 
394
                ret = CL_EMALFDB;
 
395
                break;
 
396
            }
 
397
        }
 
398
 
 
399
        if(!strncmp(buffer, "MAIL:", 5) && chkflevel(buffer, 2)) {
 
400
            if(sscanf(buffer + 5, "0x%x", &val) == 1) {
 
401
                engine->dconf->mail = val;
 
402
            } else {
 
403
                ret = CL_EMALFDB;
 
404
                break;
 
405
            }
 
406
        }
 
407
 
 
408
        if(!strncmp(buffer, "OTHER:", 6) && chkflevel(buffer, 2)) {
 
409
            if(sscanf(buffer + 6, "0x%x", &val) == 1) {
 
410
                engine->dconf->other = val;
 
411
            } else {
 
412
                ret = CL_EMALFDB;
 
413
                break;
 
414
            }
 
415
        }
 
416
 
 
417
        if(!strncmp(buffer, "PHISHING:", 9) && chkflevel(buffer, 2)) {
 
418
            if(sscanf(buffer + 9, "0x%x", &val) == 1) {
 
419
                engine->dconf->phishing = val;
 
420
            } else {
 
421
                ret = CL_EMALFDB;
 
422
                break;
 
423
            }
 
424
        }
 
425
 
 
426
        if(!strncmp(buffer, "BYTECODE:", 9) && chkflevel(buffer, 2)) {
 
427
            if(sscanf(buffer + 9, "0x%x", &val) == 1) {
 
428
                engine->dconf->bytecode = val;
 
429
            } else {
 
430
                ret = CL_EMALFDB;
 
431
                break;
 
432
            }
 
433
        }
 
434
 
 
435
        if(!strncmp(buffer, "STATS:", 6) && chkflevel(buffer, 2)) {
 
436
            if(sscanf(buffer + 6, "0x%x", &val) == 1) {
 
437
                engine->dconf->stats = val;
 
438
            } else {
 
439
                ret = CL_EMALFDB;
 
440
                break;
 
441
            }
 
442
        }
410
443
    }
411
444
 
412
445
    if(ret) {
413
 
        cli_errmsg("Problem parsing configuration file at line %u\n", line);
414
 
        return ret;
 
446
        cli_errmsg("Problem parsing configuration file at line %u\n", line);
 
447
        return ret;
415
448
    }
416
449
 
417
450
    return CL_SUCCESS;