static void update_pool_passwd(char *conf_file, char *username, char *password) { struct passwd *pw; char md5[POOL_PASSWD_LEN+1]; char pool_passwd[POOLMAXPATHLEN+1]; char dirnamebuf[POOLMAXPATHLEN+1]; char *dirp; if (pool_init_config()) { fprintf(stderr, "pool_init_config() failed\n\n"); exit(EXIT_FAILURE); } if (pool_get_config(conf_file, INIT_CONFIG)) { fprintf(stderr, "Unable to get configuration. Exiting..."); exit(EXIT_FAILURE); } strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf)); dirp = dirname(dirnamebuf); snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s", dirp, pool_config->pool_passwd); pool_init_pool_passwd(pool_passwd); if (strlen(username)) { /* generate the hash for the given username */ pg_md5_encrypt(password, username, strlen(username), md5); pool_create_passwdent(username, md5); } else { /* get the user information from the current uid */ pw = getpwuid(getuid()); if (!pw) { fprintf(stderr, "getpwuid() failed\n\n"); exit(EXIT_FAILURE); } pg_md5_encrypt(password, pw->pw_name, strlen(pw->pw_name), md5); pool_create_passwdent(pw->pw_name, md5); } pool_finish_pool_passwd(); }
static void update_pool_passwd(char *conf_file, char *username, char *password, char *key) { struct passwd *pw; char pool_passwd[MAX_PGPASS_LEN + 1]; char dirnamebuf[POOLMAXPATHLEN + 1]; char *dirp; char *user = username; unsigned char ciphertext[MAX_ENCODED_PASSWD_LEN]; unsigned char b64_enc[MAX_ENCODED_PASSWD_LEN]; int len; if (pool_init_config()) { fprintf(stderr, "pool_init_config() failed\n\n"); exit(EXIT_FAILURE); } if (pool_get_config(conf_file, CFGCXT_RELOAD) == false) { fprintf(stderr, "Unable to get configuration. Exiting...\n\n"); exit(EXIT_FAILURE); } strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf)); dirp = dirname(dirnamebuf); snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s", dirp, pool_config->pool_passwd); pool_init_pool_passwd(pool_passwd, POOL_PASSWD_RW); if (username == NULL || strlen(username) == 0) { /* get the user information from the current uid */ pw = getpwuid(getuid()); if (!pw) { fprintf(stderr, "getpwuid() failed\n\n"); exit(EXIT_FAILURE); } user = pw->pw_name; } /* generate the hash for the given username */ int cypher_len = aes_encrypt_with_password((unsigned char *) password, strlen(password), key, ciphertext); if (cypher_len <= 0) { fprintf(stderr, "password encryption failed\n\n"); exit(EXIT_FAILURE); } /* copy the prefix at the start of string */ strcpy((char *) b64_enc, (char *) PASSWORD_AES_PREFIX); len = pg_b64_encode((const char *) ciphertext, cypher_len, (char *) b64_enc + strlen(PASSWORD_AES_PREFIX)); if (cypher_len <= 0) { fprintf(stderr, "base64 encoding failed\n\n"); exit(EXIT_FAILURE); } len += strlen(PASSWORD_AES_PREFIX); b64_enc[len] = 0; pool_create_passwdent(user, (char *) b64_enc); pool_finish_pool_passwd(); }