#include "cacusermgr.h"
void usage() {
printf("Usage:\n");
printf(" cacusermgr [options] server\n\n");
printf("options:\n");
printf(" -u USERNAME Username to login with\n");
printf(" -d/-w DOMAIN Domain name\n");
printf(" -D LEVEL Debug level\n");
printf(" -h Print this message\n");
exit(1);
}
int process_cmd_line(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, int argc, char **argv) {
char op;
if(!hnd || !mem_ctx || !argc)
return 0;
while( (op = getopt(argc, argv, "u:U:d:w:W:D:h")) != -1) {
switch(op) {
case 'u':
case 'U':
if(optarg)
strncpy(hnd->username, optarg, sizeof(fstring));
else
usage();
break;
case 'd':
case 'w':
case 'W':
if(optarg)
strncpy(hnd->domain, optarg, sizeof(fstring));
else
usage();
break;
case 'D':
if(optarg)
hnd->debug = atoi(optarg);
else
usage();
break;
case 'h':
usage();
break;
case '?':
default:
printf("Unknown option -%c\n", op);
usage();
}
}
if(optind >= argc)
usage();
strncpy(hnd->server, argv[optind], sizeof(fstring));
return 1;
}
void mgr_getline(fstring line) {
fgets(line, sizeof(fstring), stdin);
if(line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0';
}
void mgr_GetAuthDataFn(const char * pServer,
const char * pShare,
char * pWorkgroup,
int maxLenWorkgroup,
char * pUsername,
int maxLenUsername,
char * pPassword,
int maxLenPassword)
{
char temp[sizeof(fstring)];
static char authUsername[sizeof(fstring)];
static char authWorkgroup[sizeof(fstring)];
static char authPassword[sizeof(fstring)];
static char authSet = 0;
char *pass = NULL;
if (authSet)
{
strncpy(pWorkgroup, authWorkgroup, maxLenWorkgroup - 1);
strncpy(pUsername, authUsername, maxLenUsername - 1);
strncpy(pPassword, authPassword, maxLenPassword - 1);
}
else
{
if(pWorkgroup[0] != '\0') {
strncpy(authWorkgroup, pWorkgroup, maxLenWorkgroup - 1);
}
else {
d_printf("Domain: [%s] ", pWorkgroup);
mgr_getline(pWorkgroup);
if (temp[0] != '\0')
{
strncpy(pWorkgroup, temp, maxLenWorkgroup - 1);
strncpy(authWorkgroup, temp, maxLenWorkgroup - 1);
}
}
if(pUsername[0] != '\0') {
strncpy(authUsername, pUsername, maxLenUsername - 1);
}
else {
d_printf("Username: [%s] ", pUsername);
mgr_getline(pUsername);
if (temp[strlen(temp) - 1] == '\n')
{
temp[strlen(temp) - 1] = '\0';
}
if (temp[0] != '\0')
{
strncpy(pUsername, temp, maxLenUsername - 1);
strncpy(authUsername, pUsername, maxLenUsername - 1);
}
}
if(pPassword[0] != '\0') {
strncpy(authPassword, pPassword, maxLenPassword - 1);
}
else {
pass = getpass("Password: ");
if (pass)
fstrcpy(temp, pass);
if (temp[strlen(temp) - 1] == '\n')
{
temp[strlen(temp) - 1] = '\0';
}
if (temp[0] != '\0')
{
strncpy(pPassword, temp, maxLenPassword - 1);
strncpy(authPassword, pPassword, maxLenPassword - 1);
}
}
authSet = 1;
}
}
void mgr_page(uint32 line_count) {
if( (line_count % DEFAULT_SCREEN_LINES) != 0)
return;
printf("--Press enter to continue--\n");
getchar();
}
uint32 rid_or_name(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, uint32 *rid, char **name) {
fstring line;
BOOL is_rid = False;
uint32 rid_type = 0;
struct SamGetNamesFromRids getnames;
struct SamGetRidsFromNames getrids;
mgr_getline(line);
if(strncmp(line, "0x", 2) == 0) {
sscanf( (line + 2), "%x", rid);
is_rid = True;
}
else {
*name = talloc_strdup(mem_ctx, line);
}
if(is_rid) {
ZERO_STRUCT(getnames);
getnames.in.dom_hnd = dom_hnd;
getnames.in.rids = rid;
getnames.in.num_rids = 1;
cac_SamGetNamesFromRids(hnd, mem_ctx, &getnames);
if(getnames.out.num_names > 0)
rid_type = getnames.out.map[0].type;
}
else {
ZERO_STRUCT(getrids);
getrids.in.dom_hnd = dom_hnd;
getrids.in.names = name;
getrids.in.num_names = 1;
cac_SamGetRidsFromNames(hnd, mem_ctx, &getrids);
if(getrids.out.num_rids > 0) {
rid_type = getrids.out.map[0].type;
*rid = getrids.out.map[0].rid;
}
}
return rid_type;
}
void printerr(const char *msg, NTSTATUS status) {
if(NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED))
printf("%s You do not have sufficient rights.\n", msg);
else if(NT_STATUS_EQUAL(status, NT_STATUS_NO_SUCH_USER))
printf("%s No such user.\n", msg);
else if(NT_STATUS_EQUAL(status, NT_STATUS_NO_SUCH_GROUP))
printf("%s No such group.\n", msg);
else if(NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS))
printf("%s User already exists.\n", msg);
else if(NT_STATUS_EQUAL(status, NT_STATUS_GROUP_EXISTS))
printf("%s Group already exists.\n", msg);
else
printf("%s %s.\n", msg, nt_errstr(status));
}
char *get_new_password(TALLOC_CTX *mem_ctx) {
char *pass1 = NULL;
pass1 = getpass("Enter new password: ");
return talloc_strdup(mem_ctx, pass1);
}
void print_rid_list(uint32 *rids, char **names, uint32 num_rids) {
uint32 i = 0;
if(!names || !rids)
return;
printf(" RID Name\n");
while(i < num_rids) {
printf("[0x%x] [%s]\n", rids[i], names[i]);
i++;
mgr_page(i);
}
}
void print_lookup_records(CacLookupRidsRecord *map, uint32 num_rids) {
uint32 i = 0;
if(!map)
return;
printf("RID Name\n");
while(i < num_rids) {
if(map[i].found) {
printf("[0x%x] [%s]\n", map[i].rid, map[i].name);
}
i++;
mgr_page(i);
}
}
int list_groups(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
struct SamEnumGroups eg;
if(!hnd || !mem_ctx || !dom_hnd)
return 0;
ZERO_STRUCT(eg);
eg.in.dom_hnd = dom_hnd;
while(cac_SamEnumGroups(hnd, mem_ctx, &eg))
print_rid_list(eg.out.rids, eg.out.names, eg.out.num_groups);
if(CAC_OP_FAILED(hnd->status)) {
printerr("Could not enumerate groups.", hnd->status);
return 0;
}
return 1;
}
void list_users(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
struct SamEnumUsers eu;
if(!hnd || !mem_ctx || !dom_hnd)
return;
ZERO_STRUCT(eu);
eu.in.dom_hnd = dom_hnd;
while(cac_SamEnumUsers(hnd, mem_ctx, &eu))
print_rid_list(eu.out.rids, eu.out.names, eu.out.num_users);
if(CAC_OP_FAILED(hnd->status))
printerr("Could not enumerate users.", hnd->status);
}