Download | Plain Text | Line Numbers


/*
 * Copyright (c) 2016 Manuel Mausz
 */
 
/* uncomment the line below to use nbdm or gdbm instead of BerkDB */
//#define USE_NDBM
 
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
 
#if defined(USE_NDBM)
# include <ndbm.h>
#else
# define DB_DBM_HSEARCH 1  /* use the dbm interface */
# define HAVE_DBM          /* for BerkDB 5.0 and later */
# include <db.h>
#endif
 
int main()
{
  char *user = getenv("SMTPAUTHUSER");
  if (user == NULL || strlen(user) == 0)
    return 0;
 
  char *dbfile = getenv("LOCKUSERDB");
  if (dbfile == NULL)
    dbfile = "control/lockedusers";
 
  DBM *dbm = dbm_open(dbfile, O_RDONLY, 0600);
  if (dbm == NULL)
  {
    perror("Unable to open database");
    return 0;
  }
 
  datum key = { .dptr = user, .dsize = strlen(user) };
  datum data = dbm_fetch(dbm, key);
  if (data.dptr != NULL)
  {
    puts("E550 YOUR ACCOUNT HAS BEEN LOCKED - PLEASE CONTACT YOUR POSTMASTER");
    fprintf(stderr, "block: smtp user %s has been blocked\n", user);
  }
 
  (void)dbm_close(dbm);
  return 0;
}