Skip to content

Commit

Permalink
## Features
Browse files Browse the repository at this point in the history
- added: support for email reminder, user will receive an email when license has expired
-  fixed: a bug where email will be send-out
- added: custom fields to woocommece order
- added: product type (license) for woocommerce
- rebuilt my licenses in my account page
- added: until version and current version to api
- ui: change styles to match more wp interface
  • Loading branch information
michelve committed Jul 1, 2019
1 parent f9d3edd commit 36b8069
Show file tree
Hide file tree
Showing 136 changed files with 17,950 additions and 671 deletions.
11 changes: 1 addition & 10 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).

## [4.12.1](https://github.com/michelve/software-license-manager/compare/4.11.2...4.12.1) - 2019-06-17

### Commits

- ### 4.12.1 [`4b3adc2`](https://github.com/michelve/software-license-manager/commit/4b3adc2a2687f008362fb864eb39a759fc3a22c3)
- ### 4.12.1 [`89acaa5`](https://github.com/michelve/software-license-manager/commit/89acaa5718721cfdce40fcab70036367d2592c11)
- added change-log and updated readme file [`123564f`](https://github.com/michelve/software-license-manager/commit/123564f08ba7877da99fb6f826b03dbfceed0795)
- security.md [`3d225ce`](https://github.com/michelve/software-license-manager/commit/3d225ceffe5a5e65049112098656198335d066f1)

## [4.11.2](https://github.com/michelve/software-license-manager/compare/4.10.3...4.11.2) - 2019-06-12

### Commits

- upgraded jQuery ui version [`27fe73f`](https://github.com/michelve/software-license-manager/commit/27fe73fe555c4a9b5b3044042be7c8b66cd0f2bd)

## [4.10.4](https://github.com/michelve/software-license-manager/compare/4.12.1...4.10.4) - 2019-06-17
## [4.10.4](https://github.com/michelve/software-license-manager/compare/4.11.2...4.10.4) - 2019-06-12

## [4.10.3](https://github.com/michelve/software-license-manager/compare/3.6.2...4.10.3) - 2019-05-14

Expand Down
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,20 @@ Changelog: [View changelog](https://github.com/michelve/software-license-manager


## Screenshots
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/dashboard.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/dashboard.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/overview-filters.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/overview-filters.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/overview.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/overview.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/screen%20options.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/screen%20options.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/subscribers-results.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/subscribers-results.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/subscribers.png?raw=true" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/subscribers.png?raw=true" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/add-key.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/add-key.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/export.png?raw=true" width=800 alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/export.png?raw=true" width=800 alt="Software License Manager" />

<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/images/previews/my-account-lics-opened.png?raw=true" alt="Software License Manager" />
<img src="https://github.com/michelve/software-license-manager/blob/master/public/assets/previews/my-account-lics-opened.png?raw=true" alt="Software License Manager" />
30 changes: 13 additions & 17 deletions admin/includes/cronjobs/slm-tasks.php
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
<?php


// ---- ---- ----
// A. Define a cron job interval if it doesn't exist

add_filter('cron_schedules', 'slm_check_every_minute');

function slm_check_every_minute($schedules)
{
$schedules['every_minute'] = array(
'interval' => 1*60,
'display' => __('Every 1 minute'),
add_filter('cron_schedules', 'slm_check_expiration_daily');
add_action('slm_expired_send_email_reminder', 'slm_run_lic_check');

// for dev
function slm_check_expiration_daily($schedules){
$schedules['slm_daily'] = array(
'interval' => 21600*4,
'display' => __('Every day'),
);
return $schedules;
}


// send automatic scheduled email
if (!wp_next_scheduled('slm_expired_send_email_reminder')) {
wp_schedule_event(time(), 'every_minute', 'slm_expired_send_email_reminder');
wp_schedule_event(time(), 'slm_daily', 'slm_expired_send_email_reminder');
}
add_action('slm_expired_send_email_reminder', 'run_slm_lic_check');


function run_slm_lic_check(){
function slm_run_lic_check(){
SLM_Utility::check_for_expired_lic();
}
}


15 changes: 15 additions & 0 deletions admin/includes/plugin-update-checker/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[*]
charset=utf-8
end_of_line=lf
insert_final_newline=false
indent_style=tab
tab_width=4

[{phpunit.xml.dist,*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
indent_style=space
indent_size=4

[*.svg]
indent_style=space
indent_size=4

6 changes: 6 additions & 0 deletions admin/includes/plugin-update-checker/Puc/v4/Factory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?php
if ( !class_exists('Puc_v4_Factory', false) ):

class Puc_v4_Factory extends Puc_v4p6_Factory { }

endif;
49 changes: 49 additions & 0 deletions admin/includes/plugin-update-checker/Puc/v4p6/Autoloader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

if ( !class_exists('Puc_v4p6_Autoloader', false) ):

class Puc_v4p6_Autoloader {
private $prefix = '';
private $rootDir = '';
private $libraryDir = '';

private $staticMap;

public function __construct() {
$this->rootDir = dirname(__FILE__) . '/';
$nameParts = explode('_', __CLASS__, 3);
$this->prefix = $nameParts[0] . '_' . $nameParts[1] . '_';

$this->libraryDir = realpath($this->rootDir . '../..') . '/';
$this->staticMap = array(
'PucReadmeParser' => 'vendor/readme-parser.php',
'Parsedown' => 'vendor/ParsedownLegacy.php',
);
if ( version_compare(PHP_VERSION, '5.3.0', '>=') ) {
$this->staticMap['Parsedown'] = 'vendor/Parsedown.php';
}

spl_autoload_register(array($this, 'autoload'));
}

public function autoload($className) {
if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) {
/** @noinspection PhpIncludeInspection */
include ($this->libraryDir . $this->staticMap[$className]);
return;
}

if (strpos($className, $this->prefix) === 0) {
$path = substr($className, strlen($this->prefix));
$path = str_replace('_', '/', $path);
$path = $this->rootDir . $path . '.php';

if (file_exists($path)) {
/** @noinspection PhpIncludeInspection */
include $path;
}
}
}
}

endif;
177 changes: 177 additions & 0 deletions admin/includes/plugin-update-checker/Puc/v4p6/DebugBar/Extension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
<?php
if ( !class_exists('Puc_v4p6_DebugBar_Extension', false) ):

class Puc_v4p6_DebugBar_Extension {
const RESPONSE_BODY_LENGTH_LIMIT = 4000;

/** @var Puc_v4p6_UpdateChecker */
protected $updateChecker;
protected $panelClass = 'Puc_v4p6_DebugBar_Panel';

public function __construct($updateChecker, $panelClass = null) {
$this->updateChecker = $updateChecker;
if ( isset($panelClass) ) {
$this->panelClass = $panelClass;
}

add_filter('debug_bar_panels', array($this, 'addDebugBarPanel'));
add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies'));

add_action('wp_ajax_puc_v4_debug_check_now', array($this, 'ajaxCheckNow'));
}

/**
* Register the PUC Debug Bar panel.
*
* @param array $panels
* @return array
*/
public function addDebugBarPanel($panels) {
if ( $this->updateChecker->userCanInstallUpdates() ) {
$panels[] = new $this->panelClass($this->updateChecker);
}
return $panels;
}

/**
* Enqueue our Debug Bar scripts and styles.
*/
public function enqueuePanelDependencies() {
wp_enqueue_style(
'puc-debug-bar-style-v4',
$this->getLibraryUrl("/css/puc-debug-bar.css"),
array('debug-bar'),
'20171124'
);

wp_enqueue_script(
'puc-debug-bar-js-v4',
$this->getLibraryUrl("/js/debug-bar.js"),
array('jquery'),
'20170516'
);
}

/**
* Run an update check and output the result. Useful for making sure that
* the update checking process works as expected.
*/
public function ajaxCheckNow() {
if ( $_POST['uid'] !== $this->updateChecker->getUniqueName('uid') ) {
return;
}
$this->preAjaxRequest();
$update = $this->updateChecker->checkForUpdates();
if ( $update !== null ) {
echo "An update is available:";
echo '<pre>', htmlentities(print_r($update, true)), '</pre>';
} else {
echo 'No updates found.';
}

$errors = $this->updateChecker->getLastRequestApiErrors();
if ( !empty($errors) ) {
printf('<p>The update checker encountered %d API error%s.</p>', count($errors), (count($errors) > 1) ? 's' : '');

foreach (array_values($errors) as $num => $item) {
$wpError = $item['error'];
/** @var WP_Error $wpError */
printf('<h4>%d) %s</h4>', $num + 1, esc_html($wpError->get_error_message()));

echo '<dl>';
printf('<dt>Error code:</dt><dd><code>%s</code></dd>', esc_html($wpError->get_error_code()));

if ( isset($item['url']) ) {
printf('<dt>Requested URL:</dt><dd><code>%s</code></dd>', esc_html($item['url']));
}

if ( isset($item['httpResponse']) ) {
if ( is_wp_error($item['httpResponse']) ) {
$httpError = $item['httpResponse'];
/** @var WP_Error $httpError */
printf(
'<dt>WordPress HTTP API error:</dt><dd>%s (<code>%s</code>)</dd>',
esc_html($httpError->get_error_message()),
esc_html($httpError->get_error_code())
);
} else {
//Status code.
printf(
'<dt>HTTP status:</dt><dd><code>%d %s</code></dd>',
wp_remote_retrieve_response_code($item['httpResponse']),
wp_remote_retrieve_response_message($item['httpResponse'])
);

//Headers.
echo '<dt>Response headers:</dt><dd><pre>';
foreach (wp_remote_retrieve_headers($item['httpResponse']) as $name => $value) {
printf("%s: %s\n", esc_html($name), esc_html($value));
}
echo '</pre></dd>';

//Body.
$body = wp_remote_retrieve_body($item['httpResponse']);
if ( $body === '' ) {
$body = '(Empty response.)';
} else if ( strlen($body) > self::RESPONSE_BODY_LENGTH_LIMIT ) {
$length = strlen($body);
$body = substr($body, 0, self::RESPONSE_BODY_LENGTH_LIMIT)
. sprintf("\n(Long string truncated. Total length: %d bytes.)", $length);
}

printf('<dt>Response body:</dt><dd><pre>%s</pre></dd>', esc_html($body));
}
}
echo '<dl>';
}
}

exit;
}

/**
* Check access permissions and enable error display (for debugging).
*/
protected function preAjaxRequest() {
if ( !$this->updateChecker->userCanInstallUpdates() ) {
die('Access denied');
}
check_ajax_referer('puc-ajax');

error_reporting(E_ALL);
@ini_set('display_errors', 'On');
}

/**
* @param string $filePath
* @return string
*/
private function getLibraryUrl($filePath) {
$absolutePath = realpath(dirname(__FILE__) . '/../../../' . ltrim($filePath, '/'));

//Where is the library located inside the WordPress directory structure?
$absolutePath = Puc_v4p6_Factory::normalizePath($absolutePath);

$pluginDir = Puc_v4p6_Factory::normalizePath(WP_PLUGIN_DIR);
$muPluginDir = Puc_v4p6_Factory::normalizePath(WPMU_PLUGIN_DIR);
$themeDir = Puc_v4p6_Factory::normalizePath(get_theme_root());

if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) {
//It's part of a plugin.
return plugins_url(basename($absolutePath), $absolutePath);
} else if ( strpos($absolutePath, $themeDir) === 0 ) {
//It's part of a theme.
$relativePath = substr($absolutePath, strlen($themeDir) + 1);
$template = substr($relativePath, 0, strpos($relativePath, '/'));
$baseUrl = get_theme_root_uri($template);

if ( !empty($baseUrl) && $relativePath ) {
return $baseUrl . '/' . $relativePath;
}
}

return '';
}
}

endif;
Loading

0 comments on commit 36b8069

Please sign in to comment.