1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-03 04:22:09 +03:00

Adding support for net password, net service, net user info, fixing net helps

This commit is contained in:
Steve French
-
parent 7131fe3be4
commit a1f3930637

View File

@ -61,7 +61,10 @@ typedef struct _functable {
#define GROUPF 8
#define VALIDATEF 9
#define GROUPMEMBERF 10
#define HELPF 11
#define ADMINF 11
#define SERVICEF 12
#define PASSWORDF 13
#define HELPF 14
const functable net_func[] = {
{ FILEF, "FILE"},
@ -74,6 +77,9 @@ const functable net_func[] = {
{ GROUPF, "GROUP"},
{ VALIDATEF, "VALIDATE"},
{ GROUPMEMBERF, "GROUPMEMBER"},
{ ADMINF, "ADMIN"},
{ SERVICEF, "SERVICE"},
{ PASSWORDF, "PASSWORD"},
{ HELPF, "HELP"}
};
@ -90,7 +96,8 @@ const functable net_subfunc[] = {
{ ADD_SF, "ADD" },
{ ADD_SF, "CREATE" },
{ DELETE_SF, "CLOSE" },
{ DELETE_SF, "DELETE" }
{ DELETE_SF, "DELETE" },
{ INFO_SF, "INFO"}
};
const char share_type[][6] = {
@ -110,6 +117,7 @@ const char share_type[][6] = {
" net file \tto list open files on a server \n"\
" net group \tto list user groups \n"\
" net groupmember to list users in a group \n"\
" net password to change the password of a user\n"\
" net printq \tto list the print queues on a server\n"\
" net server \tto list servers in a domain\n"\
" net session \tto list clients with open sessions to a server\n"\
@ -232,7 +240,9 @@ const char share_type[][6] = {
"\nnet user [misc. options] [targets]\n\tEnumerate users\n"\
"\nnet user DELETE <name> [misc. options] [targets]"\
"\n\tDelete specified user\n"\
"\nnet user ADD <user> [-M user flags] [misc. options] [targets]"\
"\nnet user INFO <name> [misc. options] [targets]"\
"\n\tList the domain groups of the specified user\n"\
"\nnet user ADD <name> [-F user flags] [misc. options] [targets]"\
"\n\tAdd specified user\n"
#define USER_ENUM_DISPLAY \
@ -256,6 +266,24 @@ const char share_type[][6] = {
"\nnet groupmember ADD <group name> <user name> [misc. options] [targets]"\
"\n\t Add specified user to specified group\n"
#define NET_ADMIN_USAGE \
"\nnet admin <remote command to execute> [cmd arguments [environment]] [misc_options] [targets]\n"\
"\texecutes a remote command on an os/2 target server\n"
#define NET_PASSWORD_USAGE \
"\nnet password <user> <old password> <new password> [misc_options] [targets]\n"\
"\tchanges the password for the specified user on a remote server\n"
#define NET_SERVICE_USAGE \
"\nnet service [misc. options] [targets] \n"\
"\tenumerates all running service daemons on target server\n"\
"\nnet service ADD <name> [service startup arguments] [misc. options] [targets]"\
"\n\tStart named service on remote server\n"\
"\nnet service DELETE <name> [misc. options] [targets]\n"\
"\n\tStop named service on remote server\n"
#define NET_VALIDATE_USAGE \
"\nnet validate <username> [password]\n"\
"\tValidate user and password to check whether they can access target server or domain\n"
@ -301,6 +329,7 @@ const char share_type[][6] = {
#define COMMENT_STR "Comment "
#define USER_STR "User name "
#define GROUP_STR "Group name "
#define SERVICE_STR "Service name"
#define HOMED_STR "Home directory "
#define LOGONS_STR "Logon script "
/************************************************************************************/
@ -958,6 +987,11 @@ void long_user_fn(const char *user_name, const char *comment, const char * home_
printf("%-21.21s %-47.47s %-35.35s %35.35s\n", user_name, comment, home_dir, logon_script);
}
void group_member_fn(const char *user_name, void *state)
{
printf("%-21.21s\n", user_name);
}
int net_user(int subfunct, char * username, char * comment, int flags)
{
struct in_addr target_ip;
@ -991,7 +1025,7 @@ int net_user(int subfunct, char * username, char * comment, int flags)
return cli_RNetUserEnum(cli, long_user_fn, NULL);
}
else
return cli_RNetUserEnum(cli, user_fn, NULL);
return cli_RNetUserEnum(cli, user_fn, NULL);
} else if (subfunct == ADD_SF) {
if (username == NULL) {
printf(ERRMSG_USERNAME_MISSING);
@ -1011,7 +1045,17 @@ int net_user(int subfunct, char * username, char * comment, int flags)
return cli_NetUserAdd(cli, &userinfo);
}
} else
} else if (subfunct == INFO_SF) {
if (username == NULL) {
printf(ERRMSG_USERNAME_MISSING);
return -1;
} else {
/* RAP_USER_INFO_1 userinfo;
cli_NetUserInfo (cli, &userinfo); */ /* BB need to add call to get user info level 3 or 4 */
return cli_NetUserGetGroups(cli, username, group_member_fn, NULL );
}
}
else
printf(ERRMSG_NOT_IMPLEMENTED);
return -1;
@ -1120,11 +1164,6 @@ void groupmember_usage(void)
printf(CONF_USAGE);
}
void group_member_fn(const char *user_name, void *state)
{
printf("%-21.21s\n", user_name);
}
int net_groupmember(int subfunct, char * groupname, char * username)
{
@ -1193,6 +1232,130 @@ int net_validate(char * username)
return 0;
}
void service_usage(void)
{
printf(NET_SERVICE_USAGE); /* command syntax */
printf(TARGET_USAGE, GLBL_LCL_MASTER); /* target options */
printf(SERVER_USAGE);
printf(IPADDRESS_USAGE);
printf(MISC_OPT_USAGE); /* misc options */
printf(PORT_USAGE);
printf(MYWORKGROUP_USAGE);
printf(DEBUG_USAGE);
printf(MYNAME_USAGE);
printf(USER_USAGE);
printf(CONF_USAGE);
}
int net_service(int subfunct, char * servicename, char * srvc_args)
{
struct in_addr target_ip;
if((have_ip == 0) && (host[0] == 0)) {
if (!resolve_name("localhost", &target_ip, 0x20)) {
DEBUG(1,("No remote server specified, unable to resolve connection to localhost via name lookup"));
return -1;
} else {
have_ip = True;
dest_ip = target_ip;
}
}
if(host[0] == 0)
strncpy(host, inet_ntoa(dest_ip),16);
cli = connect_to_ipc(host);
if(!cli) {
printf(ERRMSG_NOCONN_TARGET_SRVR);
return -2;
}
if (subfunct == LIST_SF) {
if(long_list_entries) {
printf("%-15.15s %-50.50s\n", SERVICE_STR, COMMENT_STR);
printf("-----------------------------\n");
return cli_RNetServiceEnum(cli, long_group_fn, NULL);
}
else
return cli_RNetServiceEnum(cli, group_fn, NULL);
} else
printf(ERRMSG_NOT_IMPLEMENTED);
return -1;
}
int net_password(char * username, char * old_password, char * new_password)
{
struct in_addr target_ip;
if((have_ip == 0) && (host[0] == 0)) {
if (!resolve_name("localhost", &target_ip, 0x20)) {
DEBUG(1,("No remote server specified, unable to resolve connection to localhost via name lookup"));
return -1;
} else {
have_ip = True;
dest_ip = target_ip;
}
}
if(host[0] == 0)
strncpy(host, inet_ntoa(dest_ip),16);
cli = connect_to_ipc(host);
if(!cli) {
printf(ERRMSG_NOCONN_TARGET_SRVR);
return -2;
}
/* BB Add check for password lengths? */
return cli_oem_change_password(cli, username, new_password, old_password);
}
void password_usage(void)
{
printf(NET_PASSWORD_USAGE); /* command syntax */
printf(TARGET_USAGE, GLBL_LCL_MASTER); /* target options */
printf(SERVER_USAGE);
printf(IPADDRESS_USAGE);
printf(WORKGROUP_USAGE);
printf(MISC_OPT_USAGE); /* misc options */
printf(PORT_USAGE);
printf(MYWORKGROUP_USAGE);
printf(DEBUG_USAGE);
printf(MYNAME_USAGE);
printf(USER_USAGE);
printf(CONF_USAGE);
}
void admin_usage(void)
{
printf(NET_ADMIN_USAGE); /* command syntax */
printf(TARGET_USAGE, GLBL_LCL_MASTER); /* target options */
printf(SERVER_USAGE);
printf(IPADDRESS_USAGE);
printf(WORKGROUP_USAGE);
printf(MISC_OPT_USAGE); /* misc options */
printf(PORT_USAGE);
printf(MYWORKGROUP_USAGE);
printf(DEBUG_USAGE);
printf(MYNAME_USAGE);
printf(USER_USAGE);
printf(CONF_USAGE);
}
int net_admin(char * command, char * cmd_args, char * environment)
{
printf(ERRMSG_NOT_IMPLEMENTED);
return 0;
}
/****************************************************************************
main program
****************************************************************************/
@ -1277,17 +1440,18 @@ int main(int argc,char *argv[])
}
}
lp_load(servicesf,True,False,False);
lp_load(servicesf,True,False,False);
argv_new = (char **)poptGetArgs(pc);
argc_new = argc;
for (i=0; i<argc; i++) {
if (argv_new[i] == NULL) {
argc_new = i;
break;
}
}
if (argc_new < 2) {
usage();
return -1;
@ -1310,43 +1474,52 @@ int main(int argc,char *argv[])
}
if (func == HELPF) {
switch(get_func(argv_new[2])) {
switch(get_func(argv_new[2])) {
case FILEF:
file_usage();
break;
file_usage();
break;
case SHAREF:
share_usage();
break;
share_usage();
break;
case SESSIONF:
session_usage();
break;
session_usage();
break;
case SERVERF:
server_usage();
break;
server_usage();
break;
case DOMAINF:
domain_usage();
break;
domain_usage();
break;
case PRINTQF:
printq_usage();
break;
printq_usage();
break;
case USERF:
user_usage();
break;
user_usage();
break;
case GROUPF:
group_usage();
break;
group_usage();
break;
case VALIDATEF:
validate_usage();
break;
validate_usage();
break;
case SERVICEF:
service_usage();
break;
case ADMINF:
admin_usage();
break;
case GROUPMEMBERF:
groupmember_usage();
break;
groupmember_usage();
break;
case PASSWORDF:
password_usage();
break;
case HELPF:
usage();
break;
usage();
break;
default:
printf(ERRMSG_INVALID_HELP_OPTION);
usage();
printf(ERRMSG_INVALID_HELP_OPTION);
usage();
}
return 0;
}
@ -1388,67 +1561,93 @@ int main(int argc,char *argv[])
switch (func) {
case FILEF:
if(argc_new <= 3) {
if (subfunc == OTHER_SF)
rc = net_file(subfunc, argv_new[2]);
else
rc = net_file(subfunc,NULL);
if (subfunc == OTHER_SF)
rc = net_file(subfunc, argv_new[2]);
else
rc = net_file(subfunc,NULL);
} else
rc = net_file(subfunc,argv_new[3]);
rc = net_file(subfunc,argv_new[3]);
break;
case SHAREF:
if (argc_new == 2)
rc = net_share(subfunc, NULL, NULL, 0);
rc = net_share(subfunc, NULL, NULL, 0);
else
rc = net_share(subfunc,argv_new[3], comment, maxusers);
rc = net_share(subfunc,argv_new[3], comment, maxusers);
break;
case SESSIONF:
if (argc_new <= 3)
rc = net_session(subfunc,NULL);
rc = net_session(subfunc,NULL);
else
rc = net_session(subfunc,argv_new[3]);
rc = net_session(subfunc,argv_new[3]);
break;
case SERVERF:
rc = net_server(target_workgroup, subfunc);
break;
case DOMAINF:
if(subfunc != LIST_SF)
printf(ERRMSG_INVALID_DOMAIN_ACTION);
printf(ERRMSG_INVALID_DOMAIN_ACTION);
rc = net_domain();
break;
case USERF:
if (argc_new == 2)
rc = net_user(subfunc, NULL, NULL, -1);
rc = net_user(subfunc, NULL, NULL, -1);
else if(argc_new == 3)
rc = net_user(subfunc,NULL, NULL, -1);
rc = net_user(subfunc,NULL, NULL, -1);
else if(argc_new > 3)
rc = net_user(subfunc,argv_new[3], comment, flagsarg);
rc = net_user(subfunc,argv_new[3], comment, flagsarg);
break;
case GROUPF:
if (argc_new == 2)
rc = net_group(subfunc, NULL, NULL);
rc = net_group(subfunc, NULL, NULL);
else if(argc_new == 3)
rc = net_group(subfunc,NULL, NULL);
rc = net_group(subfunc,NULL, NULL);
else if(argc_new > 3)
rc = net_group(subfunc,argv_new[3], comment);
rc = net_group(subfunc,argv_new[3], comment);
break;
case GROUPMEMBERF:
if (argc_new == 4)
rc = net_groupmember(subfunc, argv_new[3], NULL);
rc = net_groupmember(subfunc, argv_new[3], NULL);
else if (argc_new == 5)
rc = net_groupmember(subfunc, argv_new[3], argv_new[4]);
rc = net_groupmember(subfunc, argv_new[3], argv_new[4]);
else {
groupmember_usage();
rc = -1;
groupmember_usage();
rc = -1;
}
break;
case VALIDATEF:
rc = net_validate(global_user_name);
break;
case SERVICEF:
rc = net_service(subfunc, argv_new[3], argv_new[4]);
break;
case ADMINF:
if(argc_new < 3)
{
admin_usage();
rc = -1;
}
else if (argc_new == 3) {
rc = net_admin(argv_new[2], NULL, NULL);
} else if (argc_new == 4) {
rc = net_admin(argv_new[2], argv_new[3], NULL);
} else {
rc = net_admin(argv_new[2], argv_new[3], argv_new[4]);
}
break;
case PASSWORDF:
if(argc_new != 5)
{
password_usage();
rc = -1;
} else {
rc = net_password(argv_new[2], argv_new[3], argv_new[4]);
}
break;
case PRINTQF:
if (argc_new <= 3)
rc = net_printq(subfunc, NULL, jobid);
rc = net_printq(subfunc, NULL, jobid);
else
rc = net_printq(subfunc, argv_new[3], jobid);
rc = net_printq(subfunc, argv_new[3], jobid);
break;
default:
usage();