405ac7fac4
C'etait la decision prise, et je l'avais mal lue : "pour le moment 1" repondait a la question 1, pas "une seule licence". PM.MachineId melange l'UUID de la carte mere (WMI) et la serie du volume systeme, puis n'en publie que 16 hexa : l'empreinte se recopie dans un courriel, l'UUID brut n'a pas a circuler. Un UUID nul ou tout a FF est rejete — VM et images clonees l'annoncent, et deux postes tomberaient alors sur la meme empreinte. Le champ m est compare APRES la signature. m absent = licence flottante, acceptee : seule la cle privee peut en emettre, et le champ ne peut pas etre retire sans casser la signature. Cote script -Machine est obligatoire sauf -Floating explicite. L'ecran d'activation affiche l'Installation ID : une licence liee ne peut plus etre emise avant l'installation. Verifie sur ce poste : liee a lui acceptee, liee a un autre refusee, flottante acceptee. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
59 lines
2.4 KiB
ObjectPascal
59 lines
2.4 KiB
ObjectPascal
program PMServer;
|
|
|
|
uses
|
|
System.SysUtils, // FindCmdLineSwitch
|
|
System.StartUpCopy,
|
|
FMX.Forms,
|
|
PM.SingleInstance in 'Source\PM.SingleInstance.pas',
|
|
UMainForm in 'UMainForm.pas' {MainForm},
|
|
PM.JSON in 'Source\PM.JSON.pas',
|
|
PM.Database in 'Source\PM.Database.pas',
|
|
PM.Router in 'Source\PM.Router.pas',
|
|
PM.StaticFiles in 'Source\PM.StaticFiles.pas',
|
|
PM.EmbeddedAssets in 'Source\PM.EmbeddedAssets.pas',
|
|
PM.Crypto in 'Source\PM.Crypto.pas',
|
|
PM.RateLimit in 'Source\PM.RateLimit.pas',
|
|
PM.Audit in 'Source\PM.Audit.pas',
|
|
PM.Session in 'Source\PM.Session.pas',
|
|
PM.HTTPServer in 'Source\PM.HTTPServer.pas',
|
|
PM.Bridge in 'Source\PM.Bridge.pas',
|
|
PM.QuickUnlock in 'Source\PM.QuickUnlock.pas',
|
|
PM.PinUnlock in 'Source\PM.PinUnlock.pas',
|
|
PM.UserPrefs in 'Source\PM.UserPrefs.pas',
|
|
PM.MachineId in 'Source\PM.MachineId.pas',
|
|
PM.Licence in 'Source\PM.Licence.pas',
|
|
PM.AutoStart in 'Source\PM.AutoStart.pas',
|
|
PM.Favicon in 'Source\PM.Favicon.pas',
|
|
PM.ProcessLockdown in 'Source\PM.ProcessLockdown.pas',
|
|
PM.Handler.Ping in 'Handlers\PM.Handler.Ping.pas',
|
|
PM.Handler.Auth in 'Handlers\PM.Handler.Auth.pas',
|
|
PM.Handler.Folders in 'Handlers\PM.Handler.Folders.pas',
|
|
PM.Handler.Entries in 'Handlers\PM.Handler.Entries.pas',
|
|
PM.Handler.Passkey in 'Handlers\PM.Handler.Passkey.pas',
|
|
PM.Handler.Recovery in 'Handlers\PM.Handler.Recovery.pas',
|
|
PM.Handler.Audit in 'Handlers\PM.Handler.Audit.pas',
|
|
PM.Handler.Settings in 'Handlers\PM.Handler.Settings.pas',
|
|
PM.Handler.Attachments in 'Handlers\PM.Handler.Attachments.pas';
|
|
|
|
{$R *.res}
|
|
{$R assets\assets.res}
|
|
|
|
begin
|
|
// Single-instance: if another PMServer is running, bring it to front
|
|
// (it'll handle WM_PMSHOW on its message-only window) and exit. Avoids
|
|
// two icons in the tray and two HTTP servers fighting for the port.
|
|
if not PM.SingleInstance.AcquireOrSignal then
|
|
Exit;
|
|
|
|
Application.Initialize;
|
|
// --tray ("Start with Windows"): FMX puts its taskbar proxy on screen before
|
|
// FormCreate is ever reached — measured — so the watcher has to start here,
|
|
// before the form is built. It only touches raw Win32 (FindWindowEx +
|
|
// ShowWindow), never an FMX object: an earlier attempt that poked
|
|
// MainForm.Visible/Handle at this point died with an access violation.
|
|
if FindCmdLineSwitch('tray', True) then
|
|
StartTrayProxyHider;
|
|
Application.CreateForm(TMainForm, MainForm);
|
|
Application.Run;
|
|
end.
|