1/*
2   Unix SMB/CIFS implementation.
3   Translate unix-defined names to SIDs and vice versa
4   Copyright (C) Volker Lendecke 2005
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#include "includes.h"
21
22bool sid_check_is_unix_users(const DOM_SID *sid)
23{
24	return sid_equal(sid, &global_sid_Unix_Users);
25}
26
27bool sid_check_is_in_unix_users(const DOM_SID *sid)
28{
29	DOM_SID dom_sid;
30	uint32 rid;
31
32	sid_copy(&dom_sid, sid);
33	sid_split_rid(&dom_sid, &rid);
34
35	return sid_check_is_unix_users(&dom_sid);
36}
37
38bool uid_to_unix_users_sid(uid_t uid, DOM_SID *sid)
39{
40	sid_copy(sid, &global_sid_Unix_Users);
41	return sid_append_rid(sid, (uint32_t)uid);
42}
43
44bool gid_to_unix_groups_sid(gid_t gid, DOM_SID *sid)
45{
46	sid_copy(sid, &global_sid_Unix_Groups);
47	return sid_append_rid(sid, (uint32_t)gid);
48}
49
50const char *unix_users_domain_name(void)
51{
52	return "Unix User";
53}
54
55bool lookup_unix_user_name(const char *name, DOM_SID *sid)
56{
57	struct passwd *pwd;
58
59	pwd = Get_Pwnam_alloc(talloc_autofree_context(), name);
60	if (pwd == NULL) {
61		return False;
62	}
63
64	sid_copy(sid, &global_sid_Unix_Users);
65	sid_append_rid(sid, (uint32_t)pwd->pw_uid); /* For 64-bit uid's we have enough
66					  * space ... */
67	TALLOC_FREE(pwd);
68	return True;
69}
70
71bool sid_check_is_unix_groups(const DOM_SID *sid)
72{
73	return sid_equal(sid, &global_sid_Unix_Groups);
74}
75
76bool sid_check_is_in_unix_groups(const DOM_SID *sid)
77{
78	DOM_SID dom_sid;
79	uint32 rid;
80
81	sid_copy(&dom_sid, sid);
82	sid_split_rid(&dom_sid, &rid);
83
84	return sid_check_is_unix_groups(&dom_sid);
85}
86
87const char *unix_groups_domain_name(void)
88{
89	return "Unix Group";
90}
91
92bool lookup_unix_group_name(const char *name, DOM_SID *sid)
93{
94	struct group *grp;
95
96	grp = sys_getgrnam(name);
97	if (grp == NULL) {
98		return False;
99	}
100
101	sid_copy(sid, &global_sid_Unix_Groups);
102	sid_append_rid(sid, (uint32_t)grp->gr_gid); /* For 64-bit uid's we have enough
103					   * space ... */
104	return True;
105}
106