netatalk  4.6.1
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()

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

◆ create_file()

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

◆ create_srp_directory()

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

◆ disable_srp_verifier()

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

◆ find_append_position()

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

◆ initialize_libgcrypt()

static int initialize_libgcrypt ( void  )
static

◆ main()

int main ( int  argc,
char **  argv 
)

◆ open_credential_file()

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

◆ open_credential_for_replacement()

static int open_credential_for_replacement ( const char *  path)
static

◆ open_srp_verifier()

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

◆ open_srp_verifier_directory()

static int open_srp_verifier_directory ( const char *  path)
static

◆ parse_minimum_uid()

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

◆ print_usage()

static void print_usage ( void  )
static

◆ randnum_ensure_keyfile()

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

◆ randnum_make_keypath()

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

◆ randnum_open_keyfile()

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

◆ randnum_read_keyfd()

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

◆ randnum_write_keyfile()

static int randnum_write_keyfile ( const char *  keypath)
static

◆ srp_compute_verifier()

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

◆ srp_encode_hex()

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

◆ srp_uid_filename()

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

◆ unhex()

static int unhex ( unsigned char  x)
static

◆ update_passwd()

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

◆ update_srp_passwd()

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

◆ valid_hex_or_disabled()

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

◆ valid_randnum_record()

static int valid_randnum_record ( const char *  fields)
static

◆ validate_opened_file()

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

◆ validate_srp_verifier_file()

static 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