seclib.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. /*##############################################################################
  2. Copyright (C) 2011 HPCC Systems.
  3. All rights reserved. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Affero General Public License as
  5. published by the Free Software Foundation, either version 3 of the
  6. License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Affero General Public License for more details.
  11. You should have received a copy of the GNU Affero General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. ############################################################################## */
  14. #ifndef _SECLIB_HPP__
  15. #define _SECLIB_HPP__
  16. #include "jlib.hpp"
  17. #include "jtime.hpp"
  18. #include "jexcept.hpp"
  19. #ifndef SECLIB_API
  20. #ifdef _WIN32
  21. #ifndef SECLIB_EXPORTS
  22. #define SECLIB_API __declspec(dllimport)
  23. #else
  24. #define SECLIB_API __declspec(dllexport)
  25. #endif //SECLIB_EXPORTS
  26. #else
  27. #define SECLIB_API
  28. #endif //_WIN32
  29. #endif
  30. #ifdef _WIN32
  31. #define SECLIB "seclib.dll"
  32. #define LDAPSECLIB "LdapSecurity.dll"
  33. #else
  34. #define SECLIB "libseclib.so"
  35. #define LDAPSECLIB "libLdapSecurity.so"
  36. #endif
  37. enum NewSecAccessFlags
  38. {
  39. NewSecAccess_None = 0,
  40. NewSecAccess_Access = 1,
  41. NewSecAccess_Read = 2,
  42. NewSecAccess_Write = 4,
  43. NewSecAccess_Full = 255
  44. };
  45. enum SecAccessFlags
  46. {
  47. SecAccess_Unknown = -255,
  48. SecAccess_None = 0,
  49. SecAccess_Access = 1,
  50. SecAccess_Read = 3,
  51. SecAccess_Write = 7,
  52. SecAccess_Full = 255
  53. };
  54. enum SecResourceType
  55. {
  56. RT_DEFAULT = 0,
  57. RT_MODULE = 1,
  58. RT_SERVICE = 2,
  59. RT_FILE_SCOPE = 3,
  60. RT_WORKUNIT_SCOPE = 4,
  61. RT_SUDOERS = 5,
  62. RT_TRIAL = 6,
  63. RT_SCOPE_MAX = 7
  64. };
  65. const char* resTypeDesc(SecResourceType type);
  66. enum SecPermissionType
  67. {
  68. PT_DEFAULT = 0,
  69. PT_ADMINISTRATORS_ONLY = 1
  70. };
  71. #define DEFAULT_REQUIRED_ACCESS SecAccess_Read
  72. enum SecPasswordEncoding
  73. {
  74. SecPwEnc_unknown = 0,
  75. SecPwEnc_plain_text = 1,
  76. SecPwEnc_salt_sha1 = 2,
  77. SecPwEnc_salt_md5 = 3,
  78. SecPwEnc_Rijndael = 4,
  79. SecPwEnc_salt_accurint_md5 = 5
  80. };
  81. enum SecUserStatus
  82. {
  83. SecUserStatus_Inhouse = 0,
  84. SecUserStatus_Active = 1,
  85. SecUserStatus_Exempt = 2,
  86. SecUserStatus_FreeTrial = 3,
  87. SecUserStatus_csdemo = 4,
  88. SecUserStatus_Rollover = 5,
  89. SecUserStatus_Suspended = 6,
  90. SecUserStatus_Terminated = 7,
  91. SecUserStatus_TrialExpired = 8,
  92. SecUserStatus_Status_Hold = 9,
  93. SecUserStatus_Unknown = 10
  94. };
  95. interface ISecCredentials : extends IInterface
  96. {
  97. virtual bool setPassword(const char * pw) = 0;
  98. virtual const char * getPassword() = 0;
  99. virtual bool addToken(unsigned type, void * data, unsigned length) = 0;
  100. virtual bool setPasswordExpiration(CDateTime & expirationDate) = 0;
  101. virtual CDateTime & getPasswordExpiration(CDateTime & expirationDate) = 0;
  102. virtual int getPasswordDaysRemaining() = 0;
  103. };
  104. class CDateTime;
  105. interface ISecUser : extends IInterface
  106. {
  107. virtual const char * getName() = 0;
  108. virtual bool setName(const char * name) = 0;
  109. virtual const char * getFullName() = 0;
  110. virtual bool setFullName(const char * name) = 0;
  111. virtual const char * getFirstName() = 0;
  112. virtual bool setFirstName(const char * fname) = 0;
  113. virtual const char * getLastName() = 0;
  114. virtual bool setLastName(const char * lname) = 0;
  115. virtual const char * getRealm() = 0;
  116. virtual bool setRealm(const char * realm) = 0;
  117. virtual const char * getFqdn() = 0;
  118. virtual bool setFqdn(const char * Fqdn) = 0;
  119. virtual const char * getPeer() = 0;
  120. virtual bool setPeer(const char * Peer) = 0;
  121. virtual SecUserStatus getStatus() = 0;
  122. virtual bool setStatus(SecUserStatus Status) = 0;
  123. virtual bool isAuthenticated() = 0;
  124. virtual void setAuthenticated(bool authenticated) = 0;
  125. virtual ISecCredentials & credentials() = 0;
  126. virtual unsigned getUserID() = 0;
  127. virtual void copyTo(ISecUser & destination) = 0;
  128. virtual CDateTime & getPasswordExpiration(CDateTime & expirationDate) = 0;
  129. virtual bool setPasswordExpiration(CDateTime & expirationDate) = 0;
  130. virtual int getPasswordDaysRemaining() = 0;
  131. virtual void setProperty(const char * name, const char * value) = 0;
  132. virtual const char * getProperty(const char * name) = 0;
  133. virtual void setPropertyInt(const char * name, int value) = 0;
  134. virtual int getPropertyInt(const char * name) = 0;
  135. virtual ISecUser * clone() = 0;
  136. };
  137. interface ISecAuthenticEvents : extends IInterface
  138. {
  139. virtual bool onAuthenticationSuccess(ISecUser & User) = 0;
  140. virtual bool onAuthenticationFailure(ISecUser & User, unsigned reason, const char * description) = 0;
  141. virtual bool onRealmRequired(ISecUser & User) = 0;
  142. virtual bool onPasswordRequired(ISecUser & User, void * salt, unsigned salt_len) = 0;
  143. virtual bool onTokenRequired(ISecUser & User, unsigned type, void * salt, unsigned salt_len) = 0;
  144. };
  145. interface ISecProperty : extends IInterface
  146. {
  147. virtual const char * getName() = 0;
  148. virtual const char * getValue() = 0;
  149. };
  150. interface ISecResource : extends ISecProperty
  151. {
  152. virtual void setAccessFlags(int flags) = 0;
  153. virtual int getAccessFlags() = 0;
  154. virtual void setRequiredAccessFlags(int flags) = 0;
  155. virtual int getRequiredAccessFlags() = 0;
  156. virtual int addParameter(const char * name, const char * value) = 0;
  157. virtual const char * getParameter(const char * name) = 0;
  158. virtual void setDescription(const char * description) = 0;
  159. virtual const char * getDescription() = 0;
  160. virtual ISecResource * clone() = 0;
  161. virtual void copy(ISecResource * from) = 0;
  162. virtual SecResourceType getResourceType() = 0;
  163. virtual void setResourceType(SecResourceType resourcetype) = 0;
  164. virtual StringBuffer & toString(StringBuffer & s) = 0;
  165. };
  166. interface ISecPropertyIterator : extends IIteratorOf<ISecProperty>
  167. {
  168. };
  169. interface ISecPropertyList : extends IInterface
  170. {
  171. virtual ISecPropertyIterator * getPropertyItr() = 0;
  172. virtual ISecProperty * findProperty(const char * name) = 0;
  173. };
  174. interface ISecResourceList : extends ISecPropertyList
  175. {
  176. virtual bool isAuthorizationComplete() = 0;
  177. virtual ISecResourceList * clone() = 0;
  178. virtual bool copyTo(ISecResourceList & destination) = 0;
  179. virtual void clear() = 0;
  180. virtual ISecResource * addResource(const char * name) = 0;
  181. virtual void addResource(ISecResource * resource) = 0;
  182. virtual bool addCustomResource(const char * name, const char * config) = 0;
  183. virtual ISecResource * getResource(const char * feature) = 0;
  184. virtual ISecResource * queryResource(unsigned seq) = 0;
  185. virtual int count() = 0;
  186. virtual const char * getName() = 0;
  187. virtual StringBuffer & toString(StringBuffer & s) = 0;
  188. };
  189. typedef IArrayOf<ISecUser> IUserArray;
  190. typedef IArrayOf<ISecResource> IResourceArray;
  191. typedef IArrayOf<ISecProperty> IPropertyArray;
  192. interface ISecUserIterator : extends IIteratorOf<ISecUser>
  193. {
  194. };
  195. interface IAuthMap : extends IInterface
  196. {
  197. virtual int add(const char * path, ISecResourceList * resourceList) = 0;
  198. virtual bool shouldAuth(const char * path) = 0;
  199. virtual ISecResourceList * queryResourceList(const char * path) = 0;
  200. virtual ISecResourceList * getResourceList(const char * path) = 0;
  201. };
  202. interface ISecManager : extends IInterface
  203. {
  204. virtual ISecUser * createUser(const char * user_name) = 0;
  205. virtual ISecResourceList * createResourceList(const char * rlname) = 0;
  206. virtual bool subscribe(ISecAuthenticEvents & events) = 0;
  207. virtual bool unsubscribe(ISecAuthenticEvents & events) = 0;
  208. virtual bool authorize(ISecUser & user, ISecResourceList * resources) = 0;
  209. virtual bool authorizeEx(SecResourceType rtype, ISecUser & user, ISecResourceList * resources) = 0;
  210. virtual int authorizeEx(SecResourceType rtype, ISecUser & user, const char * resourcename) = 0;
  211. virtual int getAccessFlagsEx(SecResourceType rtype, ISecUser & user, const char * resourcename) = 0;
  212. virtual int authorizeFileScope(ISecUser & user, const char * filescope) = 0;
  213. virtual bool authorizeFileScope(ISecUser & user, ISecResourceList * resources) = 0;
  214. virtual bool addResources(ISecUser & user, ISecResourceList * resources) = 0;
  215. virtual bool addResourcesEx(SecResourceType rtype, ISecUser & user, ISecResourceList * resources, SecPermissionType ptype, const char * basedn) = 0;
  216. virtual bool addResourceEx(SecResourceType rtype, ISecUser & user, const char * resourcename, SecPermissionType ptype, const char * basedn) = 0;
  217. virtual bool getResources(SecResourceType rtype, const char * basedn, IResourceArray & resources) = 0;
  218. virtual bool updateResources(ISecUser & user, ISecResourceList * resources) = 0;
  219. virtual bool updateSettings(ISecUser & user, ISecPropertyList * resources) = 0;
  220. virtual bool addUser(ISecUser & user) = 0;
  221. virtual ISecUser * findUser(const char * username) = 0;
  222. virtual ISecUser * lookupUser(unsigned uid) = 0;
  223. virtual ISecUserIterator * getAllUsers() = 0;
  224. virtual void getAllGroups(StringArray & groups) = 0;
  225. virtual bool updateUser(ISecUser & user, const char * newPassword) = 0;
  226. virtual bool initUser(ISecUser & user) = 0;
  227. virtual void setExtraParam(const char * name, const char * value) = 0;
  228. virtual IAuthMap * createAuthMap(IPropertyTree * authconfig) = 0;
  229. virtual IAuthMap * createFeatureMap(IPropertyTree * authconfig) = 0;
  230. virtual IAuthMap * createSettingMap(IPropertyTree * authconfig) = 0;
  231. virtual void deleteResource(SecResourceType rtype, const char * name, const char * basedn) = 0;
  232. virtual void renameResource(SecResourceType rtype, const char * oldname, const char * newname, const char * basedn) = 0;
  233. virtual void copyResource(SecResourceType rtype, const char * oldname, const char * newname, const char * basedn) = 0;
  234. virtual void cacheSwitch(SecResourceType rtype, bool on) = 0;
  235. virtual bool authTypeRequired(SecResourceType rtype) = 0;
  236. virtual int authorizeWorkunitScope(ISecUser & user, const char * filescope) = 0;
  237. virtual bool authorizeWorkunitScope(ISecUser & user, ISecResourceList * resources) = 0;
  238. virtual const char * getDescription() = 0;
  239. };
  240. interface IExtSecurityManager
  241. {
  242. virtual bool getExtensionTag(ISecUser & user, const char * tagName, StringBuffer & value) = 0;
  243. };
  244. interface IRestartHandler : extends IInterface
  245. {
  246. virtual void Restart() = 0;
  247. };
  248. interface IRestartManager : extends IInterface
  249. {
  250. virtual void setRestartHandler(IRestartHandler * pRestartHandler) = 0;
  251. };
  252. const char* const sec_CompanyName = "sec_company_name";
  253. const char* const sec_CompanyAddress = "sec_company_address";
  254. const char* const sec_CompanyCity = "sec_company_city";
  255. const char* const sec_CompanyState = "sec_company_state";
  256. const char* const sec_CompanyZip = "sec_company_zip";
  257. typedef ISecManager* (*createSecManager_t)(const char *model_name, const char *serviceName, IPropertyTree &config);
  258. typedef IAuthMap* (*createDefaultAuthMap_t)(IPropertyTree* config);
  259. typedef ISecManager* (*newLdapSecManager_t)(const char *serviceName, IPropertyTree &config);
  260. extern "C" SECLIB_API ISecManager *createSecManager(const char *model_name, const char *serviceName, IPropertyTree &config);
  261. extern "C" SECLIB_API IAuthMap *createDefaultAuthMap(IPropertyTree* config);
  262. class SecLibLoader
  263. {
  264. public:
  265. static ISecManager* loadSecManager(const char* model_name, const char* servicename, IPropertyTree* cfg)
  266. {
  267. if(model_name && stricmp(model_name, "LdapSecurity") == 0)
  268. {
  269. HINSTANCE ldapseclib = LoadSharedObject(LDAPSECLIB, true, false);
  270. if(ldapseclib == NULL)
  271. throw MakeStringException(-1, "can't load library %s", LDAPSECLIB);
  272. newLdapSecManager_t xproc = NULL;
  273. xproc = (newLdapSecManager_t)GetSharedProcedure(ldapseclib, "newLdapSecManager");
  274. if (xproc)
  275. return xproc(servicename, *cfg);
  276. else
  277. throw MakeStringException(-1, "procedure newLdapSecManager of %s can't be loaded", LDAPSECLIB);
  278. }
  279. else
  280. {
  281. HINSTANCE seclib = LoadSharedObject(SECLIB, true, false); // ,false,true may actually be more helpful, could delete next two lines.
  282. if(seclib == NULL)
  283. throw MakeStringException(-1, "can't load library %s", SECLIB);
  284. createSecManager_t xproc = NULL;
  285. xproc = (createSecManager_t)GetSharedProcedure(seclib, "createSecManager");
  286. if (xproc)
  287. return xproc(model_name, servicename, *cfg);
  288. else
  289. throw MakeStringException(-1, "procedure createSecManager of %s can't be loaded", SECLIB);
  290. }
  291. }
  292. static IAuthMap* loadDefaultAuthMap(IPropertyTree* cfg)
  293. {
  294. HINSTANCE seclib = LoadSharedObject(SECLIB, true, false); // ,false,true may actually be more helpful.
  295. if(seclib == NULL)
  296. throw MakeStringException(-1, "can't load library %s", SECLIB);
  297. createDefaultAuthMap_t xproc = NULL;
  298. xproc = (createDefaultAuthMap_t)GetSharedProcedure(seclib, "createDefaultAuthMap");
  299. if (xproc)
  300. return xproc(cfg);
  301. else
  302. throw MakeStringException(-1, "procedure createDefaultAuthMap of %s can't be loaded", SECLIB);
  303. }
  304. };
  305. #endif