mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
This removes the StrCaseCmp() stuff from 'net idmap' and 'net
groupmap'. The correct way to implement this stuff is via a function table, as exampled in all the other parts of 'net'. This also moves the idmap code into a new file. Volker, is this your code? You might want to put your name on it. Andrew Bartlett (This used to be commit 477f2d9e390bb18d4f08d1cac9c981b73d628c4f)
This commit is contained in:
parent
68f1ca6247
commit
668a9af94e
@ -476,7 +476,7 @@ CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) \
|
||||
NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_ads_cldap.o utils/net_help.o \
|
||||
utils/net_rap.o utils/net_rpc.o utils/net_rpc_samsync.o \
|
||||
utils/net_rpc_join.o utils/net_time.o utils/net_lookup.o \
|
||||
utils/net_cache.o utils/net_groupmap.o
|
||||
utils/net_cache.o utils/net_groupmap.o utils/net_idmap.o
|
||||
|
||||
NET_OBJ = $(NET_OBJ1) $(PARAM_OBJ) $(SECRETS_OBJ) $(LIBSMB_OBJ) \
|
||||
$(RPC_PARSE_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
|
||||
|
@ -348,150 +348,6 @@ static int net_file(int argc, const char **argv)
|
||||
return net_rap_file(argc, argv);
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
migrated functionality from smbgroupedit
|
||||
**********************************************************/
|
||||
static int net_groupmap(int argc, const char **argv)
|
||||
{
|
||||
if ( 0 == argc )
|
||||
return net_help_groupmap( argc, argv );
|
||||
|
||||
if ( !StrCaseCmp( argv[0], "add" ) )
|
||||
return net_groupmap_add(argc-1, argv+1);
|
||||
else if ( !StrCaseCmp( argv[0], "modify" ) )
|
||||
return net_groupmap_modify(argc-1, argv+1);
|
||||
else if ( !StrCaseCmp( argv[0], "delete" ) )
|
||||
return net_groupmap_delete(argc-1, argv+1);
|
||||
else if ( !StrCaseCmp( argv[0], "list" ) )
|
||||
return net_groupmap_list(argc-1, argv+1);
|
||||
|
||||
return net_help_groupmap( argc, argv );
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Helper function for net_idmap_dump. Dump one entry.
|
||||
**********************************************************/
|
||||
static int net_idmap_dump_one_entry(TDB_CONTEXT *tdb,
|
||||
TDB_DATA key,
|
||||
TDB_DATA data,
|
||||
void *unused)
|
||||
{
|
||||
if (strcmp(key.dptr, "USER HWM") == 0) {
|
||||
printf("USER HWM %d\n", IVAL(data.dptr,0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(key.dptr, "GROUP HWM") == 0) {
|
||||
printf("GROUP HWM %d\n", IVAL(data.dptr,0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strncmp(key.dptr, "S-", 2) != 0)
|
||||
return 0;
|
||||
|
||||
printf("%s %s\n", data.dptr, key.dptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Dump the current idmap
|
||||
**********************************************************/
|
||||
static int net_idmap_dump(int argc, const char **argv)
|
||||
{
|
||||
TDB_CONTEXT *idmap_tdb;
|
||||
|
||||
if ( argc != 1 )
|
||||
return net_help_idmap( argc, argv );
|
||||
|
||||
idmap_tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0);
|
||||
|
||||
if (idmap_tdb == NULL) {
|
||||
d_printf("Could not open idmap: %s\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
tdb_traverse(idmap_tdb, net_idmap_dump_one_entry, NULL);
|
||||
|
||||
tdb_close(idmap_tdb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Write entries from stdin to current local idmap
|
||||
**********************************************************/
|
||||
static int net_idmap_restore(int argc, const char **argv)
|
||||
{
|
||||
if (!idmap_init()) {
|
||||
d_printf("Could not init idmap\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (!feof(stdin)) {
|
||||
fstring line, sid_string;
|
||||
int len;
|
||||
unid_t id;
|
||||
int type = ID_EMPTY;
|
||||
DOM_SID sid;
|
||||
|
||||
if (fgets(line, sizeof(line)-1, stdin) == NULL)
|
||||
break;
|
||||
|
||||
len = strlen(line);
|
||||
|
||||
if ( (len > 0) && (line[len-1] == '\n') )
|
||||
line[len-1] = '\0';
|
||||
|
||||
if (sscanf(line, "GID %d %s", &id.gid, sid_string) == 2) {
|
||||
type = ID_GROUPID;
|
||||
}
|
||||
|
||||
if (sscanf(line, "UID %d %s", &id.uid, sid_string) == 2) {
|
||||
type = ID_USERID;
|
||||
}
|
||||
|
||||
if (type == ID_EMPTY) {
|
||||
d_printf("ignoring invalid line [%s]\n", line);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!string_to_sid(&sid, sid_string)) {
|
||||
d_printf("ignoring invalid sid [%s]\n", sid_string);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(idmap_set_mapping(&sid, id, type))) {
|
||||
d_printf("Could not set mapping of %s %d to sid %s\n",
|
||||
(type == ID_GROUPID) ? "GID" : "UID",
|
||||
(type == ID_GROUPID) ? id.gid : id.uid,
|
||||
sid_string_static(&sid));
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
idmap_close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Look at the current idmap
|
||||
**********************************************************/
|
||||
static int net_idmap(int argc, const char **argv)
|
||||
{
|
||||
if ( 0 == argc )
|
||||
return net_help_idmap( argc, argv );
|
||||
|
||||
if ( !StrCaseCmp( argv[0], "dump" ) )
|
||||
return net_idmap_dump(argc-1, argv+1);
|
||||
|
||||
if ( !StrCaseCmp( argv[0], "restore" ) )
|
||||
return net_idmap_restore(argc-1, argv+1);
|
||||
|
||||
return net_help_idmap( argc, argv );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Retrieve our local SID or the SID for the specified name
|
||||
*/
|
||||
|
@ -106,7 +106,7 @@ static void print_map_entry ( GROUP_MAP map, BOOL long_list )
|
||||
/*********************************************************
|
||||
List the groups.
|
||||
**********************************************************/
|
||||
int net_groupmap_list(int argc, const char **argv)
|
||||
static int net_groupmap_list(int argc, const char **argv)
|
||||
{
|
||||
int entries;
|
||||
BOOL long_list = False;
|
||||
@ -177,7 +177,7 @@ int net_groupmap_list(int argc, const char **argv)
|
||||
Add a new group mapping entry
|
||||
**********************************************************/
|
||||
|
||||
int net_groupmap_add(int argc, const char **argv)
|
||||
static int net_groupmap_add(int argc, const char **argv)
|
||||
{
|
||||
DOM_SID sid;
|
||||
fstring ntgroup = "";
|
||||
@ -283,7 +283,7 @@ int net_groupmap_add(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int net_groupmap_modify(int argc, const char **argv)
|
||||
static int net_groupmap_modify(int argc, const char **argv)
|
||||
{
|
||||
DOM_SID sid;
|
||||
GROUP_MAP map;
|
||||
@ -412,7 +412,7 @@ int net_groupmap_modify(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int net_groupmap_delete(int argc, const char **argv)
|
||||
static int net_groupmap_delete(int argc, const char **argv)
|
||||
{
|
||||
DOM_SID sid;
|
||||
fstring ntgroup = "";
|
||||
@ -466,3 +466,45 @@ int net_groupmap_delete(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int net_help_groupmap(int argc, const char **argv)
|
||||
{
|
||||
d_printf("net groupmap add"\
|
||||
"\n Create a new group mapping\n");
|
||||
d_printf("net groupmap modify"\
|
||||
"\n Update a group mapping\n");
|
||||
d_printf("net groupmap delete"\
|
||||
"\n Remove a group mapping\n");
|
||||
d_printf("net groupmap list"\
|
||||
"\n List current group map\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************
|
||||
migrated functionality from smbgroupedit
|
||||
**********************************************************/
|
||||
int net_groupmap(int argc, const char **argv)
|
||||
{
|
||||
/* we shouldn't have silly checks like this */
|
||||
if (getuid() != 0) {
|
||||
d_printf("You must be root to edit group mappings.\nExiting...\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct functable func[] = {
|
||||
{"add", net_groupmap_add},
|
||||
{"modify", net_groupmap_modify},
|
||||
{"delete", net_groupmap_delete},
|
||||
{"list", net_groupmap_list},
|
||||
{"help", net_help_groupmap},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
return net_run_function(argc, argv, func, net_help_groupmap);
|
||||
if ( 0 == argc )
|
||||
return net_help_groupmap( argc, argv );
|
||||
|
||||
return net_help_groupmap( argc, argv );
|
||||
}
|
||||
|
||||
|
@ -99,36 +99,6 @@ int net_help_group(int argc, const char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int net_help_groupmap(int argc, const char **argv)
|
||||
{
|
||||
if (getuid() != 0) {
|
||||
d_printf("You must be root to edit group mappings.\nExiting...\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
d_printf("net groupmap add"\
|
||||
"\n Create a new group mapping\n");
|
||||
d_printf("net groupmap modify"\
|
||||
"\n Update a group mapping\n");
|
||||
d_printf("net groupmap delete"\
|
||||
"\n Remove a group mapping\n");
|
||||
d_printf("net groupmap list"\
|
||||
"\n List current group map\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int net_help_idmap(int argc, const char **argv)
|
||||
{
|
||||
d_printf("net idmap dump filename"\
|
||||
"\n Dump current id mapping\n");
|
||||
|
||||
d_printf("net idmap restore"\
|
||||
"\n Restore entries from stdin to current local idmap\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int net_help_join(int argc, const char **argv)
|
||||
{
|
||||
d_printf("\nnet [<method>] join [misc. options]\n"
|
||||
|
156
source3/utils/net_idmap.c
Normal file
156
source3/utils/net_idmap.c
Normal file
@ -0,0 +1,156 @@
|
||||
/*
|
||||
Samba Unix/Linux SMB client library
|
||||
Distributed SMB/CIFS Server Management Utility
|
||||
Copyright (C) 2003 Andrew Bartlett (abartlet@samba.org)
|
||||
|
||||
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 "includes.h"
|
||||
#include "../utils/net.h"
|
||||
|
||||
|
||||
/***********************************************************
|
||||
Helper function for net_idmap_dump. Dump one entry.
|
||||
**********************************************************/
|
||||
static int net_idmap_dump_one_entry(TDB_CONTEXT *tdb,
|
||||
TDB_DATA key,
|
||||
TDB_DATA data,
|
||||
void *unused)
|
||||
{
|
||||
if (strcmp(key.dptr, "USER HWM") == 0) {
|
||||
printf("USER HWM %d\n", IVAL(data.dptr,0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(key.dptr, "GROUP HWM") == 0) {
|
||||
printf("GROUP HWM %d\n", IVAL(data.dptr,0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strncmp(key.dptr, "S-", 2) != 0)
|
||||
return 0;
|
||||
|
||||
printf("%s %s\n", data.dptr, key.dptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Dump the current idmap
|
||||
**********************************************************/
|
||||
static int net_idmap_dump(int argc, const char **argv)
|
||||
{
|
||||
TDB_CONTEXT *idmap_tdb;
|
||||
|
||||
if ( argc != 1 )
|
||||
return net_help_idmap( argc, argv );
|
||||
|
||||
idmap_tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0);
|
||||
|
||||
if (idmap_tdb == NULL) {
|
||||
d_printf("Could not open idmap: %s\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
tdb_traverse(idmap_tdb, net_idmap_dump_one_entry, NULL);
|
||||
|
||||
tdb_close(idmap_tdb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Write entries from stdin to current local idmap
|
||||
**********************************************************/
|
||||
static int net_idmap_restore(int argc, const char **argv)
|
||||
{
|
||||
if (!idmap_init()) {
|
||||
d_printf("Could not init idmap\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (!feof(stdin)) {
|
||||
fstring line, sid_string;
|
||||
int len;
|
||||
unid_t id;
|
||||
int type = ID_EMPTY;
|
||||
DOM_SID sid;
|
||||
|
||||
if (fgets(line, sizeof(line)-1, stdin) == NULL)
|
||||
break;
|
||||
|
||||
len = strlen(line);
|
||||
|
||||
if ( (len > 0) && (line[len-1] == '\n') )
|
||||
line[len-1] = '\0';
|
||||
|
||||
if (sscanf(line, "GID %d %s", &id.gid, sid_string) == 2) {
|
||||
type = ID_GROUPID;
|
||||
}
|
||||
|
||||
if (sscanf(line, "UID %d %s", &id.uid, sid_string) == 2) {
|
||||
type = ID_USERID;
|
||||
}
|
||||
|
||||
if (type == ID_EMPTY) {
|
||||
d_printf("ignoring invalid line [%s]\n", line);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!string_to_sid(&sid, sid_string)) {
|
||||
d_printf("ignoring invalid sid [%s]\n", sid_string);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(idmap_set_mapping(&sid, id, type))) {
|
||||
d_printf("Could not set mapping of %s %d to sid %s\n",
|
||||
(type == ID_GROUPID) ? "GID" : "UID",
|
||||
(type == ID_GROUPID) ? id.gid : id.uid,
|
||||
sid_string_static(&sid));
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
idmap_close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int net_help_idmap(int argc, const char **argv)
|
||||
{
|
||||
d_printf("net idmap dump filename"\
|
||||
"\n Dump current id mapping\n");
|
||||
|
||||
d_printf("net idmap restore"\
|
||||
"\n Restore entries from stdin to current local idmap\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
Look at the current idmap
|
||||
**********************************************************/
|
||||
int net_idmap(int argc, const char **argv)
|
||||
{
|
||||
struct functable func[] = {
|
||||
{"dump", net_idmap_dump},
|
||||
{"restore", net_idmap_restore},
|
||||
{"help", net_help_idmap},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
return net_run_function(argc, argv, func, net_help_idmap);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user