Added help command (-h) and fixed some things...
This commit is contained in:
parent
cf59e5bb35
commit
4267fdfa26
1 changed files with 20 additions and 9 deletions
29
checkpw.c
29
checkpw.c
|
|
@ -1,8 +1,15 @@
|
||||||
/*
|
/**
|
||||||
* checkpw is a program that checks the validity of a users password on a
|
* checkpw is a program that checks the validity of a users password on a
|
||||||
* Linux/PAM-based system.
|
* Linux/PAM-based system.
|
||||||
*
|
*
|
||||||
* Usage: checkpw -u $USER -p $PASSWORD
|
* Usage: ./checkpw [-u <username>] [-p <password>] [-i] [-v] [-h]
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
* -u <username> Specify username.
|
||||||
|
* -p <password> Specify password.
|
||||||
|
* -i Enable interactive mode to prompt for missing username/password.
|
||||||
|
* -v Enable verbose mode.
|
||||||
|
* -h Show this help
|
||||||
*
|
*
|
||||||
* Returns 0 on success, 1 otherwise.
|
* Returns 0 on success, 1 otherwise.
|
||||||
*
|
*
|
||||||
|
|
@ -18,7 +25,7 @@
|
||||||
#include <pwd.h> // For struct passwd and getpwnam
|
#include <pwd.h> // For struct passwd and getpwnam
|
||||||
#include <termios.h> // For terminal input settings
|
#include <termios.h> // For terminal input settings
|
||||||
|
|
||||||
#define MAX_USERNAME_LEN 256
|
#define MAX_USERNAME_LEN 32
|
||||||
#define MAX_PASSWORD_LEN 256
|
#define MAX_PASSWORD_LEN 256
|
||||||
|
|
||||||
#ifndef MIN_UID
|
#ifndef MIN_UID
|
||||||
|
|
@ -154,12 +161,13 @@ void prompt_for_input(char *buffer, size_t size, const char *prompt, int hide_in
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_usage(const char *prog_name) {
|
void print_usage(const char *prog_name) {
|
||||||
fprintf(stderr, "Usage: %s [-u <username>] [-p <password>] [-i] [-v]\n", prog_name);
|
fprintf(stderr, "Usage: %s [-u <username>] [-p <password>] [-i] [-v] [-h]\n", prog_name);
|
||||||
fprintf(stderr, "Options:\n");
|
fprintf(stderr, "Options:\n");
|
||||||
fprintf(stderr, " -u <username> Specify username.\n");
|
fprintf(stderr, " -u <username> Specify username.\n");
|
||||||
fprintf(stderr, " -p <password> Specify password.\n");
|
fprintf(stderr, " -p <password> Specify password.\n");
|
||||||
fprintf(stderr, " -i Enable interactive mode to prompt for missing username/password.\n");
|
fprintf(stderr, " -i Enable interactive mode to prompt for missing username/password.\n");
|
||||||
fprintf(stderr, " -v Enable verbose mode.\n");
|
fprintf(stderr, " -v Enable verbose mode.\n");
|
||||||
|
fprintf(stderr, " -h Show this help.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
@ -170,22 +178,25 @@ int main(int argc, char *argv[]) {
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
// Parse command-line arguments
|
// Parse command-line arguments
|
||||||
while ((opt = getopt(argc, argv, "u:p:iv")) != -1) {
|
while ((opt = getopt(argc, argv, "u:p:hiv")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'u':
|
case 'u':
|
||||||
if (strlen(optarg) >= MAX_USERNAME_LEN) {
|
if (strlen(optarg) >= MAX_USERNAME_LEN) {
|
||||||
fprintf(stderr, "Error: Username is too long (maximum %d characters).\n", MAX_USERNAME_LEN - 1);
|
fprintf(stderr, "Error: Username is too long (maximum %d characters).\n", MAX_USERNAME_LEN);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
strncpy(username, optarg, MAX_USERNAME_LEN - 1);
|
strncpy(username, optarg, MAX_USERNAME_LEN - 1);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
if (strlen(optarg) >= MAX_PASSWORD_LEN) {
|
if (strlen(optarg) >= MAX_PASSWORD_LEN) {
|
||||||
fprintf(stderr, "Error: Password is too long (maximum %d characters).\n", MAX_PASSWORD_LEN - 1);
|
fprintf(stderr, "Error: Password is too long (maximum %d characters).\n", MAX_PASSWORD_LEN);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
strncpy(password, optarg, MAX_PASSWORD_LEN - 1);
|
strncpy(password, optarg, MAX_PASSWORD_LEN - 1);
|
||||||
break;
|
break;
|
||||||
|
case 'h':
|
||||||
|
print_usage(argv[0]);
|
||||||
|
exit(1);
|
||||||
case 'i':
|
case 'i':
|
||||||
interactive = 1; // Enable interactive mode
|
interactive = 1; // Enable interactive mode
|
||||||
break;
|
break;
|
||||||
|
|
@ -244,10 +255,10 @@ int main(int argc, char *argv[]) {
|
||||||
// Authenticate the user
|
// Authenticate the user
|
||||||
if (authenticate(username, password, verbose) == 0) {
|
if (authenticate(username, password, verbose) == 0) {
|
||||||
printf("Authenticated successfully.\n");
|
printf("Authenticated successfully.\n");
|
||||||
return 0;
|
exit(0);
|
||||||
} else {
|
} else {
|
||||||
printf("Authentication failed.\n");
|
printf("Authentication failed.\n");
|
||||||
return 1;
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue