Manage cPanel FTP accounts with WordPress

These are the hooks we’ll use:

<?php
add_filter( 'wp_mail_content_type', 'ilc_return_text_html' );
add_action( 'user_register', 'ilc_user_register' );
add_action( 'delete_user', 'ilc_delete_user' );
add_action( 'show_user_profile', 'ilc_user_profile' );
add_action( 'edit_user_profile', 'ilc_user_profile' );

Let’s email the users mails with HTML format:

function ilc_return_text_html () {
    return 'text/html';
}

When a user is created, an FTP account is created too:

<?php
function ilc_user_register($userid) {
    $userinfo = get_userdata($userid);
    $directory = WP_CONTENT_DIR . '/uploads/' . $userinfo->user_nicename;
    mkdir($directory, 0755);
    $fpass = wp_generate_password();

    $data['login'] = $userinfo->user_nicename;
    $data['password'] = $fpass;
    $data['quota'] = '50';
    $data['homedir'] = '/public_html/wp-content/uploads/' . $userinfo->user_nicename;
    $response = getData('ftp/doaddftp.html', $data);
    if (strpos($response, 'failure') || strpos($response, 'Fatal') || !strpos($response, 'Added')) {
        $mensaje = 'Epic fail!';
    }
    $mensaje = 'Correct!';

    wp_mail($userinfo->user_email, 'Access your FTP account' . $mensaje, '<p>Use the following credentials:</p><ul><li>Server: <strong>your-site.com</strong></li><li>User <strong>' . $userinfo->user_nicename . '@your-site.com</strong></li><li>Password <strong>' . $fpass . '</strong><li></ul>');
}

function getData($url, $data = '') {
    $username = 'cpanelusername';
    $password = 'strongpasswordgeneratordotcom';
    $theme = 'x3';
    $auth = base64_encode($username . ':' . $password);
    $port = 2082;
    $host = 'your-site.com';
    $path = '/frontend/' . $theme . '/';

    $url = $path . $url;
    if (is_array($data)) {
        $url = $url . '?';
        foreach ($data as $key => $value) {
            $url .= urlencode($key) . '=' . urlencode($value) . '&';
        }
        $url = substr($url, 0, -1);
    }
    $response = '';
    $fp = fsockopen($host, $port);
    if (!$fp) {
        return false;
    }
    $out = 'GET ' . $url . ' HTTP/1.0' . '\r\n';
    $out .= 'Authorization: Basic ' . $auth . '\r\n';
    $out .= 'Connection: Close' . '\r\n\r\n';
    fwrite($fp, $out);
    while (!feof($fp)) {
        $response .= @fgets($fp);
    }
    fclose($fp);
    return $response;
}

if the user is deleted, the ftp account is deleted too

function ilc_delete_user($userid){
    $userinfo = get_userdata($userid);
    ilcrmdir ( WP_CONTENT_DIR . '/uploads/' . $userinfo->user_nicename);
    $data['login'] = $userinfo->user_nicename;
    $response = getData('ftp/realdodelftp.html', $data);
    if(false !== strpos($response, 'deleted')) {
        return true;
    }
    return false;
}
function ilcrmdir($dir){
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != "." && $object != "..") {
                if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
            }
        }
        reset($objects);
        rmdir($dir);
    }
}

now let’s display the user files

function ilc_user_profile(){
    $userinfo = get_userdata($_GET['user_id']);
    $files = file_list( WP_CONTENT_DIR . '/uploads/' . $userinfo->user_login, '' );
    if(isset($files)){
        echo '<h3>' . esc_html__('Available Files', 'ilc') . '</h3>';
        echo '<p>' . esc_html__('These are the files available for download.', 'ilc') . '</p>';
        $files = file_list( WP_CONTENT_DIR . '/uploads/' . $userinfo->user_login );
        echo '<ol>';
        foreach ( $files as $i => $value ) {
            echo '<li><a title="Download ' . esc_attr__( $files[$i] ) . '" href="' . THEME_URI . '/library/admin/download.php?file=' . WP_CONTENT_DIR . '/uploads/' . esc_attr__( $userinfo->user_login ) . '/' . esc_attr__( $files[$i] ) . '">' . esc_html( $files[$i] ) . '</a></li>';
        }
        echo '</ol>';
    }
}
function file_list($d = '', $x = ''){
    foreach(array_diff(scandir($d),array('.','..')) as $f)
        if(is_file($d.'/'.$f)&&(($x)?ereg($x.'$',$f):1))
            if($f != '.ftpquota')
                $l[]=$f;
    return $l;
}

The content of download.php works for my server, but maybe you’ll have to tweak it for your server.

<?php
$fullPath = $_GET['file'];

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

Leave a Reply