sudar /
email-log
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
| 1 | <?php namespace EmailLog\Addon\License; |
||||
| 2 | |||||
| 3 | use EmailLog\Addon\AddonList; |
||||
| 4 | use EmailLog\Addon\API\EDDUpdater; |
||||
| 5 | use EmailLog\Core\Loadie; |
||||
| 6 | |||||
| 7 | defined( 'ABSPATH' ) || exit; // Exit if accessed directly. |
||||
| 8 | |||||
| 9 | /** |
||||
| 10 | * Handles the add-on licensing for Email Log. |
||||
| 11 | * |
||||
| 12 | * There can be one normal license for each add-on or one bundle license for all add-ons. |
||||
| 13 | * This class is final because we don't want other plugins to interfere with Email Log licensing. |
||||
| 14 | * |
||||
| 15 | * @since 2.0.0 |
||||
| 16 | */ |
||||
| 17 | final class Licenser implements Loadie { |
||||
| 18 | |||||
| 19 | /** |
||||
| 20 | * Bundle License object. |
||||
| 21 | * |
||||
| 22 | * @var \EmailLog\Addon\License\BundleLicense |
||||
| 23 | */ |
||||
| 24 | private $bundle_license; |
||||
| 25 | |||||
| 26 | /** |
||||
| 27 | * List of Add-on updaters. |
||||
| 28 | * |
||||
| 29 | * @var \EmailLog\Addon\API\EDDUpdater[] |
||||
| 30 | */ |
||||
| 31 | private $updaters = array(); |
||||
| 32 | |||||
| 33 | /** |
||||
| 34 | * List of add-ons. |
||||
| 35 | * |
||||
| 36 | * @var \EmailLog\Addon\AddonList |
||||
| 37 | */ |
||||
| 38 | private $addon_list; |
||||
| 39 | |||||
| 40 | /** |
||||
| 41 | * Licenser constructor. |
||||
| 42 | * If the bundle_license object is not passed a new object is created. |
||||
| 43 | * If the addon_list object is not passed a new object is created. |
||||
| 44 | * |
||||
| 45 | * @param \EmailLog\Addon\License\BundleLicense|null $bundle_license Optional. Bundle License. |
||||
| 46 | * @param \EmailLog\Addon\AddonList|null $addon_list Optional. Add-on List. |
||||
| 47 | */ |
||||
| 48 | public function __construct( $bundle_license = null, $addon_list = null ) { |
||||
| 49 | if ( ! $bundle_license instanceof BundleLicense ) { |
||||
| 50 | $bundle_license = new BundleLicense(); |
||||
| 51 | } |
||||
| 52 | |||||
| 53 | if ( ! $addon_list instanceof AddonList ) { |
||||
| 54 | $addon_list = new AddonList(); |
||||
| 55 | } |
||||
| 56 | |||||
| 57 | $this->bundle_license = $bundle_license; |
||||
| 58 | $this->addon_list = $addon_list; |
||||
| 59 | } |
||||
| 60 | |||||
| 61 | /** |
||||
| 62 | * Load all Licenser related hooks. |
||||
| 63 | * |
||||
| 64 | * @inheritdoc |
||||
| 65 | */ |
||||
| 66 | public function load() { |
||||
| 67 | $this->bundle_license->load(); |
||||
| 68 | |||||
| 69 | add_action( 'el_before_addon_list', array( $this, 'render_bundle_license_form' ) ); |
||||
| 70 | |||||
| 71 | add_action( 'el_bundle_license_activate', array( $this, 'activate_bundle_license' ) ); |
||||
| 72 | add_action( 'el_bundle_license_deactivate', array( $this, 'deactivate_bundle_license' ) ); |
||||
| 73 | |||||
| 74 | add_action( 'el_license_activate', array( $this, 'activate_addon_license' ) ); |
||||
| 75 | add_action( 'el_license_deactivate', array( $this, 'deactivate_addon_license' ) ); |
||||
| 76 | } |
||||
| 77 | |||||
| 78 | /** |
||||
| 79 | * Add an Add-on Updater. |
||||
| 80 | * |
||||
| 81 | * @param \EmailLog\Addon\API\EDDUpdater $updater Add-on Updater. |
||||
| 82 | */ |
||||
| 83 | public function add_updater( $updater ) { |
||||
| 84 | if ( $updater instanceof EDDUpdater ) { |
||||
|
0 ignored issues
–
show
introduced
by
Loading history...
|
|||||
| 85 | $this->updaters[ $updater->get_slug() ] = $updater; |
||||
| 86 | } |
||||
| 87 | } |
||||
| 88 | |||||
| 89 | /** |
||||
| 90 | * Get list of add-ons. |
||||
| 91 | * |
||||
| 92 | * @return \EmailLog\Addon\AddonList Add-on List. |
||||
| 93 | */ |
||||
| 94 | public function get_addon_list() { |
||||
| 95 | return $this->addon_list; |
||||
| 96 | } |
||||
| 97 | |||||
| 98 | /** |
||||
| 99 | * Render the Bundle License Form. |
||||
| 100 | */ |
||||
| 101 | public function render_bundle_license_form() { |
||||
| 102 | $action = 'el_bundle_license_activate'; |
||||
| 103 | $action_text = __( 'Activate', 'email-log' ); |
||||
| 104 | $button_class = 'button-primary'; |
||||
| 105 | |||||
| 106 | $expiry_details = ''; |
||||
| 107 | $expiry_details_class = ''; |
||||
| 108 | |||||
| 109 | if ( $this->is_bundle_license_valid() ) { |
||||
| 110 | $action = 'el_bundle_license_deactivate'; |
||||
| 111 | $action_text = __( 'Deactivate', 'email-log' ); |
||||
| 112 | $button_class = ''; |
||||
| 113 | |||||
| 114 | if ( $this->bundle_license->is_lifetime_license() ) { |
||||
| 115 | $expiry_details = __( 'You have a lifetime license, which will never expire!', 'email-log' ); |
||||
| 116 | $expiry_details_class = 'notice notice-success'; |
||||
| 117 | } else { |
||||
| 118 | $expiry_date = date( 'F d, Y', strtotime( $this->get_bundle_license_expiry_date() ) ); |
||||
|
0 ignored issues
–
show
It seems like
$this->get_bundle_license_expiry_date() can also be of type false; however, parameter $datetime of strtotime() does only seem to accept string, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 119 | |||||
| 120 | if ( $this->bundle_license->has_expired() ) { |
||||
| 121 | /* translators: 1 License expiry date, 2 License Renewal link */ |
||||
| 122 | $expiry_details = sprintf( __( 'Your license has expired on %1$s. Please <a href="%2$s">renew it</a> to receive automatic updates and support.', 'email-log' ), $expiry_date, esc_url( $this->bundle_license->get_renewal_link() ) ); |
||||
| 123 | $expiry_details_class = 'notice notice-warning'; |
||||
| 124 | } else { |
||||
| 125 | /* translators: 1 License expiry date */ |
||||
| 126 | $expiry_details = sprintf( __( 'Your license is valid till %s', 'email-log' ), $expiry_date ); |
||||
| 127 | $expiry_details_class = 'expires'; |
||||
| 128 | } |
||||
| 129 | } |
||||
| 130 | } |
||||
| 131 | ?> |
||||
| 132 | |||||
| 133 | <div class="bundle-license"> |
||||
| 134 | <?php if ( ! $this->is_bundle_license_valid() ) : ?> |
||||
| 135 | <p class="notice notice-warning"> |
||||
| 136 | <?php |
||||
| 137 | printf( |
||||
| 138 | __( "Enter your license key to activate add-ons. If you don't have a license, then you can <a href='%s' target='_blank'>buy it</a>", 'email-log' ), |
||||
| 139 | 'https://wpemaillog.com/store/?utm_campaign=Upsell&utm_medium=wpadmin&utm_source=notice&utm_content=buy-it' |
||||
| 140 | ); |
||||
| 141 | ?> |
||||
| 142 | </p> |
||||
| 143 | <?php endif; ?> |
||||
| 144 | |||||
| 145 | <form method="post"> |
||||
| 146 | <input type="text" name="el-license" class="el-license" size="40" |
||||
| 147 | title="<?php _e( 'Email Log Bundle License Key', 'email-log' ); ?>" |
||||
| 148 | placeholder="<?php _e( 'Email Log Bundle License Key', 'email-log' ); ?>" |
||||
| 149 | value="<?php echo esc_attr( $this->bundle_license->get_license_key() ); ?>"> |
||||
| 150 | |||||
| 151 | <input type="submit" class="button <?php echo sanitize_html_class( $button_class ); ?>" |
||||
| 152 | value="<?php echo esc_attr( $action_text ); ?>"> |
||||
| 153 | |||||
| 154 | <?php if ( ! empty( $expiry_details ) ) : ?> |
||||
| 155 | <p class="<?php echo esc_attr( $expiry_details_class ); ?>"> |
||||
| 156 | <?php echo $expiry_details; ?> |
||||
| 157 | </p> |
||||
| 158 | <?php endif; ?> |
||||
| 159 | |||||
| 160 | <input type="hidden" name="el-action" value="<?php echo esc_attr( $action ); ?>"> |
||||
| 161 | |||||
| 162 | <?php wp_nonce_field( $action, $action . '_nonce' ); ?> |
||||
| 163 | </form> |
||||
| 164 | </div> |
||||
| 165 | <?php |
||||
| 166 | } |
||||
| 167 | |||||
| 168 | /** |
||||
| 169 | * Activate Bundle License. |
||||
| 170 | * |
||||
| 171 | * @param array $request Request Object. |
||||
| 172 | */ |
||||
| 173 | public function activate_bundle_license( $request ) { |
||||
| 174 | $license_key = sanitize_text_field( $request['el-license'] ); |
||||
| 175 | |||||
| 176 | $this->bundle_license->set_license_key( $license_key ); |
||||
| 177 | |||||
| 178 | try { |
||||
| 179 | $this->bundle_license->activate(); |
||||
| 180 | $message = __( 'Your license has been activated. You can now install add-ons, will receive automatic updates and access to email support.', 'email-log' ); |
||||
| 181 | $type = 'updated'; |
||||
| 182 | } catch ( \Exception $e ) { |
||||
| 183 | $message = $e->getMessage(); |
||||
| 184 | $type = 'error'; |
||||
| 185 | } |
||||
| 186 | |||||
| 187 | add_settings_error( 'bundle-license', 'bundle-license', $message, $type ); |
||||
| 188 | } |
||||
| 189 | |||||
| 190 | /** |
||||
| 191 | * Deactivate Bundle License. |
||||
| 192 | */ |
||||
| 193 | public function deactivate_bundle_license() { |
||||
| 194 | try { |
||||
| 195 | $this->bundle_license->deactivate(); |
||||
| 196 | $message = __( 'Your license has been deactivated. You will not receive automatic updates.', 'email-log' ); |
||||
| 197 | $type = 'updated'; |
||||
| 198 | } catch ( \Exception $e ) { |
||||
| 199 | $message = $e->getMessage(); |
||||
| 200 | $type = 'error'; |
||||
| 201 | } |
||||
| 202 | |||||
| 203 | add_settings_error( 'bundle-license', 'bundle-license', $message, $type ); |
||||
| 204 | } |
||||
| 205 | |||||
| 206 | /** |
||||
| 207 | * Is the bundle license valid? |
||||
| 208 | * |
||||
| 209 | * @return bool True, if Bundle License is active, False otherwise. |
||||
| 210 | */ |
||||
| 211 | public function is_bundle_license_valid() { |
||||
| 212 | return $this->bundle_license->is_valid(); |
||||
| 213 | } |
||||
| 214 | |||||
| 215 | /** |
||||
| 216 | * Get the expiry date of the Bundle License. |
||||
| 217 | * |
||||
| 218 | * @return false|string Expiry date, False if license is not valid. |
||||
| 219 | */ |
||||
| 220 | protected function get_bundle_license_expiry_date() { |
||||
| 221 | return $this->bundle_license->get_expiry_date(); |
||||
| 222 | } |
||||
| 223 | |||||
| 224 | /** |
||||
| 225 | * Activate individual add-on License. |
||||
| 226 | * |
||||
| 227 | * @param array $request Request Array. |
||||
| 228 | */ |
||||
| 229 | public function activate_addon_license( $request ) { |
||||
| 230 | $license_key = sanitize_text_field( $request['el-license'] ); |
||||
| 231 | $addon_name = sanitize_text_field( $request['el-addon'] ); |
||||
| 232 | |||||
| 233 | $license = $this->addon_list->get_addon_by_name( $addon_name )->get_license(); |
||||
| 234 | $license->set_license_key( $license_key ); |
||||
| 235 | |||||
| 236 | try { |
||||
| 237 | $license->activate(); |
||||
| 238 | $message = sprintf( |
||||
| 239 | __( 'Your license for %s has been activated. You will receive automatic updates and access to email support.', 'email-log' ), |
||||
| 240 | $addon_name |
||||
| 241 | ); |
||||
| 242 | $type = 'updated'; |
||||
| 243 | } catch ( \Exception $e ) { |
||||
| 244 | $message = $e->getMessage(); |
||||
| 245 | $type = 'error'; |
||||
| 246 | } |
||||
| 247 | |||||
| 248 | add_settings_error( 'addon-license', 'addon-license', $message, $type ); |
||||
| 249 | } |
||||
| 250 | |||||
| 251 | /** |
||||
| 252 | * Deactivate individual add-on License. |
||||
| 253 | * |
||||
| 254 | * @param array $request Request Array. |
||||
| 255 | */ |
||||
| 256 | public function deactivate_addon_license( $request ) { |
||||
| 257 | $license_key = sanitize_text_field( $request['el-license'] ); |
||||
| 258 | $addon_name = sanitize_text_field( $request['el-addon'] ); |
||||
| 259 | |||||
| 260 | $license = $this->addon_list->get_addon_by_name( $addon_name )->get_license(); |
||||
| 261 | $license->set_license_key( $license_key ); |
||||
| 262 | |||||
| 263 | try { |
||||
| 264 | $license->deactivate(); |
||||
| 265 | $message = sprintf( |
||||
| 266 | __( 'Your license for %s has been deactivated. You will not receive automatic updates.', 'email-log' ), |
||||
| 267 | $addon_name |
||||
| 268 | ); |
||||
| 269 | $type = 'updated'; |
||||
| 270 | } catch ( \Exception $e ) { |
||||
| 271 | $message = $e->getMessage(); |
||||
| 272 | $type = 'error'; |
||||
| 273 | } |
||||
| 274 | |||||
| 275 | add_settings_error( 'addon-license', 'addon-license', $message, $type ); |
||||
| 276 | } |
||||
| 277 | |||||
| 278 | /** |
||||
| 279 | * Get the license key of an add-on. |
||||
| 280 | * |
||||
| 281 | * @param string $addon_name Addon. |
||||
| 282 | * |
||||
| 283 | * @return bool|string License key if found, False otherwise. |
||||
| 284 | */ |
||||
| 285 | public function get_addon_license_key( $addon_name ) { |
||||
| 286 | if ( $this->is_bundle_license_valid() ) { |
||||
| 287 | return $this->bundle_license->get_addon_license_key( $addon_name ); |
||||
| 288 | } |
||||
| 289 | |||||
| 290 | $addon = $this->addon_list->get_addon_by_name( $addon_name ); |
||||
| 291 | |||||
| 292 | if ( ! $addon ) { |
||||
| 293 | return false; |
||||
| 294 | } |
||||
| 295 | |||||
| 296 | return $addon->get_addon_license_key(); |
||||
| 297 | } |
||||
| 298 | |||||
| 299 | /** |
||||
| 300 | * Get the Download URL of an add-on. |
||||
| 301 | * |
||||
| 302 | * @param string $addon_slug Add-on slug. |
||||
| 303 | * |
||||
| 304 | * @return string Download URL. |
||||
| 305 | */ |
||||
| 306 | public function get_addon_download_url( $addon_slug ) { |
||||
| 307 | if ( isset( $this->updaters[ $addon_slug ] ) ) { |
||||
| 308 | return $this->updaters[ $addon_slug ]->get_download_url(); |
||||
| 309 | } |
||||
| 310 | |||||
| 311 | return ''; |
||||
| 312 | } |
||||
| 313 | |||||
| 314 | /** |
||||
| 315 | * Is an add-on active? |
||||
| 316 | * |
||||
| 317 | * @since 2.4.0 |
||||
| 318 | * |
||||
| 319 | * @param string $addon_name Add-on name. |
||||
| 320 | * |
||||
| 321 | * @return bool True if add-on is present and is active, false otherwise. |
||||
| 322 | */ |
||||
| 323 | public function is_addon_active( $addon_name ) { |
||||
| 324 | return $this->addon_list->is_addon_active( $addon_name ); |
||||
| 325 | } |
||||
| 326 | |||||
| 327 | /** |
||||
| 328 | * Is an add-on installed? |
||||
| 329 | * |
||||
| 330 | * @since 2.4.0 |
||||
| 331 | * |
||||
| 332 | * @param string $addon_name Add-on name. |
||||
| 333 | * |
||||
| 334 | * @return bool True if add-on is present and is installed, false otherwise. |
||||
| 335 | */ |
||||
| 336 | public function is_addon_installed( $addon_name ) { |
||||
| 337 | return $this->addon_list->is_addon_installed( $addon_name ); |
||||
| 338 | } |
||||
| 339 | |||||
| 340 | /** |
||||
| 341 | * Return the bundle license. |
||||
| 342 | * |
||||
| 343 | * @return \EmailLog\Addon\License\BundleLicense|null Bundle license or null if no bundle license. |
||||
| 344 | */ |
||||
| 345 | public function get_bundle_license() { |
||||
| 346 | return $this->bundle_license; |
||||
| 347 | } |
||||
| 348 | } |
||||
| 349 |