WordPress.org

Plugin Directory

Changeset 458078


Ignore:
Timestamp:
11/01/11 00:17:37 (2 years ago)
Author:
isaacchapman
Message:

Adding customizable responses when secured files are accessed

Location:
htaccess-secure-files
Files:
10 added
5 edited

Legend:

Unmodified
Added
Removed
  • htaccess-secure-files/trunk/admin.css

    r457433 r458078  
    1 #hsf_tab_wrap { 
    2  
    3 } 
    4 #hsf_tabs { 
     1.hsf_tabs { 
    52    list-style: none; 
    63    margin: 0 0 0 10px; 
    74} 
    8 #hsf_tabs li { 
     5.hsf_tabs li { 
    96    display: inline; 
    107    font-weight: bold; 
     
    1613    color: #21759B; 
    1714    background-color: #EAF2FA; 
    18     border-left: 1px solid #DFDFDF; 
    19     border-top: 1px solid #DFDFDF; 
    20     border-right: 1px solid #DFDFDF; 
     15    border: 1px solid #DFDFDF; 
    2116} 
    22 #hsf_tabs li.hsf_tab_active { 
     17.hsf_tabs li.hsf_tab_active { 
    2318    color: #EAF2FA; 
    2419    background-color: #21759B; 
     
    2621    border-top: 1px solid #21759B; 
    2722    border-right: 1px solid #21759B; 
     23    border-bottom: 1px solid #21759B; 
    2824} 
    2925.hsf_tab_content thead th { white-space:nowrap; } 
     
    5551    margin-left: 5px; 
    5652} 
     53 
     54.hsf_tab_content { 
     55    background-color: #F9F9F9; 
     56    border-color: #DFDFDF; 
     57} 
     58 
     59.hsf_tab_content { 
     60    border-radius: 3px 3px 3px 3px; 
     61    border-spacing: 0; 
     62    border-style: solid; 
     63    border-width: 1px; 
     64    margin: 0; 
     65} 
    5766/* Media management list table */ 
    5867.fixed .column-hsf_secured { width: 10%; } 
  • htaccess-secure-files/trunk/admin.js

    r457433 r458078  
    1616    }); 
    1717    // Handle clicking on tabs 
    18     jQuery('#hsf_tabs li').click(function() { 
    19         if (!jQuery(this).hasClass('hsf_tab_active')) { 
    20             var tab_id = jQuery(this).attr('id').substr(8); 
    21             jQuery('#hsf_tabs li').each(function() { 
    22                 if (jQuery(this).hasClass('hsf_tab_active')) { 
    23                     var id = jQuery(this).attr('id').substr(8); 
    24                     jQuery('#hsf_tab_content_' + id).hide(); 
    25                     jQuery(this).removeClass('hsf_tab_active'); 
    26                 } 
    27             }); 
    28             jQuery('#hsf_tab_content_' + tab_id).show(150); 
    29             jQuery('#hsf_tab_' + tab_id).addClass('hsf_tab_active'); 
    30             window.location.hash = tab_id; 
    31         } 
     18    jQuery('.hsf_tabs li').click(function() { 
     19        window.location.hash = jQuery(this).attr('id').substr(8); 
    3220    }); 
    3321    // Deleteing an IP address 
     
    6856        jQuery('#hsf_add_ip_text').val(''); 
    6957    }); 
     58    jQuery('.hsf_dr_custom_url').change(function() { 
     59 
     60    }); 
    7061}); 
    7162 
    7263function hsf_hash_change() { 
    73     // Display the location.hash specific content 
    7464    if (location.hash && location.hash.length > 1 && jQuery('#hsf_tab_' + location.hash.substr(1)).length) { 
    75         var active_id = location.hash.substr(1); 
    76         jQuery('#hsf_tabs li').each(function() { 
     65        hsf_show_tab(location.hash.substr(1)); 
     66    } 
     67} 
     68function hsf_show_tab(tab_id) { 
     69    var tab = jQuery('#hsf_tab_' + tab_id); 
     70    if (!tab.length) { return; }                        // tab not found 
     71    if (tab.hasClass('hsf_tab_active')) { return; }     // tab already active 
     72    tab.siblings().each(function() { 
     73        if (jQuery(this).hasClass('hsf_tab_active')) { 
    7774            var id = jQuery(this).attr('id').substr(8); 
    7875            jQuery('#hsf_tab_content_' + id).hide(); 
    7976            jQuery(this).removeClass('hsf_tab_active'); 
    80         }); 
    81         jQuery('#hsf_tab_content_' + active_id).show(); 
    82         jQuery('#hsf_tab_' + active_id).addClass('hsf_tab_active'); 
    83     } 
     77        } 
     78    }); 
     79    jQuery('#hsf_tab_content_' + tab_id).show(150); 
     80    tab.addClass('hsf_tab_active'); 
    8481} 
  • htaccess-secure-files/trunk/dl.php

    r457433 r458078  
    2222 
    2323// Ensure the plugin is initialized properly 
    24 global $hsf_allowed_roles, $hsf_allowed_capabilities, $hsf_allowed_ips, $current_user; 
    25 if (!isset($current_user) || !isset($hsf_allowed_roles) || !isset($hsf_allowed_capabilities) || !isset($hsf_allowed_ips)) { 
     24global $hsf_allowed_roles, $hsf_allowed_capabilities, $hsf_allowed_ips, $current_user, $hsf_denied_response; 
     25if (!isset($current_user) || !isset($hsf_allowed_roles) || !isset($hsf_allowed_capabilities) || !isset($hsf_allowed_ips) || !isset($hsf_denied_response)) { 
    2626    header('Status: 500 Internal Server Error', true, 500); 
    2727    echo ('Error 500: Htaccess Secure Files plugin error (possibly deactivated)'); 
     
    3030} 
    3131 
    32 if (!is_array($hsf_allowed_roles) || !is_array($hsf_allowed_capabilities) || !is_array($hsf_allowed_ips) || !is_object($current_user)) { 
     32if (!is_array($hsf_allowed_roles) || !is_array($hsf_allowed_capabilities) || !is_array($hsf_allowed_ips) || !is_object($current_user) || !is_array($hsf_denied_response)) { 
    3333    header('Status: 500 Internal Server Error', true, 500); 
    3434    echo ('Error 500: Htaccess Secure Files plugin configuration error'); 
     
    6161 
    6262if (!$can_view) { 
    63     header('Status: 403 Forbidden', true, 403); 
    64     echo ('Error 403: Access forbidden'); 
     63    $visitor = 'anon'; 
     64    if (isset($current_user) && isset($current_user->ID) && ($current_user->ID)) { 
     65        $visitor = 'user';   
     66    } 
     67    if (!isset($hsf_denied_response[$visitor])) { 
     68        header('Status: 403 Forbidden', true, 403); 
     69        echo ('Error 403: Access forbidden - access denial action invalid'); 
     70        exit();  
     71    } 
     72    switch ($hsf_denied_response[$visitor]) { 
     73        case 'login': 
     74            header('Location: ' . wp_login_url($_SERVER['REQUEST_URI']), true, 302); 
     75            break; 
     76        case 'custom': 
     77            if (!isset($hsf_denied_response[$visitor . '_custom_url']) || !strlen($hsf_denied_response[$visitor . '_custom_url'])) { 
     78                header('Status: 500 Internal Server Error', true, 500); 
     79                echo ('Error 500: Htaccess Secure Files - ' . $visitor . '_custom_url redirection not set'); 
     80                hsf_error('configuration error'); 
     81                exit();  
     82            } 
     83            $login_url = $hsf_denied_response[$visitor . '_custom_url']; 
     84            if (strlen($hsf_denied_response[$visitor . '_custom_url']) >= 10 && false !== strpos($hsf_denied_response[$visitor . '_custom_url'], '%file_url%')) { 
     85                $file_url = 'http'; 
     86                if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { 
     87                    $file_url .= 's';    
     88                } 
     89                $file_url .= '://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 
     90                $login_url = str_replace('%file_url%', urlencode($file_url), $login_url); 
     91            } 
     92            header('Location: ' . $login_url, true, 302); 
     93            break; 
     94        case '403': 
     95            header('Status: 403 Forbidden', true, 403); 
     96            echo ('Error 403: Access forbidden'); 
     97            break; 
     98        case '404': 
     99            header('Status: 404 Not Found', true, 404); 
     100            echo ('Error 404: Not Found'); 
     101            break; 
     102        default: 
     103            header('Status: 403 Forbidden', true, 403); 
     104            echo ('Error 403: Access forbidden - access denial action not set'); 
     105            break; 
     106    } 
    65107    exit(); 
    66108} 
  • htaccess-secure-files/trunk/htaccess-secure-files.php

    r457876 r458078  
    22/* 
    33Plugin Name: Htaccess Secure Files 
    4 Version: 0.2 
     4Version: 0.3 
    55Plugin URI: http://isaacchapman.com/wordpress-plugins/htaccess-secure-files/ 
    66Description: Allows securing media library uploaded files to be vieweable to only users with specified capabilities. A different <a href="http://wordpress.org/extend/plugins/search.php?q=roles+capabilities&sort=" title="WordPress plugins repository">WordPress plugin</a> will be needed if custom <a href="http://codex.wordpress.org/Roles_and_Capabilities" title="Roles and Capabilities">roles and capabilities</a> need to created. <strong>Requires Apache with mod_rewrite enabled!</strong>  
     
    2626*/ 
    2727 
     28define('HSF_VERSION', '0.3.0'); 
     29 
    2830// If the existing settings are to be used and shouldn't be changed through the admin interface HSF_HIDE_ADMIN should be defined as false in the wp-config.php file. For example: 
    2931// define('HSF_HIDE_ADMIN', true);  
     
    3335define('HSF_DEFAULT_ALLOWED_CAPABILITIES', ''); 
    3436define('HSF_DEFAULT_ALLOWED_IP', ''); 
     37define('HSF_DEFAULT_DENIED_RESPONSE', 'login'); 
    3538 
    3639// .htaccess file delimiters (DO NOT USE MULTIPLE ADJACENT SPACE CHARACTERS IF THESE ARE MODIFIED) 
     
    4346define('HSF_ALLOWED_CAPABILITIES', 'hsf_allowed_capabilities'); 
    4447define('HSF_ALLOWED_IPS', 'hsf_allowed_ips'); 
     48define('HSF_DENIED_RESPONSE', 'hsf_denied_response'); 
    4549define('HSF_POST_META_KEY', '_hsf_secured'); 
    4650define('HSF_SECURED_LABEL', 'Secured File'); 
     
    7175add_action('init', 'hsf_init'); 
    7276function hsf_init() { 
    73     global $hsf_allowed_roles, $hsf_allowed_capabilities, $hsf_allowed_ips; 
     77    // Load/set defaults (these need to be global so they can be used by dl.php) 
     78    global $hsf_allowed_roles, $hsf_allowed_capabilities, $hsf_allowed_ips, $hsf_denied_response; 
    7479    if (!($hsf_allowed_roles = get_option(HSF_ALLOWED_ROLES))) { 
    7580        $hsf_allowed_roles = explode(',', HSF_DEFAULT_ALLOWED_ROLES); 
     
    8489        if(count($hsf_allowed_ips) == 1 && $hsf_allowed_ips[0] == '') { $hsf_allowed_ips = array(); } 
    8590    } 
    86 } 
     91    if (!($hsf_denied_response = get_option(HSF_DENIED_RESPONSE)) || !is_array($hsf_denied_response) || !isset($hsf_denied_response['user']) || !isset($hsf_denied_response['anon'])) { 
     92        $hsf_denied_response = array('user' => HSF_DEFAULT_DENIED_RESPONSE, 'anon' => HSF_DEFAULT_DENIED_RESPONSE); 
     93    } 
     94} 
     95 
     96 
    8797 
    8898/**** Admin screen ****/ 
     
    92102} 
    93103function hsf_admin_menu() { 
    94     add_submenu_page('options-general.php', 'Secure Files', 'Secure Files', HSF_REQUIRED_ADMIN_CAPABILITY, 'hsf-settings', 'hsf_admin_screen'); 
     104    add_submenu_page('options-general.php', 'Secure Files', 'Secure Files', HSF_REQUIRED_ADMIN_CAPABILITY, plugin_basename(__FILE__), 'hsf_admin_screen'); 
    95105} 
    96106 
    97107add_action('admin_head', 'hsf_admin_head'); 
    98108function hsf_admin_head() { 
    99     echo ('<link rel="stylesheet" type="text/css" href="' . WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/admin.css" />'); 
    100     echo ('<script language="javascript" src="' . WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/admin.js"></script>'); 
     109    if (basename($_SERVER['SCRIPT_FILENAME']) == 'options-general.php' && isset($_GET['page']) && $_GET['page'] == plugin_basename(__FILE__)) { 
     110        echo ('<link rel="stylesheet" type="text/css" href="' . WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/admin.css?ver=' . HSF_VERSION . '" />'); 
     111        echo ('<script language="javascript" src="' . WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/admin.js?ver=' . HSF_VERSION . '"></script>'); 
     112    } 
    101113} 
    102114 
     
    106118    } 
    107119     
    108     global $hsf_allowed_roles, $hsf_allowed_capabilities, $hsf_allowed_ips, $wp_roles; 
     120    global $hsf_allowed_roles, $hsf_allowed_capabilities, $hsf_allowed_ips, $wp_roles, $hsf_denied_response; 
    109121     
    110122    // Create array of capabilities 
     
    128140                    echo ('<div id="message" class="error fade"><p><strong>Invalid nonce</strong></p></div>'); 
    129141                } else { 
     142                    // Whitelisted roles 
    130143                    $hsf_allowed_roles = array(); 
    131144                    foreach($wp_roles->role_names as $role => $name) { 
     
    136149                    update_option(HSF_ALLOWED_ROLES, $hsf_allowed_roles); 
    137150                     
     151                    // Whitelisted capabilities 
    138152                    $hsf_allowed_capabilities = array(); 
    139153                    foreach ($all_capabilities as $capability => $roles) { 
     
    144158                    update_option(HSF_ALLOWED_CAPABILITIES, $hsf_allowed_capabilities); 
    145159                     
     160                    // Whitelisted ip addresses 
    146161                    $hsf_allowed_ips = array(); 
    147162                    if (isset($_POST['hsf_allowed_ips']) && $_POST['hsf_allowed_ips']) { 
     
    149164                    } 
    150165                    update_option(HSF_ALLOWED_IPS, asort($hsf_allowed_ips)); 
     166 
     167                    // Denied access responses 
     168                    foreach ($hsf_denied_response as $key => $value) { 
     169                        if (isset($_POST['hsf_dr_' . $key]) && trim($_POST['hsf_dr_' . $key])) { 
     170                            $value = trim($_POST['hsf_dr_' . $key]); 
     171                            $hsf_denied_response[$key] = $value; 
     172                            if ($value == 'custom' && isset($_POST['hsf_dr_' . $key . '_custom_url']) && trim($_POST['hsf_dr_' . $key . '_custom_url'])) { 
     173                                $hsf_denied_response[$key . '_custom_url'] = trim($_POST['hsf_dr_' . $key . '_custom_url']); 
     174                            } 
     175                        } 
     176                    } 
     177                    update_option(HSF_DENIED_RESPONSE, $hsf_denied_response); 
    151178                     
     179                    // And we are done... 
    152180                    echo ('<div id="message" class="updated fade"><p><strong>' .  __('Options saved.') . '</strong></p></div>'); 
    153181                } 
     
    179207            wp_nonce_field('hsf_save_settings','hsf_save_settings'); 
    180208            ?> 
    181             <div id="hsf_tab_wrap"> 
    182                 <ul id="hsf_tabs"> 
     209            <div id="hsf_access_tabs_wrap"> 
     210                <ul class="hsf_tabs" id="hsf_access_tabs"> 
    183211                    <li id="hsf_tab_roles" class="hsf_tab_active">Roles</li> 
    184212                    <li id="hsf_tab_capabilities">Capabilities</li> 
    185213                    <li id="hsf_tab_ip4_addresses">IPv4 Addresses</li> 
    186                     <!--<li id="hsf_tab_users">Users</li>--> 
    187214                </ul> 
    188215            </div> 
     
    272299            </table> 
    273300            <br /> 
     301            <h3>Denied access response</h3> 
     302            <p>What should be the response for non-authorized attempts to access secured files?</p> 
     303            <div> 
     304                <ul class="hsf_tabs" id="hsf_dr_tabs"> 
     305                    <li id="hsf_tab_anon" class="hsf_tab_active">Anonymous visitors</li> 
     306                    <li id="hsf_tab_user">Logged in users</li> 
     307                </ul> 
     308            </div> 
     309            <table id="hsf_tab_content_anon" class="hsf_tab_content form-table"> 
     310                <tbody> 
     311                    <tr> 
     312                        <th><input type="radio" class="tog" value="login" name="hsf_dr_anon" id="hsf_dr_anon_login" <?php if ($hsf_denied_response['anon'] == 'login') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_anon_login">Redirect to login</label></th> 
     313                        <td><code><?php echo(wp_login_url()); ?>?redirect_to=%file_url%</code></td> 
     314                    </tr> 
     315                    <tr> 
     316                        <th><input type="radio" class="tog" value="403" name="hsf_dr_anon" id="hsf_dr_anon_403" <?php if ($hsf_denied_response['anon'] == '403') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_anon_403">Forbidden error</label></th> 
     317                        <td><a href="http://en.wikipedia.org/wiki/HTTP_403" title="HTTP 403 Status Code">Status: 403 Forbidden</a></td> 
     318                    </tr> 
     319                    <tr> 
     320                        <th><input type="radio" class="tog" value="404" name="hsf_dr_anon" id="hsf_dr_anon_404" <?php if ($hsf_denied_response['anon'] == '404') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_anon_404">Not found error</label></th> 
     321                        <td><a href="http://en.wikipedia.org/wiki/HTTP_404" title="HTTP 404 Status Code">Status: 404 Not Found</a></td> 
     322                    </tr> 
     323                    <tr> 
     324                        <th><input type="radio" class="tog" value="custom" name="hsf_dr_anon" id="hsf_dr_anon_custom" <?php if ($hsf_denied_response['anon'] == 'custom') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_anon_custom">Custom redirect</label></th> 
     325                        <td> 
     326                            <input type="text" class="regular-text code hsf_dr_custom_url" value="<?php if(isset($hsf_denied_response['anon_custom_url'])) { echo($hsf_denied_response['anon_custom_url']); } ?>" id="hsf_dr_anon_custom_url" name="hsf_dr_anon_custom_url"> 
     327                            <code>%file_url%</code> can be used in the redirect. 
     328                        </td> 
     329                    </tr> 
     330                </tbody> 
     331            </table> 
     332            <table id="hsf_tab_content_user" class="hsf_tab_content form-table" style="display:none;"> 
     333                <tbody> 
     334                    <tr> 
     335                        <th><input type="radio" class="tog" value="login" name="hsf_dr_user" id="hsf_dr_user_login" <?php if ($hsf_denied_response['user'] == 'login') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_user_login">Redirect to login</label></th> 
     336                        <td><code><?php echo(wp_login_url()); ?>?redirect_to=%file_url%</code></td> 
     337                    </tr> 
     338                    <tr> 
     339                        <th><input type="radio" class="tog" value="403" name="hsf_dr_user" id="hsf_dr_user_403" <?php if ($hsf_denied_response['user'] == '403') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_user_403">Forbidden error</label></th> 
     340                        <td><a href="http://en.wikipedia.org/wiki/HTTP_403" title="HTTP 403 Status Code">Status: 403 Forbidden</a></td> 
     341                    </tr> 
     342                    <tr> 
     343                        <th><input type="radio" class="tog" value="404" name="hsf_dr_user" id="hsf_dr_user_404" <?php if ($hsf_denied_response['user'] == '404') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_user_404">Not found error</label></th> 
     344                        <td><a href="http://en.wikipedia.org/wiki/HTTP_404" title="HTTP 404 Status Code">Status: 404 Not Found</a></td> 
     345                    </tr> 
     346                    <tr> 
     347                        <th><input type="radio" class="tog" value="custom" name="hsf_dr_user" id="hsf_dr_user_custom" <?php if ($hsf_denied_response['user'] == 'custom') { echo('checked="checked"'); } ?> /> <label for="hsf_dr_user_custom">Custom redirect</label></th> 
     348                        <td> 
     349                            <input type="text" class="regular-text code hsf_dr_custom_url" value="<?php if(isset($hsf_denied_response['user_custom_url'])) { echo($hsf_denied_response['user_custom_url']); } ?>" id="hsf_dr_user_custom_url" name="hsf_dr_user_custom_url"> 
     350                            <code>%file_url%</code> can be used in the redirect. 
     351                        </td> 
     352                    </tr> 
     353                </tbody> 
     354            </table> 
     355            <br /> 
    274356            <input type="submit" name="hsf_submit" value="Save Settings" class="button-primary" /> 
    275357        </form> 
  • htaccess-secure-files/trunk/readme.txt

    r457903 r458078  
    44Requires at least: 3.2.1 
    55Tested up to: 3.2.1 
    6 Stable tag: 0.2 
     6Stable tag: 0.3 
    77 
    88Allows securing files in WP's media library to be only accessible to users with specific roles, capabilities, or IP addresses. 
     
    24241. Unzip the zip archive and upload the htaccess-secure-files directory to your /wp-content/plugins/ directory. 
    25252. Activate the plugin through the 'Plugins' menu in WordPress. 
    26 3. Select which roles, capabilities, and IP addresses will be allowed to view and download secure files on the 'Settings' -> 'Secure Files' admin screen. 
     263. On the 'Settings' -> 'Secure Files' admin screen select which roles, capabilities, and IP addresses will be allowed to access secure files and what the server response should be for those denied access. 
    27274. To secure individual files edit the file on the 'Media' admin screen and change the 'Secured File' setting to 'Yes'. 
    2828 
    2929== Changelog == 
     30 
     31= 0.3 = 
     32* "Denied access response" is now customizable: WordPress login, 403 Forbidden, 404 Not Found, or custom redirect. 
    3033 
    3134= 0.2 = 
Note: See TracChangeset for help on using the changeset viewer.