diff options
Diffstat (limited to 'crypto/heimdal/lib/otp/otp_db.c')
-rw-r--r-- | crypto/heimdal/lib/otp/otp_db.c | 233 |
1 files changed, 0 insertions, 233 deletions
diff --git a/crypto/heimdal/lib/otp/otp_db.c b/crypto/heimdal/lib/otp/otp_db.c deleted file mode 100644 index d6f71fe4a6a0..000000000000 --- a/crypto/heimdal/lib/otp/otp_db.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -RCSID("$Id: otp_db.c,v 1.19 2002/05/19 22:11:03 joda Exp $"); -#endif - -#include "otp_locl.h" - -#if !defined(HAVE_NDBM) && !defined(HAVE_DB_NDBM) -#include "ndbm_wrap.h" -#endif - -#define RETRIES 5 - -void * -otp_db_open (void) -{ - int lock; - int i; - void *ret; - - for(i = 0; i < RETRIES; ++i) { - struct stat statbuf; - - lock = open (OTP_DB_LOCK, O_WRONLY | O_CREAT | O_EXCL, 0666); - if (lock >= 0) { - close(lock); - break; - } - if (stat (OTP_DB_LOCK, &statbuf) == 0) { - if (time(NULL) - statbuf.st_mtime > OTP_DB_TIMEOUT) - unlink (OTP_DB_LOCK); - else - sleep (1); - } - } - if (i == RETRIES) - return NULL; - ret = dbm_open (OTP_DB, O_RDWR | O_CREAT, 0600); - if (ret == NULL) - unlink (OTP_DB_LOCK); - return ret; -} - -void -otp_db_close (void *dbm) -{ - dbm_close ((DBM *)dbm); - unlink (OTP_DB_LOCK); -} - -/* - * Remove this entry from the database. - * return 0 if ok. - */ - -int -otp_delete (void *v, OtpContext *ctx) -{ - DBM *dbm = (DBM *)v; - datum key; - - key.dsize = strlen(ctx->user); - key.dptr = ctx->user; - - return dbm_delete(dbm, key); -} - -/* - * Read this entry from the database and lock it if lockp. - */ - -static int -otp_get_internal (void *v, OtpContext *ctx, int lockp) -{ - DBM *dbm = (DBM *)v; - datum dat, key; - char *p; - time_t now, then; - - key.dsize = strlen(ctx->user); - key.dptr = ctx->user; - - dat = dbm_fetch (dbm, key); - if (dat.dptr == NULL) { - ctx->err = "Entry not found"; - return -1; - } - p = dat.dptr; - - memcpy (&then, p, sizeof(then)); - ctx->lock_time = then; - if (lockp) { - time(&now); - if (then && now - then < OTP_USER_TIMEOUT) { - ctx->err = "Entry locked"; - return -1; - } - memcpy (p, &now, sizeof(now)); - } - p += sizeof(now); - ctx->alg = otp_find_alg (p); - if (ctx->alg == NULL) { - ctx->err = "Bad algorithm"; - return -1; - } - p += strlen(p) + 1; - { - unsigned char *up = (unsigned char *)p; - ctx->n = (up[0] << 24) | (up[1] << 16) | (up[2] << 8) | up[3]; - } - p += 4; - memcpy (ctx->key, p, OTPKEYSIZE); - p += OTPKEYSIZE; - strlcpy (ctx->seed, p, sizeof(ctx->seed)); - if (lockp) - return dbm_store (dbm, key, dat, DBM_REPLACE); - else - return 0; -} - -/* - * Get and lock. - */ - -int -otp_get (void *v, OtpContext *ctx) -{ - return otp_get_internal (v, ctx, 1); -} - -/* - * Get and don't lock. - */ - -int -otp_simple_get (void *v, OtpContext *ctx) -{ - return otp_get_internal (v, ctx, 0); -} - -/* - * Write this entry to the database. - */ - -int -otp_put (void *v, OtpContext *ctx) -{ - DBM *dbm = (DBM *)v; - datum dat, key; - char buf[1024], *p; - time_t zero = 0; - size_t len, rem; - - key.dsize = strlen(ctx->user); - key.dptr = ctx->user; - - p = buf; - rem = sizeof(buf); - - if (rem < sizeof(zero)) - return -1; - memcpy (p, &zero, sizeof(zero)); - p += sizeof(zero); - rem -= sizeof(zero); - len = strlen(ctx->alg->name) + 1; - - if (rem < len) - return -1; - strcpy (p, ctx->alg->name); - p += len; - rem -= len; - - if (rem < 4) - return -1; - { - unsigned char *up = (unsigned char *)p; - *up++ = (ctx->n >> 24) & 0xFF; - *up++ = (ctx->n >> 16) & 0xFF; - *up++ = (ctx->n >> 8) & 0xFF; - *up++ = (ctx->n >> 0) & 0xFF; - } - p += 4; - rem -= 4; - - if (rem < OTPKEYSIZE) - return -1; - memcpy (p, ctx->key, OTPKEYSIZE); - p += OTPKEYSIZE; - rem -= OTPKEYSIZE; - - len = strlen(ctx->seed) + 1; - if (rem < len) - return -1; - strcpy (p, ctx->seed); - p += len; - rem -= len; - dat.dptr = buf; - dat.dsize = p - buf; - return dbm_store (dbm, key, dat, DBM_REPLACE); -} |