This commit is contained in:
2023-02-15 23:26:05 +00:00
parent 82cacacfde
commit 98cb68850e
6 changed files with 61 additions and 8 deletions

2
.vscode/launch.json vendored
View File

@@ -33,7 +33,7 @@
"SOCKEYE_DB_CONNECTION": "Server=localhost;Username=postgres;Password=sockeye;Database=sockeye;CommandTimeout=300;", "SOCKEYE_DB_CONNECTION": "Server=localhost;Username=postgres;Password=sockeye;Database=sockeye;CommandTimeout=300;",
"SOCKEYE_DATA_PATH": "c:\\temp\\sockeye", "SOCKEYE_DATA_PATH": "c:\\temp\\sockeye",
"SOCKEYE_USE_URLS": "http://*:7676;", "SOCKEYE_USE_URLS": "http://*:7676;",
"SOCKEYE_PERMANENTLY_ERASE_DATABASE": "true", //"SOCKEYE_PERMANENTLY_ERASE_DATABASE": "true",
//"SOCKEYE_REPORT_RENDERING_TIMEOUT":"1", //"SOCKEYE_REPORT_RENDERING_TIMEOUT":"1",
"SOCKEYE_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_14\\bin" "SOCKEYE_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_14\\bin"
}, },

View File

@@ -6,10 +6,12 @@ using Microsoft.EntityFrameworkCore;
using System.Linq; using System.Linq;
using Sockeye.Models; using Sockeye.Models;
using Sockeye.Api.ControllerHelpers; using Sockeye.Api.ControllerHelpers;
using Microsoft.AspNetCore.Authorization;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Sockeye.Api.Controllers namespace Sockeye.Api.Controllers
{ {
// [AllowAnonymous]
[Route("rvf")]//v8 fetch license route [Route("rvf")]//v8 fetch license route
[Produces("application/json")] [Produces("application/json")]
public class RvfController : ControllerBase public class RvfController : ControllerBase

View File

@@ -43,11 +43,18 @@ namespace Sockeye.Biz
// //
internal async Task<License> CreateAsync(License newObject, bool importedWithKeyDoNotGenerate = false) internal async Task<License> CreateAsync(License newObject, bool importedWithKeyDoNotGenerate = false)
{ {
//client can send a non expiring license key but internally it MUST have a date so the
//raven default for non expiring keys is this
if (newObject.LicenseExpire == null)
{
newObject.LicenseExpire = DateUtil.EmptyDateValueForLicenseGeneration;
}
await ValidateAsync(newObject, null); await ValidateAsync(newObject, null);
if (HasErrors) if (HasErrors)
return null; return null;
else else
{ {
if (!importedWithKeyDoNotGenerate)//do not generate is used for initial import only from rockfish, could be removed after the initial import if (!importedWithKeyDoNotGenerate)//do not generate is used for initial import only from rockfish, could be removed after the initial import
{ {
await GenerateKey(newObject); await GenerateKey(newObject);
@@ -105,6 +112,12 @@ namespace Sockeye.Biz
} }
putObject.Tags = TagBiz.NormalizeTags(putObject.Tags); putObject.Tags = TagBiz.NormalizeTags(putObject.Tags);
//client can send a non expiring license key but internally it MUST have a date so the
//raven default for non expiring keys is this
if (putObject.LicenseExpire == null)
{
putObject.LicenseExpire = DateUtil.EmptyDateValueForLicenseGeneration;
}
await ValidateAsync(putObject, dbObject); await ValidateAsync(putObject, dbObject);
if (HasErrors) return null; if (HasErrors) return null;
await GenerateKey(putObject); await GenerateKey(putObject);
@@ -244,7 +257,7 @@ MaximumDataGB: 20
} }
} }
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//DELETE //DELETE
// //
internal async Task<bool> DeleteAsync(long id) internal async Task<bool> DeleteAsync(long id)
@@ -720,7 +733,7 @@ MaximumDataGB: 20
} }
#endregion key gen #endregion key gen
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//SEARCH //SEARCH
// //
@@ -761,6 +774,8 @@ MaximumDataGB: 20
{ {
bool isNew = currentObj == null; bool isNew = currentObj == null;
//fetched keys are never editable, must be duped if re-issue //fetched keys are never editable, must be duped if re-issue
//I'LL PROBABLY NEED TO CHANGE THIS LATER FOR SOME REASON BUT FOR NOW IT'S DEFENSIVE //I'LL PROBABLY NEED TO CHANGE THIS LATER FOR SOME REASON BUT FOR NOW IT'S DEFENSIVE
if (!isNew && currentObj.FetchedOn != null) if (!isNew && currentObj.FetchedOn != null)
@@ -827,6 +842,15 @@ MaximumDataGB: 20
} }
//RAVEN keys *always* expire
//perpets expire in the year 5555
if (proposedObj.LicenseExpire == null)
{
AddError(ApiErrorCode.VALIDATION_REQUIRED, "LicenseExpire");
return;
}
} }
break; break;
case ProductGroup.RavenSubscription: case ProductGroup.RavenSubscription:
@@ -838,7 +862,7 @@ MaximumDataGB: 20
} }
//sub keys *always* expire //RAVEN keys *always* expire
if (proposedObj.LicenseExpire == null) if (proposedObj.LicenseExpire == null)
{ {
AddError(ApiErrorCode.VALIDATION_REQUIRED, "LicenseExpire"); AddError(ApiErrorCode.VALIDATION_REQUIRED, "LicenseExpire");

View File

@@ -201,16 +201,16 @@ HOW TO INSTALL YOUR LICENSE KEY
5. Click on the accept button, AyaNova will fetch the license key from our server and install it automatically"; 5. Click on the accept button, AyaNova will fetch the license key from our server and install it automatically";
RavenNewKeyAvailable = @"A new AyaNova license key is available.\nAyaNova will automatically fetch it within 24 hours or you can force it to fetch immediately from the License page in AyaNova now.\n---\n{newLicense}"; RavenNewKeyAvailable = "A new AyaNova license key is available.\nAyaNova will automatically fetch it within 24 hours or you can force it to fetch immediately from the License page in AyaNova now.\n---\n{newLicense}";
ValidateEmail = @"Please verify your email address by clicking the link below or copy and pasting into a browser\r\n{verifyUrl}\r\nOnce your email is verified the request will be processed manually during business hours.\r\n(If you did not request this you can ignore this message)"; ValidateEmail = "Please verify your email address by clicking the link below or copy and pasting into a browser\n{verifyUrl}\nOnce your email is verified the request will be processed manually during business hours.\n(If you did not request this you can ignore this message)";
RavenTrialApproved = @"Your trial license request has been approved.\r\nThe license will be automatically installed shortly or you can fetch it now in the License form menu."; RavenTrialApproved = "Your trial license request has been approved.\nThe license will be automatically installed shortly or you can fetch it now in the License form menu.";
RavenTrialRejected = @"Your trial license request was not approved.\r\n{reason}"; RavenTrialRejected = "Your trial license request was not approved.\n{reason}";
#endregion default message templates #endregion default message templates

View File

@@ -50,6 +50,22 @@ namespace Sockeye.Util
} }
} }
/// <summary>
/// An internally consistent empty or not relevant date marker:
/// January 1st 5555 plus one day in UTC because RAVEN checks if less than EmptyDateValue above but didn't code it with timezone or UTC in mind originally
/// </summary>
/// <returns></returns>
public static DateTime EmptyDateValueForLicenseGeneration
{
get
{
return new DateTime(5555, 1, 2, 0, 0, 0, DateTimeKind.Utc);
//Was going to use MaxValue but apparently that varies depending on culture
// and PostgreSQL has issues with year 1 as it interprets as year 2001
// so to be on safe side just defining one for all usage
}
}
/// <summary> /// <summary>
/// returns a UTC short date, short time formatted date for local display to end user in logs, errors etc at the server level /// returns a UTC short date, short time formatted date for local display to end user in logs, errors etc at the server level

View File

@@ -6,7 +6,18 @@ Need this basically done for now to move back to raven stuff asap.
then on to all the basics, fetch licenses for v7 and v8, trial request processing trigger route, trial subscription server processing and trigger route then on to all the basics, fetch licenses for v7 and v8, trial request processing trigger route, trial subscription server processing and trigger route
TODO BEFORE RELEASE
SERVER
CLIENT
FUTURE STUFF
- JOB: "SOCKBOT" virtual staff member, - JOB: "SOCKBOT" virtual staff member,
sockbot - does everything we have to do manually on a delay if it hasn't been done by us yet sockbot - does everything we have to do manually on a delay if it hasn't been done by us yet