From d486a4789329458859fa95c188e30c45552b2936 Mon Sep 17 00:00:00 2001 From: khacoder Date: Tue, 19 Jul 2016 14:58:21 -0600 Subject: [PATCH 1/4] Add initial checks for user capabilities --- .../Theme/UseCapabilitiesNotRolesSniff.php | 102 ++++++++++++++++++ .../Theme/UseCapabilitiesNotRolesUnitTest.inc | 39 +++++++ .../Theme/UseCapabilitiesNotRolesUnitTest.php | 66 ++++++++++++ 3 files changed, 207 insertions(+) create mode 100644 WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php create mode 100644 WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc create mode 100644 WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.php diff --git a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php new file mode 100644 index 00000000..e461fd68 --- /dev/null +++ b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php @@ -0,0 +1,102 @@ +getTokens(); + $token = $tokens[ $stackPtr ]; + + // the number represents the position in the function call passed variables, + // where the capability is to be listed. + $checks = array( + 'add_dashboard_page' => 3, + 'add_posts_page' => 3, + 'add_media_page' => 3, + 'add_pages_page' => 3, + 'add_comments_page' => 3, + 'add_theme_page' => 3, + 'add_plugins_page' => 3, + 'add_users_page' => 3, + 'add_management_page' => 3, + 'add_options_page' => 3, + 'add_menu_page' => 3, + 'add_utility_page' => 3, + 'add_submenu_page' => 4, + 'current_user_can' => 1, + 'author_can' => 2, + 'current_user_can_for_blog' => 2, + ); + + $roles = array( + 'super_admin', + 'administrator', + 'editor', + 'author', + 'contributor', + 'subscriber', + ); + + $types = array( T_CONSTANT_ENCAPSED_STRING , T_VARIABLE , T_LNUMBER ); + + foreach ( $checks as $key => $check ) { + if ( strpos( $token['content'] , $key ) !== false ) { + + $nextStackPtr = $stackPtr; + + for ( $i = 1; $i <= $check; $i++ ) { + $nextStackPtr = $phpcsFile->findNext( $types , $nextStackPtr + 1 ); + } + + if ( in_array( trim( $tokens[ $nextStackPtr ]['content'] , '\'\"' ) , $roles, true ) ) { + $phpcsFile->addError( 'Please use Capabilities and not Roles in [' . $key . '] ref:https://codex.wordpress.org/Roles_and_Capabilities', $nextStackPtr, 'UseCapabilitiesNotRoles' ); + } elseif ( trim( $tokens[ $nextStackPtr ]['code'] , '\'\"' ) == T_VARIABLE ) { + $phpcsFile->addWarning( 'The capability in [' . $key . '] is a variable. Please check to ensure it is a capability and not a role. ref:https://codex.wordpress.org/Roles_and_Capabilities', $nextStackPtr, 'UseCapabilitiesNotRoles' ); + } + } + } + }//end process() +} diff --git a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc new file mode 100644 index 00000000..8d7ef2a5 --- /dev/null +++ b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc @@ -0,0 +1,39 @@ + int) + */ + public function getErrorList() { + return array( + 6 => 1, + 7 => 1, + 8 => 1, + 9 => 1, + 10 => 1, + 11 => 1, + 12 => 1, + 13 => 1, + 14 => 1, + 15 => 1, + 24 => 1, + 36 => 1, + 39 => 1, + ); + }//end getErrorList() + + /** + * Returns the lines where warnings should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of warnings that should occur on that line. + * + * @return array(int => int) + */ + public function getWarningList() { + return array( + 16 => 1, + 18 => 1, + 21 => 1, + 30 => 1, + 34 => 1, + ); + }//end getWarningList() +}//end class From 7b6348acfa50d5983e3b9fe7cf2e12bd259ed376 Mon Sep 17 00:00:00 2001 From: Ulrich Pogson Date: Mon, 30 Jan 2017 23:28:34 +0100 Subject: [PATCH 2/4] Use the FunctionsParameterAbstract instead --- .../Theme/UseCapabilitiesNotRolesSniff.php | 279 +++++++++++++----- .../Theme/UseCapabilitiesNotRolesUnitTest.inc | 52 ++-- .../Theme/UseCapabilitiesNotRolesUnitTest.php | 56 ++-- 3 files changed, 257 insertions(+), 130 deletions(-) diff --git a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php index e461fd68..3550642d 100644 --- a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php +++ b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php @@ -1,102 +1,231 @@ 3, + 'add_posts_page' => 3, + 'add_media_page' => 3, + 'add_pages_page' => 3, + 'add_comments_page' => 3, + 'add_theme_page' => 3, + 'add_plugins_page' => 3, + 'add_users_page' => 3, + 'add_management_page' => 3, + 'add_options_page' => 3, + 'add_menu_page' => 3, + 'add_utility_page' => 3, + 'add_submenu_page' => 4, + 'current_user_can' => 1, + 'author_can' => 2, + 'current_user_can_for_blog' => 2, + ); - $tokens = $phpcsFile->getTokens(); - $token = $tokens[ $stackPtr ]; + /** + * Array of core roles. + * + * @since 0.xx.0 + * + * @var array Role available in core. + */ + protected $core_roles = array( + 'super_admin' => true, + 'administrator' => true, + 'editor' => true, + 'author' => true, + 'contributor' => true, + 'subscriber' => true, + ); - // the number represents the position in the function call passed variables, - // where the capability is to be listed. - $checks = array( - 'add_dashboard_page' => 3, - 'add_posts_page' => 3, - 'add_media_page' => 3, - 'add_pages_page' => 3, - 'add_comments_page' => 3, - 'add_theme_page' => 3, - 'add_plugins_page' => 3, - 'add_users_page' => 3, - 'add_management_page' => 3, - 'add_options_page' => 3, - 'add_menu_page' => 3, - 'add_utility_page' => 3, - 'add_submenu_page' => 4, - 'current_user_can' => 1, - 'author_can' => 2, - 'current_user_can_for_blog' => 2, - ); + /** + * Array of core capabilities. + * + * @since 0.xx.0 + * + * @var array Capabilities available in core. + */ + protected $core_capabilities = array( + 'create_sites' => true, + 'delete_sites' => true, + 'manage_network' => true, + 'manage_sites' => true, + 'manage_network_users' => true, + 'manage_network_plugins' => true, + 'manage_network_themes' => true, + 'manage_network_options' => true, + 'create_sites' => true, + 'delete_sites' => true, + 'manage_network' => true, + 'manage_sites' => true, + 'manage_network_users' => true, + 'manage_network_plugins' => true, + 'manage_network_themes' => true, + 'manage_network_options' => true, + 'activate_plugins' => true, + 'delete_others_pages' => true, + 'delete_others_posts' => true, + 'delete_pages' => true, + 'delete_posts' => true, + 'delete_private_pages' => true, + 'delete_private_posts' => true, + 'delete_published_pages' => true, + 'delete_published_posts' => true, + 'edit_dashboard' => true, + 'edit_others_pages' => true, + 'edit_others_posts' => true, + 'edit_pages' => true, + 'edit_posts' => true, + 'edit_private_pages' => true, + 'edit_private_posts' => true, + 'edit_published_pages' => true, + 'edit_published_posts' => true, + 'edit_theme_options' => true, + 'export' => true, + 'import' => true, + 'list_users' => true, + 'manage_categories' => true, + 'manage_links' => true, + 'manage_options' => true, + 'moderate_comments' => true, + 'promote_users' => true, + 'publish_pages' => true, + 'publish_posts' => true, + 'read_private_pages' => true, + 'read_private_posts' => true, + 'read' => true, + 'remove_users' => true, + 'switch_themes' => true, + 'upload_files' => true, + 'customize' => true, + 'delete_site' => true, + 'update_core' => true, + 'update_plugins' => true, + 'update_themes' => true, + 'install_plugins' => true, + 'install_themes' => true, + 'upload_plugins' => true, + 'upload_themes' => true, + 'delete_themes' => true, + 'delete_plugins' => true, + 'edit_plugins' => true, + 'edit_themes' => true, + 'edit_files' => true, + 'edit_users' => true, + 'create_users' => true, + 'delete_users' => true, + 'unfiltered_html' => true, + 'delete_others_pages' => true, + 'delete_others_posts' => true, + 'delete_pages' => true, + 'delete_posts' => true, + 'delete_private_pages' => true, + 'delete_private_posts' => true, + 'delete_published_pages' => true, + 'delete_published_posts' => true, + 'edit_others_pages' => true, + 'edit_others_posts' => true, + 'edit_pages' => true, + 'edit_posts' => true, + 'edit_private_pages' => true, + 'edit_private_posts' => true, + 'edit_published_pages' => true, + 'edit_published_posts' => true, + 'manage_categories' => true, + 'manage_links' => true, + 'moderate_comments' => true, + 'publish_pages' => true, + 'publish_posts' => true, + 'read' => true, + 'read_private_pages' => true, + 'read_private_posts' => true, + 'upload_files' => true, + 'delete_posts' => true, + 'delete_published_posts' => true, + 'edit_posts' => true, + 'edit_published_posts' => true, + 'publish_posts' => true, + 'read' => true, + 'upload_files' => true, + 'delete_posts' => true, + 'edit_posts' => true, + 'read' => true, + ); - $roles = array( - 'super_admin', - 'administrator', - 'editor', - 'author', - 'contributor', - 'subscriber', - ); + /** + * Process the parameters of a matched function. + * + * @since 0.xx.0 + * + * @param int $stackPtr The position of the current token in the stack. + * @param array $group_name The name of the group which was matched. + * @param string $matched_content The token content (function name) which was matched. + * @param array $parameters Array with information about the parameters. + * + * @return void + */ + public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $types = array( T_CONSTANT_ENCAPSED_STRING , T_VARIABLE , T_LNUMBER ); + $position = $this->target_functions[ $matched_content ]; + if ( ! isset( $parameters[ $position ] ) ) { + return; + } - foreach ( $checks as $key => $check ) { - if ( strpos( $token['content'] , $key ) !== false ) { + $matched_parameter = $this->strip_quotes( $parameters[ $position ]['raw'] ); + if ( isset( $this->core_capabilities[ $matched_parameter ] ) ) { + return; + } - $nextStackPtr = $stackPtr; + if ( isset( $this->core_roles[ $matched_parameter ] ) ) { + $this->phpcsFile->addError( + 'Use capabilities and not roles in %s().', + $stackPtr, + 'RoleFound', + array( $matched_content ) + ); + } else { + $this->phpcsFile->addWarning( + 'The parameter %s is an unknown role or capability. Check %s() to ensure it is a capability and not a role.', + $stackPtr, + 'PossibleRoleFound', + array( $matched_parameter, $matched_content ) + ); + } - for ( $i = 1; $i <= $check; $i++ ) { - $nextStackPtr = $phpcsFile->findNext( $types , $nextStackPtr + 1 ); - } + } - if ( in_array( trim( $tokens[ $nextStackPtr ]['content'] , '\'\"' ) , $roles, true ) ) { - $phpcsFile->addError( 'Please use Capabilities and not Roles in [' . $key . '] ref:https://codex.wordpress.org/Roles_and_Capabilities', $nextStackPtr, 'UseCapabilitiesNotRoles' ); - } elseif ( trim( $tokens[ $nextStackPtr ]['code'] , '\'\"' ) == T_VARIABLE ) { - $phpcsFile->addWarning( 'The capability in [' . $key . '] is a variable. Please check to ensure it is a capability and not a role. ref:https://codex.wordpress.org/Roles_and_Capabilities', $nextStackPtr, 'UseCapabilitiesNotRoles' ); - } - } - } - }//end process() } diff --git a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc index 8d7ef2a5..2ea296fc 100644 --- a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc +++ b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc @@ -1,39 +1,41 @@ int) + * @return array => */ public function getErrorList() { return array( - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, + 6 => 1, + 7 => 1, + 8 => 1, + 9 => 1, 10 => 1, 11 => 1, 12 => 1, 13 => 1, 14 => 1, 15 => 1, - 24 => 1, + 23 => 1, 36 => 1, 39 => 1, ); - }//end getErrorList() + } /** * Returns the lines where warnings should occur. * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array(int => int) + * @return array => */ public function getWarningList() { return array( 16 => 1, 18 => 1, + 19 => 1, + 20 => 1, 21 => 1, - 30 => 1, + 22 => 1, + 26 => 1, 34 => 1, + 35 => 1, + 37 => 1, + 38 => 1, ); - }//end getWarningList() -}//end class + } + +} // End class. From e9f10b329d0fc91a106b4a0feaac3d7b6fadfe6b Mon Sep 17 00:00:00 2001 From: Ulrich Pogson Date: Sat, 25 Mar 2017 21:50:11 +0100 Subject: [PATCH 3/4] Update lists and messages --- .../Theme/UseCapabilitiesNotRolesSniff.php | 195 ++++++++---------- .../Theme/UseCapabilitiesNotRolesUnitTest.inc | 54 ++--- 2 files changed, 108 insertions(+), 141 deletions(-) diff --git a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php index 3550642d..5630ef45 100644 --- a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php +++ b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php @@ -28,162 +28,123 @@ class WordPress_Sniffs_Theme_UseCapabilitiesNotRolesSniff extends WordPress_Abst protected $group_name = 'caps_not_roles'; /** - * Array of functions with position. + * Array of functions that accept roles and capabilities as an agrument. * * The number represents the position in the function call * passed variables, here the capability is to be listed. + * The list is sorted alphabetically. * * @since 0.xx.0 * * @var array Function name with parameter position. */ protected $target_functions = array( + 'add_comments_page' => 3, 'add_dashboard_page' => 3, - 'add_posts_page' => 3, + 'add_management_page' => 3, 'add_media_page' => 3, + 'add_menu_page' => 3, + 'add_object_page' => 3, + 'add_options_page' => 3, 'add_pages_page' => 3, - 'add_comments_page' => 3, - 'add_theme_page' => 3, 'add_plugins_page' => 3, + 'add_posts_page' => 3, + 'add_submenu_page' => 4, + 'add_theme_page' => 3, 'add_users_page' => 3, - 'add_management_page' => 3, - 'add_options_page' => 3, - 'add_menu_page' => 3, 'add_utility_page' => 3, - 'add_submenu_page' => 4, - 'current_user_can' => 1, 'author_can' => 2, + 'current_user_can' => 1, 'current_user_can_for_blog' => 2, - ); + 'user_can' => 2, - /** - * Array of core roles. - * - * @since 0.xx.0 - * - * @var array Role available in core. - */ - protected $core_roles = array( - 'super_admin' => true, - 'administrator' => true, - 'editor' => true, - 'author' => true, - 'contributor' => true, - 'subscriber' => true, ); /** * Array of core capabilities. * + * @link https://github.com/WordPress/wordpress-develop/blob/master/tests/phpunit/tests/user/capabilities.php + * * @since 0.xx.0 * * @var array Capabilities available in core. */ protected $core_capabilities = array( - 'create_sites' => true, - 'delete_sites' => true, - 'manage_network' => true, - 'manage_sites' => true, - 'manage_network_users' => true, - 'manage_network_plugins' => true, - 'manage_network_themes' => true, - 'manage_network_options' => true, - 'create_sites' => true, - 'delete_sites' => true, - 'manage_network' => true, - 'manage_sites' => true, - 'manage_network_users' => true, - 'manage_network_plugins' => true, - 'manage_network_themes' => true, - 'manage_network_options' => true, + 'unfiltered_html' => true, 'activate_plugins' => true, - 'delete_others_pages' => true, - 'delete_others_posts' => true, - 'delete_pages' => true, - 'delete_posts' => true, - 'delete_private_pages' => true, - 'delete_private_posts' => true, - 'delete_published_pages' => true, - 'delete_published_posts' => true, - 'edit_dashboard' => true, - 'edit_others_pages' => true, - 'edit_others_posts' => true, - 'edit_pages' => true, - 'edit_posts' => true, - 'edit_private_pages' => true, - 'edit_private_posts' => true, - 'edit_published_pages' => true, - 'edit_published_posts' => true, + 'create_users' => true, + 'delete_plugins' => true, + 'delete_themes' => true, + 'delete_users' => true, + 'edit_files' => true, + 'edit_plugins' => true, + 'edit_themes' => true, + 'edit_users' => true, + 'install_plugins' => true, + 'install_themes' => true, + 'update_core' => true, + 'update_plugins' => true, + 'update_themes' => true, 'edit_theme_options' => true, 'export' => true, 'import' => true, 'list_users' => true, - 'manage_categories' => true, - 'manage_links' => true, 'manage_options' => true, - 'moderate_comments' => true, 'promote_users' => true, - 'publish_pages' => true, - 'publish_posts' => true, - 'read_private_pages' => true, - 'read_private_posts' => true, - 'read' => true, 'remove_users' => true, 'switch_themes' => true, - 'upload_files' => true, - 'customize' => true, - 'delete_site' => true, - 'update_core' => true, - 'update_plugins' => true, - 'update_themes' => true, - 'install_plugins' => true, - 'install_themes' => true, - 'upload_plugins' => true, - 'upload_themes' => true, - 'delete_themes' => true, - 'delete_plugins' => true, - 'edit_plugins' => true, - 'edit_themes' => true, - 'edit_files' => true, - 'edit_users' => true, - 'create_users' => true, - 'delete_users' => true, - 'unfiltered_html' => true, - 'delete_others_pages' => true, - 'delete_others_posts' => true, - 'delete_pages' => true, - 'delete_posts' => true, - 'delete_private_pages' => true, - 'delete_private_posts' => true, - 'delete_published_pages' => true, - 'delete_published_posts' => true, - 'edit_others_pages' => true, + 'edit_dashboard' => true, + 'moderate_comments' => true, + 'manage_categories' => true, 'edit_others_posts' => true, 'edit_pages' => true, - 'edit_posts' => true, - 'edit_private_pages' => true, - 'edit_private_posts' => true, + 'edit_others_pages' => true, 'edit_published_pages' => true, - 'edit_published_posts' => true, - 'manage_categories' => true, - 'manage_links' => true, - 'moderate_comments' => true, 'publish_pages' => true, - 'publish_posts' => true, - 'read' => true, - 'read_private_pages' => true, + 'delete_pages' => true, + 'delete_others_pages' => true, + 'delete_published_pages' => true, + 'delete_others_posts' => true, + 'delete_private_posts' => true, + 'edit_private_posts' => true, 'read_private_posts' => true, + 'delete_private_pages' => true, + 'edit_private_pages' => true, + 'read_private_pages' => true, + 'edit_published_posts' => true, 'upload_files' => true, - 'delete_posts' => true, + 'publish_posts' => true, 'delete_published_posts' => true, 'edit_posts' => true, - 'edit_published_posts' => true, - 'publish_posts' => true, - 'read' => true, - 'upload_files' => true, 'delete_posts' => true, - 'edit_posts' => true, 'read' => true, + 'level_10' => true, + 'level_9' => true, + 'level_8' => true, + 'level_7' => true, + 'level_6' => true, + 'level_5' => true, + 'level_4' => true, + 'level_3' => true, + 'level_2' => true, + 'level_1' => true, + 'level_0' => true, + ); + + /** + * Array of core roles. + * + * @since 0.xx.0 + * + * @var array Role available in core. + */ + protected $core_roles = array( + 'super_admin' => true, + 'administrator' => true, + 'editor' => true, + 'author' => true, + 'contributor' => true, + 'subscriber' => true, ); /** @@ -212,17 +173,23 @@ public function process_parameters( $stackPtr, $group_name, $matched_content, $p if ( isset( $this->core_roles[ $matched_parameter ] ) ) { $this->phpcsFile->addError( - 'Use capabilities and not roles in %s().', + 'Capabilities should be used instead of roles. Found "%s" in function "%s"', $stackPtr, 'RoleFound', - array( $matched_content ) + array( + $matched_parameter, + $matched_content, + ) ); } else { $this->phpcsFile->addWarning( - 'The parameter %s is an unknown role or capability. Check %s() to ensure it is a capability and not a role.', + '"%s" is an unknown role or capability. Check the "%s()" function call to ensure it is a capability and not a role.', $stackPtr, - 'PossibleRoleFound', - array( $matched_parameter, $matched_content ) + 'UnknownCapabilityFound', + array( + $matched_parameter, + $matched_content + ) ); } diff --git a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc index 2ea296fc..28891b24 100644 --- a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc +++ b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.inc @@ -1,41 +1,41 @@ Date: Thu, 31 May 2018 16:50:49 +0200 Subject: [PATCH 4/4] PHPCS 3.x compat: Namespace all things --- WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php | 6 +++++- WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php index 5630ef45..ddfef63b 100644 --- a/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php +++ b/WordPress/Sniffs/Theme/UseCapabilitiesNotRolesSniff.php @@ -7,6 +7,10 @@ * @license https://opensource.org/licenses/MIT MIT */ +namespace WordPress\Sniffs\Theme; + +use WordPress\AbstractFunctionParameterSniff; + /** * User capabilities should be used not roles. * @@ -16,7 +20,7 @@ * * @since 0.xx.0 */ -class WordPress_Sniffs_Theme_UseCapabilitiesNotRolesSniff extends WordPress_AbstractFunctionParameterSniff { +class UseCapabilitiesNotRolesSniff extends AbstractFunctionParameterSniff { /** * The group name for this group of functions. diff --git a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.php b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.php index 448b12df..b9d27570 100644 --- a/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.php +++ b/WordPress/Tests/Theme/UseCapabilitiesNotRolesUnitTest.php @@ -7,13 +7,17 @@ * @license https://opensource.org/licenses/MIT MIT */ +namespace WordPress\Tests\Theme; + +use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; + /** * Unit test class for the UseCapabilitiesNotRoles sniff. * * @package WPCS\WordPressCodingStandards * @since 0.xx.0 */ -class WordPress_Tests_Theme_UseCapabilitiesNotRolesUnitTest extends AbstractSniffUnitTest { +class UseCapabilitiesNotRolesUnitTest extends AbstractSniffUnitTest { /** * Returns the lines where errors should occur.