summaryrefslogtreecommitdiff
path: root/examples/libmsrpc/cacusermgr/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/libmsrpc/cacusermgr/util.c')
-rw-r--r--examples/libmsrpc/cacusermgr/util.c343
1 files changed, 343 insertions, 0 deletions
diff --git a/examples/libmsrpc/cacusermgr/util.c b/examples/libmsrpc/cacusermgr/util.c
new file mode 100644
index 0000000000..1629911812
--- /dev/null
+++ b/examples/libmsrpc/cacusermgr/util.c
@@ -0,0 +1,343 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * cacusermgr utility functions.
+ *
+ * Copyright (C) Chris Nicholls 2005
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 675
+ * Mass Ave, Cambridge, MA 02139, USA. */
+
+#include "cacusermgr.h"
+
+/*prints usage and quits*/
+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);
+}
+
+/*initializes values in the server handle from the command line returns 0 if there is a problem, non-zero if everything is ok*/
+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': /*username*/
+ case 'U':
+ if(optarg)
+ strncpy(hnd->username, optarg, sizeof(fstring));
+ else
+ usage();
+ break;
+
+ case 'd': /*domain name*/
+ case 'w':
+ case 'W':
+ if(optarg)
+ strncpy(hnd->domain, optarg, sizeof(fstring));
+ else
+ usage();
+ break;
+
+ case 'D': /*debug level*/
+ if(optarg)
+ hnd->debug = atoi(optarg);
+ else
+ usage();
+ break;
+
+ case 'h': /*help*/
+ usage();
+ break;
+
+ case '?':
+ default:
+ printf("Unknown option -%c\n", op);
+ usage();
+ }
+ }
+
+ if(optind >= argc)
+ usage();
+
+ /*whatever is less should be the server*/
+ 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';
+
+}
+
+/*this is pretty similar to the other get_auth_data_fn's*/
+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') /* A new line? */
+ {
+ 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') /* A new line? */
+ {
+ 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();
+}
+
+/*reads a line from stdin, figures out if it is a RID or name, gets a CacLookupRidsRecord and then returns the type*/
+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) {
+ /*then this is a RID*/
+ sscanf( (line + 2), "%x", rid);
+ is_rid = True;
+ }
+ else {
+ /*then this is a name*/
+ *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;
+
+ /*send back the RID so cac_SamOpenXX() doesn't have to look it up*/
+ *rid = getrids.out.map[0].rid;
+ }
+ }
+
+ return rid_type;
+}
+
+/*print's out some common error messages*/
+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);
+}