netatalk  4.6.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
afppasswd.c File Reference

AFP user password utility. More...

#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <gcrypt.h>
#include <atalk/compat.h>
#include <atalk/constant_time.h>
#include <atalk/srp.h>
#include <atalk/uam.h>
#include "afppasswd_migrate.h"
#include <crack.h>

Go to the source code of this file.

Macros

#define DES_KEY_SZ   8
#define OPT_ISROOT   (1 << 0)
#define OPT_CREATE   (1 << 1)
#define OPT_FORCE   (1 << 2)
#define OPT_ADDUSER   (1 << 3)
#define OPT_NOCRACK   (1 << 4)
#define OPT_RANDNUM   (1 << 5)
#define OPT_MIGRATE   (1 << 6)
#define OPT_DISABLE   (1 << 7)
#define PASSWD_ILLEGAL   '*'
#define FORMAT   ":****************:****************:********\n"
#define FORMAT_LEN   44
#define SRP_PASSWDLEN   255
#define UID_START   100
#define HEXPASSWDLEN   16
#define PASSWDLEN   8
#define AFPPASSWD_OPTSTRING   "cd:fmnra:p:u:w:"

Functions

static int unhex (unsigned char x)
static int initialize_libgcrypt (void)
static int parse_minimum_uid (const char *value, uid_t *uid)
static int validate_opened_file (int fd, const char *path)
static int open_credential_file (const char *path, int access_mode)
static int find_append_position (FILE *fp, const char *path, off_t *pos)
static int open_credential_for_replacement (const char *path)
static int randnum_make_keypath (const char *path, char *keypath, size_t keypath_size)
static int randnum_read_keyfd (int keyfd, uint8_t key[DES_KEY_SZ], const char *keypath)
static int randnum_open_keyfile (const char *path, int *keyfd_out)
static int randnum_write_keyfile (const char *keypath)
static int randnum_ensure_keyfile (const char *path, int flags)
static int convert_passwd (char *passwd_buf, char *newpwd, const int keyfd)
static int srp_compute_verifier (const char *username, const char *password, const unsigned char *salt, unsigned char *v_out)
static void srp_encode_hex (char *out_hex, const unsigned char *salt, const unsigned char *verifier)
static int open_srp_verifier_directory (const char *path)
static int srp_uid_filename (uid_t uid, char *name, size_t size)
static int validate_srp_verifier_file (int fd, uid_t uid, const char *path, int administrative)
static int open_srp_verifier (int dirfd, const char *path, uid_t uid, int create)
static int update_srp_passwd (const char *path, const char *name, uid_t uid, int flags, const char *pass)
static int disable_srp_verifier (const char *path, const char *name, uid_t uid)
static int create_srp_directory (const char *path, uid_t minuid)
static int valid_hex_or_disabled (const char *field, size_t len)
static int valid_randnum_record (const char *fields)
static int update_passwd (const char *path, const char *name, int flags, const char *pass)
static int create_file (const char *path, uid_t minuid)
static void print_usage (void)
int main (int argc, char **argv)

Variables

static char buf [MAXPATHLEN+1]
static const unsigned char hextable [] = "0123456789ABCDEF"

Detailed Description

AFP user password utility.

Supports two modes:

SRP mode (default): Manages one SRP verifier file per numeric UID for use with the SRP UAM. Format: username:hex_salt(32):hex_verifier(384)

RandNum mode (-r flag): Manages legacy password file for use with the RandNum UAM. Format: username:hex_password(16):last_login(16):fail_count(8)

Macro Definition Documentation

◆ AFPPASSWD_OPTSTRING

#define AFPPASSWD_OPTSTRING   "cd:fmnra:p:u:w:"

◆ DES_KEY_SZ

#define DES_KEY_SZ   8

◆ FORMAT

#define FORMAT   ":****************:****************:********\n"

◆ FORMAT_LEN

#define FORMAT_LEN   44

◆ HEXPASSWDLEN

#define HEXPASSWDLEN   16

◆ OPT_ADDUSER

#define OPT_ADDUSER   (1 << 3)

◆ OPT_CREATE

#define OPT_CREATE   (1 << 1)

◆ OPT_DISABLE

#define OPT_DISABLE   (1 << 7)

◆ OPT_FORCE

#define OPT_FORCE   (1 << 2)

◆ OPT_ISROOT

#define OPT_ISROOT   (1 << 0)

◆ OPT_MIGRATE

#define OPT_MIGRATE   (1 << 6)

◆ OPT_NOCRACK

#define OPT_NOCRACK   (1 << 4)

◆ OPT_RANDNUM

#define OPT_RANDNUM   (1 << 5)

◆ PASSWD_ILLEGAL

#define PASSWD_ILLEGAL   '*'

◆ PASSWDLEN

#define PASSWDLEN   8

◆ SRP_PASSWDLEN

#define SRP_PASSWDLEN   255

◆ UID_START

#define UID_START   100

Function Documentation

◆ convert_passwd()

int convert_passwd ( char * passwd_buf,
char * newpwd,
const int keyfd )
static

◆ create_file()

int create_file ( const char * path,
uid_t minuid )
static

◆ create_srp_directory()

int create_srp_directory ( const char * path,
uid_t minuid )
static

◆ disable_srp_verifier()

int disable_srp_verifier ( const char * path,
const char * name,
uid_t uid )
static

◆ find_append_position()

int find_append_position ( FILE * fp,
const char * path,
off_t * pos )
static

◆ initialize_libgcrypt()

int initialize_libgcrypt ( void )
static

◆ main()

int main ( int argc,
char ** argv )

◆ open_credential_file()

int open_credential_file ( const char * path,
int access_mode )
static

◆ open_credential_for_replacement()

int open_credential_for_replacement ( const char * path)
static

◆ open_srp_verifier()

int open_srp_verifier ( int dirfd,
const char * path,
uid_t uid,
int create )
static

◆ open_srp_verifier_directory()

int open_srp_verifier_directory ( const char * path)
static

◆ parse_minimum_uid()

int parse_minimum_uid ( const char * value,
uid_t * uid )
static

◆ print_usage()

void print_usage ( void )
static

◆ randnum_ensure_keyfile()

int randnum_ensure_keyfile ( const char * path,
int flags )
static

◆ randnum_make_keypath()

int randnum_make_keypath ( const char * path,
char * keypath,
size_t keypath_size )
static

◆ randnum_open_keyfile()

int randnum_open_keyfile ( const char * path,
int * keyfd_out )
static

◆ randnum_read_keyfd()

int randnum_read_keyfd ( int keyfd,
uint8_t key[DES_KEY_SZ],
const char * keypath )
static

◆ randnum_write_keyfile()

int randnum_write_keyfile ( const char * keypath)
static

◆ srp_compute_verifier()

int srp_compute_verifier ( const char * username,
const char * password,
const unsigned char * salt,
unsigned char * v_out )
static

◆ srp_encode_hex()

void srp_encode_hex ( char * out_hex,
const unsigned char * salt,
const unsigned char * verifier )
static

◆ srp_uid_filename()

int srp_uid_filename ( uid_t uid,
char * name,
size_t size )
static

◆ unhex()

int unhex ( unsigned char x)
static

◆ update_passwd()

int update_passwd ( const char * path,
const char * name,
int flags,
const char * pass )
static

◆ update_srp_passwd()

int update_srp_passwd ( const char * path,
const char * name,
uid_t uid,
int flags,
const char * pass )
static

◆ valid_hex_or_disabled()

int valid_hex_or_disabled ( const char * field,
size_t len )
static

◆ valid_randnum_record()

int valid_randnum_record ( const char * fields)
static

◆ validate_opened_file()

int validate_opened_file ( int fd,
const char * path )
static

◆ validate_srp_verifier_file()

int validate_srp_verifier_file ( int fd,
uid_t uid,
const char * path,
int administrative )
static

Variable Documentation

◆ buf

char buf[MAXPATHLEN+1]
static

◆ hextable

const unsigned char hextable[] = "0123456789ABCDEF"
static