feature: online activation

This commit is contained in:
Gary Sharp
2024-12-27 14:28:56 +11:00
parent 39ba206831
commit b6dfaa3445
35 changed files with 2287 additions and 346 deletions
@@ -0,0 +1,55 @@
@model Disco.Web.Areas.Config.Models.SystemConfig.ActivateModel
@{
Authorization.Require(Claims.DiscoAdminAccount);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "System", MVC.Config.SystemConfig.Index(), "Activate");
}
<div style="min-height: 300px;">
<div class="form" style="width: 500px;">
<h2><i class="fa fa-lg fa-cog fa-spin"></i> Testing Connectivity to Disco ICT Online Services</h2>
</div>
</div>
<iframe name="callbackFrame" class="hidden">
</iframe>
<form id="callbackSubmit" action="@Model.CallbackUrl" method="post" target="callbackFrame">
<input type="hidden" name="callbackUrl" value="@(new Uri(Request.Url, Url.Action(MVC.API.Activation.TestCallback())))" />
<input type="hidden" name="deploymentId" value="@Model.DeploymentId" />
<input type="hidden" name="correlationId" value="@Model.CorrelationId" />
<input type="hidden" name="userId" value="@Model.UserId" />
</form>
@using (Html.BeginForm(MVC.API.Activation.Begin(), FormMethod.Post, new { id = "activationBegin"}))
{
@Html.AntiForgeryToken()
}
<a id="callbackFailedUrl" href="@Url.Action(MVC.Config.SystemConfig.Index())" class="hidden"></a>
<script>
$(function () {
const callbackForm = $('#callbackSubmit');
const callbackFailedUrl = $('#callbackFailedUrl').attr('href');
const timeout = window.setTimeout(function () {
alert('A timeout occurred while communicating with Online Services. Please try a different device/browser or try again later.');
window.location.href = callbackFailedUrl;
}, 1000 * 35);
window.activateCallbackResponse = function (deploymentId, correlationId, userId) {
window.clearTimeout(timeout);
const originalDeploymentId = callbackForm.find('input[name="deploymentId"]').val();
const originalCorrelationId = callbackForm.find('input[name="correlationId"]').val();
const originalUserId = callbackForm.find('input[name="userId"]').val();
if (deploymentId !== originalDeploymentId || correlationId !== originalCorrelationId || userId !== originalUserId) {
alert('Invalid response when communicating with Online Services. Please try a different device/browser or try again later.');
window.location.href = callbackFailedUrl;
}
$('#activationBegin').trigger('submit');
};
callbackForm.trigger('submit');
});
</script>
@@ -0,0 +1,232 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Disco.Web.Areas.Config.Views.SystemConfig
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using Disco;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
using Disco.Services.Web;
using Disco.Web;
using Disco.Web.Extensions;
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")]
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/SystemConfig/Activate.cshtml")]
public partial class Activate : Disco.Services.Web.WebViewPage<Disco.Web.Areas.Config.Models.SystemConfig.ActivateModel>
{
public Activate()
{
}
public override void Execute()
{
#line 2 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
Authorization.Require(Claims.DiscoAdminAccount);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "System", MVC.Config.SystemConfig.Index(), "Activate");
#line default
#line hidden
WriteLiteral("\r\n\r\n<div");
WriteLiteral(" style=\"min-height: 300px;\"");
WriteLiteral(">\r\n <div");
WriteLiteral(" class=\"form\"");
WriteLiteral(" style=\"width: 500px;\"");
WriteLiteral(">\r\n <h2><i");
WriteLiteral(" class=\"fa fa-lg fa-cog fa-spin\"");
WriteLiteral("></i> Testing Connectivity to Disco ICT Online Services</h2>\r\n </div>\r\n</div>\r" +
"\n\r\n<iframe");
WriteLiteral(" name=\"callbackFrame\"");
WriteLiteral(" class=\"hidden\"");
WriteLiteral(">\r\n</iframe>\r\n\r\n<form");
WriteLiteral(" id=\"callbackSubmit\"");
WriteAttribute("action", Tuple.Create(" action=\"", 563), Tuple.Create("\"", 590)
#line 17 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
, Tuple.Create(Tuple.Create("", 572), Tuple.Create<System.Object, System.Int32>(Model.CallbackUrl
#line default
#line hidden
, 572), false)
);
WriteLiteral(" method=\"post\"");
WriteLiteral(" target=\"callbackFrame\"");
WriteLiteral(">\r\n <input");
WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"callbackUrl\"");
WriteAttribute("value", Tuple.Create(" value=\"", 674), Tuple.Create("\"", 752)
#line 18 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
, Tuple.Create(Tuple.Create("", 682), Tuple.Create<System.Object, System.Int32>(new Uri(Request.Url, Url.Action(MVC.API.Activation.TestCallback()))
#line default
#line hidden
, 682), false)
);
WriteLiteral(" />\r\n <input");
WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"deploymentId\"");
WriteAttribute("value", Tuple.Create(" value=\"", 802), Tuple.Create("\"", 829)
#line 19 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
, Tuple.Create(Tuple.Create("", 810), Tuple.Create<System.Object, System.Int32>(Model.DeploymentId
#line default
#line hidden
, 810), false)
);
WriteLiteral(" />\r\n <input");
WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"correlationId\"");
WriteAttribute("value", Tuple.Create(" value=\"", 880), Tuple.Create("\"", 908)
#line 20 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
, Tuple.Create(Tuple.Create("", 888), Tuple.Create<System.Object, System.Int32>(Model.CorrelationId
#line default
#line hidden
, 888), false)
);
WriteLiteral(" />\r\n <input");
WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"userId\"");
WriteAttribute("value", Tuple.Create(" value=\"", 952), Tuple.Create("\"", 973)
#line 21 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
, Tuple.Create(Tuple.Create("", 960), Tuple.Create<System.Object, System.Int32>(Model.UserId
#line default
#line hidden
, 960), false)
);
WriteLiteral(" />\r\n</form>\r\n\r\n");
#line 24 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
using (Html.BeginForm(MVC.API.Activation.Begin(), FormMethod.Post, new { id = "activationBegin"}))
{
#line default
#line hidden
#line 26 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
Write(Html.AntiForgeryToken());
#line default
#line hidden
#line 26 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
}
#line default
#line hidden
WriteLiteral("\r\n<a");
WriteLiteral(" id=\"callbackFailedUrl\"");
WriteAttribute("href", Tuple.Create(" href=\"", 1154), Tuple.Create("\"", 1205)
#line 29 "..\..\Areas\Config\Views\SystemConfig\Activate.cshtml"
, Tuple.Create(Tuple.Create("", 1161), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.Config.SystemConfig.Index())
#line default
#line hidden
, 1161), false)
);
WriteLiteral(" class=\"hidden\"");
WriteLiteral(@"></a>
<script>
$(function () {
const callbackForm = $('#callbackSubmit');
const callbackFailedUrl = $('#callbackFailedUrl').attr('href');
const timeout = window.setTimeout(function () {
alert('A timeout occurred while communicating with Online Services. Please try a different device/browser or try again later.');
window.location.href = callbackFailedUrl;
}, 1000 * 35);
window.activateCallbackResponse = function (deploymentId, correlationId, userId) {
window.clearTimeout(timeout);
const originalDeploymentId = callbackForm.find('input[name=""deploymentId""]').val();
const originalCorrelationId = callbackForm.find('input[name=""correlationId""]').val();
const originalUserId = callbackForm.find('input[name=""userId""]').val();
if (deploymentId !== originalDeploymentId || correlationId !== originalCorrelationId || userId !== originalUserId) {
alert('Invalid response when communicating with Online Services. Please try a different device/browser or try again later.');
window.location.href = callbackFailedUrl;
}
$('#activationBegin').trigger('submit');
};
callbackForm.trigger('submit');
});
</script>
");
}
}
}
#pragma warning restore 1591
@@ -70,82 +70,104 @@
</table>
</div>
<div class="form" style="width: 450px; margin-top: 15px;">
<h2>License</h2>
<h2>Activation &amp; License</h2>
<table>
@{
<tr>
<th style="width: 135px">
License:
</th>
<td>
@using (Html.BeginForm(MVC.API.System.LicenseCheck(), FormMethod.Post))
<tr>
<th style="width: 135px">
Activation:
</th>
<td>
@if (Model.IsActivated)
{
@CommonHelpers.FriendlyDate(Model.ActivatedOn) <span>by @Model.ActivatedBy</span>
}
else
{
using (Html.BeginForm(MVC.Config.SystemConfig.Activate(), FormMethod.Post))
{
@Html.AntiForgeryToken();
<input id="license" type="text" name="license" value="@Model.License" />
<button type="submit" class="button small">Activate</button>
<button type="submit" class="button small">Activate Now</button>
}
<script type="text/javascript">
$(function () {
const $element = $('#license');
const original = $element.val();
$element.on('keyup', function (e) {
const $button = $element.next('button');
const value = $element.val();
if (!original) {
$element.prop('required', true);
$button.text('Activate');
<div class="info-box">
<p class="fa-p">
<i class="fa fa-info-circle"></i>Activating Disco ICT with Online Services unlocks additional functionality.
</p>
</div>
}
</td>
</tr>
<tr>
<th style="width: 135px">
License:
</th>
<td>
@using (Html.BeginForm(MVC.API.System.LicenseCheck(), FormMethod.Post))
{
@Html.AntiForgeryToken();
<input id="license" type="text" name="license" value="@Model.License" />
<button type="submit" class="button small">Activate</button>
}
<script type="text/javascript">
$(function () {
const $element = $('#license');
const original = $element.val();
$element.on('keyup', function (e) {
const $button = $element.next('button');
const value = $element.val();
if (!original) {
$element.prop('required', true);
$button.text('Activate');
} else {
if (original === value) {
$button.text('Validate');
} else {
if (original === value) {
$button.text('Validate');
if (!value) {
$button.text('Clear');
} else {
if (!value) {
$button.text('Clear');
} else {
$button.text('Activate');
}
$button.text('Activate');
}
}
}).trigger('keyup');
});
</script>
}
}).trigger('keyup');
});
</script>
</td>
</tr>
@if (Model.License != null)
{
<tr>
<th style="width: 135px">
Status:
</th>
<td>
@if (Model.LicenseError != null)
{
<div class="error"><i class="fa fa-exclamation-circle fa-lg"></i> @Model.LicenseError</div>
}
else
{
<span>Expires @CommonHelpers.FriendlyDate(Model.LicenseExpires)</span>
}
</td>
</tr>
}
else
{
<tr>
<td colspan="2">
<strong>Official support is available</strong>
<ul>
<li>Initial implementation assistance.</li>
<li>Commitment to maintaining Disco ICT functionality and associated plugins.</li>
<li>Direct support.</li>
<li>Access to additional functionality.</li>
<li>Ability to suggest additional functionality, with a voice in feature prioritisation.</li>
</ul>
<div style="text-align: right; margin-top: 4px;">
<a href="https://discoict.com.au/support.aspx" target="_blank" class="button small">Request More Information</a>
</div>
</td>
</tr>
if (Model.License != null)
{
<tr>
<th style="width: 135px">
Status:
</th>
<td>
@if (Model.LicenseError != null)
{
<div class="error"><i class="fa fa-exclamation-circle fa-lg"></i> @Model.LicenseError</div>
}
else
{
<span>Expires @CommonHelpers.FriendlyDate(Model.LicenseExpires)</span>
}
</td>
</tr>
}
else
{
<tr>
<td colspan="2">
<strong>Official support is available</strong>
<ul>
<li>Initial implementation assistance.</li>
<li>Commitment to maintaining Disco ICT functionality and associated plugins.</li>
<li>Direct support.</li>
<li>Access to additional functionality.</li>
<li>Ability to suggest additional functionality, with a voice in feature prioritisation.</li>
</ul>
<div style="text-align: right; margin-top: 4px;">
<a href="https://discoict.com.au/support.aspx" target="_blank" class="button small">Request More Information</a>
</div>
</td>
</tr>
}
}
</table>
</div>
File diff suppressed because it is too large Load Diff