View source
<?php
function rss_permissions_help($path, $arg) {
$help = '<p>' . t('RSS permissions module allows administrator to control the display of RSS feeds.') . '</p>';
switch ($path) {
case 'admin/help#rss_permissions':
$help .= '<p>' . t('You can choose to disable the RSS feeds altogether. In order to do that, go to <a href="@admin_page_url">RSS Permissions administration page</a> and select <em>"Disable altogether"</em> from the dropdown.', array(
'@admin_page_url' => url('admin/settings/rss_permissions'),
)) . '</p>';
$help .= '<p>' . t('You can also manage the display or RSS feeds on a more granular level. In order to do that, go to <a href="@permissions_url">rss_permissions module</a> section of the Permissions page to set permissions for various feeds per role.', array(
'@permissions_url' => url('admin/user/permissions', array(
'fragment' => 'module-rss_permissions',
)),
)) . '</p>';
$help .= '<p>' . t('You can manage permissions for main site RSS feed, aggregator RSS feeds (if Aggregator module is enabled), main blog RSS feed and user blog RSS feeds (if Blog module is enabled), and taxonomy RSS feeds (if Taxonomy module is enabled).') . '</p>';
return $help;
case 'admin/settings/rss_permissions':
$help .= '<p>' . t('On this page you can disable the RSS feeds altogether. In order to do that, select <em>"Disable altogether"</em> from the dropdown.', array(
'@admin_page_url' => url('admin/settings/rss_permissions'),
)) . '</p>';
return $help;
}
}
function rss_permissions_menu() {
$menu = array();
$menu['admin/settings/rss_permissions'] = array(
'title' => t('RSS permissions'),
'description' => t('Enable or disable RSS feeds on the website.'),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'rss_permissions_form',
),
'access arguments' => array(
'administer site configuration',
),
'type' => MENU_NORMAL_ITEM,
);
return $menu;
}
function rss_permissions_perm() {
$rss_permissions = array(
'access site RSS feed',
);
if (module_exists('taxonomy')) {
$rss_permissions[] = 'access taxonomy RSS feeds';
}
if (module_exists('blog')) {
$rss_permissions[] = 'access user blog RSS feeds';
$rss_permissions[] = 'access main blog RSS feed';
}
if (module_exists('aggregator')) {
$rss_permissions[] = 'access aggregator RSS feeds';
}
return $rss_permissions;
}
function rss_permissions_menu_alter(&$items) {
$items['rss.xml']['access callback'] = 'rss_permissions_menu_access';
$items['rss.xml']['access arguments'] = array(
'node',
);
if (module_exists('taxonomy')) {
$items['taxonomy/term/%']['access callback'] = 'rss_permissions_menu_access';
$items['taxonomy/term/%']['access arguments'] = array(
'taxonomy',
4,
);
}
if (module_exists('blog')) {
$items['blog/%user/feed']['access callback'] = 'rss_permissions_menu_access';
$items['blog/%user/feed']['access arguments'] = array(
'blog_user',
1,
);
$items['blog/feed']['access callback'] = 'rss_permissions_menu_access';
$items['blog/feed']['access arguments'] = array(
'blog',
);
}
if (module_exists('aggregator')) {
$items['aggregator/rss']['access callback'] = 'rss_permissions_menu_access';
$items['aggregator/rss']['access arguments'] = array(
'aggregator',
);
$items['aggregator/opml']['access callback'] = 'rss_permissions_menu_access';
$items['aggregator/opml']['access arguments'] = array(
'aggregator',
);
}
}
function rss_permissions_theme_registry_alter(&$theme_registry) {
if (!empty($theme_registry['feed_icon']['function'])) {
variable_set('rss_permissions_feed_icon_theme', $theme_registry['feed_icon']['function']);
}
$theme_registry['feed_icon']['function'] = 'theme_rss_permissions_feed_icon';
}
function rss_permissions_form(&$form_state) {
$form = array();
$form['rss_permissions_disable_all'] = array(
'#type' => 'select',
'#title' => t('Disable RSS access altogether or use role permissions'),
'#default_value' => variable_get('rss_permissions_disable_all', FALSE),
'#options' => array(
0 => t('Use permissions'),
1 => t('Disable altogether'),
),
'#description' => t('If you choose to disable RSS feeds altogether, the
permissions settings for rss_permissions module will be ignored.'),
);
return system_settings_form($form);
}
function theme_rss_permissions_feed_icon($url, $title) {
if (rss_permissions_feed_url_access($url)) {
$theme_function = variable_get('rss_permissions_feed_icon_theme', 'theme_feed_icon');
$arguments = func_get_args();
return call_user_func_array($theme_function, $arguments);
}
return '';
}
function rss_permissions_menu_access($module) {
$disable_all_feeds = variable_get('rss_permissions_disable_all', FALSE);
if ($module != 'taxonomy') {
if ($disable_all_feeds) {
return FALSE;
}
}
switch ($module) {
case 'node':
return user_access('access content') && user_access('access site RSS feed');
break;
case 'taxonomy':
if (func_num_args() >= 2 && func_get_arg(1) == 'feed') {
if ($disable_all_feeds) {
return FALSE;
}
else {
return user_access('access content') && user_access('access taxonomy RSS feeds');
}
}
else {
return user_access('access content');
}
break;
case 'blog_user':
$account = func_get_arg(1);
return blog_page_user_access($account) && user_access('access user blog RSS feeds');
break;
case 'blog':
return user_access('access content') && user_access('access main blog RSS feed');
break;
case 'aggregator':
return user_access('access news feeds') && user_access('access aggregator RSS feeds');
break;
default:
return user_access('access content');
}
}
function rss_permissions_feed_url_access($url) {
if (variable_get('rss_permissions_disable_all', FALSE)) {
return FALSE;
}
if (url('rss.xml', array(
'absolute' => TRUE,
)) == $url) {
return user_access('access content') && user_access('access site RSS feed');
}
if (preg_match('/^.*taxonomy\\/term\\/([0-9]+)\\/([0-9]+)\\/feed$/i', $url, $matches) > 0) {
return user_access('access content') && user_access('access taxonomy RSS feeds');
}
if (preg_match('/^.*blog\\/([0-9]+)\\/feed$/i', $url, $matches) > 0) {
$blog_uid = $matches[1];
$account = user_load($blog_uid);
return blog_page_user_access($account) && user_access('access user blog RSS feeds');
}
if (url('blog/feed') == $url) {
return user_access('access content') && user_access('access main blog RSS feed');
}
if (strpos($url, 'aggregator/rss') != FALSE || url('aggregator/opml') == $url) {
return user_access('access news feeds') && user_access('access aggregator RSS feeds');
}
return user_access('access content');
}
function rss_permissions_preprocess_page(&$vars) {
if (preg_match('/<link rel="alternate" type="application\\/rss\\+xml" title=".*?" href="(.*?)" \\/>/', $vars['head'], $matches)) {
if (!empty($matches[1]) && !rss_permissions_feed_url_access($matches[1])) {
$vars['head'] = preg_replace('/<link rel="alternate" type="application\\/rss\\+xml" title=".*?" href="' . addcslashes($matches[1], '/') . '" \\/>\\n/', '', $vars['head']);
}
}
}