View source
<?php
function rss_permissions_help($path, $arg) {
switch ($path) {
case 'admin/help#rss_permissions':
return '<p>' . t('RSS permissions module adds role-based permissions to various RSS feeds on a Drupal site. Go to <a href="@rss_permissions">rss_permissions module</a> section of the Permissions page to set permissions for various feeds per role.', array(
'@rss_permissions' => url('admin/people/permissions', array(
'fragment' => 'module-rss_permissions',
)),
)) . '</p>' . '<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>';
break;
}
}
function rss_permissions_permission() {
$rss_permissions = array(
'access site RSS feed' => array(
'title' => t('Access site RSS feed'),
),
);
if (module_exists('taxonomy')) {
$rss_permissions['access taxonomy RSS feeds'] = array(
'title' => t('Access taxonomy Term RSS feeds'),
'description' => t('Only available when the Taxonomy module is enabled.'),
);
}
if (module_exists('blog')) {
$rss_permissions['access user blog RSS feeds'] = array(
'title' => t('Access user blog RSS feeds'),
'description' => t('For feeds typically available at blog/3/feed, for example.'),
);
$rss_permissions['access main blog RSS feed'] = array(
'title' => t('Access main blog RSS feed.'),
);
}
if (module_exists('aggregator')) {
$rss_permissions['access aggregator RSS feeds'] = array(
'title' => t('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/%taxonomy_term/feed']['access callback'] = 'rss_permissions_menu_access';
$items['taxonomy/term/%taxonomy_term/feed']['access arguments'] = array(
'taxonomy',
);
}
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) {
$theme_registry['feed_icon']['function'] = 'rss_permissions_theme_feed_icon';
}
function rss_permissions_theme_feed_icon($variables) {
if (rss_permissions_feed_url_access($variables['url'])) {
return theme_feed_icon($variables);
}
return '';
}
function rss_permissions_menu_access($module) {
switch ($module) {
case 'node':
return user_access('access content') && user_access('access site RSS feed');
break;
case 'taxonomy':
return user_access('access content') && user_access('access taxonomy RSS feeds');
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) {
global $base_url, $base_path;
if (strstr($url, $base_url . $base_path)) {
$url = str_replace($base_url, '', $url);
}
if ('rss.xml' == $url || 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]+)\\/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_html_head_alter(&$head_elements) {
foreach ($head_elements as $key => $element) {
$rel = isset($element['#attributes']['rel']) ? $element['#attributes']['rel'] : NULL;
if (isset($rel) && $rel == 'alternate') {
$href = isset($element['#attributes']['href']) ? $element['#attributes']['href'] : NULL;
if (isset($href) && !rss_permissions_feed_url_access($href)) {
unset($head_elements[$key]);
}
}
}
}