1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
14  * Copyright 2017 RackTop Systems.
15  */
16 
17 #include <sys/types.h>
18 #include <sys/time.h>
19 #include <sys/thread.h>
20 #include <sys/cred.h>
21 #include <sys/sid.h>
22 #include <strings.h>
23 
24 /*
25  * This library does not implement real credentials. All contexts
26  * use an opaque cred_t object, and all activity happens in the
27  * context of the user who runs the program.
28  */
29 
30 extern struct zone zone0;
31 
32 struct cred {
33 	uid_t		cr_uid;
34 	ksid_t		*cr_ksid;
35 	uint32_t	pad[100];
36 };
37 
38 cred_t cred0;
39 cred_t *kcred = &cred0;
40 
41 /*
42  * Note that fksmbd uses CRED() for SMB user logons, but uses
43  * zone_kcred() for operations done internally by the server.
44  * Let CRED() (_curcred()) return &cred1, so it's different from
45  * kcred, otherwise tests like: (cred == kcred) are always true.
46  * Also, only cred1 will have a ksid (not kcred).
47  * The UID and SID are both "nobody".
48  */
49 ksiddomain_t ksdom1 = {1, 5, "S-1-0", {0}};
50 ksid_t ksid1 = { 60001, 0, 0, &ksdom1};
51 cred_t cred1 = { 60001, &ksid1 };
52 
53 cred_t *
_curcred(void)54 _curcred(void)
55 {
56 	/* Thread-specific data? */
57 	return (&cred1);
58 }
59 
60 /*ARGSUSED*/
61 void
crfree(cred_t * cr)62 crfree(cred_t *cr)
63 {
64 }
65 
66 /*ARGSUSED*/
67 void
crhold(cred_t * cr)68 crhold(cred_t *cr)
69 {
70 }
71 
72 /*ARGSUSED*/
73 uid_t
crgetuid(const cred_t * cr)74 crgetuid(const cred_t *cr)
75 {
76 	return (cr->cr_uid);
77 }
78 
79 /*ARGSUSED*/
80 uid_t
crgetruid(const cred_t * cr)81 crgetruid(const cred_t *cr)
82 {
83 	return (cr->cr_uid);
84 }
85 
86 /*ARGSUSED*/
87 uid_t
crgetgid(const cred_t * cr)88 crgetgid(const cred_t *cr)
89 {
90 	return (0);
91 }
92 
93 /*ARGSUSED*/
94 int
crgetngroups(const cred_t * cr)95 crgetngroups(const cred_t *cr)
96 {
97 	return (0);
98 }
99 
100 /*ARGSUSED*/
101 const gid_t *
crgetgroups(const cred_t * cr)102 crgetgroups(const cred_t *cr)
103 {
104 	return (NULL);
105 }
106 
107 /*ARGSUSED*/
108 zoneid_t
crgetzoneid(const cred_t * cr)109 crgetzoneid(const cred_t *cr)
110 {
111 	return (GLOBAL_ZONEID);
112 }
113 
114 /*ARGSUSED*/
115 struct zone *
crgetzone(const cred_t * cr)116 crgetzone(const cred_t *cr)
117 {
118 	return (&zone0);
119 }
120 
121 cred_t *
zone_kcred(void)122 zone_kcred(void)
123 {
124 	return (kcred);
125 }
126 
127 /*ARGSUSED*/
128 ksid_t *
crgetsid(const cred_t * cr,int i)129 crgetsid(const cred_t *cr, int i)
130 {
131 	return (cr->cr_ksid);
132 }
133 
134 cred_t *
ddi_get_cred(void)135 ddi_get_cred(void)
136 {
137 	return (_curcred());
138 }
139