You've already forked wc-licensed-product
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f7490de69b | |||
| d2bf9aa330 | |||
| d00a2235ef | |||
| 27c9a22739 |
23
CHANGELOG.md
23
CHANGELOG.md
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.2.2] - 2026-01-22
|
||||
|
||||
### Added
|
||||
|
||||
- SHA256 checksum column in admin product versions table
|
||||
- File hash display in customer account downloads section
|
||||
- Visual indicators for file integrity verification
|
||||
|
||||
### Changed
|
||||
|
||||
- Checksum file upload field now styled consistently with package upload field
|
||||
- Download list items now show truncated hash with full hash on hover
|
||||
|
||||
### Technical Details
|
||||
|
||||
- ProductVersion `getFileHash()` method now exposed in admin and frontend views
|
||||
- Frontend CSS extended with `.download-hash` styles
|
||||
- Admin CSS extended with `.file-hash` styles
|
||||
|
||||
## [0.2.1] - 2026-01-22
|
||||
|
||||
### Changed
|
||||
@@ -354,7 +373,9 @@ define('WC_LICENSE_SERVER_SECRET', 'your-secure-random-string-min-32-chars');
|
||||
- WordPress REST API integration
|
||||
- Custom WooCommerce product type extending WC_Product
|
||||
|
||||
[Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.0...HEAD
|
||||
[Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.2...HEAD
|
||||
[0.2.2]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.1...v0.2.2
|
||||
[0.2.1]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.0...v0.2.1
|
||||
[0.2.0]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.1.0...v0.2.0
|
||||
[0.1.0]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.11...v0.1.0
|
||||
[0.0.11]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.10...v0.0.11
|
||||
|
||||
@@ -34,9 +34,13 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
|
||||
|
||||
### Known Bugs
|
||||
|
||||
No known bugs at the moment
|
||||
No known bugs at the moment.
|
||||
|
||||
No planned features at this time. See Session History for completed work.
|
||||
### Version 0.3.0
|
||||
|
||||
- Implement License check using the composer package `magdev/wc-licensed-product-client` located in the local folder `/home/magdev/workspaces/php/wc-licensed-product-client`
|
||||
- Add license configuration to the plugins settings page
|
||||
- Hide frontend parts if no valid license is provided
|
||||
|
||||
## Technical Stack
|
||||
|
||||
|
||||
@@ -43,6 +43,13 @@
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* File Hash */
|
||||
code.file-hash {
|
||||
cursor: help;
|
||||
font-size: 0.85em;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* License Product Tab */
|
||||
#woocommerce-product-data .show_if_licensed {
|
||||
display: block !important;
|
||||
|
||||
@@ -247,6 +247,30 @@
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.download-hash {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.25em;
|
||||
font-size: 0.8em;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.download-hash .dashicons {
|
||||
font-size: 14px;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
color: #28a745;
|
||||
}
|
||||
|
||||
.download-hash code {
|
||||
font-family: 'SF Mono', Monaco, Consolas, monospace;
|
||||
background: #f5f5f5;
|
||||
padding: 0.2em 0.4em;
|
||||
border-radius: 3px;
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* Domain Field */
|
||||
#licensed-product-domain-field {
|
||||
margin-top: 2em;
|
||||
|
||||
@@ -23,6 +23,11 @@
|
||||
$('#upload-version-file-btn').on('click', this.openMediaUploader.bind(this));
|
||||
$('#remove-version-file-btn').on('click', this.removeSelectedFile);
|
||||
|
||||
// Checksum file events
|
||||
$('#select-checksum-file-btn').on('click', this.triggerChecksumFileSelect);
|
||||
$('#new_checksum_file').on('change', this.onChecksumFileSelected);
|
||||
$('#remove-checksum-file-btn').on('click', this.removeChecksumFile);
|
||||
|
||||
// Listen for product type changes
|
||||
$('#product-type').on('change', this.onProductTypeChange);
|
||||
|
||||
@@ -104,6 +109,40 @@
|
||||
// Hide and clear checksum file field
|
||||
$('#sha256-hash-row').hide();
|
||||
$('#new_checksum_file').val('');
|
||||
$('#selected_checksum_name').text('');
|
||||
$('#remove-checksum-file-btn').hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Trigger checksum file input click
|
||||
*/
|
||||
triggerChecksumFileSelect: function(e) {
|
||||
e.preventDefault();
|
||||
$('#new_checksum_file').trigger('click');
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle checksum file selection
|
||||
*/
|
||||
onChecksumFileSelected: function(e) {
|
||||
var file = e.target.files[0];
|
||||
if (file) {
|
||||
$('#selected_checksum_name').text(file.name);
|
||||
$('#remove-checksum-file-btn').show();
|
||||
} else {
|
||||
$('#selected_checksum_name').text('');
|
||||
$('#remove-checksum-file-btn').hide();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove selected checksum file
|
||||
*/
|
||||
removeChecksumFile: function(e) {
|
||||
e.preventDefault();
|
||||
$('#new_checksum_file').val('');
|
||||
$('#selected_checksum_name').text('');
|
||||
$('#remove-checksum-file-btn').hide();
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -216,6 +255,8 @@
|
||||
$('#remove-version-file-btn').hide();
|
||||
$('#sha256-hash-row').hide();
|
||||
$('#new_checksum_file').val('');
|
||||
$('#selected_checksum_name').text('');
|
||||
$('#remove-checksum-file-btn').hide();
|
||||
} else {
|
||||
alert(response.data.message || wcLicensedProductVersions.strings.error);
|
||||
}
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
BIN
releases/wc-licensed-product-0.2.1.zip
Normal file
BIN
releases/wc-licensed-product-0.2.1.zip
Normal file
Binary file not shown.
1
releases/wc-licensed-product-0.2.1.zip.sha256
Normal file
1
releases/wc-licensed-product-0.2.1.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
7b895090538f9063fac1509b6f7a40a2b71dc9958b3a255cbfcc60d0320ae5e5 releases/wc-licensed-product-0.2.1.zip
|
||||
@@ -101,7 +101,14 @@ final class VersionAdminController
|
||||
<tr id="sha256-hash-row" style="display: none;">
|
||||
<th><label for="new_checksum_file"><?php esc_html_e('Checksum File', 'wc-licensed-product'); ?></label></th>
|
||||
<td>
|
||||
<input type="file" id="new_checksum_file" name="new_checksum_file" accept=".sha256,.txt" />
|
||||
<input type="file" id="new_checksum_file" name="new_checksum_file" accept=".sha256,.txt" style="display: none;" />
|
||||
<span id="selected_checksum_name" class="selected-file-name"></span>
|
||||
<button type="button" class="button" id="select-checksum-file-btn">
|
||||
<?php esc_html_e('Select Checksum File', 'wc-licensed-product'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" id="remove-checksum-file-btn" style="display: none;">
|
||||
<?php esc_html_e('Remove', 'wc-licensed-product'); ?>
|
||||
</button>
|
||||
<p class="description"><?php esc_html_e('Upload a SHA256 checksum file (.sha256 or .txt) to verify file integrity.', 'wc-licensed-product'); ?></p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -128,6 +135,7 @@ final class VersionAdminController
|
||||
<tr>
|
||||
<th><?php esc_html_e('Version', 'wc-licensed-product'); ?></th>
|
||||
<th><?php esc_html_e('Download File', 'wc-licensed-product'); ?></th>
|
||||
<th><?php esc_html_e('SHA256', 'wc-licensed-product'); ?></th>
|
||||
<th><?php esc_html_e('Release Notes', 'wc-licensed-product'); ?></th>
|
||||
<th><?php esc_html_e('Status', 'wc-licensed-product'); ?></th>
|
||||
<th><?php esc_html_e('Released', 'wc-licensed-product'); ?></th>
|
||||
@@ -137,7 +145,7 @@ final class VersionAdminController
|
||||
<tbody>
|
||||
<?php if (empty($versions)): ?>
|
||||
<tr class="no-versions">
|
||||
<td colspan="6"><?php esc_html_e('No versions found. Add your first version above.', 'wc-licensed-product'); ?></td>
|
||||
<td colspan="7"><?php esc_html_e('No versions found. Add your first version above.', 'wc-licensed-product'); ?></td>
|
||||
</tr>
|
||||
<?php else: ?>
|
||||
<?php foreach ($versions as $version): ?>
|
||||
@@ -159,6 +167,13 @@ final class VersionAdminController
|
||||
<em><?php esc_html_e('No download file', 'wc-licensed-product'); ?></em>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($version->getFileHash()): ?>
|
||||
<code class="file-hash" title="<?php echo esc_attr($version->getFileHash()); ?>"><?php echo esc_html(substr($version->getFileHash(), 0, 12)); ?>...</code>
|
||||
<?php else: ?>
|
||||
<em>—</em>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?php echo esc_html($version->getReleaseNotes() ? wp_trim_words($version->getReleaseNotes(), 10) : '—'); ?></td>
|
||||
<td>
|
||||
<span class="version-status version-status-<?php echo $version->isActive() ? 'active' : 'inactive'; ?>">
|
||||
@@ -381,6 +396,13 @@ final class VersionAdminController
|
||||
<em><?php esc_html_e('No download file', 'wc-licensed-product'); ?></em>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($version->getFileHash()): ?>
|
||||
<code class="file-hash" title="<?php echo esc_attr($version->getFileHash()); ?>"><?php echo esc_html(substr($version->getFileHash(), 0, 12)); ?>...</code>
|
||||
<?php else: ?>
|
||||
<em>—</em>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?php echo esc_html($version->getReleaseNotes() ? wp_trim_words($version->getReleaseNotes(), 10) : '—'); ?></td>
|
||||
<td>
|
||||
<span class="version-status version-status-<?php echo $version->isActive() ? 'active' : 'inactive'; ?>">
|
||||
|
||||
@@ -129,6 +129,7 @@ final class AccountController
|
||||
),
|
||||
'release_notes' => $version->getReleaseNotes(),
|
||||
'released_at' => $version->getReleasedAt()->format(get_option('date_format')),
|
||||
'file_hash' => $version->getFileHash(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,12 @@
|
||||
</a>
|
||||
<span class="download-version">v{{ esc_html(download.version) }}</span>
|
||||
<span class="download-date">{{ esc_html(download.released_at) }}</span>
|
||||
{% if download.file_hash %}
|
||||
<span class="download-hash" title="{{ esc_attr(download.file_hash) }}">
|
||||
<span class="dashicons dashicons-shield"></span>
|
||||
<code>{{ download.file_hash[:12] }}...</code>
|
||||
</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Plugin Name: WooCommerce Licensed Product
|
||||
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-licensed-product
|
||||
* Description: WooCommerce plugin to sell software products using license keys with domain-based validation.
|
||||
* Version: 0.2.1
|
||||
* Version: 0.2.2
|
||||
* Author: Marco Graetsch
|
||||
* Author URI: https://src.bundespruefstelle.ch/magdev
|
||||
* License: GPL-2.0-or-later
|
||||
@@ -28,7 +28,7 @@ if (!defined('ABSPATH')) {
|
||||
}
|
||||
|
||||
// Plugin constants
|
||||
define('WC_LICENSED_PRODUCT_VERSION', '0.2.1');
|
||||
define('WC_LICENSED_PRODUCT_VERSION', '0.2.2');
|
||||
define('WC_LICENSED_PRODUCT_PLUGIN_FILE', __FILE__);
|
||||
define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||
define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__));
|
||||
|
||||
Reference in New Issue
Block a user