" ; * _ all "TAB" characters (chr(10)) are replaced by "
" ; * _ all spaces are replaced by " ". * * @param * $var : variable to display * @return * string easy to display in Piwigo */ function str_from_var($var) { return '

'. str_replace( chr(10),'
', str_replace(' ',' ', print_r /* var_dump */ ($var,true)) ). '

'; } /* * ec_inspect() * goes through ec_lists['ec_table'] to check errors on (multiple) entries * using the same code. Cannot really be used elsewhere than here in * build_ec_table() . * * @param * * @return * (no return value) */ function ec_inspect($checked_item, $new_action, $check_ec_nok = true) { global $ec_lists; $first = array(); $to_correct = array(); /* // $to_correct is needed cause following code would not work everywhere : foreach ($table as $value) { if ($value == $value_to_check and $value == $problem) { foreach ($table as &$value2) { // key index of $table can be reset if ($value2 == $value_to_check) { $value2 = $better_value; } } } } // It works with WinAmp Server, but not on Apache server of Free (french // Internet provider). */ foreach ($ec_lists['ec_table'] as $ec_entry) { $ec_current_code = $ec_entry['code']; if ( $ec_entry['action'] == 'ec_ok' or ($check_ec_nok and $ec_entry['action'] == 'ec_nok') ) { if (isset($first[$ec_current_code])) { // $first[$ec_current_code] is set <=> code has already been met. // Checked item MUST be equal to the first item (thus all items) for // this code. if ( $first[$ec_current_code] != $ec_entry[$checked_item] or ($new_action == '' and $ec_entry[$checked_item] == 'true') ) $to_correct[$ec_current_code] = true; // value not used in fact // but using $ec_current_code as a key makes a smaller table } // if the error comes back several times else $first[$ec_current_code] = $ec_entry[$checked_item]; } } foreach ($ec_lists['ec_table'] as &$ec_entry) { // & is needed here if (isset($to_correct[$ec_entry['code']])) { if ($new_action == '') { if (!pwg_query(" UPDATE `".EVNTCATS_TABLE."` SET `forced` = 'false' WHERE `id` = ".$ec_entry['id'] )) die('Could not fix a "_f_pb"'); $ec_entry['forced'] = 'false'; } else $ec_entry['action'] = $new_action; } } } // Compatibility to Piwigo 2.2 , where this function disappeared /** returns the argument_ids array with new sequenced keys based on related * names. Sequence is not case sensitive. * Warning: By definition, this function breaks original keys */ function ec_order_by_name($element_ids,$name) { $ordered_element_ids = array(); foreach ($element_ids as $k_id => $element_id) { $key = strtolower($name[$element_id]) .'-'. $name[$element_id] .'-'. $k_id; $ordered_element_ids[$key] = $element_id; } ksort($ordered_element_ids); return $ordered_element_ids; } // +-----------------------------------------------------------------------+ // | Tables building functions | // +-----------------------------------------------------------------------+ /* * build_ec_addp() * builds $ec_lists['add_pages']. * * @param * (no parameter) * @return * (no return value) */ function build_ec_addp() { global $ec_lists; $ec_lists['add_pages'] = array(); if (defined('ADD_PAGES_TABLE')) { $res = pwg_query("SELECT `id`, `title` FROM `".ADD_PAGES_TABLE."`;"); while ($r = mysql_fetch_array($res)) { $a = (is_in($r['title'], '/user_id=')) ? explode('/user_id=' , $r['title']) : array($r['title']); $b = (is_in($a[0], '/group_id=')) ? explode('/group_id=' , $a[0]) : $a; $ec_lists['add_pages'][$r['id']] = $b[0]; } } } /* * build_ec_categories($dsp) * builds $ec_lists['categories']. * * @param * whether $ec_lists['categories'] must be of type "cat / sub-cat" or * or "cat - sub-cat". * @return * (no return value) */ function build_ec_categories($dsp) { global $template, $ec_lists; $ec_lists['categories'] = array(); $c = array(); display_select_cat_wrapper(" SELECT `id`, `name`, `uppercats`, `global_rank` FROM `".CATEGORIES_TABLE."` ", $c, 'category_options', $dsp); $ec_lists['categories'] = $template->smarty->_tpl_vars['category_options']; } /* * build_ec_userids() * builds $ec_lists['user_ids']. * * @param * (no parameter) * @return * (no return value) */ function build_ec_userids() { global $ec_lists, $conf; $ec_lists['user_ids'] = array(); $ec_lists['user_ids'] = simple_hash_from_query(" SELECT ".$conf['user_fields']['id']." AS id, ".$conf['user_fields']['username']." AS username FROM `".USERS_TABLE."` WHERE id > 2;", 'id', 'username' ); } /* * build_ec_table() * builds a table showing the content of the _event_cats database table, * and a table showing the eventual errors. * * @param * no parameters passed ; the main material on which works the function, is * the global array variable $ec_lists. * @return * (no return value) */ function build_ec_table() { global $ec_lists; $ec_lists['ec_table'] = array(); $q = pwg_query(" SELECT * FROM `".EVNTCATS_TABLE."` WHERE `code` IS NOT NULL ORDER BY `id` "); while ($r = mysql_fetch_assoc($q)) $ec_lists['ec_table'][intval($r['id'])] = $r; // Construction of behaviour // Multiple action params for a single code check ec_inspect('action', 'ec_nok_action_pb'); // Multiple user_ids for a single code check ec_inspect('user_id', 'ec_nok_userid_pb', false); // Multiple "forced" params for a single code check ec_inspect('forced', ''); // User id and associated page validities checks foreach ($ec_lists['ec_table'] as &$ec_entry) { // Check if associated user_id exists if ( is_in($ec_entry['action'], 'ec_ok') and !array_key_exists($ec_entry['user_id'], $ec_lists['user_ids']) ) $ec_entry['action'] = 'ec_nok_userid_miss'; // Check if associated displayed page exists $a = 0; if ( !empty($ec_entry['arg1']) and // (Only arg2 is significant if action is ec_nok[_xxx] .) is_in($ec_entry['action'], 'ec_ok') ) $a++; if (!empty($ec_entry['arg2'])) $a+= 2; switch ($a) { // case 0 : home, nothing to check case 2: // Additional Page if ( defined('ADD_PAGES_TABLE') and ( is_in($ec_entry['action'], 'ec_ok') or $ec_entry['action'] == 'ec_nok' ) and !array_key_exists($ec_entry['arg2'], $ec_lists['add_pages']) ) $ec_entry['action'].= '_ap_pb'; break; case 1: // Category case 3: // Image if (is_in($ec_entry['action'], 'ec_ok')) { if (array_key_exists($ec_entry['arg1'], $ec_lists['categories'])) { if ($a == 3) // case 3: // Image if (!ec_image_exists($ec_entry['arg1'], $ec_entry['arg2'])) $ec_entry['action'].= '_img_pb'; } else $ec_entry['action'].= '_cat_pb'; } break; } } } /* * build_dup_groups() * builds the information telling who is allowed to duplicate * * @param * no parameter passed, the main material on which works the function, is * the global array variable $ec_lists. * @return * (no return value) */ function build_dup_groups() { global $ec_lists; if (count($ec_lists['user_ids']) == 0) build_ec_userids(); // Existing groups (needed later) $ec_lists['groups'] = simple_hash_from_query(" SELECT `id`, `name` FROM `".GROUPS_TABLE."` ORDER BY `name` ASC; ", 'id', 'name' ); // groups granted to duplication $ec_lists['groups_granted_ids'] = ec_order_by_name( array_from_query(" SELECT `arg2` FROM ".EVNTCATS_TABLE." WHERE `code` IS NULL AND `arg1` = 1 AND `arg2` IS NOT NULL ;", 'arg2' ), $ec_lists['groups'] ); // users directly granted to duplication $ec_lists['users_granted_direct_ids'] = ec_order_by_name( array_from_query(" SELECT `arg2` FROM `".EVNTCATS_TABLE."` WHERE `code` IS NULL AND `arg1` = 2 AND `arg2` IS NOT NULL ;", 'arg2' ), $ec_lists['user_ids'] ); // Calculate users granted to duplication thanks to belonging to a // certain group (in groups, level (friends, family, contacts), // or user status (generic)) $types_entry_exists = (($t = mysql_fetch_row(pwg_query(" SELECT `arg2` FROM `".EVNTCATS_TABLE."` WHERE `code` IS NULL AND `arg1` = 3 AND `arg2` IS NOT NULL LIMIT 1; "))) !== false); $ec_lists['types_granted'] = ($types_entry_exists) ? $t[0] : 0; return $types_entry_exists; } /* * build_ec_lists() * builds the main array variable contaning all informations for the plugin * * @param * no parameter passed, the main material on which works the function, is * the global array variable $ec_lists. * @return * (no return value) */ function build_ec_lists() { // Construction of $ec_lists['add_pages'] array var build_ec_addp(); // Construction of $ec_lists['categories'] array var build_ec_categories(true); // Construction of $ec_lists['user_ids'] array var build_ec_userids(); // Construction of $ec_lists['ec_table'] array var build_ec_table(); } // +-----------------------------------------------------------------------+ // | Duplication analysis functions | // +-----------------------------------------------------------------------+ /* * build_dup_arrays($append_tpl = false) * builds arrays telling which accounts are allowed to display a duplicate * account link. Returns an array of all the user ids allowed to duplicate. * * @param * $append_tpl : tells if $template must be appended with built arrays * @return * array of all the user ids allowed to duplicate */ function build_dup_arrays($append_tpl = false) { global $template, $ec_lists, $conf; // A lot of below code has simply been copied from file cat_perm.php . // Many thanks to people who wrote it ! build_dup_groups(); $users_granted_ids = array(); $users_granted_thks_gen_ids = array(); if ($ec_gen_granted = (($ec_lists['types_granted'] & 8) != 0)) { $users_granted_thks_gen_ids = ec_order_by_name( array_diff( array_from_query(" SELECT `user_id` FROM `".USER_INFOS_TABLE."` WHERE `status` = 'generic' AND `user_id` > 2;", 'user_id' ), $ec_lists['users_granted_direct_ids'] ), $ec_lists['user_ids'] ); foreach ($users_granted_thks_gen_ids as $user_id) $users_granted_ids[$user_id] = l10n('user_status_generic'); } $types = array( '1' => l10n('Level 1'), '2' => l10n('Level 2'), '4' => l10n('Level 4'), ); $types_granted_ids = array(); $users_granted_thks_types_ids = array(); if (($ec_lists['types_granted'] & 7) != 0) { if (($ec_lists['types_granted'] & 1) != 0) $types_granted_ids[] = '1'; if (($ec_lists['types_granted'] & 2) != 0) $types_granted_ids[] = '2'; if (($ec_lists['types_granted'] & 4) != 0) $types_granted_ids[] = '4'; if (count($types_granted_ids) > 0) { $user_granted_from_type = array(); $result = pwg_query(" SELECT `user_id`, `level` FROM `".USER_INFOS_TABLE."` WHERE `level` IN (".implode(',', $types_granted_ids).") AND `user_id` > 2; "); while ($row = mysql_fetch_array($result)) { if (!isset($user_granted_from_type[$row['level']])) { $user_granted_from_type[$row['level']] = array(); } $user_granted_from_type[$row['level']][] = $row['user_id']; } $user_granted_by_type_ids = array(); foreach ($user_granted_from_type as $type_users) $user_granted_by_type_ids = array_merge( $user_granted_by_type_ids, $type_users ); $users_granted_thks_types_ids = ec_order_by_name( array_diff( array_unique($user_granted_by_type_ids), $ec_lists['users_granted_direct_ids'] ), $ec_lists['user_ids'] ); foreach ($users_granted_thks_types_ids as $user_id) foreach ($user_granted_from_type as $type_id => $type_users) { if (in_array($user_id, $type_users)) { $users_granted_ids[$user_id]= $types[$type_id]; break; } } } } $users_granted_thks_groups_ids = array(); if (count($ec_lists['groups_granted_ids']) > 0) { $granted_groups = array(); $result = pwg_query(" SELECT `user_id`, `group_id` FROM `".USER_GROUP_TABLE."` WHERE `group_id` IN (".implode(',', $ec_lists['groups_granted_ids']).") AND `user_id` > 2; "); while ($row = mysql_fetch_array($result)) { if (!isset($granted_groups[$row['group_id']])) { $granted_groups[$row['group_id']] = array(); } $granted_groups[$row['group_id']][] = $row['user_id']; } $user_granted_by_group_ids = array(); foreach ($granted_groups as $group_users) $user_granted_by_group_ids = array_merge( $user_granted_by_group_ids, $group_users ); $users_granted_thks_groups_ids = ec_order_by_name( array_diff( array_unique($user_granted_by_group_ids), $ec_lists['users_granted_direct_ids'] ), $ec_lists['user_ids'] ); foreach ($users_granted_thks_groups_ids as $user_id) foreach ($granted_groups as $group_id => $group_users) if (in_array($user_id, $group_users)) { $users_granted_ids[$user_id]= $ec_lists['groups'][$group_id]; break; } } if ($append_tpl) { $users_denied_ids = ec_order_by_name( array_diff( array_keys($ec_lists['user_ids']), $users_granted_thks_gen_ids, $users_granted_thks_types_ids, $users_granted_thks_groups_ids, $ec_lists['users_granted_direct_ids'] ), $ec_lists['user_ids'] ); foreach ($users_granted_ids as $u => $g) $template->append( 'user_granted_indirects', array( 'USER' => $ec_lists['user_ids'][$u], 'GROUP' => $g ) ); $template->assign('all_groups', $ec_lists['groups']); $template->assign('groups_granted_ids', $ec_lists['groups_granted_ids']); $template->assign('groups_denied_ids', ec_order_by_name( array_diff( array_keys($ec_lists['groups']), $ec_lists['groups_granted_ids'] ), $ec_lists['groups'] )); $template->assign('ec_gen_granted', $ec_gen_granted); $template->assign('all_types', $types); $template->assign('types_granted_ids', $types_granted_ids); $template->assign('types_denied_ids', ec_order_by_name( array_diff(array_keys($types), $types_granted_ids), $types )); $template->assign('all_users', $ec_lists['user_ids']); $template->assign( 'users_granted_direct_ids', $ec_lists['users_granted_direct_ids'] ); $template->assign('users_denied_ids', $users_denied_ids); } $users_granted_ids = array_merge( array_keys($users_granted_ids), $ec_lists['users_granted_direct_ids'] ); // Returns an array which values are all the user_ids allowed to display a // "duplicate" link. The keys of this array are strange (for direct allowed // users, keys are usernames), but should not used return $users_granted_ids; } /* * dup_allowed($user_id) * returns true if the user_id is allowed to display a duplicate link * * @param * $user_id : the user_id * @return * true if the user_id is allowed to display a duplicate link */ function dup_allowed($user_id) { return in_array($user_id, build_dup_arrays()); } ?>