| @@ -2,12 +2,14 @@ | ||
| 2 | 2 | |
| 3 | 3 | namespace LearnPress\Services; |
| 4 | 4 | |
| 5 | 5 | use Exception; |
| 6 | +use LearnPress\Helpers\Config; | |
| 6 | 7 | use LearnPress\Helpers\Singleton; |
| 7 | 8 | use LearnPress\Models\UserModel; |
| 8 | 9 | use Throwable; |
| 9 | 10 | use WP_Error; |
| 11 | +use WP_Role; | |
| 10 | 12 | use WP_User; |
| 11 | 13 | |
| 12 | 14 | |
| 13 | 15 | /** |
| @@ -166,6 +168,66 @@ | ||
| 166 | 168 | return false; |
| 167 | 169 | } |
| 168 | 170 | |
| 169 | 171 | return new UserModel( $wp_user->data ); |
| 172 | + } | |
| 173 | + | |
| 174 | + /** | |
| 175 | + * Set capabilities for roles. | |
| 176 | + * | |
| 177 | + * @param string $item_type Ex: "lp_course", "lp_lesson", "lp_assignment", "lp_h5p" | |
| 178 | + * @return void | |
| 179 | + * @since 4.4.2 | |
| 180 | + * @version 1.0.0 | |
| 181 | + */ | |
| 182 | + public function add_capabilities_for_roles( string $item_type ) { | |
| 183 | + $role_capabilities = Config::instance()->get( 'user-roles-caps' ); | |
| 184 | + foreach ( $role_capabilities as $role_key => $role_data ) { | |
| 185 | + $role_label = $role_data['label'] ?? ''; | |
| 186 | + $prefix_caps = $role_data['prefix_capabilities'] ?? []; | |
| 187 | + $role = get_role( $role_key ); | |
| 188 | + if ( $role_key !== UserModel::ROLE_ADMINISTRATOR | |
| 189 | + && ! $role instanceof WP_Role ) { | |
| 190 | + add_role( $role_key, $role_label ); | |
| 191 | + $role = get_role( $role_key ); | |
| 192 | + } | |
| 193 | + | |
| 194 | + if ( $role instanceof WP_Role ) { | |
| 195 | + foreach ( $prefix_caps as $prefix_cap ) { | |
| 196 | + // Example: "publish_lp_courses", "edit_lp_courses",... | |
| 197 | + $cap = "{$prefix_cap}_{$item_type}s"; | |
| 198 | + if ( ! $role->has_cap( $cap ) ) { | |
| 199 | + $role->add_cap( $cap ); | |
| 200 | + } | |
| 201 | + } | |
| 202 | + } | |
| 203 | + } | |
| 204 | + } | |
| 205 | + | |
| 206 | + /** | |
| 207 | + * Create or get CSRF token to verify | |
| 208 | + * | |
| 209 | + * @return mixed|string|null | |
| 210 | + * @since 4.4.6 | |
| 211 | + * @version 1.0.0 | |
| 212 | + */ | |
| 213 | + public static function csrf_token() { | |
| 214 | + static $token = null; | |
| 215 | + $cookie_name = 'lp_csrf_token'; | |
| 216 | + | |
| 217 | + if ( null !== $token ) { | |
| 218 | + return $token; | |
| 219 | + } | |
| 220 | + | |
| 221 | + if ( ! empty( $_COOKIE[ $cookie_name ] ) ) { | |
| 222 | + $token = sanitize_text_field( wp_unslash( $_COOKIE[ $cookie_name ] ) ); | |
| 223 | + return $token; | |
| 224 | + } | |
| 225 | + | |
| 226 | + $token = wp_generate_password( 20, false ); | |
| 227 | + if ( ! headers_sent() ) { | |
| 228 | + learn_press_setcookie( $cookie_name, $token, time() + DAY_IN_SECONDS ); | |
| 229 | + } | |
| 230 | + | |
| 231 | + return $token; | |
| 170 | 232 | } |
| 171 | 233 | } |