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