~ubuntu-branches/ubuntu/precise/dspam/precise

« back to all changes in this revision

Viewing changes to src/ora_drv.c

  • Committer: Bazaar Package Importer
  • Author(s): Julien Valroff, Kurt B. Kaiser, Julien Valroff
  • Date: 2011-03-28 15:04:10 UTC
  • mfrom: (1.1.3 upstream)
  • mto: (8.1.5 sid)
  • mto: This revision was merged to the branch mainline in revision 23.
  • Revision ID: james.westby@ubuntu.com-20110328150410-3zsgfxn4lcc708kt
Tags: 3.9.1~rc1+git20110312.9a9050f+dfsg-1
[ Kurt B. Kaiser ]
* debian/rules: don't use --build config option if host equals target.
* debian/rules: dpkg-dev now handles CFLAGS.
* Use maintainer-clean in clean target and remove any Makefile.in left over.
* Remove libapache2-mod-auth-shadow - no longer available in unstable
* Suggest clamav-daemon instead of recommending it.
* Suggest dspam-webfrontend.
* Add amavis to trusted users (Closes: #477508)
* Use dh_lintian to install the webfrontend conffile override
* Webfrontend improvements:
  - Delete the old, obsolete apache.conf file from the package, and
    purge it when dspam-webfrontend is purged if it is present in
    /etc/dspam/.
  - Move the html templates to /etc/dspam/templates/
  - Install the apache conf fragment as an example in dspam-webfrontend 
  - Modify apache2.conf to install a working example website. Use
    /etc/dspam/passwd, which doesn't need access to /etc/shadow.
    (Closes: #430589)
  - Clean up customize-cgi.txt and add it to README.Debian. 

[ Julien Valroff ]
* New upstream release
  (Closes: #418736, #491387, #505010, #514498, #577661, #445890, #383964,
  #430840, #568068)
* Bump Standards to 3.9.1:
  - Add README.source, as per Debian Policy Manual 4.14
* Bump debhelper compatibility to 8
* Update/remove patches for new release
* Add misc depends to all binary packages
* Rewrite package descriptions
* Use dh_prep instead of dh_clean -k
* Drop obsolete db4 driver (Closes: #601209)
* Update copyright information
* Add Vcs-* and Homepage fields in control file
* Remove useless DMUA field 
* Add TODO.Debian file to describe planned changes to DSPAM Debian packages
* Fix watch file to track upstream releases on new hosting location
* Remove /var/run/dspam from dspam.dirs to make lintian happy - the init
  script makes sure the directory is created before starting dspam
* Install examples scripts using dh_installexamples
* Update SQL schemas and make sure the databases are updated when upgrading
  from 3.6.8 using dbconfig-common
* Set default database name and user name to dspam for both MySQL and PgSQL
* Make dspam-webfrontend suggest apache2
* Remove inactive & MIA uploaders (Closes: #503488)
* Add myself as uploader
* Add depends on other MDAs than procmail (Closes: #506312)
* Honour $USER in call to chmod (Closes: #505217)
* Fix MySQL daily cronjob to work correctly when using storage profiles
* Make MySQL daily cronjob quiet
* Fix build-dependencies to use current automake version and use
  unversionned libmysqclient-dev
* Drop runtime dependencies on debconf - unneeded as this package
  is "required"
* Purge ucf database and ucf config files on package purge
* Remove unused lintian overrides
* Add description to all patches
* Rewrite init script based on the current skeleton shipped in the
  initscripts package
* Add numerical prefixes to Debian patches 
* Fix verbose_bug build option
* Add logrotate entry for dspam.messages and sql.errors
* Add 'notifempty' option for logrotate
* Fix 'hyphen-used-as-minus-sign' lintian information: escape all --
  in manpages
* Update dspam_admin manpage to list aggregate feature
* Makes drv-sqlite3 daily cronjob quiet if package is removed and
  not purged - thanks to Petter Reinholdtsen <pere@hungry.com>
  (Closes: #540064, #562857)
* Converted source package to 3.0 (quilt) format
* Add dependency to libhtml-parser-perl for the webfrontend
* Opt Out is now the default condfiguration, as per upstream default
* Default daemon port is set to 2424 as dspam daemon is run by an
  unprivileged user (Closes: #385760)
* Add explicit dependency on perl
* Fix typo in README.source
* Fix daily cron scripts to avoid problems if the user has added
  two identical entries for certain values
  (thanks to Stevan Bajić <stevan@bajic.ch>)
* Add automatic configuration file splitting snippet in rules
  (thanks to Stevan Bajić <stevan@bajic.ch>)
* Make use of dspam_maintenance.sh script instead of homemade purge scripts
* Only ships SQL files for MySQL >= 4.1 as no older version is available
  in Debian
* Add dspam_notify script in dspam-webfrontend to send automatic quarantine
  email notification
* Add debug package which ships debugging symbols
* Switch to dh style rules file
* Repack upstream tarball to make DFSG clean sources and add explanations to
  README.source file

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: ora_drv.c,v 1.15 2006/05/13 01:12:59 jonz Exp $ */
2
 
 
3
 
/*
4
 
 DSPAM
5
 
 COPYRIGHT (C) 2002-2006 JONATHAN A. ZDZIARSKI
6
 
 
7
 
 This program is free software; you can redistribute it and/or
8
 
 modify it under the terms of the GNU General Public License
9
 
 as published by the Free Software Foundation; version 2
10
 
 of the License.
11
 
 
12
 
 This program is distributed in the hope that it will be useful,
13
 
 but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
 GNU General Public License for more details.
16
 
 
17
 
 You should have received a copy of the GNU General Public License
18
 
 along with this program; if not, write to the Free Software
19
 
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
 
 
21
 
*/
22
 
 
23
 
#ifdef HAVE_CONFIG_H
24
 
#include <auto-config.h>
25
 
#endif
26
 
 
27
 
#include <string.h>
28
 
#include <pwd.h>
29
 
#include <sys/types.h>
30
 
#include <sys/stat.h>
31
 
#include <dirent.h>
32
 
#include <unistd.h>
33
 
#include <errno.h>
34
 
#include <stdlib.h>
35
 
#include <stdio.h>
36
 
#include <fcntl.h>
37
 
#include <signal.h>
38
 
#include <oci.h>
39
 
 
40
 
#ifdef TIME_WITH_SYS_TIME
41
 
#   include <sys/time.h>
42
 
#   include <time.h>
43
 
#else
44
 
#   ifdef HAVE_SYS_TIME_H
45
 
#       include <sys/time.h>
46
 
#   else
47
 
#       include <time.h>
48
 
#   endif
49
 
#endif
50
 
 
51
 
#include "storage_driver.h"
52
 
#include "ora_drv.h"
53
 
#include "libdspam.h"
54
 
#include "config.h"
55
 
#include "error.h"
56
 
#include "language.h"
57
 
#include "util.h"
58
 
#include "config_shared.h"
59
 
 
60
 
int
61
 
dspam_init_driver (DRIVER_CTX *DTX)
62
 
{
63
 
  return 0;
64
 
}
65
 
 
66
 
int
67
 
dspam_shutdown_driver (DRIVER_CTX *DTX)
68
 
{
69
 
  return 0;
70
 
}
71
 
 
72
 
int
73
 
_ds_init_storage (DSPAM_CTX * CTX, void *dbh)
74
 
{
75
 
  struct _ora_drv_storage *s;
76
 
  FILE *file;
77
 
  char dblink[1024];
78
 
  char buffer[1024];
79
 
  char username[64] = "";
80
 
  char password[32] = "";
81
 
  char schema[32] = "";
82
 
  char filename[MAX_FILENAME_LENGTH];
83
 
  int i = 0;
84
 
 
85
 
  if (CTX == NULL)
86
 
    return EINVAL;
87
 
                                                                                
88
 
  if (dbh != NULL) {
89
 
    LOG(LOG_ERR, ERR_DRV_NO_ATTACH);
90
 
    return EINVAL;
91
 
  }
92
 
 
93
 
  if (CTX->flags & DSF_MERGED) {
94
 
    LOG(LOG_ERR, ERR_DRV_NO_MERGED);
95
 
    return EINVAL;
96
 
  }
97
 
 
98
 
  /* don't init if we're already initted */
99
 
  if (CTX->storage != NULL)
100
 
  {
101
 
    LOGDEBUG ("_ds_init_storage: storage already initialized");
102
 
    return EINVAL;
103
 
  }
104
 
 
105
 
  s = malloc (sizeof (struct _ora_drv_storage));
106
 
  if (s == NULL)
107
 
  {
108
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
109
 
    return EUNKNOWN;
110
 
  }
111
 
 
112
 
  s->control_token = 0;
113
 
  s->control_ih = 0;
114
 
  s->control_sh = 0;
115
 
  s->authp = NULL;
116
 
  s->schema = NULL;
117
 
  s->iter_user = NULL;
118
 
  s->iter_token = NULL;
119
 
  s->iter_sig = NULL;
120
 
 
121
 
  if (_ds_read_attribute(CTX->config->attributes, "OraServer")) {
122
 
    char *p;
123
 
 
124
 
    strlcpy(dblink,
125
 
            _ds_read_attribute(CTX->config->attributes, "OraServer"), 
126
 
            sizeof(dblink));
127
 
 
128
 
    if ((p = _ds_read_attribute(CTX->config->attributes, "OraUser")))
129
 
      strlcpy(username, p, sizeof(username));
130
 
 
131
 
    if ((p = _ds_read_attribute(CTX->config->attributes, "OraPass")))
132
 
      strlcpy(password, p, sizeof(password));
133
 
 
134
 
    if ((p = _ds_read_attribute(CTX->config->attributes, "OraSchema")))
135
 
      strlcpy(schema, p, sizeof(schema));
136
 
 
137
 
  } else {
138
 
    if (!CTX->home) {
139
 
      LOG(LOG_ERR, ERR_AGENT_DSPAM_HOME);
140
 
      return EINVAL;
141
 
    }
142
 
    snprintf (filename, MAX_FILENAME_LENGTH, "%s/oracle.data", CTX->home);
143
 
    file = fopen (filename, "r");
144
 
    if (file == NULL)
145
 
    {
146
 
      LOG (LOG_WARNING, "unable to open %s for reading: %s",
147
 
           filename, strerror (errno));
148
 
      return EFAILURE;
149
 
    }
150
 
  
151
 
    while (fgets (buffer, sizeof (buffer), file) != NULL)
152
 
    {
153
 
      chomp (buffer);
154
 
      if (!i)
155
 
        strlcpy (dblink, buffer, sizeof (dblink));
156
 
      else if (i == 1)
157
 
        strlcpy (username, buffer, sizeof (username));
158
 
      else if (i == 2)
159
 
        strlcpy (password, buffer, sizeof (password));
160
 
      else if (i == 3)
161
 
        strlcpy (schema, buffer, sizeof (schema));
162
 
      i++;
163
 
    }
164
 
    fclose (file);
165
 
  }
166
 
 
167
 
  if (schema[0] == 0)
168
 
  {
169
 
    LOG (LOG_WARNING, "file %s: incomplete Oracle connect data", filename);
170
 
    return EINVAL;
171
 
  }
172
 
 
173
 
  s->schema = strdup (schema);
174
 
 
175
 
  /* establish an Oracle session */
176
 
 
177
 
  OCIInitialize ((ub4) OCI_DEFAULT, (dvoid *) 0,
178
 
                 (dvoid * (*)(dvoid *, size_t)) 0,
179
 
                 (dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
180
 
                 (void (*)(dvoid *, dvoid *)) 0);
181
 
 
182
 
  OCIEnvInit ((OCIEnv **) & s->envhp, OCI_DEFAULT, (size_t) 0, (dvoid **) 0);
183
 
 
184
 
  OCIHandleAlloc ((dvoid *) s->envhp, (dvoid **) & s->errhp, OCI_HTYPE_ERROR,
185
 
                  (size_t) 0, (dvoid **) 0);
186
 
 
187
 
  OCIHandleAlloc ((dvoid *) s->envhp, (dvoid **) & s->srvhp,
188
 
                  OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0);
189
 
 
190
 
  OCIHandleAlloc ((dvoid *) s->envhp, (dvoid **) & s->svchp,
191
 
                  OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0);
192
 
 
193
 
  if (_ora_drv_checkerr
194
 
      (dblink, s->errhp,
195
 
       OCIServerAttach (s->srvhp, s->errhp, (text *) dblink, strlen (dblink),
196
 
                        0)) != OCI_SUCCESS)
197
 
    return EFAILURE;
198
 
 
199
 
  OCIAttrSet ((dvoid *) s->svchp, OCI_HTYPE_SVCCTX, (dvoid *) s->srvhp,
200
 
              (ub4) 0, OCI_ATTR_SERVER, (OCIError *) s->errhp);
201
 
 
202
 
  OCIHandleAlloc ((dvoid *) s->envhp, (dvoid **) & s->authp,
203
 
                  (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);
204
 
 
205
 
  OCIAttrSet ((dvoid *) s->authp, (ub4) OCI_HTYPE_SESSION,
206
 
              (dvoid *) username, (ub4) strlen ((char *) username),
207
 
              (ub4) OCI_ATTR_USERNAME, s->errhp);
208
 
 
209
 
  OCIAttrSet ((dvoid *) s->authp, (ub4) OCI_HTYPE_SESSION,
210
 
              (dvoid *) password, (ub4) strlen ((char *) password),
211
 
              (ub4) OCI_ATTR_PASSWORD, s->errhp);
212
 
 
213
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCISessionBegin (s->svchp, s->errhp,
214
 
                                                          s->authp,
215
 
                                                          OCI_CRED_RDBMS,
216
 
                                                          (ub4) OCI_DEFAULT))
217
 
      != OCI_SUCCESS)
218
 
    return EFAILURE;
219
 
 
220
 
  (void) OCIAttrSet ((dvoid *) s->svchp, (ub4) OCI_HTYPE_SVCCTX,
221
 
                     (dvoid *) s->authp, (ub4) 0,
222
 
                     (ub4) OCI_ATTR_SESSION, s->errhp);
223
 
 
224
 
  CTX->storage = s;
225
 
 
226
 
  /* get spam totals on successful init */
227
 
  if (CTX->username != NULL)
228
 
  {
229
 
    if (_ora_drv_get_spamtotals (CTX))
230
 
    {
231
 
      LOGDEBUG ("unable to load totals.  using zero values.");
232
 
      memset (&CTX->totals, 0, sizeof (struct _ds_spam_totals));
233
 
      memset (&s->control_totals, 0, sizeof (struct _ds_spam_totals));
234
 
    }
235
 
    else
236
 
    {
237
 
      memcpy (&s->control_totals, &CTX->totals,
238
 
              sizeof (struct _ds_spam_totals));
239
 
    }
240
 
  }
241
 
  else
242
 
  {
243
 
    memset (&CTX->totals, 0, sizeof (struct _ds_spam_totals));
244
 
    memset (&s->control_totals, 0, sizeof (struct _ds_spam_totals));
245
 
  }
246
 
 
247
 
  return 0;
248
 
}
249
 
 
250
 
int
251
 
_ds_shutdown_storage (DSPAM_CTX * CTX)
252
 
{
253
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
254
 
 
255
 
  if (CTX->storage == NULL)
256
 
  {
257
 
    LOGDEBUG ("_ds_shutdown_storage: storage not initialized");
258
 
    return EINVAL;
259
 
  }
260
 
 
261
 
  /* Store spam totals on shutdown */
262
 
  if (CTX->username != NULL && CTX->operating_mode != DSM_CLASSIFY)
263
 
  {
264
 
    _ora_drv_set_spamtotals (CTX);
265
 
  }
266
 
  OCISessionEnd (s->svchp, s->errhp, s->authp, (ub4) OCI_DEFAULT);
267
 
  OCIServerDetach (s->srvhp, s->errhp, (ub4) OCI_DEFAULT);
268
 
  OCIHandleFree ((dvoid *) s->srvhp, (ub4) OCI_HTYPE_SERVER);
269
 
  OCIHandleFree ((dvoid *) s->svchp, (ub4) OCI_HTYPE_SVCCTX);
270
 
  OCIHandleFree ((dvoid *) s->errhp, (ub4) OCI_HTYPE_ERROR);
271
 
  OCIHandleFree ((dvoid *) s->envhp, OCI_HTYPE_ENV);
272
 
 
273
 
  free (s->schema);
274
 
  free (CTX->storage);
275
 
  CTX->storage = NULL;
276
 
 
277
 
  return 0;
278
 
}
279
 
 
280
 
void
281
 
_ora_drv_query_error (const char *error, const char *query)
282
 
{
283
 
  FILE *file;
284
 
  time_t tm = time (NULL);
285
 
  char ct[128];
286
 
  char fn[MAX_FILENAME_LENGTH];
287
 
 
288
 
  snprintf (fn, sizeof (fn), "%s/sql.errors", LOGDIR);
289
 
 
290
 
  snprintf (ct, sizeof (ct), "%s", ctime (&tm));
291
 
  chomp (ct);
292
 
 
293
 
  file = fopen (fn, "a");
294
 
 
295
 
  if (file == NULL)
296
 
  {
297
 
    LOG(LOG_ERR, ERR_IO_FILE_WRITE, fn, strerror (errno));
298
 
    return;
299
 
  }
300
 
  if (query != NULL)
301
 
    fprintf (file, "[%s] %d: %s: %s\n", ct, getpid (), error, query);
302
 
  else
303
 
    fprintf (file, "[%s] %d: %s\n", ct, getpid (), error);
304
 
  fclose (file);
305
 
 
306
 
#ifdef DEBUG
307
 
  if (query != NULL)
308
 
    fprintf (stderr, "[%s] %d: %s: %s\n", ct, getpid (), error, query);
309
 
  else
310
 
    fprintf (stderr, "[%s] %d: %s\n", ct, getpid (), error);
311
 
#endif
312
 
 
313
 
  return;
314
 
}
315
 
 
316
 
sword
317
 
_ora_drv_checkerr (const char *query, OCIError * errhp, sword status)
318
 
{
319
 
  text errbuf[512];
320
 
  sb4 errcode = 0;
321
 
 
322
 
  switch (status)
323
 
  {
324
 
  case OCI_SUCCESS:
325
 
    break;
326
 
  case OCI_SUCCESS_WITH_INFO:
327
 
    _ora_drv_query_error ("Oracle error: OCI_SUCCESS_WITH_INFO", query);
328
 
    break;
329
 
  case OCI_NEED_DATA:
330
 
    _ora_drv_query_error ("Oracle error: OCI_NEED_DATA", query);
331
 
    break;
332
 
  case OCI_NO_DATA:
333
 
    _ora_drv_query_error ("Oracle error: OCI_NO_DATA", query);
334
 
    break;
335
 
  case OCI_ERROR:
336
 
    (void) OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
337
 
                        errbuf, (ub4) sizeof (errbuf), OCI_HTYPE_ERROR);
338
 
    _ora_drv_query_error ((const char *) errbuf, query);
339
 
    break;
340
 
  case OCI_INVALID_HANDLE:
341
 
    _ora_drv_query_error ("Oracle error: OCI_INVALID_HANDLE", query);
342
 
    break;
343
 
  case OCI_STILL_EXECUTING:
344
 
    _ora_drv_query_error ("Oracle error: OCI_STILL_EXECUTE", query);
345
 
    break;
346
 
  case OCI_CONTINUE:
347
 
    _ora_drv_query_error ("Oracle error: OCI_CONTINUE", query);
348
 
    break;
349
 
  default:
350
 
    break;
351
 
  }
352
 
 
353
 
  return status;
354
 
}
355
 
 
356
 
int
357
 
_ds_create_signature_id (DSPAM_CTX * CTX, char *buf, size_t len)
358
 
{
359
 
  char session[64];
360
 
  char digit[6];
361
 
  int pid, j;
362
 
 
363
 
  pid = getpid ();
364
 
  snprintf (session, sizeof (session), "%8lx%d", (long) time (NULL), pid);
365
 
 
366
 
  for (j = 0; j < 2; j++)
367
 
  {
368
 
    snprintf (digit, 6, "%d", rand ());
369
 
    strlcat (session, digit, 64);
370
 
  }
371
 
 
372
 
  strlcpy (buf, session, len);
373
 
  return 0;
374
 
}
375
 
 
376
 
int
377
 
_ds_get_signature (DSPAM_CTX * CTX, struct _ds_spam_signature *SIG,
378
 
                   const char *signature)
379
 
{
380
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
381
 
  char query[1024];
382
 
  struct passwd *p;
383
 
  OCIStmt *stmthp;
384
 
  OCIDefine *defn = (OCIDefine *) 0;
385
 
  sword status;
386
 
 
387
 
  if (CTX->storage == NULL)
388
 
  {
389
 
    LOGDEBUG ("_ds_get_signature: storage not initialized");
390
 
    return EINVAL;
391
 
  }
392
 
 
393
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
394
 
  if (p == NULL)
395
 
  {
396
 
    LOGDEBUG ("_ds_get_signature: unable to _ora_drv_getpwnam(%s)",
397
 
              CTX->username);
398
 
    return EINVAL;
399
 
  }
400
 
 
401
 
  snprintf (query, sizeof (query),
402
 
            "SELECT LENGTH FROM %s.DSPAM_SIGNATURE_DATA"
403
 
            " WHERE SIGNATURE = '%s' AND USER_ID = %d",
404
 
            s->schema, signature, p->pw_uid);
405
 
 
406
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
407
 
                                                         (dvoid **) & stmthp,
408
 
                                                         (ub4) OCI_HTYPE_STMT,
409
 
                                                         (size_t) 0,
410
 
                                                         (dvoid **) 0)) !=
411
 
      OCI_SUCCESS)
412
 
    return EUNKNOWN;
413
 
 
414
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp,
415
 
                                                          s->errhp,
416
 
                                                          (text *) query,
417
 
                                                          (ub4)
418
 
                                                          strlen (query),
419
 
                                                          (ub4)
420
 
                                                          OCI_NTV_SYNTAX,
421
 
                                                          (ub4) OCI_DEFAULT))
422
 
      != OCI_SUCCESS)
423
 
    goto bail;
424
 
 
425
 
  if (_ora_drv_checkerr
426
 
      (query, s->errhp,
427
 
       OCIDefineByPos (stmthp, &defn, s->errhp, 1, (dvoid *) & SIG->length,
428
 
                       (sword) sizeof (long), SQLT_INT, (dvoid *) 0,
429
 
                       (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
430
 
    goto bail;
431
 
 
432
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
433
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
434
 
                           (ub4) OCI_DEFAULT);
435
 
 
436
 
  if (status == OCI_NO_DATA)
437
 
  {
438
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
439
 
    return EFAILURE;
440
 
  }
441
 
 
442
 
  if (status != OCI_SUCCESS)
443
 
    goto bail;
444
 
 
445
 
  SIG->data = malloc (SIG->length);
446
 
  if (SIG->data == NULL)
447
 
  {
448
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
449
 
    goto bail;
450
 
  }
451
 
 
452
 
  snprintf (query, sizeof (query),
453
 
            "SELECT DATA FROM %s.DSPAM_SIGNATURE_DATA"
454
 
            " WHERE SIGNATURE = '%s' AND USER_ID = %d",
455
 
            s->schema, signature, p->pw_uid);
456
 
 
457
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
458
 
                                                         (dvoid **) & stmthp,
459
 
                                                         (ub4) OCI_HTYPE_STMT,
460
 
                                                         (size_t) 0,
461
 
                                                         (dvoid **) 0)) !=
462
 
      OCI_SUCCESS)
463
 
    return EUNKNOWN;
464
 
 
465
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp,
466
 
                                                          s->errhp,
467
 
                                                          (text *) query,
468
 
                                                          (ub4)
469
 
                                                          strlen (query),
470
 
                                                          (ub4)
471
 
                                                          OCI_NTV_SYNTAX,
472
 
                                                          (ub4) OCI_DEFAULT))
473
 
      != OCI_SUCCESS)
474
 
    goto bail;
475
 
 
476
 
  if (_ora_drv_checkerr
477
 
      (query, s->errhp,
478
 
       OCIDefineByPos (stmthp, &defn, s->errhp, 1, (dvoid *) SIG->data,
479
 
                       (sword) SIG->length, SQLT_LNG, (dvoid *) 0, (ub2 *) 0,
480
 
                       (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
481
 
    goto bail;
482
 
 
483
 
  status = _ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
484
 
                                                               stmthp,
485
 
                                                               s->errhp,
486
 
                                                               (ub4) 1,
487
 
                                                               (ub4) 0,
488
 
                                                               (OCISnapshot *)
489
 
                                                               NULL,
490
 
                                                               (OCISnapshot *)
491
 
                                                               NULL,
492
 
                                                               (ub4)
493
 
                                                               OCI_DEFAULT));
494
 
 
495
 
  if (status == OCI_NO_DATA)
496
 
  {
497
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
498
 
    return EFAILURE;
499
 
  }
500
 
 
501
 
  if (status != OCI_SUCCESS)
502
 
    goto bail;
503
 
 
504
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
505
 
  return 0;
506
 
 
507
 
bail:
508
 
 
509
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
510
 
  return EUNKNOWN;
511
 
}
512
 
 
513
 
int
514
 
_ds_set_signature (DSPAM_CTX * CTX, struct _ds_spam_signature *SIG,
515
 
                   const char *signature)
516
 
{
517
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
518
 
  char query[1024];
519
 
  struct passwd *p;
520
 
  OCIStmt *stmthp;
521
 
  OCIBind *phBindSignature = NULL;
522
 
 
523
 
  if (CTX->storage == NULL)
524
 
  {
525
 
    LOGDEBUG ("_ds_set_signature: storage not initialized");
526
 
    return EINVAL;
527
 
  }
528
 
 
529
 
  if (SIG == NULL || SIG->data == NULL || !SIG->length)
530
 
    return 0;
531
 
 
532
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
533
 
  if (p == NULL)
534
 
  {
535
 
    LOGDEBUG ("_ds_set_signature: unable to _ora_drv_getpwnam(%s)",
536
 
              CTX->username);
537
 
    return EINVAL;
538
 
  }
539
 
 
540
 
  snprintf (query, sizeof (query),
541
 
            "INSERT INTO %s.DSPAM_SIGNATURE_DATA(USER_ID, SIGNATURE, LENGTH, CREATED_ON"
542
 
            ", DATA) VALUES(%d, '%s', %ld, SYSDATE, :signature)",
543
 
            s->schema, p->pw_uid, signature, SIG->length);
544
 
 
545
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
546
 
                                                         (dvoid **) & stmthp,
547
 
                                                         (ub4) OCI_HTYPE_STMT,
548
 
                                                         (size_t) 0,
549
 
                                                         (dvoid **) 0)) !=
550
 
      OCI_SUCCESS)
551
 
    return EUNKNOWN;
552
 
 
553
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp,
554
 
                                                          s->errhp,
555
 
                                                          (text *) query,
556
 
                                                          (ub4)
557
 
                                                          strlen (query),
558
 
                                                          (ub4)
559
 
                                                          OCI_NTV_SYNTAX,
560
 
                                                          (ub4) OCI_DEFAULT))
561
 
      != OCI_SUCCESS)
562
 
    goto bail;
563
 
 
564
 
  if (_ora_drv_checkerr (query, s->errhp, OCIBindByName (stmthp,
565
 
                                                         &phBindSignature,
566
 
                                                         s->errhp,
567
 
                                                         ":signature", -1,
568
 
                                                         (dvoid *) SIG->data,
569
 
                                                         SIG->length,
570
 
                                                         SQLT_LNG, NULL, NULL,
571
 
                                                         NULL, 0, NULL,
572
 
                                                         OCI_DEFAULT)) !=
573
 
      OCI_SUCCESS)
574
 
    goto bail;
575
 
 
576
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
577
 
                                                          stmthp, s->errhp,
578
 
                                                          (ub4) 1, (ub4) 0,
579
 
                                                          (OCISnapshot *)
580
 
                                                          NULL,
581
 
                                                          (OCISnapshot *)
582
 
                                                          NULL,
583
 
                                                          (ub4) OCI_DEFAULT))
584
 
      != OCI_SUCCESS)
585
 
    goto bail;
586
 
 
587
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
588
 
  return 0;
589
 
 
590
 
bail:
591
 
 
592
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
593
 
  return EUNKNOWN;
594
 
}
595
 
 
596
 
int
597
 
_ds_delete_signature (DSPAM_CTX * CTX, const char *signature)
598
 
{
599
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
600
 
  char query[1024];
601
 
  struct passwd *p;
602
 
  OCIStmt *stmthp;
603
 
 
604
 
  if (CTX->storage == NULL)
605
 
  {
606
 
    LOGDEBUG ("_ds_delete_signature: storage not initialized");
607
 
    return EINVAL;
608
 
  }
609
 
 
610
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
611
 
  if (p == NULL)
612
 
  {
613
 
    LOGDEBUG ("_ds_set_signature: unable to _ora_drv_getpwnam(%s)",
614
 
              CTX->username);
615
 
    return EINVAL;
616
 
  }
617
 
 
618
 
  snprintf (query, sizeof (query),
619
 
            "DELETE FROM %s.DSPAM_SIGNATURE_DATA"
620
 
            " WHERE SIGNATURE = '%s' AND USER_ID = %d",
621
 
            s->schema, signature, p->pw_uid);
622
 
 
623
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
624
 
                                                         (dvoid **) & stmthp,
625
 
                                                         (ub4) OCI_HTYPE_STMT,
626
 
                                                         (size_t) 0,
627
 
                                                         (dvoid **) 0)) !=
628
 
      OCI_SUCCESS)
629
 
    return EUNKNOWN;
630
 
 
631
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp,
632
 
                                                          s->errhp,
633
 
                                                          (text *) query,
634
 
                                                          (ub4)
635
 
                                                          strlen (query),
636
 
                                                          (ub4)
637
 
                                                          OCI_NTV_SYNTAX,
638
 
                                                          (ub4) OCI_DEFAULT))
639
 
      != OCI_SUCCESS)
640
 
    goto bail;
641
 
 
642
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
643
 
                                                          stmthp, s->errhp,
644
 
                                                          (ub4) 1, (ub4) 0,
645
 
                                                          (OCISnapshot *)
646
 
                                                          NULL,
647
 
                                                          (OCISnapshot *)
648
 
                                                          NULL,
649
 
                                                          (ub4) OCI_DEFAULT))
650
 
      != OCI_SUCCESS)
651
 
    goto bail;
652
 
 
653
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
654
 
  return 0;
655
 
 
656
 
bail:
657
 
 
658
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
659
 
  return EUNKNOWN;
660
 
}
661
 
 
662
 
int
663
 
_ds_verify_signature (DSPAM_CTX * CTX, const char *signature)
664
 
{
665
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
666
 
  char query[1024], sig[32];
667
 
  struct passwd *p;
668
 
  OCIStmt *stmthp;
669
 
  OCIDefine *defn = (OCIDefine *) 0;
670
 
  sword status;
671
 
 
672
 
  if (CTX->storage == NULL)
673
 
  {
674
 
    LOGDEBUG ("_ds_verify_signature: storage not initialized");
675
 
    return EINVAL;
676
 
  }
677
 
 
678
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
679
 
  if (p == NULL)
680
 
  {
681
 
    LOGDEBUG ("_ds_verify_signature: unable to _ora_drv_getpwnam(%s)",
682
 
              CTX->username);
683
 
    return EINVAL;
684
 
  }
685
 
 
686
 
  snprintf (query, sizeof (query),
687
 
            "SELECT SIGNATURE FROM %s.DSPAM_SIGNATURE_DATA"
688
 
            " WHERE SIGNATURE = '%s' AND USER_ID = %d",
689
 
            s->schema, signature, p->pw_uid);
690
 
 
691
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
692
 
                                                         (dvoid **) & stmthp,
693
 
                                                         (ub4) OCI_HTYPE_STMT,
694
 
                                                         (size_t) 0,
695
 
                                                         (dvoid **) 0)) !=
696
 
      OCI_SUCCESS)
697
 
    return EUNKNOWN;
698
 
 
699
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp,
700
 
                                                          s->errhp,
701
 
                                                          (text *) query,
702
 
                                                          (ub4)
703
 
                                                          strlen (query),
704
 
                                                          (ub4)
705
 
                                                          OCI_NTV_SYNTAX,
706
 
                                                          (ub4) OCI_DEFAULT))
707
 
      != OCI_SUCCESS)
708
 
    goto bail;
709
 
 
710
 
  if (_ora_drv_checkerr
711
 
      (query, s->errhp,
712
 
       OCIDefineByPos (stmthp, &defn, s->errhp, 1, (dvoid *) & sig,
713
 
                       (sword) sizeof (sig), SQLT_STR, (dvoid *) 0, (ub2 *) 0,
714
 
                       (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
715
 
    goto bail;
716
 
 
717
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
718
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
719
 
                           (ub4) OCI_DEFAULT);
720
 
 
721
 
  if (status == OCI_NO_DATA)
722
 
  {
723
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
724
 
    return EFAILURE;
725
 
  }
726
 
 
727
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
728
 
  return 0;
729
 
 
730
 
bail:
731
 
 
732
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
733
 
  return EUNKNOWN;
734
 
}
735
 
 
736
 
char *
737
 
_ds_get_nextuser (DSPAM_CTX * CTX)
738
 
{
739
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
740
 
  struct passwd *p;
741
 
  char query[1024];
742
 
  uid_t uid;
743
 
  static OCIDefine *defn = (OCIDefine *) 0;
744
 
  static char user[MAX_FILENAME_LENGTH] = { 0 };
745
 
  sword status;
746
 
 
747
 
  if (CTX->storage == NULL)
748
 
  {
749
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
750
 
    return NULL;
751
 
  }
752
 
 
753
 
  /* Execute initial query */
754
 
  if (s->iter_user == NULL)
755
 
  {
756
 
    snprintf (query, sizeof (query),
757
 
              "SELECT DISTINCT USER_ID FROM %s.DSPAM_STATS", s->schema);
758
 
 
759
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
760
 
                                                           (dvoid **) & s->
761
 
                                                           iter_user,
762
 
                                                           (ub4)
763
 
                                                           OCI_HTYPE_STMT,
764
 
                                                           (size_t) 0,
765
 
                                                           (dvoid **) 0)) !=
766
 
        OCI_SUCCESS)
767
 
      return NULL;
768
 
 
769
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (s->iter_user,
770
 
                                                            s->errhp,
771
 
                                                            (text *) query,
772
 
                                                            (ub4)
773
 
                                                            strlen (query),
774
 
                                                            (ub4)
775
 
                                                            OCI_NTV_SYNTAX,
776
 
                                                            (ub4)
777
 
                                                            OCI_DEFAULT)) !=
778
 
        OCI_SUCCESS)
779
 
      goto bail;
780
 
 
781
 
    if (_ora_drv_checkerr
782
 
        (query, s->errhp,
783
 
         OCIDefineByPos (s->iter_user, &defn, s->errhp, 1, (dvoid *) & uid,
784
 
                         (sword) sizeof (uid_t), SQLT_UIN, (dvoid *) 0,
785
 
                         (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
786
 
      goto bail;
787
 
 
788
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
789
 
                                                            s->iter_user,
790
 
                                                            s->errhp, (ub4) 0,
791
 
                                                            (ub4) 0,
792
 
                                                            (OCISnapshot *)
793
 
                                                            NULL,
794
 
                                                            (OCISnapshot *)
795
 
                                                            NULL,
796
 
                                                            (ub4)
797
 
                                                            OCI_DEFAULT)) !=
798
 
        OCI_SUCCESS)
799
 
      goto bail;
800
 
  }
801
 
 
802
 
  status =
803
 
    OCIStmtFetch (s->iter_user, s->errhp, (ub4) 1, (ub4) OCI_FETCH_NEXT,
804
 
                  (ub4) OCI_DEFAULT);
805
 
 
806
 
  if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO)
807
 
    goto bail;
808
 
 
809
 
  p = _ora_drv_getpwuid (CTX, uid);
810
 
  if (p != NULL)
811
 
  {
812
 
    strlcpy (user, p->pw_name, sizeof (user));
813
 
    return user;
814
 
  }
815
 
 
816
 
bail:
817
 
 
818
 
  OCIHandleFree ((dvoid *) s->iter_user, (ub4) OCI_HTYPE_STMT);
819
 
  s->iter_user = NULL;
820
 
  return NULL;
821
 
 
822
 
}
823
 
 
824
 
struct _ds_storage_record *
825
 
_ds_get_nexttoken (DSPAM_CTX * CTX)
826
 
{
827
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
828
 
  struct _ds_storage_record *st;
829
 
  struct passwd *p;
830
 
  char query[1024], token_c[32];
831
 
  static OCIDefine *defn1 = NULL, *defn2 = NULL, *defn3 = NULL, *defn4 = NULL;
832
 
  long sh, ih, lh;
833
 
  sword status;
834
 
 
835
 
  if (CTX->storage == NULL)
836
 
  {
837
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
838
 
    return NULL;
839
 
  }
840
 
 
841
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
842
 
  if (p == NULL)
843
 
  {
844
 
    LOGDEBUG ("_ds_get_nexttoken: unable to _ora_drv_getpwnam(%s)",
845
 
              CTX->username);
846
 
    return NULL;
847
 
  }
848
 
 
849
 
  if (s->iter_token == NULL)
850
 
  {
851
 
    snprintf (query, sizeof (query),
852
 
              "SELECT TOKEN, SPAM_HITS, INNOCENT_HITS, "
853
 
              "TO_NUMBER(LAST_HIT-TO_DATE('01011970','DDMMYYYY'))*60*60*24"
854
 
              "  FROM %s.DSPAM_TOKEN_DATA WHERE USER_ID = %d", s->schema,
855
 
              p->pw_uid);
856
 
 
857
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
858
 
                                                           (dvoid **) & s->
859
 
                                                           iter_token,
860
 
                                                           (ub4)
861
 
                                                           OCI_HTYPE_STMT,
862
 
                                                           (size_t) 0,
863
 
                                                           (dvoid **) 0)) !=
864
 
        OCI_SUCCESS)
865
 
      return NULL;
866
 
 
867
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (s->iter_token,
868
 
                                                            s->errhp,
869
 
                                                            (text *) query,
870
 
                                                            (ub4)
871
 
                                                            strlen (query),
872
 
                                                            (ub4)
873
 
                                                            OCI_NTV_SYNTAX,
874
 
                                                            (ub4)
875
 
                                                            OCI_DEFAULT)) !=
876
 
        OCI_SUCCESS)
877
 
      goto bail;
878
 
 
879
 
    if (_ora_drv_checkerr
880
 
        (query, s->errhp,
881
 
         OCIDefineByPos (s->iter_token, &defn1, s->errhp, 1,
882
 
                         (dvoid *) & token_c, (sword) sizeof (token_c),
883
 
                         SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0,
884
 
                         OCI_DEFAULT)) != OCI_SUCCESS)
885
 
      goto bail;
886
 
 
887
 
    if (_ora_drv_checkerr
888
 
        (query, s->errhp,
889
 
         OCIDefineByPos (s->iter_token, &defn2, s->errhp, 2, (dvoid *) & sh,
890
 
                         (sword) sizeof (sh), SQLT_INT, (dvoid *) 0,
891
 
                         (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
892
 
      goto bail;
893
 
 
894
 
    if (_ora_drv_checkerr
895
 
        (query, s->errhp,
896
 
         OCIDefineByPos (s->iter_token, &defn3, s->errhp, 3, (dvoid *) & ih,
897
 
                         (sword) sizeof (ih), SQLT_INT, (dvoid *) 0,
898
 
                         (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
899
 
      goto bail;
900
 
 
901
 
    if (_ora_drv_checkerr
902
 
        (query, s->errhp,
903
 
         OCIDefineByPos (s->iter_token, &defn4, s->errhp, 4, (dvoid *) & lh,
904
 
                         (sword) sizeof (lh), SQLT_INT, (dvoid *) 0,
905
 
                         (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
906
 
      goto bail;
907
 
 
908
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
909
 
                                                            s->iter_token,
910
 
                                                            s->errhp, (ub4) 0,
911
 
                                                            (ub4) 0,
912
 
                                                            (OCISnapshot *)
913
 
                                                            NULL,
914
 
                                                            (OCISnapshot *)
915
 
                                                            NULL,
916
 
                                                            (ub4)
917
 
                                                            OCI_DEFAULT)) !=
918
 
        OCI_SUCCESS)
919
 
      goto bail;
920
 
  }
921
 
 
922
 
  status =
923
 
    OCIStmtFetch (s->iter_token, s->errhp, (ub4) 1, (ub4) OCI_FETCH_NEXT,
924
 
                  (ub4) OCI_DEFAULT);
925
 
 
926
 
  if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO)
927
 
    goto bail;
928
 
 
929
 
  st = malloc (sizeof (struct _ds_storage_record));
930
 
  if (st == NULL)
931
 
  {
932
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
933
 
    return NULL;
934
 
  }
935
 
 
936
 
  memset (st, 0, sizeof (struct _ds_storage_record));
937
 
  st->token = strtoull (token_c, NULL, 0);
938
 
  st->spam_hits = sh;
939
 
  st->innocent_hits = ih;
940
 
  st->last_hit = (time_t) lh;
941
 
 
942
 
  return st;
943
 
 
944
 
bail:
945
 
 
946
 
  OCIHandleFree ((dvoid *) s->iter_user, (ub4) OCI_HTYPE_STMT);
947
 
  s->iter_token = NULL;
948
 
  return NULL;
949
 
 
950
 
}
951
 
 
952
 
struct _ds_storage_signature *
953
 
_ds_get_nextsignature (DSPAM_CTX * CTX)
954
 
{
955
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
956
 
  struct _ds_storage_signature *st;
957
 
  struct passwd *p;
958
 
  char query[1024], signature[128];
959
 
  static OCIDefine *defn1 = NULL, *defn2 = NULL, *defn3 = NULL, *defn4 = NULL;
960
 
  long sl, lh;
961
 
  sword status;
962
 
  OCIStmt *stmthp;
963
 
 
964
 
  if (CTX->storage == NULL)
965
 
  {
966
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
967
 
    return NULL;
968
 
  }
969
 
 
970
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
971
 
  if (p == NULL)
972
 
  {
973
 
    LOGDEBUG ("_ds_get_nexttoken: unable to _ora_drv_getpwnam(%s)",
974
 
              CTX->username);
975
 
    return NULL;
976
 
  }
977
 
 
978
 
  if (s->iter_sig == NULL)
979
 
  {
980
 
    snprintf (query, sizeof (query),
981
 
              "SELECT SIGNATURE, LENGTH, "
982
 
              "  TO_NUMBER(CREATED_ON-TO_DATE('01011970','MMDDYYYY'))*60*60*24"
983
 
              "  FROM %s.DSPAM_SIGNATURE_DATA WHERE USER_ID = %d",
984
 
              s->schema, p->pw_uid);
985
 
 
986
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
987
 
                                                           (dvoid **) & s->
988
 
                                                           iter_sig,
989
 
                                                           (ub4)
990
 
                                                           OCI_HTYPE_STMT,
991
 
                                                           (size_t) 0,
992
 
                                                           (dvoid **) 0)) !=
993
 
        OCI_SUCCESS)
994
 
      return NULL;
995
 
 
996
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (s->iter_sig,
997
 
                                                            s->errhp,
998
 
                                                            (text *) query,
999
 
                                                            (ub4)
1000
 
                                                            strlen (query),
1001
 
                                                            (ub4)
1002
 
                                                            OCI_NTV_SYNTAX,
1003
 
                                                            (ub4)
1004
 
                                                            OCI_DEFAULT)) !=
1005
 
        OCI_SUCCESS)
1006
 
      goto bail;
1007
 
 
1008
 
    if (_ora_drv_checkerr
1009
 
        (query, s->errhp,
1010
 
         OCIDefineByPos (s->iter_sig, &defn1, s->errhp, 1,
1011
 
                         (dvoid *) & signature, (sword) sizeof (signature),
1012
 
                         SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0,
1013
 
                         OCI_DEFAULT)) != OCI_SUCCESS)
1014
 
      goto bail;
1015
 
 
1016
 
    if (_ora_drv_checkerr
1017
 
        (query, s->errhp,
1018
 
         OCIDefineByPos (s->iter_sig, &defn2, s->errhp, 2, (dvoid *) & sl,
1019
 
                         (sword) sizeof (sl), SQLT_INT, (dvoid *) 0,
1020
 
                         (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1021
 
      goto bail;
1022
 
 
1023
 
    if (_ora_drv_checkerr
1024
 
        (query, s->errhp,
1025
 
         OCIDefineByPos (s->iter_sig, &defn3, s->errhp, 3, (dvoid *) & lh,
1026
 
                         (sword) sizeof (lh), SQLT_INT, (dvoid *) 0,
1027
 
                         (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1028
 
      goto bail;
1029
 
 
1030
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
1031
 
                                                            s->iter_sig,
1032
 
                                                            s->errhp, (ub4) 0,
1033
 
                                                            (ub4) 0,
1034
 
                                                            (OCISnapshot *)
1035
 
                                                            NULL,
1036
 
                                                            (OCISnapshot *)
1037
 
                                                            NULL,
1038
 
                                                            (ub4)
1039
 
                                                            OCI_DEFAULT)) !=
1040
 
        OCI_SUCCESS)
1041
 
      goto bail;
1042
 
  }
1043
 
 
1044
 
  status = OCIStmtFetch (s->iter_sig, s->errhp, (ub4) 1, (ub4) OCI_FETCH_NEXT,
1045
 
                         (ub4) OCI_DEFAULT);
1046
 
 
1047
 
  if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO)
1048
 
    goto bail;
1049
 
 
1050
 
  st = malloc (sizeof (struct _ds_storage_signature));
1051
 
  if (st == NULL)
1052
 
  {
1053
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
1054
 
    goto bail;
1055
 
  }
1056
 
 
1057
 
  memset (st, 0, sizeof (struct _ds_storage_signature));
1058
 
 
1059
 
  st->length = sl;
1060
 
  st->created_on = (time_t) lh;
1061
 
  strlcpy (st->signature, signature, sizeof (st->signature));
1062
 
  st->data = malloc (st->length);
1063
 
 
1064
 
  if (st->data == NULL)
1065
 
  {
1066
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
1067
 
    goto bail;
1068
 
  }
1069
 
 
1070
 
  snprintf (query, sizeof (query),
1071
 
            "SELECT DATA FROM %s.DSPAM_SIGNATURE_DATA WHERE USER_ID = %d"
1072
 
            "  AND SIGNATURE = '%s'", s->schema, p->pw_uid, st->signature);
1073
 
 
1074
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1075
 
                                                         (dvoid **) & stmthp,
1076
 
                                                         (ub4) OCI_HTYPE_STMT,
1077
 
                                                         (size_t) 0,
1078
 
                                                         (dvoid **) 0)) !=
1079
 
      OCI_SUCCESS)
1080
 
    goto bail;
1081
 
 
1082
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp,
1083
 
                                                          s->errhp,
1084
 
                                                          (text *) query,
1085
 
                                                          (ub4)
1086
 
                                                          strlen (query),
1087
 
                                                          (ub4)
1088
 
                                                          OCI_NTV_SYNTAX,
1089
 
                                                          (ub4) OCI_DEFAULT))
1090
 
      != OCI_SUCCESS)
1091
 
  {
1092
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1093
 
    free (st);
1094
 
    goto bail;
1095
 
  }
1096
 
 
1097
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn4,
1098
 
                                                          s->errhp, 1,
1099
 
                                                          (dvoid *) & st->
1100
 
                                                          data,
1101
 
                                                          (sword) st->length,
1102
 
                                                          SQLT_LNG,
1103
 
                                                          (dvoid *) 0,
1104
 
                                                          (ub2 *) 0,
1105
 
                                                          (ub2 *) 0,
1106
 
                                                          OCI_DEFAULT)) !=
1107
 
      OCI_SUCCESS)
1108
 
  {
1109
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1110
 
    free (st);
1111
 
    goto bail;
1112
 
  }
1113
 
 
1114
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp,
1115
 
                                                          stmthp, s->errhp,
1116
 
                                                          (ub4) 0, (ub4) 0,
1117
 
                                                          (OCISnapshot *)
1118
 
                                                          NULL,
1119
 
                                                          (OCISnapshot *)
1120
 
                                                          NULL,
1121
 
                                                          (ub4) OCI_DEFAULT))
1122
 
      != OCI_SUCCESS)
1123
 
  {
1124
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1125
 
    free (st);
1126
 
    goto bail;
1127
 
  }
1128
 
  else
1129
 
  {
1130
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1131
 
    return st;
1132
 
  }
1133
 
 
1134
 
bail:
1135
 
 
1136
 
  OCIHandleFree ((dvoid *) s->iter_sig, (ub4) OCI_HTYPE_STMT);
1137
 
  s->iter_sig = NULL;
1138
 
  return NULL;
1139
 
}
1140
 
 
1141
 
struct passwd *
1142
 
_ora_drv_getpwnam (DSPAM_CTX * CTX, const char *name)
1143
 
{
1144
 
 
1145
 
#ifndef VIRTUAL_USERS
1146
 
  static struct passwd p = { NULL, NULL, 0, 0, NULL, NULL, NULL };
1147
 
  struct passwd *q;
1148
 
 
1149
 
  if (p.pw_name != NULL)
1150
 
  {
1151
 
    /* cache the last name queried */
1152
 
    if (name != NULL && !strcmp (p.pw_name, name))
1153
 
      return &p;
1154
 
 
1155
 
    free (p.pw_name);
1156
 
    p.pw_name = NULL;
1157
 
    p.pw_uid = 0;
1158
 
  }
1159
 
 
1160
 
  q = getpwnam (name);
1161
 
  if (q == NULL)
1162
 
    return NULL;
1163
 
  p.pw_uid = q->pw_uid;
1164
 
  p.pw_name = strdup (q->pw_name);
1165
 
 
1166
 
  return &p;
1167
 
#else
1168
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1169
 
  static struct passwd p = { NULL, NULL, 0, 0, NULL, NULL, NULL };
1170
 
  char query[256];
1171
 
  OCIStmt *stmthp;
1172
 
  OCIDefine *defn = (OCIDefine *) 0;
1173
 
  sword status;
1174
 
  uid_t uid = 0;
1175
 
 
1176
 
  if (p.pw_name != NULL)
1177
 
  {
1178
 
    /* cache the last name queried */
1179
 
    if (name != NULL && !strcmp (p.pw_name, name))
1180
 
      return &p;
1181
 
 
1182
 
    free (p.pw_name);
1183
 
    p.pw_name = NULL;
1184
 
  }
1185
 
 
1186
 
  snprintf (query, sizeof (query), "SELECT USER_ID FROM %s."
1187
 
            "DSPAM_VIRTUAL_USER_IDS WHERE USERNAME = '%s'", s->schema, name);
1188
 
 
1189
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1190
 
                                                         (dvoid **) & stmthp,
1191
 
                                                         (ub4) OCI_HTYPE_STMT,
1192
 
                                                         (size_t) 0,
1193
 
                                                         (dvoid **) 0)) !=
1194
 
      OCI_SUCCESS)
1195
 
    return NULL;
1196
 
 
1197
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
1198
 
                                                          (text *) query,
1199
 
                                                          (ub4)
1200
 
                                                          strlen (query),
1201
 
                                                          (ub4)
1202
 
                                                          OCI_NTV_SYNTAX,
1203
 
                                                          (ub4) OCI_DEFAULT))
1204
 
      != OCI_SUCCESS)
1205
 
    goto bail;
1206
 
 
1207
 
  if (_ora_drv_checkerr
1208
 
      (query, s->errhp,
1209
 
       OCIDefineByPos (stmthp, &defn, s->errhp, 1, (dvoid *) & uid,
1210
 
                       (sword) sizeof (uid_t), SQLT_UIN, (dvoid *) 0,
1211
 
                       (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1212
 
    goto bail;
1213
 
 
1214
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
1215
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
1216
 
                           (ub4) OCI_DEFAULT);
1217
 
 
1218
 
  if (status == OCI_NO_DATA)
1219
 
  {
1220
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1221
 
    if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS)
1222
 
      return NULL;
1223
 
    return _ora_drv_setpwnam (CTX, name);
1224
 
  }
1225
 
  else if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO)
1226
 
  {
1227
 
    _ora_drv_checkerr (query, s->errhp, status);
1228
 
    goto bail;
1229
 
  }
1230
 
 
1231
 
  p.pw_uid = uid;
1232
 
  p.pw_name = strdup (name);
1233
 
 
1234
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1235
 
  return &p;
1236
 
 
1237
 
bail:
1238
 
 
1239
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1240
 
  return NULL;
1241
 
 
1242
 
#endif
1243
 
}
1244
 
 
1245
 
struct passwd *
1246
 
_ora_drv_getpwuid (DSPAM_CTX * CTX, uid_t uid)
1247
 
{
1248
 
#ifndef VIRTUAL_USERS
1249
 
  static struct passwd p = { NULL, NULL, 0, 0, NULL, NULL, NULL };
1250
 
  struct passwd *q;
1251
 
 
1252
 
  if (p.pw_name != NULL)
1253
 
  {
1254
 
    /* cache the last uid queried */
1255
 
    if (p.pw_uid == uid)
1256
 
    {
1257
 
      return &p;
1258
 
    }
1259
 
    p.pw_name = NULL;
1260
 
  }
1261
 
 
1262
 
  q = getpwuid (uid);
1263
 
  memcpy (&p, q, sizeof (struct passwd));
1264
 
 
1265
 
  return &p;
1266
 
#else
1267
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1268
 
  static struct passwd p = { NULL, NULL, 0, 0, NULL, NULL, NULL };
1269
 
  char query[256];
1270
 
  char user[128];
1271
 
  OCIStmt *stmthp;
1272
 
  OCIDefine *defn = (OCIDefine *) 0;
1273
 
  sword status;
1274
 
 
1275
 
  if (p.pw_name != NULL)
1276
 
  {
1277
 
    /* cache the last uid queried */
1278
 
    if (p.pw_uid == uid)
1279
 
      return &p;
1280
 
    free (p.pw_name);
1281
 
    p.pw_name = NULL;
1282
 
  }
1283
 
 
1284
 
  memset (user, 0, sizeof (user));
1285
 
 
1286
 
  snprintf (query, sizeof (query),
1287
 
            "SELECT USERNAME FROM %s.DSPAM_VIRTUAL_USER_IDS WHERE USER_ID = %d",
1288
 
            s->schema, uid);
1289
 
 
1290
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1291
 
                                                         (dvoid **) & stmthp,
1292
 
                                                         (ub4) OCI_HTYPE_STMT,
1293
 
                                                         (size_t) 0,
1294
 
                                                         (dvoid **) 0)) !=
1295
 
      OCI_SUCCESS)
1296
 
    return NULL;
1297
 
 
1298
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
1299
 
                                                          (text *) query,
1300
 
                                                          (ub4)
1301
 
                                                          strlen (query),
1302
 
                                                          (ub4)
1303
 
                                                          OCI_NTV_SYNTAX,
1304
 
                                                          (ub4) OCI_DEFAULT))
1305
 
      != OCI_SUCCESS)
1306
 
    goto bail;
1307
 
 
1308
 
  if (_ora_drv_checkerr
1309
 
      (query, s->errhp,
1310
 
       OCIDefineByPos (stmthp, &defn, s->errhp, 1, (dvoid *) & user,
1311
 
                       (sword) sizeof (user), SQLT_STR, (dvoid *) 0,
1312
 
                       (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1313
 
    goto bail;
1314
 
 
1315
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
1316
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
1317
 
                           (ub4) OCI_DEFAULT);
1318
 
 
1319
 
  if (status == OCI_NO_DATA)
1320
 
    goto bail;
1321
 
 
1322
 
  p.pw_uid = uid;
1323
 
  p.pw_name = strdup (user);
1324
 
 
1325
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1326
 
  return &p;
1327
 
 
1328
 
bail:
1329
 
 
1330
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1331
 
  return NULL;
1332
 
#endif
1333
 
}
1334
 
 
1335
 
#ifdef VIRTUAL_USERS
1336
 
struct passwd *
1337
 
_ora_drv_setpwnam (DSPAM_CTX * CTX, const char *name)
1338
 
{
1339
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1340
 
  char query[256];
1341
 
  OCIStmt *stmthp;
1342
 
 
1343
 
  snprintf (query, sizeof (query),
1344
 
            "INSERT INTO %s.DSPAM_VIRTUAL_USER_IDS (USER_ID, USERNAME) VALUES "
1345
 
            "(%s.VIRTUAL_USER.NEXTVAL, '%s')", s->schema, s->schema, name);
1346
 
 
1347
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1348
 
                                                         (dvoid **) & stmthp,
1349
 
                                                         (ub4) OCI_HTYPE_STMT,
1350
 
                                                         (size_t) 0,
1351
 
                                                         (dvoid **) 0)) !=
1352
 
      OCI_SUCCESS)
1353
 
    return NULL;
1354
 
 
1355
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
1356
 
                                                          (text *) query,
1357
 
                                                          (ub4)
1358
 
                                                          strlen (query),
1359
 
                                                          (ub4)
1360
 
                                                          OCI_NTV_SYNTAX,
1361
 
                                                          (ub4) OCI_DEFAULT))
1362
 
      != OCI_SUCCESS)
1363
 
    goto bail;
1364
 
 
1365
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp, stmthp,
1366
 
                                                          s->errhp, (ub4) 1,
1367
 
                                                          (ub4) 0,
1368
 
                                                          (OCISnapshot *)
1369
 
                                                          NULL,
1370
 
                                                          (OCISnapshot *)
1371
 
                                                          NULL,
1372
 
                                                          (ub4) OCI_DEFAULT))
1373
 
      != OCI_SUCCESS)
1374
 
    goto bail;
1375
 
 
1376
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1377
 
  return _ora_drv_getpwnam (CTX, name);
1378
 
 
1379
 
bail:
1380
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1381
 
  return NULL;
1382
 
 
1383
 
}
1384
 
#endif
1385
 
 
1386
 
int
1387
 
_ora_drv_get_spamtotals (DSPAM_CTX * CTX)
1388
 
{
1389
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1390
 
  char query[1024];
1391
 
  struct passwd *p;
1392
 
  OCIStmt *stmthp;
1393
 
  OCIDefine *defn1 = NULL, *defn2 = NULL, *defn3 = NULL, *defn4 = NULL;
1394
 
  long ts, ti, sm, fp, sc, ic, sf, icf;
1395
 
  int status;
1396
 
 
1397
 
  ts = 0;
1398
 
  ti = 0;
1399
 
  sm = 0;
1400
 
  fp = 0;
1401
 
  sc = 0;
1402
 
  ic = 0;
1403
 
  sf = 0;
1404
 
  icf = 0;
1405
 
 
1406
 
  if (CTX->storage == NULL)
1407
 
  {
1408
 
    LOGDEBUG ("_ora_drv_get_spamtotals: storage not initialized");
1409
 
    return EINVAL;
1410
 
  }
1411
 
 
1412
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
1413
 
  if (p == NULL)
1414
 
  {
1415
 
    LOGDEBUG ("_ora_drv_get_spamtotals: unable to _ora_drv_getpwnam(%s)",
1416
 
              CTX->username);
1417
 
    return EINVAL;
1418
 
  }
1419
 
 
1420
 
  snprintf (query, sizeof (query),
1421
 
            "SELECT TOTAL_SPAM, TOTAL_INNOCENT, SPAM_MISSES, FALSE_POSITIVES, "
1422
 
            " SPAM_CORPUSFED, INNOCENT_CORPUSFED, SPAM_CLASSIFIED, "
1423
 
            " INNOCENT_CLASSIFIED "
1424
 
            " FROM %s.DSPAM_STATS WHERE USER_ID = %d", s->schema, p->pw_uid);
1425
 
 
1426
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1427
 
                                                         (dvoid **) & stmthp,
1428
 
                                                         (ub4) OCI_HTYPE_STMT,
1429
 
                                                         (size_t) 0,
1430
 
                                                         (dvoid **) 0)) !=
1431
 
      OCI_SUCCESS)
1432
 
    return EUNKNOWN;
1433
 
 
1434
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
1435
 
                                                          (text *) query,
1436
 
                                                          (ub4)
1437
 
                                                          strlen (query),
1438
 
                                                          (ub4)
1439
 
                                                          OCI_NTV_SYNTAX,
1440
 
                                                          (ub4) OCI_DEFAULT))
1441
 
      != OCI_SUCCESS)
1442
 
    goto bail;
1443
 
 
1444
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn1,
1445
 
                                                          s->errhp, 1,
1446
 
                                                          (dvoid *) & ts,
1447
 
                                                          (sword) sizeof (ts),
1448
 
                                                          SQLT_INT,
1449
 
                                                          (dvoid *) 0,
1450
 
                                                          (ub2 *) 0,
1451
 
                                                          (ub2 *) 0,
1452
 
                                                          OCI_DEFAULT)) !=
1453
 
      OCI_SUCCESS)
1454
 
    goto bail;
1455
 
 
1456
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn2,
1457
 
                                                          s->errhp, 2,
1458
 
                                                          (dvoid *) & ti,
1459
 
                                                          (sword) sizeof (ti),
1460
 
                                                          SQLT_INT,
1461
 
                                                          (dvoid *) 0,
1462
 
                                                          (ub2 *) 0,
1463
 
                                                          (ub2 *) 0,
1464
 
                                                          OCI_DEFAULT)) !=
1465
 
      OCI_SUCCESS)
1466
 
    goto bail;
1467
 
 
1468
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn3,
1469
 
                                                          s->errhp, 3,
1470
 
                                                          (dvoid *) & sm,
1471
 
                                                          (sword) sizeof (sm),
1472
 
                                                          SQLT_INT,
1473
 
                                                          (dvoid *) 0,
1474
 
                                                          (ub2 *) 0,
1475
 
                                                          (ub2 *) 0,
1476
 
                                                          OCI_DEFAULT)) !=
1477
 
      OCI_SUCCESS)
1478
 
    goto bail;
1479
 
 
1480
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn4,
1481
 
                                                          s->errhp, 4,
1482
 
                                                          (dvoid *) & fp,
1483
 
                                                          (sword) sizeof (fp),
1484
 
                                                          SQLT_INT,
1485
 
                                                          (dvoid *) 0,
1486
 
                                                          (ub2 *) 0,
1487
 
                                                          (ub2 *) 0,
1488
 
                                                          OCI_DEFAULT)) !=
1489
 
      OCI_SUCCESS)
1490
 
    goto bail;
1491
 
 
1492
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn4,
1493
 
                                                          s->errhp, 5,
1494
 
                                                          (dvoid *) & sc,
1495
 
                                                          (sword) sizeof (sc),
1496
 
                                                          SQLT_INT,
1497
 
                                                          (dvoid *) 0,
1498
 
                                                          (ub2 *) 0,
1499
 
                                                          (ub2 *) 0,
1500
 
                                                          OCI_DEFAULT)) !=
1501
 
      OCI_SUCCESS)
1502
 
    goto bail;
1503
 
 
1504
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn4,
1505
 
                                                          s->errhp, 6,
1506
 
                                                          (dvoid *) & ic,
1507
 
                                                          (sword) sizeof (ic),
1508
 
                                                          SQLT_INT,
1509
 
                                                          (dvoid *) 0,
1510
 
                                                          (ub2 *) 0,
1511
 
                                                          (ub2 *) 0,
1512
 
                                                          OCI_DEFAULT)) !=
1513
 
      OCI_SUCCESS)
1514
 
    goto bail;
1515
 
 
1516
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn4,
1517
 
                                                          s->errhp, 7,
1518
 
                                                          (dvoid *) & sf,
1519
 
                                                          (sword) sizeof (sf),
1520
 
                                                          SQLT_INT,
1521
 
                                                          (dvoid *) 0,
1522
 
                                                          (ub2 *) 0,
1523
 
                                                          (ub2 *) 0,
1524
 
                                                          OCI_DEFAULT)) !=
1525
 
      OCI_SUCCESS)
1526
 
    goto bail;
1527
 
 
1528
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn4,
1529
 
                                                          s->errhp, 7,
1530
 
                                                          (dvoid *) & icf,
1531
 
                                                          (sword) sizeof (icf),
1532
 
                                                          SQLT_INT,
1533
 
                                                          (dvoid *) 0,
1534
 
                                                          (ub2 *) 0,
1535
 
                                                          (ub2 *) 0,
1536
 
                                                          OCI_DEFAULT)) !=
1537
 
      OCI_SUCCESS)
1538
 
    goto bail;
1539
 
 
1540
 
 
1541
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
1542
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
1543
 
                           (ub4) OCI_DEFAULT);
1544
 
 
1545
 
  if (status == OCI_NO_DATA)
1546
 
  {
1547
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1548
 
    return EFAILURE;
1549
 
  }
1550
 
  else if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO)
1551
 
  {
1552
 
    _ora_drv_checkerr (query, s->errhp, status);
1553
 
    goto bail;
1554
 
  }
1555
 
 
1556
 
  CTX->totals.spam_learned = ts;
1557
 
  CTX->totals.innocent_learned = ti;
1558
 
  CTX->totals.spam_misclassified = sm;
1559
 
  CTX->totals.innocent_misclassified = fp;
1560
 
  CTX->totals.spam_corpusfed = sc;
1561
 
  CTX->totals.innocent_corpusfed = ic;
1562
 
  CTX->totals.spam_classified = sf;
1563
 
  CTX->totals.innocent_classified = icf;
1564
 
 
1565
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1566
 
  return 0;
1567
 
 
1568
 
bail:
1569
 
 
1570
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1571
 
  return EUNKNOWN;
1572
 
}
1573
 
 
1574
 
int
1575
 
_ora_drv_set_spamtotals (DSPAM_CTX * CTX)
1576
 
{
1577
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1578
 
  struct passwd *p;
1579
 
  char query[1024];
1580
 
  OCIStmt *stmthp;
1581
 
  int bad = 0;
1582
 
 
1583
 
  if (CTX->storage == NULL)
1584
 
  {
1585
 
    LOGDEBUG ("_ora_drv_set_spamtotals: storage not initialized");
1586
 
    return EINVAL;
1587
 
  }
1588
 
 
1589
 
  if (CTX->operating_mode == DSM_CLASSIFY)
1590
 
  {
1591
 
    _ora_drv_get_spamtotals (CTX);      /* undo changes to in memory totals */
1592
 
    return 0;
1593
 
  }
1594
 
 
1595
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
1596
 
  if (p == NULL)
1597
 
  {
1598
 
    LOGDEBUG ("_ora_drv_get_spamtotals: unable to _ora_drv_getpwnam(%s)",
1599
 
              CTX->username);
1600
 
    return EINVAL;
1601
 
  }
1602
 
 
1603
 
  if (s->control_totals.innocent_learned == 0)
1604
 
  {
1605
 
    snprintf (query, sizeof (query),
1606
 
              "INSERT INTO %s.DSPAM_STATS(USER_ID, TOTAL_SPAM, TOTAL_INNOCENT,"
1607
 
              "  SPAM_MISSES, FALSE_POSITIVES, SPAM_CORPUSFED, "
1608
 
              "  INNOCENT_CORPUSFED, SPAM_CLASSIFIED, INNOCENT_CLASSIFIED) "
1609
 
              "  VALUES(%d, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld)",
1610
 
              s->schema,
1611
 
              p->pw_uid, CTX->totals.spam_learned,
1612
 
              CTX->totals.innocent_learned, CTX->totals.spam_misclassified,
1613
 
              CTX->totals.innocent_misclassified,
1614
 
              CTX->totals.spam_corpusfed, CTX->totals.innocent_corpusfed,
1615
 
              CTX->totals.spam_classified, CTX->totals.innocent_classified);
1616
 
 
1617
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1618
 
                                                           (dvoid **) &
1619
 
                                                           stmthp,
1620
 
                                                           (ub4)
1621
 
                                                           OCI_HTYPE_STMT,
1622
 
                                                           (size_t) 0,
1623
 
                                                           (dvoid **) 0)) !=
1624
 
        OCI_SUCCESS)
1625
 
      return EUNKNOWN;
1626
 
 
1627
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
1628
 
                                                            (text *) query,
1629
 
                                                            (ub4)
1630
 
                                                            strlen (query),
1631
 
                                                            (ub4)
1632
 
                                                            OCI_NTV_SYNTAX,
1633
 
                                                            (ub4)
1634
 
                                                            OCI_DEFAULT)) !=
1635
 
        OCI_SUCCESS)
1636
 
      goto bail;
1637
 
 
1638
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp, stmthp,
1639
 
                                                            s->errhp, (ub4) 1,
1640
 
                                                            (ub4) 0,
1641
 
                                                            (OCISnapshot *)
1642
 
                                                            NULL,
1643
 
                                                            (OCISnapshot *)
1644
 
                                                            NULL,
1645
 
                                                            (ub4)
1646
 
                                                            OCI_DEFAULT)) !=
1647
 
        OCI_SUCCESS)
1648
 
      bad = 1;
1649
 
  }
1650
 
 
1651
 
  if (s->control_totals.innocent_learned != 0 || bad)
1652
 
  {
1653
 
    snprintf (query, sizeof (query),
1654
 
              "UPDATE DSPAM_STATS SET TOTAL_SPAM = TOTAL_SPAM %s %d, "
1655
 
              "TOTAL_INNOCENT = TOTAL_INNOCENT %s %d, "
1656
 
              "SPAM_MISSES = SPAM_MISSES %s %d, "
1657
 
              "FALSE_POSITIVES = FALSE_POSITIVES %s %d, "
1658
 
              "SPAM_CORPUSFED = SPAM_CORPUSFED %s %d, "
1659
 
              "INNOCENT_CORPUSFED = INNOCENT_CORPUSFED %s %d, "
1660
 
              "SPAM_CLASSIFIED = SPAM_CLASSIFIED %s %d, "
1661
 
              "INNOCENT_CLASSIFIED = INNOCENT_CLASSIFIED %s %d "
1662
 
              "WHERE USER_ID = %d",
1663
 
              (CTX->totals.spam_learned >
1664
 
               s->control_totals.spam_learned) ? "+" : "-",
1665
 
              abs (CTX->totals.spam_learned -
1666
 
                   s->control_totals.spam_learned),
1667
 
              (CTX->totals.innocent_learned >
1668
 
               s->control_totals.innocent_learned) ? "+" : "-",
1669
 
              abs (CTX->totals.innocent_learned -
1670
 
                   s->control_totals.innocent_learned),
1671
 
              (CTX->totals.spam_misclassified >
1672
 
               s->control_totals.spam_misclassified) ? "+" : "-",
1673
 
              abs (CTX->totals.spam_misclassified -
1674
 
                   s->control_totals.spam_misclassified),
1675
 
              (CTX->totals.innocent_misclassified >
1676
 
               s->control_totals.innocent_misclassified) ? "+" : "-",
1677
 
              abs (CTX->totals.innocent_misclassified -
1678
 
                   s->control_totals.innocent_misclassified),
1679
 
              (CTX->totals.spam_corpusfed >
1680
 
               s->control_totals.spam_corpusfed) ? "+" : "-",
1681
 
              abs (CTX->totals.spam_corpusfed -
1682
 
                   s->control_totals.spam_corpusfed),
1683
 
              (CTX->totals.innocent_corpusfed >
1684
 
               s->control_totals.innocent_corpusfed) ? "+" : "-",
1685
 
              abs (CTX->totals.innocent_corpusfed -
1686
 
                   s->control_totals.innocent_corpusfed), 
1687
 
              (CTX->totals.spam_classified >
1688
 
               s->control_totals.spam_classified) ? "+" : "-",
1689
 
              abs (CTX->totals.spam_classified -
1690
 
                   s->control_totals.spam_classified),
1691
 
              (CTX->totals.innocent_classified >
1692
 
               s->control_totals.innocent_classified) ? "+" : "-",
1693
 
              abs (CTX->totals.innocent_classified -
1694
 
                   s->control_totals.innocent_classified), p->pw_uid);
1695
 
 
1696
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1697
 
                                                           (dvoid **) &
1698
 
                                                           stmthp,
1699
 
                                                           (ub4)
1700
 
                                                           OCI_HTYPE_STMT,
1701
 
                                                           (size_t) 0,
1702
 
                                                           (dvoid **) 0)) !=
1703
 
        OCI_SUCCESS)
1704
 
      return EUNKNOWN;
1705
 
 
1706
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
1707
 
                                                            (text *) query,
1708
 
                                                            (ub4)
1709
 
                                                            strlen (query),
1710
 
                                                            (ub4)
1711
 
                                                            OCI_NTV_SYNTAX,
1712
 
                                                            (ub4)
1713
 
                                                            OCI_DEFAULT)) !=
1714
 
        OCI_SUCCESS)
1715
 
      goto bail;
1716
 
 
1717
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp, stmthp,
1718
 
                                                            s->errhp, (ub4) 1,
1719
 
                                                            (ub4) 0,
1720
 
                                                            (OCISnapshot *)
1721
 
                                                            NULL,
1722
 
                                                            (OCISnapshot *)
1723
 
                                                            NULL,
1724
 
                                                            (ub4)
1725
 
                                                            OCI_DEFAULT)) !=
1726
 
        OCI_SUCCESS)
1727
 
      goto bail;
1728
 
  }
1729
 
 
1730
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1731
 
  return 0;
1732
 
 
1733
 
bail:
1734
 
 
1735
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1736
 
  return EUNKNOWN;
1737
 
 
1738
 
}
1739
 
 
1740
 
int
1741
 
_ds_getall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction)
1742
 
{
1743
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1744
 
  struct passwd *p;
1745
 
  buffer *query;
1746
 
  ds_term_t ds_term;
1747
 
  ds_cursor_t ds_c;
1748
 
  char scratch[1024], token_c[32] = { 0 };
1749
 
  struct _ds_spam_stat stat;
1750
 
  OCIStmt *stmthp;
1751
 
  OCIDefine *defn1 = NULL, *defn2 = NULL, *defn3 = NULL;
1752
 
  unsigned long long token = 0;
1753
 
  long sh = 0, ih = 0;
1754
 
  sword status;
1755
 
 
1756
 
  if (CTX->storage == NULL)
1757
 
  {
1758
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
1759
 
    return EINVAL;
1760
 
  }
1761
 
 
1762
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
1763
 
  if (p == NULL)
1764
 
  {
1765
 
    LOGDEBUG ("_ds_getall_spamrecords: unable to _ora_drv_getpwnam(%s)",
1766
 
              CTX->username);
1767
 
    return EINVAL;
1768
 
  }
1769
 
 
1770
 
  stat.spam_hits = 0;
1771
 
  stat.innocent_hits = 0;
1772
 
 
1773
 
  query = buffer_create (NULL);
1774
 
  if (query == NULL)
1775
 
  {
1776
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
1777
 
    return EUNKNOWN;
1778
 
  }
1779
 
 
1780
 
  snprintf (scratch, sizeof (scratch),
1781
 
            "SELECT TOKEN, SPAM_HITS, INNOCENT_HITS FROM %s.DSPAM_TOKEN_DATA WHERE "
1782
 
            "  USER_ID = %d AND TOKEN IN(", s->schema, p->pw_uid);
1783
 
  buffer_cat (query, scratch);
1784
 
  ds_c = ds_diction_cursor(diction);
1785
 
  ds_term = ds_diction_next(ds_c); 
1786
 
  while(ds_term)
1787
 
  {
1788
 
    snprintf (scratch, sizeof (scratch), "%llu", ds_term->key);
1789
 
    buffer_cat (query, scratch);
1790
 
    ds_term->s.innocent_hits = 0;
1791
 
    ds_term->s.spam_hits = 0;
1792
 
    ds_term->s.probability = 0;
1793
 
    ds_term->s.status &= ~TST_DISK;
1794
 
    ds_term = ds_diction_next(ds_c);
1795
 
    if (ds_term)
1796
 
      buffer_cat (query, ",");
1797
 
  }
1798
 
  ds_diction_close(ds_c);
1799
 
  buffer_cat (query, ")");
1800
 
#ifdef VERBOSE
1801
 
  LOGDEBUG ("oracle query length: %ld\n", query->used);
1802
 
#endif
1803
 
 
1804
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
1805
 
                                                         (dvoid **) & stmthp,
1806
 
                                                         (ub4) OCI_HTYPE_STMT,
1807
 
                                                         (size_t) 0,
1808
 
                                                         (dvoid **) 0)) !=
1809
 
      OCI_SUCCESS)
1810
 
    return EUNKNOWN;
1811
 
 
1812
 
  if (_ora_drv_checkerr
1813
 
      (query->data, s->errhp,
1814
 
       OCIStmtPrepare (stmthp, s->errhp, (text *) query->data,
1815
 
                       (ub4) strlen (query->data), (ub4) OCI_NTV_SYNTAX,
1816
 
                       (ub4) OCI_DEFAULT)) != OCI_SUCCESS)
1817
 
    goto bail;
1818
 
 
1819
 
  if (_ora_drv_checkerr
1820
 
      (query->data, s->errhp,
1821
 
       OCIDefineByPos (stmthp, &defn1, s->errhp, 1, (dvoid *) & token_c,
1822
 
                       (sword) sizeof (token_c), SQLT_STR, (dvoid *) 0,
1823
 
                       (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1824
 
    goto bail;
1825
 
 
1826
 
  if (_ora_drv_checkerr
1827
 
      (query->data, s->errhp,
1828
 
       OCIDefineByPos (stmthp, &defn2, s->errhp, 2, (dvoid *) & sh,
1829
 
                       (sword) sizeof (sh), SQLT_INT, (dvoid *) 0, (ub2 *) 0,
1830
 
                       (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1831
 
    goto bail;
1832
 
 
1833
 
  if (_ora_drv_checkerr
1834
 
      (query->data, s->errhp,
1835
 
       OCIDefineByPos (stmthp, &defn3, s->errhp, 3, (dvoid *) & ih,
1836
 
                       (sword) sizeof (ih), SQLT_INT, (dvoid *) 0, (ub2 *) 0,
1837
 
                       (ub2 *) 0, OCI_DEFAULT)) != OCI_SUCCESS)
1838
 
    goto bail;
1839
 
 
1840
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 0, (ub4) 0,
1841
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
1842
 
                           (ub4) OCI_DEFAULT);
1843
 
 
1844
 
  stat.probability = 0;
1845
 
 
1846
 
  while ((status =
1847
 
          OCIStmtFetch (stmthp, s->errhp, (ub4) 1, (ub4) OCI_FETCH_NEXT, (ub4)
1848
 
                        OCI_DEFAULT)) == OCI_SUCCESS
1849
 
         || status == OCI_SUCCESS_WITH_INFO)
1850
 
  {
1851
 
 
1852
 
    token = strtoull (token_c, NULL, 0);
1853
 
 
1854
 
    if (token)
1855
 
    {
1856
 
 
1857
 
      if (sh < 0)
1858
 
        sh = 0;
1859
 
      if (ih < 0)
1860
 
        ih = 0;
1861
 
 
1862
 
      stat.spam_hits = sh;
1863
 
      stat.innocent_hits = ih;
1864
 
      stat.status |= TST_DISK;
1865
 
 
1866
 
      /* our control token will tell us how each token was altered */
1867
 
      if (stat.spam_hits && stat.innocent_hits && !s->control_token)
1868
 
      {
1869
 
        s->control_token = token;
1870
 
        s->control_sh = stat.spam_hits;
1871
 
        s->control_ih = stat.innocent_hits;
1872
 
      }
1873
 
      ds_diction_setstat(diction, token, &stat);
1874
 
    }
1875
 
  }
1876
 
 
1877
 
  if (!s->control_token)
1878
 
  {
1879
 
    s->control_token = token;
1880
 
    s->control_sh = stat.spam_hits;
1881
 
    s->control_ih = stat.innocent_hits;
1882
 
  }
1883
 
 
1884
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1885
 
  buffer_destroy (query);
1886
 
  return 0;
1887
 
 
1888
 
bail:
1889
 
 
1890
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
1891
 
  return EUNKNOWN;
1892
 
 
1893
 
}
1894
 
 
1895
 
int
1896
 
_ds_setall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction)
1897
 
{
1898
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
1899
 
  struct _ds_spam_stat stat;
1900
 
  ds_term_t ds_term;
1901
 
  ds_cursor_t ds_c;
1902
 
  buffer *query;
1903
 
  char scratch[1024];
1904
 
  struct passwd *p;
1905
 
  int update_one = 0;
1906
 
  OCIStmt *stmthp;
1907
 
 
1908
 
  if (CTX->storage == NULL)
1909
 
  {
1910
 
    LOGDEBUG ("_ds_setall_spamrecords: storage not initialized");
1911
 
    return EINVAL;
1912
 
  }
1913
 
 
1914
 
  if (CTX->operating_mode == DSM_CLASSIFY &&
1915
 
        (CTX->training_mode != DST_TOE ||
1916
 
          (diction->whitelist_token == 0 && (!(CTX->flags & DSF_NOISE)))))
1917
 
    return 0;
1918
 
 
1919
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
1920
 
  if (p == NULL)
1921
 
  {
1922
 
    LOGDEBUG ("_ds_setall_spamrecords: unable to _ora_drv_getpwnam(%s)",
1923
 
              CTX->username);
1924
 
    return EINVAL;
1925
 
  }
1926
 
 
1927
 
  query = buffer_create (NULL);
1928
 
  if (query == NULL)
1929
 
  {
1930
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
1931
 
    return EUNKNOWN;
1932
 
  }
1933
 
 
1934
 
  if (s->control_token == 0)
1935
 
  {
1936
 
    ds_c = ds_diction_cursor(diction);
1937
 
    ds_term = ds_diction_next(ds_c);
1938
 
    if (!ds_term)
1939
 
    {
1940
 
      stat.spam_hits = 0;
1941
 
      stat.innocent_hits = 0;
1942
 
    }
1943
 
    else
1944
 
    {
1945
 
      stat.spam_hits = ds_term->s.spam_hits;
1946
 
      stat.innocent_hits = ds_term->s.innocent_hits;
1947
 
    }
1948
 
    ds_diction_close(ds_c);
1949
 
  }
1950
 
  else
1951
 
  {
1952
 
    ds_diction_setstat(diction, s->control_token, &stat);
1953
 
  }
1954
 
  snprintf (scratch, sizeof (scratch),
1955
 
            "UPDATE %s.DSPAM_TOKEN_DATA SET LAST_HIT = SYSDATE, "
1956
 
            "  SPAM_HITS = GREATEST(0, SPAM_HITS %s %d), "
1957
 
            "  INNOCENT_HITS = GREATEST(0, INNOCENT_HITS %s %d) "
1958
 
            "  WHERE USER_ID = %d AND TOKEN IN(",
1959
 
            s->schema,
1960
 
            (stat.spam_hits > s->control_sh) ? "+" : "-",
1961
 
            abs (stat.spam_hits - s->control_sh),
1962
 
            (stat.innocent_hits > s->control_ih) ? "+" : "-",
1963
 
            abs (stat.innocent_hits - s->control_ih), p->pw_uid);
1964
 
 
1965
 
  buffer_cat (query, scratch);
1966
 
 
1967
 
  ds_c = ds_diction_cursor(diction);
1968
 
  ds_term = ds_diction_next(ds_c);
1969
 
  while(ds_term)
1970
 
  {
1971
 
    int wrote_this = 0;
1972
 
    if (CTX->training_mode == DST_TOE           &&
1973
 
        CTX->classification == DSR_NONE         &&
1974
 
        CTX->operating_mode == DSM_CLASSIFY     &&
1975
 
        diction->whitelist_token != ds_term->key  &&
1976
 
        (!ds_term->name || strncmp(ds_term->name, "bnr.", 4)))
1977
 
    {
1978
 
      ds_term = ds_diction_next(ds_c);
1979
 
      continue;
1980
 
    }
1981
 
 
1982
 
    if (!(ds_term->s.status & TST_DIRTY)) {
1983
 
      ds_term = ds_diction_next(ds_c);
1984
 
      continue;
1985
 
    }
1986
 
 
1987
 
    ds_diction_getstat(diction, ds_term->key, &stat);
1988
 
 
1989
 
    if (!(stat.status & TST_DISK))
1990
 
    {
1991
 
      char insert[1024];
1992
 
 
1993
 
      snprintf (insert, sizeof (insert),
1994
 
                "INSERT INTO %s.DSPAM_TOKEN_DATA(USER_ID, TOKEN, SPAM_HITS, "
1995
 
                "INNOCENT_HITS, LAST_HIT) VALUES(%d, %llu, %ld, %ld, SYSDATE)",
1996
 
                s->schema, p->pw_uid, ds_term->key,
1997
 
                stat.spam_hits, stat.innocent_hits);
1998
 
 
1999
 
      if (_ora_drv_checkerr
2000
 
          (NULL, s->errhp,
2001
 
           OCIHandleAlloc ((dvoid *) s->envhp, (dvoid **) & stmthp,
2002
 
                           (ub4) OCI_HTYPE_STMT, (size_t) 0,
2003
 
                           (dvoid **) 0)) != OCI_SUCCESS)
2004
 
        return EUNKNOWN;
2005
 
 
2006
 
      if (_ora_drv_checkerr
2007
 
          (insert, s->errhp,
2008
 
           OCIStmtPrepare (stmthp, s->errhp, (text *) insert,
2009
 
                           (ub4) strlen (insert), (ub4) OCI_NTV_SYNTAX,
2010
 
                           (ub4) OCI_DEFAULT)) != OCI_SUCCESS)
2011
 
        goto bail;
2012
 
 
2013
 
      if (_ora_drv_checkerr
2014
 
          (insert, s->errhp,
2015
 
           OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
2016
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
2017
 
                           (ub4) OCI_DEFAULT)) != OCI_SUCCESS)
2018
 
        stat.status |= TST_DISK;
2019
 
    }
2020
 
 
2021
 
    if ((stat.status & TST_DISK))
2022
 
    {
2023
 
      snprintf (scratch, sizeof (scratch), "%llu", ds_term->key);
2024
 
      buffer_cat (query, scratch);
2025
 
      update_one = 1;
2026
 
      wrote_this = 1;
2027
 
      ds_term->s.status |= TST_DISK;
2028
 
    }
2029
 
    ds_term = ds_diction_next(ds_c);
2030
 
    if (ds_term && wrote_this)
2031
 
      buffer_cat (query, ",");
2032
 
  }
2033
 
  ds_diction_close(ds_c);
2034
 
 
2035
 
  if (query->used && query->data[strlen (query->data) - 1] == ',')
2036
 
  {
2037
 
    query->used--;
2038
 
    query->data[strlen (query->data) - 1] = 0;
2039
 
                                                                                
2040
 
  }
2041
 
 
2042
 
  buffer_cat (query, ")");
2043
 
 
2044
 
  if (update_one)
2045
 
  {
2046
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
2047
 
                                                           (dvoid **) &
2048
 
                                                           stmthp,
2049
 
                                                           (ub4)
2050
 
                                                           OCI_HTYPE_STMT,
2051
 
                                                           (size_t) 0,
2052
 
                                                           (dvoid **) 0)) !=
2053
 
        OCI_SUCCESS)
2054
 
      return EUNKNOWN;
2055
 
 
2056
 
    if (_ora_drv_checkerr (query->data, s->errhp, OCIStmtPrepare (stmthp,
2057
 
                                                                  s->errhp,
2058
 
                                                                  (text *)
2059
 
                                                                  query->data,
2060
 
                                                                  (ub4)
2061
 
                                                                  strlen
2062
 
                                                                  (query->
2063
 
                                                                   data),
2064
 
                                                                  (ub4)
2065
 
                                                                  OCI_NTV_SYNTAX,
2066
 
                                                                  (ub4)
2067
 
                                                                  OCI_DEFAULT))
2068
 
        != OCI_SUCCESS)
2069
 
      goto bail;
2070
 
 
2071
 
    if (_ora_drv_checkerr (query->data, s->errhp, OCIStmtExecute (s->svchp,
2072
 
                                                                  stmthp,
2073
 
                                                                  s->errhp,
2074
 
                                                                  (ub4) 1,
2075
 
                                                                  (ub4) 0,
2076
 
                                                                  (OCISnapshot
2077
 
                                                                   *) NULL,
2078
 
                                                                  (OCISnapshot
2079
 
                                                                   *) NULL,
2080
 
                                                                  (ub4)
2081
 
                                                                  OCI_DEFAULT))
2082
 
        != OCI_SUCCESS)
2083
 
      goto bail;
2084
 
  }
2085
 
 
2086
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2087
 
  buffer_destroy (query);
2088
 
  return 0;
2089
 
 
2090
 
bail:
2091
 
 
2092
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2093
 
  return EFAILURE;
2094
 
}
2095
 
 
2096
 
int
2097
 
_ds_get_spamrecord (DSPAM_CTX * CTX, unsigned long long token,
2098
 
                    struct _ds_spam_stat *stat)
2099
 
{
2100
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
2101
 
  struct passwd *p;
2102
 
  char query[1024];
2103
 
  OCIStmt *stmthp;
2104
 
  OCIDefine *defn1 = NULL, *defn2 = NULL;
2105
 
  sword status;
2106
 
 
2107
 
  if (CTX->storage == NULL)
2108
 
  {
2109
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
2110
 
    return EINVAL;
2111
 
  }
2112
 
 
2113
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
2114
 
  if (p == NULL)
2115
 
  {
2116
 
    LOGDEBUG ("_ds_getall_spamrecords: unable to _ora_drv_getpwnam(%s)",
2117
 
              CTX->username);
2118
 
    return EINVAL;
2119
 
  }
2120
 
 
2121
 
  snprintf (query, sizeof (query),
2122
 
            "SELECT SPAM_HITS, INNOCENT_HITS FROM %s.DSPAM_TOKEN_DATA WHERE "
2123
 
            "  USER_ID = %d AND TOKEN = %llu", s->schema, p->pw_uid, token);
2124
 
 
2125
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
2126
 
                                                         (dvoid **) & stmthp,
2127
 
                                                         (ub4) OCI_HTYPE_STMT,
2128
 
                                                         (size_t) 0,
2129
 
                                                         (dvoid **) 0)) !=
2130
 
      OCI_SUCCESS)
2131
 
    return EUNKNOWN;
2132
 
 
2133
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
2134
 
                                                          (text *) query,
2135
 
                                                          (ub4)
2136
 
                                                          strlen (query),
2137
 
                                                          (ub4)
2138
 
                                                          OCI_NTV_SYNTAX,
2139
 
                                                          (ub4) OCI_DEFAULT))
2140
 
      != OCI_SUCCESS)
2141
 
    goto bail;
2142
 
 
2143
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn1,
2144
 
                                                          s->errhp, 1,
2145
 
                                                          (dvoid *) & stat->
2146
 
                                                          spam_hits,
2147
 
                                                          (sword)
2148
 
                                                          sizeof (long),
2149
 
                                                          SQLT_INT,
2150
 
                                                          (dvoid *) 0,
2151
 
                                                          (ub2 *) 0,
2152
 
                                                          (ub2 *) 0,
2153
 
                                                          OCI_DEFAULT)) !=
2154
 
      OCI_SUCCESS)
2155
 
    goto bail;
2156
 
 
2157
 
  if (_ora_drv_checkerr (query, s->errhp, OCIDefineByPos (stmthp, &defn2,
2158
 
                                                          s->errhp, 2,
2159
 
                                                          (dvoid *) & stat->
2160
 
                                                          innocent_hits,
2161
 
                                                          (sword)
2162
 
                                                          sizeof (long),
2163
 
                                                          SQLT_INT,
2164
 
                                                          (dvoid *) 0,
2165
 
                                                          (ub2 *) 0,
2166
 
                                                          (ub2 *) 0,
2167
 
                                                          OCI_DEFAULT)) !=
2168
 
      OCI_SUCCESS)
2169
 
    goto bail;
2170
 
 
2171
 
  status = OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
2172
 
                           (OCISnapshot *) NULL, (OCISnapshot *) NULL,
2173
 
                           (ub4) OCI_DEFAULT);
2174
 
 
2175
 
  stat->probability = 0;
2176
 
 
2177
 
  if (status == OCI_NO_DATA)
2178
 
  {
2179
 
    OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2180
 
    return EFAILURE;
2181
 
  }
2182
 
 
2183
 
  if (_ora_drv_checkerr (query, s->errhp, status) != OCI_SUCCESS)
2184
 
    goto bail;
2185
 
 
2186
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2187
 
  return 0;
2188
 
 
2189
 
bail:
2190
 
 
2191
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2192
 
  return EUNKNOWN;
2193
 
 
2194
 
}
2195
 
 
2196
 
int
2197
 
_ds_set_spamrecord (DSPAM_CTX * CTX, unsigned long long token,
2198
 
                    struct _ds_spam_stat *stat)
2199
 
{
2200
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
2201
 
  struct passwd *p;
2202
 
  char query[1024];
2203
 
  OCIStmt *stmthp;
2204
 
 
2205
 
  if (CTX->operating_mode == DSM_CLASSIFY)
2206
 
    return 0;
2207
 
 
2208
 
  if (CTX->storage == NULL)
2209
 
  {
2210
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
2211
 
    return EINVAL;
2212
 
  }
2213
 
 
2214
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
2215
 
  if (p == NULL)
2216
 
  {
2217
 
    LOGDEBUG ("_ds_getall_spamrecords: unable to _ora_drv_getpwnam(%s)",
2218
 
              CTX->username);
2219
 
    return EINVAL;
2220
 
  }
2221
 
 
2222
 
  /* Try to insert first; will fail if exists because of unique index */
2223
 
 
2224
 
  snprintf (query, sizeof (query),
2225
 
            "INSERT INTO %s.DSPAM_TOKEN_DATA (USER_ID, TOKEN, INNOCENT_HITS,"
2226
 
            "  SPAM_HITS, LAST_HIT) VALUES(%d, %llu, %ld, %ld, SYSDATE)",
2227
 
            s->schema, p->pw_uid, token, 
2228
 
            stat->innocent_hits > 0 ? stat->innocent_hits : 0,
2229
 
            stat->spam_hits > 0 ? stat->spam_hits : 0);
2230
 
 
2231
 
  if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
2232
 
                                                         (dvoid **) & stmthp,
2233
 
                                                         (ub4) OCI_HTYPE_STMT,
2234
 
                                                         (size_t) 0,
2235
 
                                                         (dvoid **) 0)) !=
2236
 
      OCI_SUCCESS)
2237
 
    return EUNKNOWN;
2238
 
 
2239
 
  if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
2240
 
                                                          (text *) query,
2241
 
                                                          (ub4)
2242
 
                                                          strlen (query),
2243
 
                                                          (ub4)
2244
 
                                                          OCI_NTV_SYNTAX,
2245
 
                                                          (ub4) OCI_DEFAULT))
2246
 
      != OCI_SUCCESS)
2247
 
    goto bail;
2248
 
 
2249
 
 
2250
 
  /* If insert fails, try an update */
2251
 
 
2252
 
  if (OCIStmtExecute (s->svchp, stmthp, s->errhp, (ub4) 1, (ub4) 0,
2253
 
                      (OCISnapshot *) NULL, (OCISnapshot *) NULL,
2254
 
                      (ub4) OCI_DEFAULT) != OCI_SUCCESS)
2255
 
  {
2256
 
 
2257
 
    snprintf (query, sizeof (query),
2258
 
              "UPDATE %s.DSPAM_TOKEN_DATA SET INNOCENT_HITS = %ld, SPAM_HITS = %ld"
2259
 
              "  WHERE USER_ID = %d AND TOKEN = %llu", s->schema,
2260
 
              stat->innocent_hits, stat->spam_hits, p->pw_uid, token);
2261
 
  if (CTX->training_mode == DST_TUM) {
2262
 
    if (CTX->classification == DSR_NONE)
2263
 
      strlcat(query, " AND INNOCENT_HITS + SPAM_HITS < 50", sizeof(query));
2264
 
  }
2265
 
 
2266
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
2267
 
                                                           (dvoid **) &
2268
 
                                                           stmthp,
2269
 
                                                           (ub4)
2270
 
                                                           OCI_HTYPE_STMT,
2271
 
                                                           (size_t) 0,
2272
 
                                                           (dvoid **) 0)) !=
2273
 
        OCI_SUCCESS)
2274
 
      return EUNKNOWN;
2275
 
 
2276
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
2277
 
                                                            (text *) query,
2278
 
                                                            (ub4)
2279
 
                                                            strlen (query),
2280
 
                                                            (ub4)
2281
 
                                                            OCI_NTV_SYNTAX,
2282
 
                                                            (ub4)
2283
 
                                                            OCI_DEFAULT)) !=
2284
 
        OCI_SUCCESS)
2285
 
      goto bail;
2286
 
 
2287
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp, stmthp,
2288
 
                                                            s->errhp, (ub4) 1,
2289
 
                                                            (ub4) 0,
2290
 
                                                            (OCISnapshot *)
2291
 
                                                            NULL,
2292
 
                                                            (OCISnapshot *)
2293
 
                                                            NULL,
2294
 
                                                            (ub4)
2295
 
                                                            OCI_DEFAULT)) !=
2296
 
        OCI_SUCCESS)
2297
 
      goto bail;
2298
 
  }
2299
 
 
2300
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2301
 
  return 0;
2302
 
 
2303
 
bail:
2304
 
 
2305
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2306
 
  return EUNKNOWN;
2307
 
 
2308
 
}
2309
 
 
2310
 
int _ds_delall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction)
2311
 
{
2312
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
2313
 
  ds_term_t ds_term;
2314
 
  ds_cursor_t ds_c;
2315
 
  buffer *query;
2316
 
  char scratch[1024];
2317
 
  char queryhead[1024];
2318
 
  struct passwd *p;
2319
 
  OCIStmt *stmthp;
2320
 
 
2321
 
  if (diction == NULL || diction->items == 0)
2322
 
    return 0;
2323
 
 
2324
 
  if (CTX->storage == NULL)
2325
 
  {
2326
 
    LOGDEBUG ("_ds_delall_spamrecords: storage not initialized");
2327
 
    return EINVAL;
2328
 
  }
2329
 
 
2330
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
2331
 
  if (p == NULL)
2332
 
  {
2333
 
    LOGDEBUG ("_ds_delall_spamrecords: unable to _ora_drv_getpwnam(%s)",
2334
 
              CTX->username);
2335
 
    return EINVAL;
2336
 
  }
2337
 
 
2338
 
  query = buffer_create (NULL);
2339
 
  if (query == NULL)
2340
 
  {
2341
 
    LOG (LOG_CRIT, ERR_MEM_ALLOC);
2342
 
    return EUNKNOWN;
2343
 
  }
2344
 
 
2345
 
  snprintf (queryhead, sizeof (queryhead),
2346
 
            "DELETE FROM %s.DSPAM_TOKEN_DATA "
2347
 
            "  WHERE USER_ID = %d AND TOKEN IN(",
2348
 
            s->schema, p->pw_uid);
2349
 
 
2350
 
  buffer_cat (query, queryhead);
2351
 
 
2352
 
  ds_c = ds_diction_cursor(diction);
2353
 
  ds_term = ds_diction_next(ds_c);
2354
 
  while (ds_term)
2355
 
  {
2356
 
      snprintf (scratch, sizeof (scratch), "%llu", ds_term->key);
2357
 
      buffer_cat (query, scratch);
2358
 
      ds_term = ds_diction_next(ds_c);
2359
 
      if (ds_term)
2360
 
        buffer_cat (query, ",");
2361
 
  }
2362
 
  ds_diction_close(ds_c);
2363
 
  buffer_cat (query, ")");
2364
 
 
2365
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
2366
 
                                                           (dvoid **) &
2367
 
                                                           stmthp,
2368
 
                                                           (ub4)
2369
 
                                                           OCI_HTYPE_STMT,
2370
 
                                                           (size_t) 0,
2371
 
                                                           (dvoid **) 0)) !=
2372
 
        OCI_SUCCESS)
2373
 
      return EUNKNOWN;
2374
 
 
2375
 
    if (_ora_drv_checkerr (query->data, s->errhp, OCIStmtPrepare (stmthp,
2376
 
                                                                  s->errhp,
2377
 
                                                                  (text *)
2378
 
                                                                  query->data,
2379
 
                                                                  (ub4)
2380
 
                                                                  strlen
2381
 
                                                                  (query->
2382
 
                                                                   data),
2383
 
                                                                  (ub4)
2384
 
                                                                  OCI_NTV_SYNTAX,
2385
 
                                                                  (ub4)
2386
 
                                                                  OCI_DEFAULT))
2387
 
        != OCI_SUCCESS)
2388
 
      goto bail;
2389
 
 
2390
 
    if (_ora_drv_checkerr (query->data, s->errhp, OCIStmtExecute (s->svchp,
2391
 
                                                                  stmthp,
2392
 
                                                                  s->errhp,
2393
 
                                                                  (ub4) 1,
2394
 
                                                                  (ub4) 0,
2395
 
                                                                  (OCISnapshot
2396
 
                                                                   *) NULL,
2397
 
                                                                  (OCISnapshot
2398
 
                                                                   *) NULL,
2399
 
                                                                  (ub4)
2400
 
                                                                  OCI_DEFAULT))
2401
 
        != OCI_SUCCESS)
2402
 
      goto bail;
2403
 
 
2404
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2405
 
  buffer_destroy (query);
2406
 
  return 0;
2407
 
 
2408
 
bail:
2409
 
 
2410
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2411
 
  return EFAILURE;
2412
 
}
2413
 
 
2414
 
 
2415
 
int _ds_del_spamrecord (DSPAM_CTX * CTX, unsigned long long token)
2416
 
{
2417
 
  struct _ora_drv_storage *s = (struct _ora_drv_storage *) CTX->storage;
2418
 
  struct passwd *p;
2419
 
  char query[1024];
2420
 
  OCIStmt *stmthp;
2421
 
 
2422
 
  if (CTX->storage == NULL)
2423
 
  {
2424
 
    LOGDEBUG ("_ds_getall_spamrecords: storage not initialized");
2425
 
    return EINVAL;
2426
 
  }
2427
 
 
2428
 
  p = _ora_drv_getpwnam (CTX, CTX->username);
2429
 
  if (p == NULL)
2430
 
  {
2431
 
    LOGDEBUG ("_ds_getall_spamrecords: unable to _ora_drv_getpwnam(%s)",
2432
 
              CTX->username);
2433
 
    return EINVAL;
2434
 
  }
2435
 
 
2436
 
  snprintf (query, sizeof (query),
2437
 
            "DELETE FROM %s.DSPAM_TOKEN_DATA "
2438
 
            "  WHERE USER_ID = %d AND TOKEN = %llu", 
2439
 
            s->schema, p->pw_uid, token);
2440
 
 
2441
 
    if (_ora_drv_checkerr (NULL, s->errhp, OCIHandleAlloc ((dvoid *) s->envhp,
2442
 
                                                           (dvoid **) &
2443
 
                                                           stmthp,
2444
 
                                                           (ub4)
2445
 
                                                           OCI_HTYPE_STMT,
2446
 
                                                           (size_t) 0,
2447
 
                                                           (dvoid **) 0)) !=
2448
 
        OCI_SUCCESS)
2449
 
      return EUNKNOWN;
2450
 
 
2451
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtPrepare (stmthp, s->errhp,
2452
 
                                                            (text *) query,
2453
 
                                                            (ub4)
2454
 
                                                            strlen (query),
2455
 
                                                            (ub4)
2456
 
                                                            OCI_NTV_SYNTAX,
2457
 
                                                            (ub4)
2458
 
                                                            OCI_DEFAULT)) !=
2459
 
        OCI_SUCCESS)
2460
 
      goto bail;
2461
 
 
2462
 
    if (_ora_drv_checkerr (query, s->errhp, OCIStmtExecute (s->svchp, stmthp,
2463
 
                                                            s->errhp, (ub4) 1,
2464
 
                                                            (ub4) 0,
2465
 
                                                            (OCISnapshot *)
2466
 
                                                            NULL,
2467
 
                                                            (OCISnapshot *)
2468
 
                                                            NULL,
2469
 
                                                            (ub4)
2470
 
                                                            OCI_DEFAULT)) !=
2471
 
        OCI_SUCCESS)
2472
 
      goto bail;
2473
 
 
2474
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2475
 
  return 0;
2476
 
 
2477
 
bail:
2478
 
 
2479
 
  OCIHandleFree ((dvoid *) stmthp, (ub4) OCI_HTYPE_STMT);
2480
 
  return EUNKNOWN;
2481
 
 
2482
 
}
2483
 
 
2484
 
void *_ds_connect (DSPAM_CTX *CTX)
2485
 
{
2486
 
  return NULL;
2487
 
}
2488
 
 
2489
 
/* Preference Stubs for Flat-File */
2490
 
 
2491
 
agent_pref_t _ds_pref_load(config_t config, const char *user,
2492
 
  const char *home, void *dbh)
2493
 
{
2494
 
  return _ds_ff_pref_load(config, user, home, dbh);
2495
 
}
2496
 
 
2497
 
int _ds_pref_set(config_t config, const char *user, const char *home,
2498
 
  const char *attrib, const char *value, void *dbh)
2499
 
{
2500
 
  return _ds_ff_pref_set(config, user, home, attrib, value, dbh);
2501
 
}
2502
 
 
2503
 
int _ds_pref_del(config_t config, const char *user, const char *home,
2504
 
  const char *attrib, void *dbh)
2505
 
{
2506
 
  return _ds_ff_pref_del(config, user, home, attrib, dbh);
2507
 
}
2508