NT4/private/net/portuas/portmac.c
2020-09-30 17:12:29 +02:00

172 lines
5.0 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
PortMac.c
Abstract:
PortMac contains routines to handle the Macintosh primary group
field in the UAS database.
Author:
JR (John Rogers, JohnRo@Microsoft) 26-Jan-1993
Revision History:
29-Oct-1992 JohnRo
Created for RAID 9020 ("prompt on conflicts" version).
27-Jan-1993 JohnRo
RAID 8683: PortUAS should set primary group from Mac parms.
29-Jan-1993 JohnRo
Made changes suggested by PC-LINT 5.0.
--*/
// These must be included first:
#include <nt.h> // Needed by <portuasp.h>
#include <ntrtl.h> // (Needed with nt.h and windows.h)
#include <nturtl.h> // (Needed with ntrtl.h and windows.h)
#include <windows.h> // IN, OUT, OPTIONAL, LPTSTR, etc.
#include <lmcons.h> // NET_API_STATUS, PARMNUM_BASE_INFOLEVEL, etc.
// These may be included in any order:
#include <lmaccess.h> // NetUserSetInfo(), NetGroupUserAdd(), etc.
#include <lmerr.h> // NO_ERROR, ERROR_, and NERR_ equates.
#include <names.h> // NetpGetPrimaryGroupFromMac().
#include <netdebug.h> // NetpAssert(), etc.
#include <netlib.h> // NetpMemoryFree().
#include <portuasp.h> // LPMAP_ENTRY, UNEXPECTED_MSG(), my prototypes, etc.
#include "nlstxt.h" // NLS message ID's
NET_API_STATUS
PortUasSetMacPrimaryGroup(
IN LPCTSTR UserName,
IN LPCTSTR MacPrimaryField // field in "mGroup:junk" format.
)
{
NET_API_STATUS ApiStatus;
LPTSTR GroupName = NULL;
LPTSTR GroupNameToUse = NULL;
ULONG GroupRid;
BOOL IgnoreThis;
LPMAP_ENTRY MapEntry = NULL;
USER_INFO_1051 UserInfo;
//
// Extract the primary group name from the Mac field.
//
ApiStatus = NetpGetPrimaryGroupFromMacField(
MacPrimaryField, // name in "mGroup:" format.
& GroupName ); // alloc and set ptr.
if (ApiStatus != NO_ERROR) {
UNEXPECTED_MSG( "NetpGetPrimaryGroupFromMacField", ApiStatus );
goto Cleanup;
}
NetpAssert( GroupName != NULL );
NetpAssert( NetpIsGroupNameValid( GroupName ) );
//
// Tell admin what we're planning.
//
//PROGRESS_MSG(( "Setting primary group for user '" FORMAT_LPTSTR
// "' to '" FORMAT_LPTSTR "' (before mapping)...\n",
// UserName, GroupName ));
(void)NlsPutMsg(STDOUT, PUAS_SETTING_PRIM_GROUP_BEFORE_MAPPING,
UserName, GroupName );
//
// Map this group name if necessary.
//
ApiStatus = PortUasFindMapEntry(
GroupName, // name to find
&IgnoreThis, // did user say ignore this one?
&MapEntry ); // set ptr to existing map entry
if (ApiStatus != NO_ERROR) {
UNEXPECTED_MSG( "PortUasFindMapEntry", ApiStatus );
goto Cleanup;
}
if (IgnoreThis) {
// User said ignore this entry.
ApiStatus = NO_ERROR;
goto Cleanup;
}
if (MapEntry == NULL) {
GroupNameToUse = GroupName; // no mapping
} else {
GroupNameToUse = MapEntry->NewName;
}
NetpAssert( GroupNameToUse != NULL );
NetpAssert( NetpIsGroupNameValid( GroupNameToUse ) );
//
// Make sure this user is a member of the group (add to group if needed).
// This will also check if the group and user exist.
//
//PROGRESS_MSG(( "Setting primary group for user '" FORMAT_LPTSTR
// "' to '" FORMAT_LPTSTR "' (after mapping)...\n",
// UserName, GroupNameToUse ));
(void)NlsPutMsg(STDOUT, PUAS_SETTING_PRIM_GROUP_AFTER_MAPPING,
UserName, GroupNameToUse );
ApiStatus = NetGroupAddUser(
NULL, // local (no server name)
GroupNameToUse, // group to update
(LPTSTR) UserName ); // user name to add to group
if ( (ApiStatus != NO_ERROR) && (ApiStatus != NERR_UserInGroup) ) {
UNEXPECTED_MSG( "NetGroupAddUser", ApiStatus );
goto Cleanup;
}
//
// Convert the group name to a RID.
//
ApiStatus = PortUasNameToRid(
(LPCWSTR) GroupNameToUse,
SidTypeGroup, // expected type
&GroupRid );
if (ApiStatus != NO_ERROR) {
UNEXPECTED_MSG( "PortUasNameToRid", ApiStatus );
goto Cleanup;
}
//
// Call NetUserSetInfo to set the primary group ID using the RID.
//
UserInfo.usri1051_primary_group_id = (DWORD) GroupRid;
ApiStatus = NetUserSetInfo (
NULL, // local (no server name)
(LPTSTR) UserName,
PARMNUM_BASE_INFOLEVEL + USER_PRIMARY_GROUP_PARMNUM,
(LPVOID) &UserInfo,
NULL ); // don't care about parmnum
if (ApiStatus != NO_ERROR) {
UNEXPECTED_MSG( "NetUserSetInfo", ApiStatus );
goto Cleanup;
}
ApiStatus = NO_ERROR;
Cleanup:
if (GroupName != NULL) {
NetpMemoryFree( GroupName );
}
// No need to do anything with MapEntry or GroupNameToUse.
return (ApiStatus);
}