/*

  DBOX Module
  Copyright (C) 1994-2000 Daniel Kroening <kroening@handshake.de>

  Purpose: 

*/

#include <unistd.h>
#include <stdio.h>
#include <time.h>

#include <tools.h>
#include "challenge.h"

void get_challenge(string &challenge, userpt &up)
 {
  time_t created, now;
  time(&now);

  challenge="";

  up.get("challenge.token", challenge);
  created=atol(up|"challenge.created");
  if(challenge=="" || (created+10*60)<now)
   {
    if(!up.lock())
     {
      if(challenge=="" || (created+5*60)<now)
       {
        up.set("challenge.oldtoken", challenge);

        srand(now+getpid()+str2crc(challenge.c_str()));
        char tempstr[TEXTLEN];
        snprintf(tempstr, TEXTLEN, "%ld.%d.%d", now, rand(), rand());
        challenge=tempstr;
        
        up.set("challenge.token", challenge);
        up.set("challenge.created", now);
        up.write();
       }
      up.unlock();
     }
   }
 }

bool verify_challenge(const char *challenge, userpt &up)
 {
  if(challenge==NULL) return TRUE;
  string real_challenge;
  up.get("challenge.token", real_challenge);
  if(real_challenge!="" && real_challenge==challenge) return FALSE;
  up.get("challenge.oldtoken", real_challenge);
  if(real_challenge!="" && real_challenge==challenge) return FALSE;
  return TRUE;
 }


syntax highlighted by Code2HTML, v. 0.9.1