diff --git a/plist b/plist
index e9f4f2481..b3870dc40 100644
--- a/plist
+++ b/plist
@@ -556,6 +556,7 @@
/usr/local/opnsense/scripts/firmware/hotfix.sh
/usr/local/opnsense/scripts/firmware/install.sh
/usr/local/opnsense/scripts/firmware/launcher.sh
+/usr/local/opnsense/scripts/firmware/license.sh
/usr/local/opnsense/scripts/firmware/lock.sh
/usr/local/opnsense/scripts/firmware/reinstall.sh
/usr/local/opnsense/scripts/firmware/remove.sh
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/FirmwareController.php b/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/FirmwareController.php
index d71f74b48..b5345cb2b 100644
--- a/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/FirmwareController.php
+++ b/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/FirmwareController.php
@@ -183,6 +183,34 @@ class FirmwareController extends ApiControllerBase
return $response;
}
+ /**
+ * Retrieve specific license for package in text format
+ * @param string $package package to retrieve
+ * @return array with all possible licenses
+ * @throws \Exception
+ */
+ public function licenseAction($package)
+ {
+ $this->sessionClose(); // long running action, close session
+ $backend = new Backend();
+ $response = array();
+
+ if ($this->request->isPost()) {
+ // sanitize package name
+ $filter = new \Phalcon\Filter();
+ $filter->add('scrub', function ($value) {
+ return preg_replace('/[^0-9a-zA-Z]/', '', $value);
+ });
+ $package = $filter->sanitize($package, 'scrub');
+ $text = trim($backend->configdRun(sprintf('firmware license %s', $package)));
+ if (!empty($text)) {
+ $response['license'] = $text;
+ }
+ }
+
+ return $response;
+ }
+
/**
* perform reboot
* @return array status
@@ -428,7 +456,7 @@ class FirmwareController extends ApiControllerBase
{
$this->sessionClose(); // long running action, close session
- $keys = array('name', 'version', 'comment', 'flatsize', 'locked');
+ $keys = array('name', 'version', 'comment', 'flatsize', 'locked', 'license');
$backend = new Backend();
$response = array();
diff --git a/src/opnsense/mvc/app/views/OPNsense/Core/firmware.volt b/src/opnsense/mvc/app/views/OPNsense/Core/firmware.volt
index d16777f50..2fd147ffb 100644
--- a/src/opnsense/mvc/app/views/OPNsense/Core/firmware.volt
+++ b/src/opnsense/mvc/app/views/OPNsense/Core/firmware.volt
@@ -115,6 +115,30 @@ POSSIBILITY OF SUCH DAMAGE.
});
}
+ /**
+ * read license from backend
+ */
+ function license(package)
+ {
+ ajaxCall('/api/core/firmware/license/' + package, {}, function (data, status) {
+ var license = "{{ lang._('Sorry, the package does not have an associated license file.') }}";
+ if (data['license'] != undefined) {
+ license = data['license'];
+ }
+ BootstrapDialog.show({
+ type:BootstrapDialog.TYPE_INFO,
+ title: "{{ lang._('License details') }}",
+ message: license,
+ buttons: [{
+ label: "{{ lang._('Close') }}",
+ action: function(dialogRef){
+ dialogRef.close();
+ }
+ }]
+ });
+ });
+ }
+
/**
* read changelog from backend
*/
@@ -246,10 +270,10 @@ POSSIBILITY OF SUCH DAMAGE.
$("#packageslist").html("
| {{ lang._('Name') }} | " +
"{{ lang._('Version') }} | {{ lang._('Size') }} | " +
- "{{ lang._('Comment') }} | |
");
+ "{{ lang._('License') }} | {{ lang._('Comment') }} | | ");
$("#pluginlist").html("| {{ lang._('Name') }} | " +
"{{ lang._('Version') }} | {{ lang._('Size') }} | " +
- "{{ lang._('Comment') }} | |
");
+ "{{ lang._('License') }} | {{ lang._('Comment') }} | | ");
var local_count = 0;
var remote_count = 0;
@@ -268,8 +292,12 @@ POSSIBILITY OF SUCH DAMAGE.
'' + row['name'] + ' | ' +
'' + row['version'] + ' | ' +
'' + row['flatsize'] + ' | ' +
+ '' + row['license'] + ' | ' +
'' + row['comment'] + ' | ' +
'' +
+ ' ' +
' ' + (row['locked'] === '1' ?
@@ -299,8 +327,12 @@ POSSIBILITY OF SUCH DAMAGE.
' | ' + '| ' + row['name'] + orphaned_text + ' | ' +
'' + row['version'] + ' | ' +
'' + row['flatsize'] + ' | ' +
+ '' + row['license'] + ' | ' +
'' + row['comment'] + ' | ' +
- '' + (row['installed'] == "1" ?
+ ' | ' +
+ (row['installed'] == "1" ?
' |