00001
00002
00003
00004
00005
00006
00007
00008 #include "unipermgen.h"
00009 #include "unidefgen.h"
00010 #include "wvmoniker.h"
00011 #include "wvstringlist.h"
00012 #include "wvtclstring.h"
00013 #include "wvstream.h"
00014 #include "wvlinkerhack.h"
00015
00016 WV_LINK(UniPermGen);
00017
00018
00019
00020 UniPermGen::UniPermGen(IUniConfGen *_gen)
00021 : UniFilterGen(_gen)
00022 {
00023 }
00024
00025
00026 UniPermGen::UniPermGen(WvStringParm moniker)
00027 : UniFilterGen(NULL)
00028 {
00029 IUniConfGen *gen = wvcreate<IUniConfGen>(moniker);
00030 assert(gen && "Moniker doesn't get us a generator!");
00031 setinner(gen);
00032 }
00033
00034
00035 void UniPermGen::setowner(const UniConfKey &path, WvStringParm owner)
00036 {
00037 inner()->set(WvString("%s/owner", path), owner);
00038 }
00039
00040
00041 WvString UniPermGen::getowner(const UniConfKey &path)
00042 {
00043 WvString owner = inner()->get(WvString("%s/owner", path));
00044
00045 if (!owner && !path.isempty())
00046 owner = getowner(path.removelast());
00047 return owner;
00048 }
00049
00050
00051 void UniPermGen::setgroup(const UniConfKey &path, WvStringParm group)
00052 {
00053 inner()->set(WvString("%s/group", path), group);
00054 }
00055
00056
00057 WvString UniPermGen::getgroup(const UniConfKey &path)
00058 {
00059 WvString group = inner()->get(WvString("%s/group", path));
00060 if (!group && !path.isempty())
00061 group = getgroup(path.removelast());
00062 return group;
00063 }
00064
00065
00066 void UniPermGen::setperm(const UniConfKey &path, Level level,
00067 Type type, bool val)
00068 {
00069 inner()->set(WvString("%s/%s-%s", path, level2str(level),
00070 type2str(type)), val);
00071 }
00072
00073
00074 bool UniPermGen::getperm(const UniConfKey &path, const Credentials &cred,
00075 Type type)
00076 {
00077 WvString owner = getowner(path);
00078 WvString group = getgroup(path);
00079
00080 Level level;
00081 if (!!owner && cred.user == owner) level = USER;
00082 else if (!!group && cred.groups[group]) level = GROUP;
00083 else level = WORLD;
00084
00085 bool perm = getoneperm(path, level, type);
00086
00087
00088
00089 return perm;
00090 }
00091
00092
00096 bool UniPermGen::getoneperm(const UniConfKey &path, Level level, Type type)
00097 {
00098 int val = str2int(inner()->get(WvString("%s/%s-%s", path, level2str(level),
00099 type2str(type))), -1);
00100 if (val == -1)
00101 {
00102 if (path.isempty())
00103 {
00104
00105 switch (type)
00106 {
00107 case READ: return false;
00108 case WRITE: return false;
00109 case EXEC: return false;
00110 }
00111 }
00112 else
00113 return getoneperm(path.removelast(), level, type);
00114 }
00115 return val;
00116 }
00117
00118
00119 void UniPermGen::chmod(const UniConfKey &path,
00120 unsigned int user, unsigned int group,
00121 unsigned int world)
00122 {
00123 static const int r = 4;
00124 static const int w = 2;
00125 static const int x = 1;
00126
00127 setperm(path, USER, READ, (user & r));
00128 setperm(path, USER, WRITE, (user & w));
00129 setperm(path, USER, EXEC, (user & x));
00130
00131 setperm(path, GROUP, READ, (group & r));
00132 setperm(path, GROUP, WRITE, (group & w));
00133 setperm(path, GROUP, EXEC, (group & x));
00134
00135 setperm(path, WORLD, READ, (world & r));
00136 setperm(path, WORLD, WRITE, (world & w));
00137 setperm(path, WORLD, EXEC, (world & x));
00138 }
00139
00140
00141 void UniPermGen::chmod(const UniConfKey &path, unsigned int mode)
00142 {
00143 unsigned int user = (mode & 0700) >> 6;
00144 unsigned int group = (mode & 0070) >> 3;
00145 unsigned int world = (mode & 0007);
00146
00147 chmod(path, user, group, world);
00148 }
00149
00150
00151 WvString UniPermGen::level2str(Level level)
00152 {
00153 switch (level)
00154 {
00155 case USER: return "user";
00156 case GROUP: return "group";
00157 case WORLD: return "world";
00158 }
00159 assert(false && "Something in the Level enum wasn't covered");
00160 return WvString::null;
00161 }
00162
00163
00164 WvString UniPermGen::type2str(Type type)
00165 {
00166 switch (type)
00167 {
00168 case READ: return "read";
00169 case WRITE: return "write";
00170 case EXEC: return "exec";
00171 }
00172 assert(false && "Something in the Type enum wasn't covered");
00173 return WvString::null;
00174 }