/*
 * kakumei_pass.h
 *
 * Password handling for kakumei.
 *
 * Author: Dario Rodriguez dario@softhome.net
 * This progran is licensed under the terms of the Affero GPL v1+
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "kakumei.h"
#include "libscrypt.h"

int
pass_new(kakumei *ka, char *user, char *passwd)
{
        int fd;
        char filename[1024];
        char mcf[SCRYPT_MCF_LEN+1];
        int len;
        if(kakumei_uservalid(ka,user)!=0)
                return(-1);
        snprintf(filename,sizeof(filename)-1,"%s/%s/passwd",USERSDIR,user);
        filename[sizeof(filename)-1]='\0';
        memset(mcf,0,sizeof(mcf));
        libscrypt_hash(mcf,passwd,SCRYPT_N,SCRYPT_r,SCRYPT_p);
        if((fd=open(filename,O_WRONLY|O_TRUNC|O_CREAT,0600))==-1)
                return(-1);
        len=strlen(mcf);
        if(write(fd,mcf,len)!=len) {
                close(fd),fd=-1;
                return(-1);
        }
        close(fd),fd=-1;
        return(0);
}

int
pass_check(kakumei *ka, char *user, char *passwd)
{
        int fd;
        char filename[1024];
        char mcf[SCRYPT_MCF_LEN+1];
        if(kakumei_userexists(ka,user)!=0)
                return(-1);
        snprintf(filename,sizeof(filename)-1,"%s/%s/passwd",USERSDIR,user);
        filename[sizeof(filename)-1]='\0';
        if((fd=open(filename,O_RDONLY))==-1)
                return(-1);
        memset(mcf,0,sizeof(mcf));
        read(fd,mcf,sizeof(mcf)-1);
        close(fd),fd=-1;
        if(libscrypt_check(mcf,passwd)<=0)
                return(-1);
        return(0);
}