xref: /plan9/sys/src/cmd/cifs/sid2name.c (revision 671dfc474d1a5bcbeda8be1356d2abfa05b91489)
1*671dfc47SDavid du Colombier #include <u.h>
2*671dfc47SDavid du Colombier #include <libc.h>
3*671dfc47SDavid du Colombier #include <auth.h>
4*671dfc47SDavid du Colombier #include <fcall.h>
5*671dfc47SDavid du Colombier #include <thread.h>
6*671dfc47SDavid du Colombier #include <9p.h>
7*671dfc47SDavid du Colombier #include "cifs.h"
8*671dfc47SDavid du Colombier 
9*671dfc47SDavid du Colombier struct {		/* Well known security IDs */
10*671dfc47SDavid du Colombier 	char	*name;
11*671dfc47SDavid du Colombier 	char	*auth;
12*671dfc47SDavid du Colombier 	char	*rid;
13*671dfc47SDavid du Colombier } known[] = {
14*671dfc47SDavid du Colombier 	/* default local users */
15*671dfc47SDavid du Colombier 	{ "lu.dialup",			"S-1-5-1",	nil },
16*671dfc47SDavid du Colombier 	{ "lu.network",			"S-1-5-2",	nil },
17*671dfc47SDavid du Colombier 	{ "lu.batch",			"S-1-5-3",	nil },
18*671dfc47SDavid du Colombier 	{ "lu.interactive",		"S-1-5-4",	nil },
19*671dfc47SDavid du Colombier 	{ "lu.service",			"S-1-5-6",	nil },
20*671dfc47SDavid du Colombier 	{ "lu.anon",			"S-1-5-7",	nil },
21*671dfc47SDavid du Colombier 	{ "lu.DC",			"S-1-5-8",	nil },
22*671dfc47SDavid du Colombier 	{ "lu.enterprise-domain",	"S-1-5-9",	nil },
23*671dfc47SDavid du Colombier 	{ "lu.self",			"S-1-5-10",	nil },
24*671dfc47SDavid du Colombier 	{ "lu.authenticated",		"S-1-5-11",	nil },
25*671dfc47SDavid du Colombier 	{ "lu.restricted",		"S-1-5-12",	nil },
26*671dfc47SDavid du Colombier 	{ "lu.terminal-services",	"S-1-5-13",	nil },
27*671dfc47SDavid du Colombier 	{ "lu.remote-desktop",		"S-1-5-14",	nil },
28*671dfc47SDavid du Colombier 	{ "lu.local-system",		"S-1-5-18",	nil },
29*671dfc47SDavid du Colombier 	{ "lu.local-service",		"S-1-5-19",	nil },
30*671dfc47SDavid du Colombier 	{ "lu.network-service",		"S-1-5-20",	nil },
31*671dfc47SDavid du Colombier 	{ "lu.builtin",			"S-1-5-32",	nil },
32*671dfc47SDavid du Colombier 
33*671dfc47SDavid du Colombier 	/* default local groups */
34*671dfc47SDavid du Colombier 	{ "lg.null",			"S-1-0-0",	nil },
35*671dfc47SDavid du Colombier 	{ "lg.world",			"S-1-1-0",	nil },
36*671dfc47SDavid du Colombier 	{ "lg.local",			"S-1-2-0",	nil },
37*671dfc47SDavid du Colombier 	{ "lg.creator-owner",		"S-1-3-0",	nil },
38*671dfc47SDavid du Colombier 	{ "lg.creator-group",		"S-1-3-1",	nil },
39*671dfc47SDavid du Colombier 	{ "lg.creator-owner-server",	"S-1-3-2",	nil },
40*671dfc47SDavid du Colombier 	{ "lg.creator-group-server",	"S-1-3-3",	nil },
41*671dfc47SDavid du Colombier 
42*671dfc47SDavid du Colombier 	/* default domain users */
43*671dfc47SDavid du Colombier 	{ "du.admin", 			"S-1-5",	"500" },
44*671dfc47SDavid du Colombier 	{ "du.guest",			"S-1-5",	"501" },
45*671dfc47SDavid du Colombier 	{ "du.kerberos",		"S-1-5",	"502" },
46*671dfc47SDavid du Colombier 
47*671dfc47SDavid du Colombier 	/* default domain groups */
48*671dfc47SDavid du Colombier 	{ "dg.admins", 			"S-1-5-21",	"512" },
49*671dfc47SDavid du Colombier 	{ "dg.users",			"S-1-5-21",	"513" },
50*671dfc47SDavid du Colombier 	{ "dg.guests",			"S-1-5",	"514" },
51*671dfc47SDavid du Colombier 	{ "dg.computers",		"S-1-5",	"515" },
52*671dfc47SDavid du Colombier 	{ "dg.controllers",		"S-1-5",	"516" },
53*671dfc47SDavid du Colombier 	{ "dg.cert-admins",		"S-1-5",	"517" },
54*671dfc47SDavid du Colombier 	{ "dg.schema-admins",		"S-1-5",	"518" },
55*671dfc47SDavid du Colombier 	{ "dg.enterprise-admins",	"S-1-5",	"519" },
56*671dfc47SDavid du Colombier 	{ "dg.group-policy-admins",	"S-1-5",	"520" },
57*671dfc47SDavid du Colombier 	{ "dg.remote-access",		"S-1-5",	"553" },
58*671dfc47SDavid du Colombier 
59*671dfc47SDavid du Colombier 	/* default domain aliases */
60*671dfc47SDavid du Colombier 	{ "da.admins",			"S-1-5",	"544" },
61*671dfc47SDavid du Colombier 	{ "da.users",			"S-1-5",	"545" },
62*671dfc47SDavid du Colombier 	{ "da.guests",			"S-1-5",	"546" },
63*671dfc47SDavid du Colombier 	{ "da.power-users",		"S-1-5",	"547" },
64*671dfc47SDavid du Colombier 	{ "da.account-operators",	"S-1-5",	"548" },
65*671dfc47SDavid du Colombier 	{ "da.server-operators",	"S-1-5",	"549" },
66*671dfc47SDavid du Colombier 	{ "da.print-operators",		"S-1-5",	"550" },
67*671dfc47SDavid du Colombier 	{ "da.backup-operators",	"S-1-5",	"551" },
68*671dfc47SDavid du Colombier 	{ "da.replicator",		"S-1-5",	"552" },
69*671dfc47SDavid du Colombier 	{ "da.RAS-servers",		"S-1-5",	"553" },
70*671dfc47SDavid du Colombier 
71*671dfc47SDavid du Colombier };
72*671dfc47SDavid du Colombier 
73*671dfc47SDavid du Colombier static char *
sid2name(char * sid)74*671dfc47SDavid du Colombier sid2name(char *sid)
75*671dfc47SDavid du Colombier {
76*671dfc47SDavid du Colombier 	int i;
77*671dfc47SDavid du Colombier 	char *rid;
78*671dfc47SDavid du Colombier 
79*671dfc47SDavid du Colombier 	if(sid == nil || (rid = strrchr(sid, '-')) == nil || *++rid == 0)
80*671dfc47SDavid du Colombier 		return estrdup9p("-");
81*671dfc47SDavid du Colombier 
82*671dfc47SDavid du Colombier 	for(i = 0; i < nelem(known); i++){
83*671dfc47SDavid du Colombier 		if(strcmp(known[i].auth, sid) == 0 && known[i].rid == nil)
84*671dfc47SDavid du Colombier 			return estrdup9p(known[i].name);
85*671dfc47SDavid du Colombier 
86*671dfc47SDavid du Colombier 		if(strlen(known[i].auth) < strlen(sid) &&
87*671dfc47SDavid du Colombier 		    strncmp(known[i].auth, sid, strlen(known[i].auth)) == 0 &&
88*671dfc47SDavid du Colombier 		    known[i].rid && strcmp(known[i].rid, rid) == 0)
89*671dfc47SDavid du Colombier 			return estrdup9p(known[i].name);
90*671dfc47SDavid du Colombier 	}
91*671dfc47SDavid du Colombier 
92*671dfc47SDavid du Colombier 	return estrdup9p(rid);
93*671dfc47SDavid du Colombier }
94*671dfc47SDavid du Colombier 
95*671dfc47SDavid du Colombier void
upd_names(Session * s,Share * sp,char * path,Dir * d)96*671dfc47SDavid du Colombier upd_names(Session *s, Share *sp, char *path, Dir *d)
97*671dfc47SDavid du Colombier {
98*671dfc47SDavid du Colombier 	int fh, result;
99*671dfc47SDavid du Colombier 	char *usid, *gsid;
100*671dfc47SDavid du Colombier 	FInfo fi;
101*671dfc47SDavid du Colombier 
102*671dfc47SDavid du Colombier 	if(d->uid)
103*671dfc47SDavid du Colombier 		free(d->uid);
104*671dfc47SDavid du Colombier 	if(d->gid)
105*671dfc47SDavid du Colombier 		free(d->gid);
106*671dfc47SDavid du Colombier 
107*671dfc47SDavid du Colombier 	if((fh = CIFS_NT_opencreate(s, sp, path, 0, 0, 0, READ_CONTROL,
108*671dfc47SDavid du Colombier 	    FILE_SHARE_ALL, FILE_OPEN, &result, &fi)) == -1){
109*671dfc47SDavid du Colombier 		d->uid = estrdup9p("unknown");
110*671dfc47SDavid du Colombier 		d->gid = estrdup9p("unknown");
111*671dfc47SDavid du Colombier 		return;
112*671dfc47SDavid du Colombier 	}
113*671dfc47SDavid du Colombier 	usid = nil;
114*671dfc47SDavid du Colombier 	gsid = nil;
115*671dfc47SDavid du Colombier 	TNTquerysecurity(s, sp, fh, &usid, &gsid);
116*671dfc47SDavid du Colombier 	d->uid = sid2name(usid);
117*671dfc47SDavid du Colombier 	d->gid = sid2name(gsid);
118*671dfc47SDavid du Colombier 	if(fh != -1)
119*671dfc47SDavid du Colombier 		CIFSclose(s, sp, fh);
120*671dfc47SDavid du Colombier }
121