From: <di...@us...> - 2013-08-04 15:19:34
|
Revision: 58455 http://sourceforge.net/p/firebird/code/58455 Author: dimitr Date: 2013-08-04 15:19:31 +0000 (Sun, 04 Aug 2013) Log Message: ----------- Fixed CORE-4164: Owner name is missing for generators/exceptions restored from a backup. Also propagated the sysflag/owner/secclass assignment and validation to all object types and wiped out the duplicating system triggers. Warning: testing is required! Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/include/gen/codetext.h firebird/trunk/src/include/gen/iberror.h firebird/trunk/src/include/gen/msgs.h firebird/trunk/src/include/gen/sql_code.h firebird/trunk/src/include/gen/sql_state.h firebird/trunk/src/jrd/ini.epp firebird/trunk/src/jrd/trig.h firebird/trunk/src/jrd/vio.cpp firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2013-08-04 15:19:31 UTC (rev 58455) @@ -1526,6 +1526,8 @@ PARAMETER (GDS__include_depth = 335545056) INTEGER*4 GDS__include_miss PARAMETER (GDS__include_miss = 335545057) + INTEGER*4 GDS__protect_ownership + PARAMETER (GDS__protect_ownership = 335545058) INTEGER*4 GDS__gfix_db_name PARAMETER (GDS__gfix_db_name = 335740929) INTEGER*4 GDS__gfix_invalid_sw Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/lang_helpers/gds_codes.pas 2013-08-04 15:19:31 UTC (rev 58455) @@ -770,6 +770,7 @@ gds_conf_include = 335545055; gds_include_depth = 335545056; gds_include_miss = 335545057; + gds_protect_ownership = 335545058; gds_gfix_db_name = 335740929; gds_gfix_invalid_sw = 335740930; gds_gfix_incmp_sw = 335740932; Modified: firebird/trunk/src/include/gen/codetext.h =================================================================== --- firebird/trunk/src/include/gen/codetext.h 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/include/gen/codetext.h 2013-08-04 15:19:31 UTC (rev 58455) @@ -759,6 +759,7 @@ {"conf_include", 335545055}, {"include_depth", 335545056}, {"include_miss", 335545057}, + {"protect_ownership", 335545058}, {"gfix_db_name", 335740929}, {"gfix_invalid_sw", 335740930}, {"gfix_incmp_sw", 335740932}, Modified: firebird/trunk/src/include/gen/iberror.h =================================================================== --- firebird/trunk/src/include/gen/iberror.h 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/include/gen/iberror.h 2013-08-04 15:19:31 UTC (rev 58455) @@ -793,6 +793,7 @@ const ISC_STATUS isc_conf_include = 335545055L; const ISC_STATUS isc_include_depth = 335545056L; const ISC_STATUS isc_include_miss = 335545057L; +const ISC_STATUS isc_protect_ownership = 335545058L; const ISC_STATUS isc_gfix_db_name = 335740929L; const ISC_STATUS isc_gfix_invalid_sw = 335740930L; const ISC_STATUS isc_gfix_incmp_sw = 335740932L; @@ -1237,7 +1238,7 @@ const ISC_STATUS isc_trace_switch_param_miss = 337182758L; const ISC_STATUS isc_trace_param_act_notcompat = 337182759L; const ISC_STATUS isc_trace_mandatory_switch_miss = 337182760L; -const ISC_STATUS isc_err_max = 1181; +const ISC_STATUS isc_err_max = 1182; #else /* c definitions */ @@ -2000,6 +2001,7 @@ #define isc_conf_include 335545055L #define isc_include_depth 335545056L #define isc_include_miss 335545057L +#define isc_protect_ownership 335545058L #define isc_gfix_db_name 335740929L #define isc_gfix_invalid_sw 335740930L #define isc_gfix_incmp_sw 335740932L @@ -2444,7 +2446,7 @@ #define isc_trace_switch_param_miss 337182758L #define isc_trace_param_act_notcompat 337182759L #define isc_trace_mandatory_switch_miss 337182760L -#define isc_err_max 1181 +#define isc_err_max 1182 #endif Modified: firebird/trunk/src/include/gen/msgs.h =================================================================== --- firebird/trunk/src/include/gen/msgs.h 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/include/gen/msgs.h 2013-08-04 15:19:31 UTC (rev 58455) @@ -762,6 +762,7 @@ {335545055, "Invalid include operator in @1 for <@2>"}, /* conf_include */ {335545056, "Include depth too big"}, /* include_depth */ {335545057, "File to include not found"}, /* include_miss */ + {335545058, "Only the owner can change the ownership"}, /* protect_ownership */ {335740929, "data base file name (@1) already given"}, /* gfix_db_name */ {335740930, "invalid switch @1"}, /* gfix_invalid_sw */ {335740932, "incompatible switch combination"}, /* gfix_incmp_sw */ Modified: firebird/trunk/src/include/gen/sql_code.h =================================================================== --- firebird/trunk/src/include/gen/sql_code.h 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/include/gen/sql_code.h 2013-08-04 15:19:31 UTC (rev 58455) @@ -758,6 +758,7 @@ {335545055, -902}, /* 735 conf_include */ {335545056, -902}, /* 736 include_depth */ {335545057, -902}, /* 737 include_miss */ + {335545058, -552}, /* 738 protect_ownership */ {335740929, -901}, /* 1 gfix_db_name */ {335740930, -901}, /* 2 gfix_invalid_sw */ {335740932, -901}, /* 4 gfix_incmp_sw */ Modified: firebird/trunk/src/include/gen/sql_state.h =================================================================== --- firebird/trunk/src/include/gen/sql_state.h 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/include/gen/sql_state.h 2013-08-04 15:19:31 UTC (rev 58455) @@ -758,6 +758,7 @@ {335545055, "XX000"}, // 735 conf_include {335545056, "XX000"}, // 736 include_depth {335545057, "XX000"}, // 737 include_miss + {335545058, "28000"}, // 738 protect_ownership {335740929, "00000"}, // 1 gfix_db_name {335740930, "00000"}, // 2 gfix_invalid_sw {335740932, "00000"}, // 4 gfix_incmp_sw Modified: firebird/trunk/src/jrd/ini.epp =================================================================== --- firebird/trunk/src/jrd/ini.epp 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/jrd/ini.epp 2013-08-04 15:19:31 UTC (rev 58455) @@ -105,15 +105,6 @@ { "RDB$TRIGGER_3", (UCHAR) nam_trgs, RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_ERASE, sizeof(trigger4), trigger4, 0, ODS_8_0 }, - { "RDB$TRIGGER_4", (UCHAR) nam_relations, - RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_STORE, sizeof(trigger5), trigger5, - 0, ODS_8_0 }, - { "RDB$TRIGGER_5", (UCHAR) nam_relations, - RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_MODIFY, sizeof(trigger6), trigger6, - 0, ODS_8_0 }, - { "RDB$TRIGGER_6", (UCHAR) nam_gens, - RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_STORE, sizeof(trigger7), trigger7, - 0, ODS_8_0 }, { "RDB$TRIGGER_26", (UCHAR) nam_rel_constr, RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_STORE, sizeof(trigger26), trigger26, 0, ODS_8_0 }, @@ -168,15 +159,6 @@ { "RDB$TRIGGER_27", (UCHAR) nam_r_fields, RDB$TRIGGERS.RDB$TRIGGER_TYPE.POST_ERASE, sizeof(trigger27), trigger27, 0, ODS_8_0 }, - { "RDB$TRIGGER_28", (UCHAR) nam_procedures, - RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_STORE, sizeof(trigger28), trigger28, - 0, ODS_8_0 }, - { "RDB$TRIGGER_29", (UCHAR) nam_procedures, - RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_MODIFY, sizeof(trigger29), - trigger29, 0, ODS_8_0 }, - { "RDB$TRIGGER_30", (UCHAR) nam_exceptions, - RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_STORE, sizeof(trigger30), trigger30, - 0, ODS_8_0 }, { "RDB$TRIGGER_31", (UCHAR) nam_user_privileges, RDB$TRIGGERS.RDB$TRIGGER_TYPE.PRE_MODIFY, sizeof(trigger31), trigger31, 0, ODS_8_1 }, @@ -212,7 +194,6 @@ { "RDB$TRIGGER_1", 0, "existing_priv_mod", ODS_8_0 }, { "RDB$TRIGGER_2", 0, "systrig_update", ODS_8_0 }, { "RDB$TRIGGER_3", 0, "systrig_update", ODS_8_0 }, - { "RDB$TRIGGER_5", 0, "not_rel_owner", ODS_8_0 }, { "RDB$TRIGGER_24", 1, "cnstrnt_fld_rename", ODS_8_0 }, { "RDB$TRIGGER_23", 1, "cnstrnt_fld_del", ODS_8_0 }, { "RDB$TRIGGER_22", 1, "check_trig_update", ODS_8_0 }, Modified: firebird/trunk/src/jrd/trig.h =================================================================== --- firebird/trunk/src/jrd/trig.h 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/jrd/trig.h 2013-08-04 15:19:31 UTC (rev 58455) @@ -1106,68 +1106,6 @@ }; -static const UCHAR trigger5[] = -{ - blr_version5, - blr_if, - blr_missing, - blr_field, 1, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_assignment, - blr_upcase, - blr_user_name, - blr_field, 1, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_end, - blr_eoc -}; - - -/****** -static const TEXT trigger_6_msg_0 [] = "only the owner of a relation may reassign ownership"; -******/ - -static const UCHAR trigger6[] = -{ - blr_version5, - blr_if, - blr_and, - blr_neq, - blr_field, 0, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_field, 1, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_neq, - blr_field, 0, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_upcase, - blr_user_name, - blr_leave, 0, - blr_end, - blr_eoc -}; - - -static const UCHAR trigger7[] = -{ - blr_version5, - blr_begin, - blr_if, - blr_missing, - blr_field, 1, 16, 'R', 'D', 'B', '$', 'G', 'E', 'N', 'E', 'R', 'A', 'T', - 'O', 'R', '_', 'I', 'D', - blr_assignment, - blr_gen_id, 14, 'R', 'D', 'B', '$', 'G', 'E', 'N', 'E', 'R', 'A', 'T', - 'O', 'R', 'S', - blr_literal, blr_long, 0, 1, 0, 0, 0, - blr_field, 1, 16, 'R', 'D', 'B', '$', 'G', 'E', 'N', 'E', 'R', 'A', 'T', - 'O', 'R', '_', 'I', 'D', - blr_end, - blr_end, - blr_eoc -}; - - /* define trigger add_constraint for rdb$relation_constraints */ /****** @@ -2444,77 +2382,6 @@ }; -static const UCHAR trigger28[] = -{ - blr_version5, - blr_begin, - blr_if, - blr_missing, - blr_field, 1, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_assignment, - blr_upcase, - blr_user_name, - blr_field, 1, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_end, - blr_if, - blr_missing, - blr_field, 1, 16, 'R', 'D', 'B', '$', 'P', 'R', 'O', 'C', 'E', 'D', 'U', - 'R', 'E', '_', 'I', 'D', - blr_assignment, - blr_gen_id, 14, 'R', 'D', 'B', '$', 'P', 'R', 'O', 'C', 'E', 'D', 'U', - 'R', 'E', 'S', - blr_literal, blr_long, 0, 1, 0, 0, 0, - blr_field, 1, 16, 'R', 'D', 'B', '$', 'P', 'R', 'O', 'C', 'E', 'D', 'U', - 'R', 'E', '_', 'I', 'D', - blr_end, - blr_end, - blr_eoc -}; - - -static const UCHAR trigger29[] = -{ - blr_version5, - blr_if, - blr_and, - blr_neq, - blr_field, 0, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_field, 1, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_neq, - blr_field, 0, 14, 'R', 'D', 'B', '$', 'O', 'W', 'N', 'E', 'R', '_', 'N', - 'A', 'M', 'E', - blr_upcase, - blr_user_name, - blr_leave, 0, - blr_end, - blr_eoc -}; - - -static const UCHAR trigger30[] = -{ - blr_version5, - blr_begin, - blr_if, - blr_missing, - blr_field, 1, 20, 'R', 'D', 'B', '$', 'E', 'X', 'C', 'E', 'P', 'T', 'I', - 'O', 'N', '_', 'N', 'U', 'M', 'B', 'E', 'R', - blr_assignment, - blr_gen_id, 14, 'R', 'D', 'B', '$', 'E', 'X', 'C', 'E', 'P', 'T', 'I', - 'O', 'N', 'S', - blr_literal, blr_long, 0, 1, 0, 0, 0, - blr_field, 1, 20, 'R', 'D', 'B', '$', 'E', 'X', 'C', 'E', 'P', 'T', 'I', - 'O', 'N', '_', 'N', 'U', 'M', 'B', 'E', 'R', - blr_end, - blr_end, - blr_eoc -}; - - /* new trigger to create ODS 8.1 (and to upgrade from ODS 8.0 to ODS 8.1 */ static const UCHAR trigger31[] = { Modified: firebird/trunk/src/jrd/vio.cpp =================================================================== --- firebird/trunk/src/jrd/vio.cpp 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/jrd/vio.cpp 2013-08-04 15:19:31 UTC (rev 58455) @@ -96,6 +96,7 @@ using namespace Firebird; static void check_class(thread_db*, jrd_tra*, record_param*, record_param*, USHORT); +static void check_owner(thread_db*, jrd_tra*, record_param*, record_param*, USHORT); static bool check_user(thread_db*, const dsc*); static int check_precommitted(const jrd_tra*, const record_param*); static void check_rel_field_class(thread_db*, record_param*, SecurityClass::flags_t, jrd_tra*); @@ -161,8 +162,9 @@ static Record* replace_gc_record(jrd_rel*, Record**, USHORT); static void replace_record(thread_db*, record_param*, PageStack*, const jrd_tra*); static SSHORT set_metadata_id(thread_db*, Record*, USHORT, drq_type_t, const char*); +static void set_owner_name(thread_db*, Record*, USHORT); static void set_security_class(thread_db*, Record*, USHORT); -static void set_system_flag(thread_db*, Record*, USHORT, SSHORT); +static void set_system_flag(thread_db*, Record*, USHORT); static void update_in_place(thread_db*, jrd_tra*, record_param*, record_param*); static void verb_post(thread_db*, jrd_tra*, record_param*, Record*, const bool, const bool); @@ -2361,6 +2363,7 @@ EVL_field(0, org_rpb->rpb_record, f_rel_name, &desc1); SCL_check_relation(tdbb, &desc1, SCL_alter); check_class(tdbb, transaction, org_rpb, new_rpb, f_rel_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_rel_owner); DFW_post_work(transaction, dfw_update_format, &desc1, 0); break; @@ -2368,6 +2371,7 @@ if (EVL_field(0, org_rpb->rpb_record, f_pkg_name, &desc1)) SCL_check_package(tdbb, &desc1, SCL_alter); check_class(tdbb, transaction, org_rpb, new_rpb, f_pkg_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_pkg_owner); break; case rel_procedures: @@ -2384,6 +2388,7 @@ } check_class(tdbb, transaction, org_rpb, new_rpb, f_prc_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_prc_owner); if (dfw_should_know(org_rpb, new_rpb, f_prc_desc, true)) { @@ -2407,6 +2412,7 @@ } check_class(tdbb, transaction, org_rpb, new_rpb, f_fun_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_fun_owner); if (dfw_should_know(org_rpb, new_rpb, f_fun_desc, true)) { @@ -2420,6 +2426,8 @@ EVL_field(0, org_rpb->rpb_record, f_gen_name, &desc1); MOV_get_metaname(&desc1, object_name); SCL_check_generator(tdbb, object_name, SCL_alter); + check_class(tdbb, transaction, org_rpb, new_rpb, f_gen_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_gen_owner); break; case rel_rfr: @@ -2479,6 +2487,8 @@ if ((!rc1 || MOV_get_long(&desc3, 0) == 0) && rc2 && MOV_get_long(&desc4, 0) != 0) DFW_post_work_arg(transaction, dw, &desc2, 0, dfw_arg_field_not_null); } + check_class(tdbb, transaction, org_rpb, new_rpb, f_fld_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_fld_owner); break; case rel_classes: @@ -2553,18 +2563,24 @@ EVL_field(0, new_rpb->rpb_record, f_cs_cs_name, &desc1); MOV_get_metaname(&desc1, object_name); SCL_check_charset(tdbb, object_name, SCL_alter); + check_class(tdbb, transaction, org_rpb, new_rpb, f_cs_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_cs_owner); break; case rel_collations: EVL_field(0, new_rpb->rpb_record, f_coll_name, &desc1); MOV_get_metaname(&desc1, object_name); SCL_check_collation(tdbb, object_name, SCL_alter); + check_class(tdbb, transaction, org_rpb, new_rpb, f_coll_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_coll_owner); break; case rel_exceptions: EVL_field(0, new_rpb->rpb_record, f_xcp_name, &desc1); MOV_get_metaname(&desc1, object_name); SCL_check_exception(tdbb, object_name, SCL_alter); + check_class(tdbb, transaction, org_rpb, new_rpb, f_xcp_class); + check_owner(tdbb, transaction, org_rpb, new_rpb, f_xcp_owner); break; default: @@ -2874,8 +2890,11 @@ * **************************************/ SET_TDBB(tdbb); - jrd_req* request = tdbb->getRequest(); + jrd_req* const request = tdbb->getRequest(); + DeferredWork* work = NULL; + MetaName package_name; + USHORT object_id; #ifdef VIO_DEBUG VIO_trace(DEBUG_WRITES, @@ -2896,24 +2915,28 @@ EVL_field(0, rpb->rpb_record, f_rel_name, &desc); DFW_post_work(transaction, dfw_create_relation, &desc, 0); DFW_post_work(transaction, dfw_update_format, &desc, 0); - set_system_flag(tdbb, rpb->rpb_record, f_rel_sys_flag, 0); + set_system_flag(tdbb, rpb->rpb_record, f_rel_sys_flag); + set_security_class(tdbb, rpb->rpb_record, f_rel_class); + set_owner_name(tdbb, rpb->rpb_record, f_rel_owner); break; case rel_packages: - set_system_flag(tdbb, rpb->rpb_record, f_pkg_sys_flag, 0); + set_system_flag(tdbb, rpb->rpb_record, f_pkg_sys_flag); + set_security_class(tdbb, rpb->rpb_record, f_pkg_class); + set_owner_name(tdbb, rpb->rpb_record, f_pkg_owner); break; case rel_procedures: EVL_field(0, rpb->rpb_record, f_prc_name, &desc); - { // scope - MetaName package_name; - if (EVL_field(0, rpb->rpb_record, f_prc_pkg_name, &desc2)) - MOV_get_metaname(&desc2, package_name); - EVL_field(0, rpb->rpb_record, f_prc_id, &desc2); - const USHORT id = MOV_get_long(&desc2, 0); - work = DFW_post_work(transaction, dfw_create_procedure, &desc, id, package_name); + if (EVL_field(0, rpb->rpb_record, f_prc_pkg_name, &desc2)) + MOV_get_metaname(&desc2, package_name); + object_id = set_metadata_id(tdbb, rpb->rpb_record, + f_prc_id, drq_g_nxt_prc_id, "RDB$PROCEDURES"); + work = DFW_post_work(transaction, dfw_create_procedure, &desc, object_id, package_name); + + { // scope bool check_blr = true; if (EVL_field(0, rpb->rpb_record, f_prc_valid_blr, &desc2)) check_blr = MOV_get_long(&desc2, 0) != 0; @@ -2921,22 +2944,23 @@ if (check_blr) DFW_post_work_arg(transaction, work, NULL, 0, dfw_arg_check_blr); } // scope - set_system_flag(tdbb, rpb->rpb_record, f_prc_sys_flag, 0); + + set_system_flag(tdbb, rpb->rpb_record, f_prc_sys_flag); + set_security_class(tdbb, rpb->rpb_record, f_prc_class); + set_owner_name(tdbb, rpb->rpb_record, f_prc_owner); break; case rel_funs: EVL_field(0, rpb->rpb_record, f_fun_name, &desc); - { // scope - MetaName package_name; - if (EVL_field(0, rpb->rpb_record, f_fun_pkg_name, &desc2)) - MOV_get_metaname(&desc2, package_name); - const USHORT id = - set_metadata_id(tdbb, rpb->rpb_record, f_fun_id, drq_g_nxt_fun_id, "RDB$FUNCTIONS"); - work = DFW_post_work(transaction, dfw_create_function, &desc, id, package_name); + if (EVL_field(0, rpb->rpb_record, f_fun_pkg_name, &desc2)) + MOV_get_metaname(&desc2, package_name); - set_security_class(tdbb, rpb->rpb_record, f_fun_class); + object_id = set_metadata_id(tdbb, rpb->rpb_record, + f_fun_id, drq_g_nxt_fun_id, "RDB$FUNCTIONS"); + work = DFW_post_work(transaction, dfw_create_function, &desc, object_id, package_name); + { // scope bool check_blr = true; if (EVL_field(0, rpb->rpb_record, f_fun_valid_blr, &desc2)) check_blr = MOV_get_long(&desc2, 0) != 0; @@ -2944,7 +2968,10 @@ if (check_blr) DFW_post_work_arg(transaction, work, NULL, 0, dfw_arg_check_blr); } // scope - set_system_flag(tdbb, rpb->rpb_record, f_fun_sys_flag, 0); + + set_system_flag(tdbb, rpb->rpb_record, f_fun_sys_flag); + set_security_class(tdbb, rpb->rpb_record, f_fun_class); + set_owner_name(tdbb, rpb->rpb_record, f_fun_owner); break; case rel_indices: @@ -2959,13 +2986,14 @@ else { DFW_post_work(transaction, dfw_create_index, &desc, tdbb->getDatabase()->dbb_max_idx); } + set_system_flag(tdbb, rpb->rpb_record, f_idx_sys_flag); break; case rel_rfr: EVL_field(0, rpb->rpb_record, f_rfr_rname, &desc); SCL_check_relation(tdbb, &desc, SCL_control); DFW_post_work(transaction, dfw_update_format, &desc, 0); - set_system_flag(tdbb, rpb->rpb_record, f_rfr_sys_flag, 0); + set_system_flag(tdbb, rpb->rpb_record, f_rfr_sys_flag); break; case rel_classes: @@ -2976,8 +3004,9 @@ case rel_fields: EVL_field(0, rpb->rpb_record, f_fld_name, &desc); DFW_post_work(transaction, dfw_create_field, &desc, 0); - set_system_flag(tdbb, rpb->rpb_record, f_fld_sys_flag, 0); + set_system_flag(tdbb, rpb->rpb_record, f_fld_sys_flag); set_security_class(tdbb, rpb->rpb_record, f_fld_class); + set_owner_name(tdbb, rpb->rpb_record, f_fld_owner); break; case rel_files: @@ -3016,9 +3045,8 @@ EVL_field(0, rpb->rpb_record, f_trg_rname, &desc); // check if this request go through without checking permissions - if (!(request->getStatement()->flags & JrdStatement::FLAG_IGNORE_PERM)) { + if (!(request->getStatement()->flags & JrdStatement::FLAG_IGNORE_PERM)) SCL_check_relation(tdbb, &desc, SCL_control); - } if (EVL_field(0, rpb->rpb_record, f_trg_rname, &desc2)) DFW_post_work(transaction, dfw_update_format, &desc2, 0); @@ -3034,16 +3062,14 @@ DFW_post_work_arg(transaction, work, &desc2, (USHORT) MOV_get_int64(&desc2, 0), dfw_arg_trg_type); } - + set_system_flag(tdbb, rpb->rpb_record, f_trg_sys_flag); break; case rel_priv: EVL_field(0, rpb->rpb_record, f_prv_rname, &desc); EVL_field(0, rpb->rpb_record, f_prv_o_type, &desc2); - { // scope - const USHORT id = MOV_get_long(&desc2, 0); - DFW_post_work(transaction, dfw_grant, &desc, id); - } // scope + object_id = MOV_get_long(&desc2, 0); + DFW_post_work(transaction, dfw_grant, &desc, object_id); break; case rel_vrel: @@ -3062,24 +3088,33 @@ case rel_gens: EVL_field(0, rpb->rpb_record, f_gen_name, &desc); EVL_field(0, rpb->rpb_record, f_gen_id, &desc2); - { - const USHORT id = MOV_get_long(&desc2, 0); - transaction->getGenIdCache()->put(id, 0); - DFW_post_work(transaction, dfw_set_generator, &desc, id); - } + object_id = set_metadata_id(tdbb, rpb->rpb_record, + f_gen_id, drq_g_nxt_gen_id, "RDB$GENERATORS"); + transaction->getGenIdCache()->put(object_id, 0); + DFW_post_work(transaction, dfw_set_generator, &desc, object_id); + set_system_flag(tdbb, rpb->rpb_record, f_gen_sys_flag); set_security_class(tdbb, rpb->rpb_record, f_gen_class); + set_owner_name(tdbb, rpb->rpb_record, f_gen_owner); break; case rel_charsets: + set_system_flag(tdbb, rpb->rpb_record, f_cs_sys_flag); set_security_class(tdbb, rpb->rpb_record, f_cs_class); + set_owner_name(tdbb, rpb->rpb_record, f_cs_owner); break; case rel_collations: + set_system_flag(tdbb, rpb->rpb_record, f_coll_sys_flag); set_security_class(tdbb, rpb->rpb_record, f_coll_class); + set_owner_name(tdbb, rpb->rpb_record, f_coll_owner); break; case rel_exceptions: + set_metadata_id(tdbb, rpb->rpb_record, + f_xcp_number, drq_g_nxt_xcp_id, "RDB$EXCEPTIONS"); + set_system_flag(tdbb, rpb->rpb_record, f_xcp_sys_flag); set_security_class(tdbb, rpb->rpb_record, f_xcp_class); + set_owner_name(tdbb, rpb->rpb_record, f_xcp_owner); break; default: // Shut up compiler warnings @@ -3788,6 +3823,40 @@ } +static void check_owner(thread_db* tdbb, + jrd_tra* transaction, + record_param* old_rpb, record_param* new_rpb, USHORT id) +{ +/************************************** + * + * c h e c k _ o w n e r + * + ************************************** + * + * Functional description + * A record in a system relation containing an owner is + * being changed. Check to see if the owner has changed, + * and if so, validate whether this action is allowed. + * + **************************************/ + SET_TDBB(tdbb); + + DSC desc1, desc2; + EVL_field(0, old_rpb->rpb_record, id, &desc1); + EVL_field(0, new_rpb->rpb_record, id, &desc2); + if (!MOV_compare(&desc1, &desc2)) + return; + + const Jrd::Attachment* const attachment = tdbb->getAttachment(); + const Firebird::MetaName name(attachment->att_user->usr_user_name); + desc2.makeText((USHORT) name.length(), CS_METADATA, (UCHAR*) name.c_str()); + if (!MOV_compare(&desc1, &desc2)) + return; + + ERR_post(Arg::Gds(isc_protect_ownership)); +} + + static bool check_user(thread_db* tdbb, const dsc* desc) { /************************************** @@ -5393,9 +5462,7 @@ dsc desc1; if (EVL_field(0, record, field_id, &desc1)) - { return MOV_get_long(&desc1, 0); - } SSHORT value = (SSHORT) DYN_UTIL_gen_unique_id(tdbb, dyn_id, name); dsc desc2; @@ -5406,6 +5473,32 @@ } +static void set_owner_name(thread_db* tdbb, Record* record, USHORT field_id) +{ +/************************************** + * + * s e t _ o w n e r _ n a m e + * + ************************************** + * + * Functional description + * Set the owner name for the metadata object. + * + **************************************/ + dsc desc1; + + if (!EVL_field(0, record, field_id, &desc1)) + { + const Jrd::Attachment* const attachment = tdbb->getAttachment(); + const Firebird::MetaName name(attachment->att_user->usr_user_name); + dsc desc2; + desc2.makeText((USHORT) name.length(), CS_METADATA, (UCHAR*) name.c_str()); + MOV_move(tdbb, &desc2, &desc1); + record->clearNull(field_id); + } +} + + static void set_security_class(thread_db* tdbb, Record* record, USHORT field_id) { /************************************** @@ -5433,7 +5526,7 @@ } -static void set_system_flag(thread_db* tdbb, Record* record, USHORT field_id, SSHORT flag) +static void set_system_flag(thread_db* tdbb, Record* record, USHORT field_id) { /************************************** * @@ -5447,14 +5540,14 @@ **************************************/ dsc desc1; - if (EVL_field(0, record, field_id, &desc1)) { - return; + if (!EVL_field(0, record, field_id, &desc1)) + { + SSHORT flag = 0; + dsc desc2; + desc2.makeShort(0, &flag); + MOV_move(tdbb, &desc2, &desc1); + record->clearNull(field_id); } - - dsc desc2; - desc2.makeShort(0, &flag); - MOV_move(tdbb, &desc2, &desc1); - record->clearNull(field_id); } Modified: firebird/trunk/src/msgs/facilities2.sql =================================================================== --- firebird/trunk/src/msgs/facilities2.sql 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/msgs/facilities2.sql 2013-08-04 15:19:31 UTC (rev 58455) @@ -1,7 +1,7 @@ /* MAX_NUMBER is the next number to be used, always one more than the highest message number. */ set bulk_insert INSERT INTO FACILITIES (LAST_CHANGE, FACILITY, FAC_CODE, MAX_NUMBER) VALUES (?, ?, ?, ?); -- -('2013-03-26 17:52:41', 'JRD', 0, 738) +('2013-03-26 17:52:41', 'JRD', 0, 739) ('2012-01-23 20:10:30', 'QLI', 1, 532) ('2009-07-16 05:26:11', 'GFIX', 3, 121) ('1996-11-07 13:39:40', 'GPRE', 4, 1) Modified: firebird/trunk/src/msgs/messages2.sql =================================================================== --- firebird/trunk/src/msgs/messages2.sql 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/msgs/messages2.sql 2013-08-04 15:19:31 UTC (rev 58455) @@ -845,6 +845,7 @@ ('conf_include', NULL, 'config_file.cpp', NULL, 0, 735, NULL, 'Invalid include operator in @1 for <@2>', NULL, NULL); ('include_depth', NULL, 'config_file.cpp', NULL, 0, 736, NULL, 'Include depth too big', NULL, NULL); ('include_miss', NULL, 'config_file.cpp', NULL, 0, 737, NULL, 'File to include not found', NULL, NULL); +('protect_ownership', 'check_owner', 'vio.cpp', NULL, 0, 738, NULL, 'Only the owner can change the ownership', NULL, NULL); -- QLI (NULL, NULL, NULL, NULL, 1, 0, NULL, 'expected type', NULL, NULL); (NULL, NULL, NULL, NULL, 1, 1, NULL, 'bad block type', NULL, NULL); Modified: firebird/trunk/src/msgs/system_errors2.sql =================================================================== --- firebird/trunk/src/msgs/system_errors2.sql 2013-08-04 11:12:49 UTC (rev 58454) +++ firebird/trunk/src/msgs/system_errors2.sql 2013-08-04 15:19:31 UTC (rev 58455) @@ -744,6 +744,7 @@ (-902, 'XX', '000', 0, 735, 'conf_include', NULL, NULL) (-902, 'XX', '000', 0, 736, 'include_depth', NULL, NULL) (-902, 'XX', '000', 0, 737, 'include_miss', NULL, NULL) +(-552, '28', '000', 0, 738, 'protect_ownership', NULL, NULL) -- GFIX (-901, '00', '000', 3, 1, 'gfix_db_name', NULL, NULL) (-901, '00', '000', 3, 2, 'gfix_invalid_sw', NULL, NULL) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |