30 #include <boost/lexical_cast.hpp>
31 #include <boost/function.hpp>
32 #include <boost/any.hpp>
38 #define STATIC_PEP(NAME) static_policy_enforcement_points[#NAME] = NAME
48 irods::error ret{_cb(std::string(
"unsafe_ms_ctx"), &rei)};
50 THROW(ret.code(),
"failed to get rei");
61 THROW(-1,
"null rs_comm");
72 THROW(-1,
"null other user info object");
79 std::string str_array;
81 for(
const auto& elem : boost::any_cast<
const std::vector< boost::any >& >( _array ) ) {
83 str_array += boost::any_cast< const std::string& >( elem );
85 catch (
const boost::bad_any_cast& ) {
88 "%s - failed to cast rule base file name entry to string",
89 __PRETTY_FUNCTION__ );
96 str_array = str_array.substr( 0, str_array.size() - 1 );
98 }
catch (
const boost::bad_any_cast& ) {
101 "failed to any_cast to vector" );
109 return _cb(std::string(
"print_hello"));
114 for(
auto itr : _params ) {
115 if(itr.type() ==
typeid(std::string*)) {
117 *boost::any_cast<std::string*>(itr) =
"CS_NEG_DONT_CARE";
118 }
catch (
const boost::bad_any_cast&
e) {
122 "Bad any_cast in acPreConnect()" );
146 irods::error ret = _cb(std::string(
"acPreProcForCreateUser"));
148 ret = _cb(std::string(
"msiCreateUser"));
150 _cb(std::string(
"msiRollback"));
154 std::string other_user_name;
160 other_user_name = other_user_info.
userName;
163 return ERROR(
e.code(),
"irods exception in acCreateUser");
166 if (other_user_name !=
"anonymous") {
167 ret = _cb(std::string(
"acCreateDefaultCollections"));
169 ret = _cb(std::string(
"msiAddUserToGroup"), std::string(
"public"));
171 _cb(std::string(
"msiRollback"));
176 ret = _cb(std::string(
"msiCommit"));
178 ret = _cb(std::string(
"acPostProcForCreateUser"));
185 irods::error ret = _cb(std::string(
"acCreateUserZoneCollections"));
193 std::string rods_zone_proxy;
194 std::string other_user_name;
201 user_info = rs_comm.proxyUser;
205 rods_zone_proxy = user_info.
rodsZone;
206 other_user_name = other_user_info.
userName;
209 return ERROR(
e.code(),
"irods exception in acCreateDefaultCollections");
212 std::string home_coll =
"/" + rods_zone_proxy +
"/home";
213 std::string trash_coll =
"/" + rods_zone_proxy +
"/trash/home";
215 irods::error ret = _cb(std::string(
"acCreateCollByAdmin"), home_coll, other_user_name);
216 ret = _cb(std::string(
"acCreateCollByAdmin"), trash_coll, other_user_name);
223 std::string parent_coll;
224 std::string child_coll;
226 for (
auto& param: _params) {
228 std::string tmp = boost::any_cast<std::string>(param);
237 }
catch (
const boost::bad_any_cast&
e) {
242 irods::error ret = _cb(std::string(
"msiCreateCollByAdmin"), parent_coll, child_coll);
257 irods::error ret = _cb(std::string(
"acPreProcForDeleteUser"));
259 ret = _cb(std::string(
"acDeleteDefaultCollections"));
261 _cb(std::string(
"msiRollback"));
265 ret = _cb(std::string(
"msiDeleteUser"));
267 _cb(std::string(
"msiRollback"));
271 ret = _cb(std::string(
"msiCommit"));
273 ret = _cb(std::string(
"acPostProcForDeleteUser"));
281 irods::error ret = _cb(std::string(
"acDeleteUserZoneCollections"));
289 std::string rods_zone_proxy;
290 std::string other_user_name;
297 user_info = rs_comm.proxyUser;
301 rods_zone_proxy = user_info.
rodsZone;
302 other_user_name = other_user_info.
userName;
305 return ERROR(
e.code(),
"irods exception in acDeleteDefaultCollections");
308 std::string home_coll =
"/" + rods_zone_proxy +
"/home";
309 std::string trash_coll =
"/" + rods_zone_proxy +
"/trash/home";
311 irods::error ret = _cb(std::string(
"acDeleteCollByAdminIfPresent"), home_coll, other_user_name);
312 ret = _cb(std::string(
"acDeleteCollByAdminIfPresent"), trash_coll, other_user_name);
321 std::string parent_coll;
322 std::string child_coll;
324 for (
auto& param: _params) {
326 std::string tmp = boost::any_cast<std::string>(param);
335 }
catch (
const boost::bad_any_cast&
e) {
336 rodsLog(
LOG_ERROR,
"Bad any cast on param [%d] in acDeleteCollByAdminIfPresent", i);
341 irods::error ret = _cb(std::string(
"acDeleteCollByAdmin"), parent_coll, child_coll);
352 std::string parent_coll;
353 std::string child_coll;
355 for (
auto& param: _params) {
357 std::string tmp = boost::any_cast<std::string>(param);
366 }
catch (
const boost::bad_any_cast&
e) {
371 irods::error ret = _cb(std::string(
"msiDeleteCollByAdmin"), parent_coll, child_coll);
379 irods::error ret = _cb(std::string(
"msiRenameCollection"));
381 _cb(std::string(
"msiRollback"));
385 ret = _cb(std::string(
"msiRenameLocalZone"));
387 _cb(std::string(
"msiRollback"));
391 ret = _cb(std::string(
"msiCommit"));
402 return _cb(std::string(
"msiAclPolicy"), std::string(
"STRICT"));
423 std::string resc_name =
"demoResc";
429 "No default_resource_name in server properties - using 'demoResc'");
432 return _cb(std::string(
"msiSetDefaultResc"), resc_name, std::string(
"null"));
446 std::string resc_name =
"demoResc";
452 "No default_resource_name in server properties - using 'demoResc'");
455 return _cb(std::string(
"msiSetDefaultResc"), resc_name, std::string(
"null"));
496 return _cb(std::string(
"msiSetNumThreads"), std::string(
"default"), std::string(
"64"), std::string(
"default"));
509 return _cb(std::string(
"msiSetChkFilePathPerm"), std::string(
"disallowPathReg"));
526 return _cb(std::string(
"msiSetGraftPathScheme"), std::string(
"no"), std::string(
"1"));
531 return _cb(std::string(
"msiSetReServerNumProc"), std::string(
"default"));
671 return _cb(std::string(
"msiSetRescQuotaPolicy"), std::string(
"off"));
675 return _cb(std::string(
"msiSetBulkPutPostProcPolicy"), std::string(
"off"));
711 std::string session_var;
713 for (
auto& param: _params) {
715 std::string tmp = boost::any_cast<std::string>(param);
723 }
catch (
const boost::bad_any_cast&
e) {
724 rodsLog(
LOG_ERROR,
"Bad any cast on param [%d] in acPreProcForWriteSessionVar", i);
728 if (session_var ==
"status") {
745 irods::error ret = _cb(std::string(
"msiGetNewObjDescriptor"));
747 _cb(std::string(
"recover_msiGetNewObjDescriptor"));
751 ret = _cb(std::string(
"acSetResourceList"));
758 irods::error ret = _cb(std::string(
"msiPhyDataObjCreate"));
760 _cb(std::string(
"recover_msiPhyDataObjCreate"));
764 ret = _cb(std::string(
"acRegisterData"));
766 _cb(std::string(
"msiRollback"));
770 ret = _cb(std::string(
"msiCommit"));
777 return _cb(std::string(
"msiSetResourceList"));
782 return _cb(std::string(
"msiSetCopyNumber"));
789 _cb(std::string(
"msiRollback"));
904 rule_vec.push_back(map_entry.first);
912 const std::string& _rn,
913 std::list<boost::any>& _ps,
918 if(!(err = _eff_hdlr(
"unsafe_ms_ctx", &rei)).ok()) {
929 "[%s] not defined in default rule engine",
936 auto collapse_error_stack(
rError_t& _error) -> std::string {
937 std::stringstream ss;
938 for(
int i = 0; i < _error.len; ++i) {
941 ss <<
"status: " << err_msg->
status <<
" ";
944 ss << err_msg->
msg <<
" - ";
951 const std::string& _action,
952 std::list<boost::any>& _args) {
962 std::string msg = collapse_error_stack(_rei->
rsComm->
rError);
975 const std::string& _rule_text,
977 const std::string& _out_desc,
984 if(!(err = _eff_hdlr(
"unsafe_ms_ctx", &rei)).ok()) {
990 std::string rule_text{_rule_text};
991 if(_rule_text.find(
"@external") != std::string::npos) {
992 rule_text = _rule_text.substr(10);
995 auto rule{json::parse(rule_text)};
996 std::string policy = rule[
"policy"];
1000 "exec_rule_text : policy is not supported");
1003 auto payload{rule[
"payload"]};
1004 if(payload.empty()) {
1007 "exec_rule_text : payload is empty");
1010 if(
"irods_policy_enqueue_rule" == policy) {
1011 std::string delay_cond{rule[
"delay_conditions"]};
1013 const auto err =
_delayExec(payload.dump().c_str(),
"",
1014 delay_cond.c_str(), rei);
1016 return ERROR(err,
"delayExec failed");
1020 std::string policy_to_invoke{payload[
"policy_to_invoke"]};
1021 std::string parameter_string{payload[
"parameters"].dump()};
1022 std::string configuration_string{payload[
"configuration"].dump()};
1024 std::list<boost::any> arguments;
1025 arguments.push_back(boost::any(std::ref(parameter_string)));
1026 arguments.push_back(boost::any(std::ref(configuration_string)));
1028 invoke_policy(rei, policy_to_invoke, arguments);
1031 catch(
const json::exception&
e) {
1049 catch(
const std::exception&
e) {
1065 const std::string& _rule_text,
1073 if(!(err = _eff_hdlr(
"unsafe_ms_ctx", &rei)).ok()) {
1078 json rule{json::parse(_rule_text)};
1079 std::string policy = rule[
"policy"];
1080 if(policy.empty() ||
"irods_policy_execute_rule" != policy) {
1083 "exec_rule_text is not supported");
1086 auto payload{rule[
"payload"]};
1087 if(payload.empty()) {
1090 "exec_rule_text is not supported");
1093 std::string policy_to_invoke{payload[
"policy_to_invoke"]};
1094 std::string parameter_string{payload[
"parameters"].dump()};
1095 std::string configuration_string{payload[
"configuration"].dump()};
1097 std::list<boost::any> arguments;
1098 arguments.push_back(boost::any(std::ref(parameter_string)));
1099 arguments.push_back(boost::any(std::ref(configuration_string)));
1100 invoke_policy(rei, policy_to_invoke, arguments);
1102 catch(
const json::exception&
e) {
1120 catch(
const std::exception&
e) {
1135 const std::string& _context ) {