Advanced Access Manager - Version 3.6

Version Description

  • Added Media Access Control feature
  • Added Access Denied Handling feature
  • Improved core functionality
Download this release

Release Info

Developer vasyl_m
Plugin Icon 128x128 Advanced Access Manager
Version 3.6
Comparing to
See all releases

Code changes from version 3.5 to 3.6

Application/Backend/Feature/ProductList.php CHANGED
@@ -65,7 +65,7 @@ return array(
65
  'id' => 'AAM Post Filter',
66
  'type' => 'GNU',
67
  'license' => 'AAMPOSTFILTER',
68
- 'description' => AAM_Backend_View_Helper::preparePhrase('[WARNING!] Please use with caution. This is a supportive exension for the post access option [List]. It adds additional post filtering to fix the issue with large amount of post. [Turned on caching] is strongly recommended.', 'strong', 'strong', 'strong'),
69
  'status' => AAM_Core_Repository::getInstance()->extensionStatus('AAM Post Filter'),
70
  'version' => AAM_Core_Repository::getInstance()->getExtensionVersion('AAM Post Filter')
71
  ),
@@ -76,6 +76,13 @@ return array(
76
  'description' => '<span class="aam-highlight">Highly recommended!</span> ' . __('Patent-pending technology that provides solutions to PHP errors within hours, preventing costly maintenance time and keeping your WordPress site error.', AAM_KEY) . ' <a href="http://codepinch.io" target="_blank">Read more.</a>',
77
  'status' => AAM_Core_Repository::getInstance()->pluginStatus('WP Error Fix')
78
  ),
 
 
 
 
 
 
 
79
  array(
80
  'title' => 'User Switching',
81
  'id' => 'User Switching',
65
  'id' => 'AAM Post Filter',
66
  'type' => 'GNU',
67
  'license' => 'AAMPOSTFILTER',
68
+ 'description' => AAM_Backend_View_Helper::preparePhrase('[WARNING!] Please use with caution. This is a supportive exension for the post access option [LIST]. It adds additional post filtering to fix the issue with large amount of posts.', 'strong', 'strong'),
69
  'status' => AAM_Core_Repository::getInstance()->extensionStatus('AAM Post Filter'),
70
  'version' => AAM_Core_Repository::getInstance()->getExtensionVersion('AAM Post Filter')
71
  ),
76
  'description' => '<span class="aam-highlight">Highly recommended!</span> ' . __('Patent-pending technology that provides solutions to PHP errors within hours, preventing costly maintenance time and keeping your WordPress site error.', AAM_KEY) . ' <a href="http://codepinch.io" target="_blank">Read more.</a>',
77
  'status' => AAM_Core_Repository::getInstance()->pluginStatus('WP Error Fix')
78
  ),
79
+ array(
80
+ 'title' => 'ConfigPress',
81
+ 'id' => 'ConfigPress',
82
+ 'type' => 'plugin',
83
+ 'description' => __('Development tool with an easy way to manage all your website custom settings. ', AAM_KEY) . ' <a href="http://vasyltech.com/config-press" target="_blank">Read more.</a>',
84
+ 'status' => AAM_Core_Repository::getInstance()->pluginStatus('ConfigPress')
85
+ ),
86
  array(
87
  'title' => 'User Switching',
88
  'id' => 'User Switching',
Application/Backend/Filter.php CHANGED
@@ -95,9 +95,11 @@ class AAM_Backend_Filter {
95
  } else {
96
  $menu = $plugin_page;
97
  }
 
 
98
 
99
- if (AAM::getUser()->getObject('menu')->has($menu)) {
100
- AAM_Core_API::reject('backend');
101
  }
102
  }
103
 
@@ -190,9 +192,12 @@ class AAM_Backend_Filter {
190
  global $post;
191
 
192
  if (is_a($post, 'WP_Post')) {
193
- $user = AAM::getUser();
194
- if ($user->getObject('post', $post->ID)->has('backend.edit')) {
195
- AAM_Core_API::reject();
 
 
 
196
  }
197
  }
198
  }
@@ -207,14 +212,14 @@ class AAM_Backend_Filter {
207
  * @access public
208
  */
209
  public function getPost() {
 
 
210
  if (get_post()) {
211
  $post = get_post();
212
  } elseif ($post_id = AAM_Core_Request::get('post')) {
213
  $post = get_post($post_id);
214
  } elseif ($post_id = AAM_Core_Request::get('post_ID')) {
215
  $post = get_post($post_id);
216
- } else {
217
- $post = null;
218
  }
219
 
220
  return $post;
@@ -230,7 +235,13 @@ class AAM_Backend_Filter {
230
  * @access public
231
  */
232
  public function backendDie($function) {
233
- AAM_Core_API::reject('backend', $function);
 
 
 
 
 
 
234
  }
235
 
236
  /**
95
  } else {
96
  $menu = $plugin_page;
97
  }
98
+
99
+ $object = AAM::getUser()->getObject('menu');
100
 
101
+ if ($object->has($menu)) {
102
+ AAM_Core_API::reject('backend', array('object' => $object, 'id' => $menu));
103
  }
104
  }
105
 
192
  global $post;
193
 
194
  if (is_a($post, 'WP_Post')) {
195
+ $object = AAM::getUser()->getObject('post', $post->ID);
196
+ if ($object->has('backend.edit')) {
197
+ AAM_Core_API::reject(
198
+ 'backend',
199
+ array('object' => $object, 'action' => 'backend.edit')
200
+ );
201
  }
202
  }
203
  }
212
  * @access public
213
  */
214
  public function getPost() {
215
+ $post = null;
216
+
217
  if (get_post()) {
218
  $post = get_post();
219
  } elseif ($post_id = AAM_Core_Request::get('post')) {
220
  $post = get_post($post_id);
221
  } elseif ($post_id = AAM_Core_Request::get('post_ID')) {
222
  $post = get_post($post_id);
 
 
223
  }
224
 
225
  return $post;
235
  * @access public
236
  */
237
  public function backendDie($function) {
238
+ if (AAM_Core_Config::get('access-denied-handler', true)) {
239
+ AAM_Core_API::reject(
240
+ 'backend', array('callback' => $function, 'skip-die' => true)
241
+ );
242
+ }
243
+
244
+ return $function;
245
  }
246
 
247
  /**
Application/Backend/Manager.php CHANGED
@@ -117,14 +117,20 @@ class AAM_Backend_Manager {
117
  *
118
  */
119
  public function metabox() {
120
- add_meta_box(
121
- 'aam-acceess-control',
122
- __('Access Manager', AAM_KEY),
123
- array($this, 'renderMetabox'),
124
- null,
125
- 'side',
126
- 'high'
127
  );
 
 
 
 
 
 
 
 
 
 
 
128
  }
129
 
130
  /**
117
  *
118
  */
119
  public function metabox() {
120
+ $cap = AAM_Core_Config::get(
121
+ AAM_Backend_Feature_Post::getAccessOption(), 'administrator'
 
 
 
 
 
122
  );
123
+
124
+ if (AAM::getUser()->hasCapability($cap)) {
125
+ add_meta_box(
126
+ 'aam-acceess-control',
127
+ __('Access Manager', AAM_KEY),
128
+ array($this, 'renderMetabox'),
129
+ null,
130
+ 'side',
131
+ 'high'
132
+ );
133
+ }
134
  }
135
 
136
  /**
Application/Backend/phtml/utility.phtml CHANGED
@@ -1,12 +1,20 @@
1
  <?php if (defined('AAM_KEY')) { ?>
2
  <div class="aam-feature" id="utilities-content">
 
 
 
 
 
 
 
 
3
  <table class="table table-striped table-bordered">
4
  <tbody>
5
  <tr>
6
  <td>
7
  <span class='aam-setting-title'><?php echo __('Edit/Delete Capabilities', AAM_KEY); ?></span>
8
  <p class="aam-setting-description">
9
- <?php echo AAM_Backend_View_Helper::preparePhrase('[Please notice!] This feature should be used only by experienced users. Toggle an ability to edit or delete capabilities. [Since AAM v3.0.6]', 'strong', 'small'); ?>
10
  </p>
11
  </td>
12
  <td>
@@ -17,7 +25,7 @@
17
  <td>
18
  <span class='aam-setting-title'><?php echo __('Backend Access Control', AAM_KEY); ?></span>
19
  <p class="aam-setting-description">
20
- <?php echo AAM_Backend_View_Helper::preparePhrase('Use AAM to control access to posts, pages, categories, menus and metaboxes etc. Disable this setting to stop AAM from controling access for backend. [Since AAM v3.1]', 'small'); ?>
21
  </p>
22
  </td>
23
  <td>
@@ -28,13 +36,35 @@
28
  <td>
29
  <span class='aam-setting-title'><?php echo __('Frontend Access Control', AAM_KEY); ?></span>
30
  <p class="aam-setting-description">
31
- <?php echo AAM_Backend_View_Helper::preparePhrase('Use AAM to control access to posts, pages, categories, menus and widgets. Disable this setting to stop AAM from controling access for frontend. [Since AAM v3.1]', 'small'); ?>
32
  </p>
33
  </td>
34
  <td>
35
  <input data-toggle="toggle" data-on="<?php echo __('Enabled', AAM_KEY); ?>" data-off="<?php echo __('Disabled', AAM_KEY); ?>" type="checkbox" name="frontend-access-control" <?php echo (AAM_Core_Config::get('frontend-access-control', true) ? 'checked' : ''); ?> />
36
  </td>
37
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  <?php do_action('aam-utilities-setting'); ?>
39
  <tr>
40
  <td>
1
  <?php if (defined('AAM_KEY')) { ?>
2
  <div class="aam-feature" id="utilities-content">
3
+ <div class="row">
4
+ <div class="col-xs-12">
5
+ <p class="aam-info">
6
+ <?php echo sprintf(AAM_Backend_View_Helper::preparePhrase('To learn more about AAM Utilities check %sAAM Utilities%s article.'), '<a href="http://vasyltech.com/blog/aam-utilities" target="_blank">', '</a>'); ?><br/>
7
+ </p>
8
+ </div>
9
+ </div>
10
+
11
  <table class="table table-striped table-bordered">
12
  <tbody>
13
  <tr>
14
  <td>
15
  <span class='aam-setting-title'><?php echo __('Edit/Delete Capabilities', AAM_KEY); ?></span>
16
  <p class="aam-setting-description">
17
+ <?php echo AAM_Backend_View_Helper::preparePhrase('[Please notice!] This feature should be used only by experienced users. Toggle an ability to edit or delete capabilities.', 'strong'); ?>
18
  </p>
19
  </td>
20
  <td>
25
  <td>
26
  <span class='aam-setting-title'><?php echo __('Backend Access Control', AAM_KEY); ?></span>
27
  <p class="aam-setting-description">
28
+ <?php echo AAM_Backend_View_Helper::preparePhrase('Use AAM to control access to posts, pages, categories, menus and metaboxes etc. Disable this setting to stop AAM from controling access for backend.'); ?>
29
  </p>
30
  </td>
31
  <td>
36
  <td>
37
  <span class='aam-setting-title'><?php echo __('Frontend Access Control', AAM_KEY); ?></span>
38
  <p class="aam-setting-description">
39
+ <?php echo AAM_Backend_View_Helper::preparePhrase('Use AAM to control access to posts, pages, categories, menus and widgets. Disable this setting to stop AAM from controling access for frontend.'); ?>
40
  </p>
41
  </td>
42
  <td>
43
  <input data-toggle="toggle" data-on="<?php echo __('Enabled', AAM_KEY); ?>" data-off="<?php echo __('Disabled', AAM_KEY); ?>" type="checkbox" name="frontend-access-control" <?php echo (AAM_Core_Config::get('frontend-access-control', true) ? 'checked' : ''); ?> />
44
  </td>
45
  </tr>
46
+ <tr>
47
+ <td>
48
+ <span class='aam-setting-title'><?php echo __('Media Files Access Control', AAM_KEY); ?></span>
49
+ <p class="aam-setting-description">
50
+ <?php echo sprintf(AAM_Backend_View_Helper::preparePhrase('When enabled, AAM will physically control access to all media files located in [uploads] folder. For more information check %sthis tutorial%s.', 'strong'), '<a href="http://vasyltech.com/blog/wordpress-media-access-control" target="_blank">', '</a>'); ?>
51
+ </p>
52
+ </td>
53
+ <td>
54
+ <input data-toggle="toggle" data-on="<?php echo __('Enabled', AAM_KEY); ?>" data-off="<?php echo __('Disabled', AAM_KEY); ?>" type="checkbox" name="media-access-control" <?php echo (AAM_Core_Config::get('media-access-control', true) ? 'checked' : ''); ?> />
55
+ </td>
56
+ </tr>
57
+ <tr>
58
+ <td>
59
+ <span class='aam-setting-title'><?php echo __('Access Denied Handling', AAM_KEY); ?></span>
60
+ <p class="aam-setting-description">
61
+ <?php echo sprintf(AAM_Backend_View_Helper::preparePhrase('Take control over the default [Access Denied] behavior when access is restricted for a certain resource like page, post or menu. For more information read %sthis tutorial%s.', 'strong'), '<a href="http://vasyltech.com/blog/wordpress-access-denied-handling" target="_blank">', '</a>'); ?>
62
+ </p>
63
+ </td>
64
+ <td>
65
+ <input data-toggle="toggle" data-on="<?php echo __('Enabled', AAM_KEY); ?>" data-off="<?php echo __('Disabled', AAM_KEY); ?>" type="checkbox" name="access-denied-handler" <?php echo (AAM_Core_Config::get('access-denied-handler', true) ? 'checked' : ''); ?> />
66
+ </td>
67
+ </tr>
68
  <?php do_action('aam-utilities-setting'); ?>
69
  <tr>
70
  <td>
Application/Core/API.php CHANGED
@@ -187,28 +187,33 @@ final class AAM_Core_API {
187
  *
188
  * Redirect or die the execution based on ConfigPress settings
189
  *
190
- * @param string $area
191
- * @param callback $callback
192
  *
193
  * @return void
194
  *
195
  * @access public
196
  */
197
- public static function reject($area = 'frontend', $callback = null) {
198
  $redirect = AAM_Core_Config::get("{$area}.access.deny.redirect");
199
  $message = AAM_Core_Config::get(
200
  "{$area}.access.deny.message", __('Access Denied', AAM_KEY)
201
  );
 
 
202
 
203
- if (filter_var($redirect, FILTER_VALIDATE_URL)) {
204
- wp_redirect($redirect);
205
- } elseif (is_int($redirect)) {
206
- wp_redirect(get_post_permalink($redirect));
207
- } elseif (!empty($callback)) {
208
- call_user_func($callback, $message, '', array());
209
- } else {
210
- wp_die($message);
 
 
211
  }
 
212
  exit;
213
  }
214
 
187
  *
188
  * Redirect or die the execution based on ConfigPress settings
189
  *
190
+ * @param string $area
191
+ * @param array $args
192
  *
193
  * @return void
194
  *
195
  * @access public
196
  */
197
+ public static function reject($area = 'frontend', $args = array()) {
198
  $redirect = AAM_Core_Config::get("{$area}.access.deny.redirect");
199
  $message = AAM_Core_Config::get(
200
  "{$area}.access.deny.message", __('Access Denied', AAM_KEY)
201
  );
202
+
203
+ $manage = AAM_Core_Config::get('access-denied-handler', true);
204
 
205
+ if ($manage) {
206
+ if (filter_var($redirect, FILTER_VALIDATE_URL)) {
207
+ wp_redirect($redirect);
208
+ } elseif (intval($redirect)) {
209
+ wp_redirect(get_post_permalink($redirect));
210
+ } elseif (is_callable($redirect)) {
211
+ call_user_func($redirect, $args);
212
+ } elseif (!empty($args['callback']) && is_callable($args['callback'])) {
213
+ call_user_func($args['callback'], $message, '', array());
214
+ }
215
  }
216
+ if (empty($args['skip-die'])) { wp_die($message); }
217
  exit;
218
  }
219
 
Application/Core/Media.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * ======================================================================
5
+ * LICENSE: This file is subject to the terms and conditions defined in *
6
+ * file 'LICENSE', which is part of this source code package. *
7
+ * ======================================================================
8
+ */
9
+
10
+ /**
11
+ * AAM Media Access
12
+ *
13
+ * @package AAM
14
+ * @author Vasyl Martyniuk <vasyl@vasyltech.com>
15
+ */
16
+ class AAM_Core_Media {
17
+
18
+ /**
19
+ * Instance of itself
20
+ *
21
+ * @var AAM_PlusPackage
22
+ *
23
+ * @access private
24
+ */
25
+ private static $_instance = null;
26
+
27
+ /**
28
+ * Initialize the extension
29
+ *
30
+ * @return void
31
+ *
32
+ * @access protected
33
+ */
34
+ protected function __construct() {
35
+ if (AAM_Core_Request::get('aam-media')) {
36
+ $area = (is_admin() ? 'backend' : 'frontend');
37
+ if (AAM_Core_Config::get("{$area}-access-control")) {
38
+ $this->checkMediaAccess();
39
+ }
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Check media access
45
+ *
46
+ * @return void
47
+ *
48
+ * @access protected
49
+ */
50
+ protected function checkMediaAccess() {
51
+ $directory = wp_get_upload_dir();
52
+
53
+ $abspath = str_replace('\\', '/', ABSPATH);
54
+ $uploads = str_replace('\\', '/', $directory['basedir']);
55
+ $request = AAM_Core_Request::server('REQUEST_URI');
56
+
57
+ if (strpos($request, str_replace($abspath, '/', $uploads)) === 0) {
58
+ $media = $this->findMedia($request);
59
+ $area = (is_admin() ? 'backend' : 'frontend');
60
+
61
+ if (empty($media) || !$media->has("{$area}.read")) {
62
+ @header('Content-Type: ' . $media->post_mime_type);
63
+ echo file_get_contents(ABSPATH . $request);
64
+ exit;
65
+ } elseif (!empty($media)) {
66
+ AAM_Core_API::reject(
67
+ $area, array('object' => $media, 'action' => "{$area}.read")
68
+ );
69
+ }
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Find media by URI
75
+ *
76
+ * @global Wpdb $wpdb
77
+ *
78
+ * @param string $uri
79
+ *
80
+ * @return AAM_Core_Object_Post|null
81
+ *
82
+ * @access protected
83
+ */
84
+ protected function findMedia($uri) {
85
+ global $wpdb;
86
+
87
+ $s = addslashes(preg_replace('/(-[\d]+x[\d]+)(\.[\w]+)$/', '$2', $uri));
88
+ $id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE guid LIKE '%$s'");
89
+
90
+ return ($id ? AAM::getUser()->getObject('post', $id) : null);
91
+ }
92
+
93
+ /**
94
+ * Bootstrap the extension
95
+ *
96
+ * @return AAM_Skeleton
97
+ *
98
+ * @access public
99
+ */
100
+ public static function bootstrap() {
101
+ if (is_null(self::$_instance)) {
102
+ self::$_instance = new self;
103
+ }
104
+
105
+ return self::$_instance;
106
+ }
107
+
108
+ }
Application/Core/Object/Post.php CHANGED
@@ -48,6 +48,17 @@ class AAM_Core_Object_Post extends AAM_Core_Object {
48
  $this->read();
49
  }
50
  }
 
 
 
 
 
 
 
 
 
 
 
51
 
52
  /**
53
  * Read the Post AAM Metadata
48
  $this->read();
49
  }
50
  }
51
+
52
+ /**
53
+ *
54
+ * @param type $name
55
+ * @return type
56
+ */
57
+ public function __get($name) {
58
+ $post = $this->getPost();
59
+
60
+ return (property_exists($post, $name) ? $post->$name : null);
61
+ }
62
 
63
  /**
64
  * Read the Post AAM Metadata
Application/Frontend/Manager.php CHANGED
@@ -67,7 +67,10 @@ class AAM_Frontend_Manager {
67
  $others = $object->has('frontend.read_others');
68
 
69
  if ($read || ($others && !$this->isAuthor($post))) {
70
- AAM_Core_API::reject();
 
 
 
71
  }
72
  //trigger any action that is listeting
73
  do_action('aam-wp-action', $object);
67
  $others = $object->has('frontend.read_others');
68
 
69
  if ($read || ($others && !$this->isAuthor($post))) {
70
+ AAM_Core_API::reject(
71
+ 'frontend',
72
+ array('object' => $object, 'action' => 'frontend.read')
73
+ );
74
  }
75
  //trigger any action that is listeting
76
  do_action('aam-wp-action', $object);
Lang/advanced-access-manager-en_US.mo CHANGED
Binary file
Lang/advanced-access-manager-en_US.po CHANGED
@@ -1,7 +1,7 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: AAM\n"
4
- "POT-Creation-Date: 2016-07-13 11:39-0400\n"
5
  "PO-Revision-Date: \n"
6
  "Language-Team: WP AAM <vasyl@vasyltech.com>\n"
7
  "MIME-Version: 1.0\n"
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: AAM\n"
4
+ "POT-Creation-Date: 2016-08-01 19:29-0400\n"
5
  "PO-Revision-Date: \n"
6
  "Language-Team: WP AAM <vasyl@vasyltech.com>\n"
7
  "MIME-Version: 1.0\n"
aam.php CHANGED
@@ -3,7 +3,7 @@
3
  /**
4
  Plugin Name: Advanced Access Manager
5
  Description: Manage User and Role Access to WordPress Backend and Frontend.
6
- Version: 3.5
7
  Author: Vasyl Martyniuk <vasyl@vasyltech.com>
8
  Author URI: http://www.vasyltech.com
9
 
@@ -56,17 +56,6 @@ class AAM {
56
 
57
  //load AAM core config
58
  AAM_Core_Config::bootstrap();
59
-
60
- //load all installed extension
61
- //TODO - Remove in Aug 2017
62
- AAM_Core_Repository::getInstance()->load();
63
-
64
- //bootstrap the correct interface
65
- if (is_admin()) {
66
- AAM_Backend_Manager::bootstrap();
67
- } else {
68
- AAM_Frontend_Manager::bootstrap();
69
- }
70
  }
71
 
72
  /**
@@ -126,6 +115,20 @@ class AAM {
126
 
127
  //load AAM cache
128
  AAM_Core_Cache::bootstrap();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  }
130
 
131
  return self::$_instance;
3
  /**
4
  Plugin Name: Advanced Access Manager
5
  Description: Manage User and Role Access to WordPress Backend and Frontend.
6
+ Version: 3.6
7
  Author: Vasyl Martyniuk <vasyl@vasyltech.com>
8
  Author URI: http://www.vasyltech.com
9
 
56
 
57
  //load AAM core config
58
  AAM_Core_Config::bootstrap();
 
 
 
 
 
 
 
 
 
 
 
59
  }
60
 
61
  /**
115
 
116
  //load AAM cache
117
  AAM_Core_Cache::bootstrap();
118
+
119
+ //load all installed extension
120
+ //TODO - Remove in Aug 2017
121
+ AAM_Core_Repository::getInstance()->load();
122
+
123
+ //bootstrap the correct interface
124
+ if (is_admin()) {
125
+ AAM_Backend_Manager::bootstrap();
126
+ } else {
127
+ AAM_Frontend_Manager::bootstrap();
128
+ }
129
+
130
+ //load media control
131
+ AAM_Core_Media::bootstrap();
132
  }
133
 
134
  return self::$_instance;
media/css/aam.css CHANGED
@@ -815,6 +815,14 @@ input[type="checkbox"]:focus, input[type="radio"]:focus {
815
  margin-bottom: 5px;
816
  }
817
 
 
 
 
 
 
 
 
 
818
  /*! ========================================================================
819
  * Bootstrap Toggle: bootstrap-toggle.css v2.2.0
820
  * http://www.bootstraptoggle.com
815
  margin-bottom: 5px;
816
  }
817
 
818
+ .aam-license-indicator {
819
+ font-size:0.8em;
820
+ display:block;
821
+ margin-top: -4px;
822
+ margin-bottom: 5px;
823
+ color: #777777;
824
+ }
825
+
826
  /*! ========================================================================
827
  * Bootstrap Toggle: bootstrap-toggle.css v2.2.0
828
  * http://www.bootstraptoggle.com
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: vasyltech
3
  Tags: access, role, user, capability, page, post, permission, security
4
  Requires at least: 3.8
5
  Tested up to: 4.5.3
6
- Stable tag: 3.5
7
 
8
  One of the best tools in WordPress repository to manage access to your posts,
9
  pages, categories and backend area for users, roles and visitors.
@@ -57,6 +57,11 @@ out more about the Advanced Access Manager.
57
 
58
  == Changelog ==
59
 
 
 
 
 
 
60
  = 3.5 =
61
  * Improved access control for Posts & Pages
62
  * Introduced Access Manager metabox to Post edit screen
3
  Tags: access, role, user, capability, page, post, permission, security
4
  Requires at least: 3.8
5
  Tested up to: 4.5.3
6
+ Stable tag: 3.6
7
 
8
  One of the best tools in WordPress repository to manage access to your posts,
9
  pages, categories and backend area for users, roles and visitors.
57
 
58
  == Changelog ==
59
 
60
+ = 3.6 =
61
+ * Added Media Access Control feature
62
+ * Added Access Denied Handling feature
63
+ * Improved core functionality
64
+
65
  = 3.5 =
66
  * Improved access control for Posts & Pages
67
  * Introduced Access Manager metabox to Post edit screen