Das neue Validierungssystem erklärt

In Version 24.0.0 haben wir ein Registrierungsvalidierungssystem eingeführt, um das bereits bestehende Registrierungssystem zu verbessern. Dieses Validierungssystem kann die Anzahl der Geräte verfolgen, auf denen ein Kunde EmEditor registriert hat.

Diese Seite soll unsere Beweggründe transparent machen und dokumentieren, wie das Validierungssystem funktioniert. Wenn wir das Validierungssystem in Zukunft aktualisieren, werden wir auch diese Seite aktualisieren.

Beweggründe

In der Vergangenheit konnten wir keine Benutzer erkennen, die ihre Lizenzen mit mehreren Personen teilten oder ihre Lizenzen auf mehr Geräten verwendeten, als die EULA (Endbenutzer-Lizenzvereinbarung) erlaubt. Wir möchten, dass Kunden genügend Lizenzen kaufen, um die Lizenzbedingungen einzuhalten. Dies würde die Fairness unter Kunden gewährleisten, die mehrere Lizenzen erworben haben, und uns helfen, weiterhin ein Qualitätsprodukt zu liefern.

Terminologie

  • Registrierung: Der einmalige Vorgang, EmEditor Professional mit einem Registrierungsschlüssel oder den Anmeldedaten des Emurasoft Customer Center zu aktivieren.
  • Validierung: Die regelmäßige Prüfung, die bei jedem Start von EmEditor ausgeführt wird, um zu überprüfen, ob die aktuelle Installation mit einer gültigen Lizenz verknüpft ist.
  • Registrierungsschlüssel: Eine Zeichenfolge, mit der EmEditor registriert wird.
  • Offline-Registrierung: Eine Art der Registrierung, mit der Benutzer EmEditor registrieren und validieren können, ohne eine Verbindung zum EmEditor-Server herzustellen.
  • Gerät: Eine einzelne gezählte Einheit im Rahmen der Lizenz, die eine EmEditor-Installation darstellt. Mehrere benutzerbezogene Installationen von EmEditor auf demselben Rechner gelten als ein Gerät.
  • Gerätelimit: Die maximale Anzahl von Geräten, die für einen Benutzer registriert werden dürfen, basierend auf der Anzahl der Lizenzen, die der Benutzer besitzt, wie in der EULA festgelegt.
  • Rechner: Eine Windows-Umgebung, in der EmEditor installiert ist und ausgeführt werden kann. Ein Rechner wird eindeutig durch seine Maschinen-ID identifiziert. Ein Rechner ist nicht unbedingt mit einem physischen Computer gleichzusetzen, da auf einem Computer mehrere virtuelle Maschinen installiert sein können.
  • Maschinen-ID: Eine Kombination mehrerer Windows-Attribute (MachineGuid, Datum der Betriebssysteminstallation, Volumeseriennummer, Prozessorname und Name des Motherboards), mit der ein Rechner von einem anderen unterschieden wird.
  • MachineGuid: Eine Kennung für eine Windows-Installation, die als eine der Eingaben für die Maschinen-ID verwendet wird.
  • Virtuelle Maschine (VM): Ein Windows-Rechner, der in einer Virtualisierungsumgebung ausgeführt wird.
  • Lokales Gerätetoken: Ein signiertes Token, das auf dem Rechner des Benutzers gespeichert wird und bestätigt, dass das Gerät registriert wurde.
  • Verlaufsdatensatz: Ein Datenbankdatensatz, der mit einem 2Checkout- oder Wiederverkäuferkauf verknüpft ist.
  • Stripe-Abonnement-ID: Die Kennung des Stripe-Abonnements eines Benutzers, mit der registrierte Geräte mit dem Stripe-Abonnement verknüpft werden.
  • Wiederverkäufer: Ein Drittanbieter, der EmEditor-Lizenzen verkauft (außer 2Checkout oder Stripe). Kunden, die über Wiederverkäufer kaufen, müssen das Produkt registrieren und ein Customer-Center-Konto erstellen, um Geräte online anzuzeigen und zu verwalten.
  • Seite „Registrierte Geräte“: Eine Seite im Emurasoft Customer Center, auf der alle Geräte aufgeführt sind, die derzeit für die Lizenzen und Abonnements eines Kunden registriert sind.
  • Go: Eine Programmiersprache, die für serverseitige Logik verwendet wird.

Anforderungen

Dieser Abschnitt listet die Anforderungen an das Validierungssystem auf.

Funktionale Anforderungen

  • Das Validierungssystem sollte die Klausel zum Gerätelimit der Lizenz locker durchsetzen. Es darf die Kundenzufriedenheit nicht beeinträchtigen, und das Limit sollte für Benutzer niemals überraschend kommen.
  • Die Registrierung wird einmal ausgeführt, wenn der Benutzer das Dialogfeld „Produkt registrieren“ absendet oder einen anderen Registrierungsablauf abschließt. Die Validierung wird bei jedem Öffnen von EmEditor ausgeführt.
  • Die Registrierung erfordert, dass EmEditor über HTTPS eine Verbindung zu support.emeditor.com herstellen kann, während die Validierung keine Internetverbindung erfordert.
  • Benutzer sollten eine Offline-Lizenz verwenden können, die es der App ermöglicht, ohne Verbindung zu unserem Server zu registrieren und zu validieren. Wenn bei der normalen Registrierung Fehler auftreten, sollte eine Offline-Lizenz eine alternative Möglichkeit zur Registrierung bieten.
  • Die Datenschutzrechte der Benutzer müssen gewahrt bleiben. Die Erhebung personenbezogener Daten erfolgt auf Opt-in-Basis.
  • Das System sollte in den bestehenden Registrierungsablauf passen und darf keine völlig neue Art der Registrierung einführen. Bestehende Benutzer sollten sich registrieren können, ohne neue Schritte lernen zu müssen.
  • Es sollte vier einfache Möglichkeiten zum Aufheben der Registrierung geben: die Schaltfläche „Abmelden“ im Dialogfeld „Registrierungsinformationen“, die Befehlszeile (/unregister), das Emurasoft Customer Center und automatisch nach Inaktivität, um ein Gerät abzumelden.
  • Benutzer können sich beim Emurasoft Customer Center anmelden, um Geräte anzuzeigen, sodass Geräte auch außerhalb der App abgemeldet werden können.
  • Kunden, die bei anderen Wiederverkäufern als 2Checkout kaufen, müssen das Produkt registrieren und ein Customer-Center-Konto erstellen, da sie sonst keine Möglichkeit haben, ihre Geräte online anzuzeigen und zu verwalten.
  • Das System sollte in Version 23 im Hintergrund getestet werden und ab Version 24 vollständig durchgesetzt werden.
  • Wir werden Abonnements über Stripe verkaufen, daher muss das System in Stripe integriert werden können.
  • Wir werden Registrierungsschlüssel für Stripe-Abonnements anbieten.
  • Benutzer sollten EmEditor in einer VM-Umgebung verwenden können, ohne sich häufig neu registrieren zu müssen.

Technische Anforderungen

  • Das System sollte einfach sein, damit es leicht zu warten ist.

  • Ein Rechner kann anhand seiner Maschinen-ID identifiziert werden.

    • Die Maschinen-ID ist eine Kombination mehrerer Windows-Konstanten, die zur Identifizierung eines Rechners verwendet werden.
    • Da diese Werte einen Rechner eindeutig identifizieren können, sollten sie gehasht werden, um zu vermeiden, dass die Rohwerte im Klartext gespeichert werden.
    • EmEditor Portable kann auf einem USB-Laufwerk installiert werden, wobei die Einstellungen auf diesem Laufwerk gespeichert werden. Das USB-Laufwerk kann auf vielen Rechnern verwendet werden, und das Validierungssystem würde unterschiedliche Maschinen-IDs erkennen. Wenn die App daher erkennt, dass es sich um eine portable Version handelt, die von einem USB-Laufwerk ausgeführt wird, erfolgt keine Registrierung.
  • EmEditor kann benutzerbezogen auf einem Mehrbenutzerrechner installiert werden. Alle benutzerbezogenen Installationen von EmEditor auf demselben Rechner müssen als ein einziges Gerät gezählt werden.

  • Es sollte eine Möglichkeit geben, das Gerätelimit für einen bestimmten Registrierungsschlüssel bei Bedarf außer Kraft zu setzen.

  • Ein signiertes Token mit den Geräteinformationen sollte auf dem Gerät des Benutzers gespeichert werden. Dadurch wird das aktuelle Gerät mit dem in der Datenbank gespeicherten Gerätedatensatz verknüpft.

  • Das System sollte so gestaltet sein, dass bei Bedarf künftig ein Floating-Lizenzmechanismus integriert werden kann.

Ausgabe

  • Eine Liste aller Geräte können Sie auf der Seite „Registrierte Geräte“ im Customer Center anzeigen.
  • Wenn das Gerätelimit erreicht ist, wird eine Benachrichtigung angezeigt. Die App verhindert die Nutzung nicht, wenn das Gerätelimit überschritten wird.

  • Wenn der Benutzer die App bei einem Wiederverkäufer (nicht 2Checkout oder Stripe) gekauft und das Produkt nicht registriert hat, fordert eine Benachrichtigung den Benutzer auf, das Produkt zu registrieren.

Gerätetabelle

Die Gerätetabelle wird in unserer Datenbank gespeichert und zeichnet alle Geräte auf, die registriert wurden. Beachten Sie, dass ein History-Datensatz mit einem Kauf verknüpft ist und dort ein alter Registrierungsschlüssel gespeichert wird. Ein Device-Datensatz ist in Go wie folgt definiert.

type Device struct {
	DeviceID             string
	UserID               int
	HistoryID            sql.NullInt64
	StripeSubscriptionID sql.NullString
	MachineID            MachineID
	RegistrationDate     time.Time
	ValidationDate       time.Time
	InstallationType     InstallationType
	Label                string
	Unregistered         bool
}

Die Felder werden in der Dokumentation zu Registrierten Geräten erläutert. Das Feld MachineID wird unten erläutert.

Datenschutzmaßnahmen für das Label

Das Feld Label kann personenbezogene Daten enthalten. Das Feld Gerät beschriften im Dialogfeld Produkt registrieren ist standardmäßig auf {computer name} {user name} gesetzt. Die personenbezogenen Daten im Labelfeld sind für die grundlegende Funktionalität der App nicht erforderlich. Daher haben wir das Labelfeld auf Opt-in umgestellt, um an unserer Richtlinie des Datenschutzes standardmäßig festzuhalten.

Maschinen-ID

Die Maschinen-ID wird zur Identifizierung eines Rechners verwendet und in der folgenden Struktur gespeichert.

type MachineID struct {
    // Identifies a Windows installation
    // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid
    MachineGuid string

    // Time of Windows installation
    // SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallTime
    OSInstallDate string

    // Filesystem identifier created when a storage drive is formatted
    // Volume serial number from GetVolumeInformationW()
    VolumeSerialNumber string

    // Name of processor
    // HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString
    ProcessorName string

    // Name of motherboard
    // HARDWARE\DESCRIPTION\System\BIOS\BaseBoardManufacturer and HARDWARE\DESCRIPTION\System\BIOS\BaseBoardProduct
    MotherboardName string
}

Jedes Feld wird auf dem Rechner des Clients sicher gehasht, bevor die Registrierungsanfrage gesendet wird. Die gehashte Maschinen-ID wird mit Ende-zu-Ende-Verschlüsselung sicher in unserer Datenbank gespeichert. Die Klartext-Identifikationswerte werden niemals übertragen und nicht auf unseren Servern gespeichert.

Vergleichen von Maschinen-IDs

Wir verwenden mehrere Windows-Konstanten, um festzustellen, ob zwei Rechner derselbe sind. Früher gingen wir davon aus, dass die MachineGuid für einen bestimmten Rechner konstant bleibt, aber dies erwies sich als falsch. Ein häufiger Fall, in dem sich die MachineGuid für eine einzelne EmEditor-Installation ändert, ist, wenn der Kunde die App auf einem VM-Laufwerk installiert, das dann in verschiedene Windows-Installationen gebootet wird.

Um die Robustheit zu verbessern, verwenden wir mehrere Werte des Betriebssystems, die größtenteils konstant sind und zusammen zur Identifizierung eines Rechners beitragen. Mit dem folgenden Algorithmus entscheiden wir, ob zwei Rechner als gleich angesehen werden.

// Returns true if machine a and b are considered to be equal.
// Machines are considered equal if it scores at least 3 points from the following points.
// 3 points: MachineGuid matches
// 2 points: OS install date matches
// 2 points: Volume serial number matches
// 1 point: Processor name matches
// 1 point: Motherboard name matches
func IsMachineIDSame(a, b MachineID) bool {
	// Quick check: MachineGuid matches (3 points)
	if a.MachineGuid == b.MachineGuid {
		return true
	}

	score := 0

	// 2 points: OS install date matches
	if a.OSInstallDate == b.OSInstallDate {
		score += 2
	}

	// 2 points: Volume serial number matches
	if a.VolumeSerialNumber == b.VolumeSerialNumber {
		score += 2
	}

	// 1 point: Processor name matches
	if a.ProcessorName == b.ProcessorName {
		score += 1
	}

	// 1 point: Motherboard name matches
	if a.MotherboardName == b.MotherboardName {
		score += 1
	}

	return score >= 3
}

Wenn die MachineGuid gleich ist, betrachten wir die Rechner sofort als gleich. Andernfalls suchen wir nach einer Gesamtpunktzahl von 3 oder mehr Punkten, was mindestens zwei anderen übereinstimmenden Werten entspricht. Die unten erläuterte Geräteanzahl verwendet diese Logik, um die Anzahl der eindeutigen Rechner zu bestimmen.

Vor Version 24.5 haben wir bei der Bestimmung, ob Rechner gleich sind, nur die MachineGuid berücksichtigt. Einige Kunden, die VMs verwendeten, hatten dann eine negative Erfahrung, da sie schnell das Gerätelimit erreichten, obwohl sie glaubten, sich nicht so oft registriert zu haben. Durch die Berücksichtigung anderer Konstanten zusätzlich zur MachineGuid tragen wir dazu bei, dass EmEditor in VM-Umgebungen verwendet werden kann, ohne unerwartet das Gerätelimit zu erreichen.

Geräteanzahl

Dieser Abschnitt beschreibt, wie wir bestimmen, wie viele Geräte Sie registrieren können.

Zuerst fragen wir alle Geräte ab, die einem bestimmten Registrierungsschlüssel oder einer Stripe-Abonnement-ID zugeordnet sind, und filtern sie auf diejenigen, die derzeit registriert sind.

Als Nächstes zählen wir die Anzahl der eindeutigen Rechner mit der oben beschriebenen Logik. Wenn zwei Geräte gemäß IsMachineIDSame dieselbe Maschinen-ID haben, beträgt die Geräteanzahl 1. Wenn zwei Geräte unterschiedliche Maschinen-IDs haben, beträgt die Geräteanzahl 2. Wenn mehrere Geräte vorhanden sind, die als auf demselben Rechner befindlich gelten, können sie benutzerbezogene Installationen auf demselben Rechner oder derselben VM darstellen.

Die EULA erlaubt dem Lizenznehmer, EmEditor auf bis zu zwei Geräten pro Lizenz zu installieren. Wenn EmEditor für den persönlichen Gebrauch bestimmt ist und nicht auf Firmencomputern installiert wird, darf der Lizenznehmer EmEditor auf bis zu fünf Geräten pro Lizenz installieren.

Der Algorithmus zur Ermittlung des maximalen Gerätelimits für einen Benutzer wird nicht öffentlich dokumentiert.

Lokales Gerätetoken

Ein LocalDevice-Token wird lokal auf dem Gerät des Benutzers in Form eines JWT (JSON Web Token) gespeichert. Es verknüpft das aktuelle Gerät mit dem Device-Datensatz der Datenbank. Außerdem ermöglicht es EmEditor, auch offline eine gewisse Validierung durchzuführen. Die Nutzlast des Tokens ist wie folgt definiert.

type LocalDevice struct {
	DeviceID  string
	MachineID MachineID

	// StripeSubscriptionID is empty if this device is not associated with a subscription.
	StripeSubscriptionID string
}

Bei benutzerbezogenen Installationen wird das Token in der Registrierung als LocalDeviceToken unter Computer\HKEY_CURRENT_USER\Software\EmSoft\EmEditor v3\Common gespeichert.

Offline-Registrierung

Eine Offline-Lizenz ermöglicht es einem Benutzer, sich ohne Internetverbindung zu registrieren. Die Registrierung erfordert nur eine Lizenzdatei.

Ein Kunde kann eine Offline-Lizenzdatei anfordern. Der Kunde muss seinen alten Registrierungsschlüssel oder seine Stripe-Bestell-ID in die Anfrage aufnehmen. Wir antworten innerhalb weniger Werktage mit der Lizenzdatei an die E-Mail-Adresse des Kunden. Die Lizenzdatei ist eine Textdatei, die ein JWT-Token mit der folgenden Nutzlast enthält.

type LicenseFile struct {
	LicenseID string
	UserID    int
	FullName  string
	Email     string

	// Is nil if not a Stripe subscription
	StripeSubscriptionID *string

	// Is nil if not a registration key
	HistoryID *int
}

Das Offline-Lizenz-Token wird im Registrierungseintrag OfflineLicense gespeichert.

Es gibt drei Möglichkeiten, wie das Gerätelimit durchgesetzt und die illegale Weitergabe der Lizenzdatei verhindert wird. 1) Wenn EmEditor auf das Internet zugreifen kann, wird eine Validierung durchgeführt. 2) Wir senden die Lizenzdatei nur per E-Mail und nicht zum Download von unserer Website. 3) Das Dialogfeld „Registrierungsinformationen“ zeigt den vollständigen Namen und die E-Mail-Adresse des Lizenzinhabers an.

OfflineLicense-Tabelle

Die Nutzung von Offline-Lizenzen wird anhand der Tabelle OfflineLicense verfolgt. Sie enthält die Maschinen-ID, um zu verfolgen, wie viele Rechner die Lizenz verwendet haben, und das Flag Revoked, damit wir eine Lizenz widerrufen können.

type OfflineLicense struct {
	LicenseID            string
	UserID               int
	MachineID            MachineID
	StripeSubscriptionID sql.NullString
	HistoryID            sql.NullInt64

	// Revoked indicates that this license cannot be used
	Revoked bool
}

Dialogfeld „Registrierungsinformationen“

Registrierungsinformationen zeigt Informationen zur Registrierung des Benutzers an. Dies ist nützlich, um den Registrierungsstatus zu kennen und um Probleme bei der Validierung zu diagnostizieren. Außerdem kann der Benutzer die Geräteinformationen bearbeiten und die Registrierung aufheben.

Das Dialogfeld führt eine Validierung durch und zeigt an, ob sie erfolgreich war.

Stripe-Registrierungsschlüssel

Wir haben ein neues Registrierungsschlüsselformat speziell für Stripe-Abonnements eingeführt, das in diesem Artikel als „Stripe-Registrierungsschlüssel“ bezeichnet wird. Das ältere Format wird als „alter Registrierungsschlüssel“ bezeichnet, während der Begriff „Registrierungsschlüssel“ beide Formate umfasst.

Das Format des Stripe-Registrierungsschlüssels lautet wie folgt:

r-xxxx-xxxx-xxxx-xxxx-xxxx

Dabei ist x ein base58-Zeichen. Jedes Zeichen wird zufällig generiert, was bedeutet, dass ein Stripe-Registrierungsschlüssel 117 Bit Entropie hat.

Registrierungsablauf

Es gibt vier Szenarien, in denen der Registrierungsablauf stattfinden kann.

  • Die meisten Benutzer registrieren sich über das Dialogfeld Produkt registrieren.
  • Eine rechnerweite Registrierung kann mit dem Befehl /register durchgeführt werden.
  • Eine Offline-Registrierung kann mit dem Befehl /ol durchgeführt werden.
  • Wenn Sie ein Gerät abmelden und dann EmEditor auf diesem Gerät öffnen, wird das Gerät automatisch registriert.

Es gibt drei Online-Registrierungsabläufe, je nachdem, ob ein alter Registrierungsschlüssel verwendet wird (RegisterDeviceLegacyRegkey()), ein Stripe-Registrierungsschlüssel verwendet wird (RegisterDeviceStripeRegkey) oder ein Stripe-Abonnement verwendet wird (RegisterDeviceSubscription()). Es gibt einen zusätzlichen Registrierungsablauf für die Offline-Registrierung (StoreOfflineLicenseAndValidate()).

In diesem Abschnitt bezieht sich „Client“ auf die lokale EmEditor-App auf dem Rechner des Benutzers. „Server“ ist unser Backend-Server und unsere Datenbank.

Finden eines zu verwendenden Abonnements

  1. Wenn der Benutzer sich anmeldet, versucht der Server, ein gültiges Stripe-Abonnement zu finden, dem 0 Geräte zugeordnet sind.

  2. Wenn kein Abonnement 0 zugeordnete Geräte hat, wird versucht, ein Abonnement zu finden, das das Gerätelimit nicht überschritten hat.

    1. Wenn ein nutzbares Stripe-Abonnement vorhanden ist, wird RegisterDeviceSubscription() aufgerufen.
    2. Wenn ein solches Stripe-Abonnement nicht vorhanden ist, wird ein gültiger alter Registrierungsschlüssel gesucht, der das Gerätelimit nicht überschritten hat. Für alte Registrierungsschlüssel wird RegisterDeviceLegacyRegkey() verwendet.

Registrierung mit altem Registrierungsschlüssel (RegisterDeviceLegacyRegkey())

  1. Wenn bereits ein Gerätetoken vorhanden ist, sendet der Client eine Abmeldeanfrage an den Server. Das Token und der Registrierungsschlüssel werden aus der Registrierung gelöscht.

  2. Der Client sendet eine Registrierungsanfrage an den Server, die den alten Registrierungsschlüssel, die E-Mail-Adresse, die Maschinen-ID, das Label und den Installationstyp enthält.

  3. Der Server vergleicht die eingegebene E-Mail-Adresse mit der tatsächlichen E-Mail-Adresse des Benutzers, um sicherzustellen, dass sie ähnlich sind.

  4. Der Server ruft die Geräteanzahl (im vorherigen Abschnitt definiert) ab, die der Maschinen-ID zugeordnet ist, um zu bestimmen, ob der alte Registrierungsschlüssel zur Registrierung des Geräts verwendet werden kann.

    1. Wenn das Gerätelimit überschritten ist, werden Geräte mit einem ValidationDate vor jetzt – 60 Tagen abgemeldet. Die Geräteanzahl wird erneut abgerufen.
  5. Ein Device-Datensatz wird erstellt.

  6. Der Client empfängt die Geräte-ID. Mit der Geräte-ID fordert der Client ein lokales Gerätetoken an.

  7. Der Server erstellt das lokale Gerätetoken und antwortet damit. Das Ablaufdatum des Tokens wird auf das Ablaufdatum des alten Registrierungsschlüssels gesetzt. Der Client schreibt das Token in den lokalen Speicher.

Registrierung mit Stripe-Registrierungsschlüssel (RegisterDeviceStripeRegkey())

  1. Wenn bereits ein Gerätetoken vorhanden ist, sendet der Client eine Abmeldeanfrage an den Server. Das Token und der Registrierungsschlüssel werden aus der Registrierung gelöscht.

  2. Der Client sendet eine Registrierungsanfrage an den Server, die den Stripe-Registrierungsschlüssel, die E-Mail-Adresse, die Maschinen-ID, das Label und den Installationstyp enthält.

  3. Der Server vergleicht die eingegebene E-Mail-Adresse mit der tatsächlichen E-Mail-Adresse des Benutzers, um sicherzustellen, dass sie ähnlich sind.

  4. Der Server überprüft, ob das Stripe-Abonnement gültig ist.

  5. Der Server ruft die Geräteanzahl (im vorherigen Abschnitt definiert) ab, die der Maschinen-ID zugeordnet ist, um zu bestimmen, ob der Stripe-Registrierungsschlüssel zur Registrierung des Geräts verwendet werden kann.

    1. Wenn das Gerätelimit überschritten ist, werden Geräte mit einem ValidationDate vor jetzt – 60 Tagen abgemeldet. Die Geräteanzahl wird erneut abgerufen.
  6. Ein Device-Datensatz wird erstellt.

  7. Der Client empfängt die Geräte-ID. Mit der Geräte-ID fordert der Client ein lokales Gerätetoken an.

  8. Der Server erstellt das lokale Gerätetoken und antwortet damit. Das Ablaufdatum des Tokens wird auf einen Monat in der Zukunft gesetzt, wenn der Abonnementstatus aktiv ist. Wenn der Abonnementstatus gekündigt ist, wird das Ablaufdatum auf das Enddatum des aktuellen Abrechnungszeitraums gesetzt. Der Client schreibt das Token in den lokalen Speicher.

Registrierung mit Stripe-Abonnement (RegisterDeviceSubscription())

  1. Wenn bereits ein Gerätetoken vorhanden ist, sendet der Client eine Abmeldeanfrage an den Server. Das Token und der Registrierungsschlüssel werden aus der Registrierung gelöscht.

  2. Der Client sendet eine Registrierungsanfrage an den Server, die das Stripe-Abonnement, die Maschinen-ID, das Label und den Installationstyp enthält.

  3. Der Server überprüft, ob das Stripe-Abonnement gültig ist.

  4. Der Server fragt deviceCount (im vorherigen Abschnitt definiert) ab, die der Maschinen-ID zugeordnet ist, um zu bestimmen, ob das Stripe-Abonnement zur Registrierung des Geräts verwendet werden kann.

    1. Wenn das Gerätelimit überschritten ist, werden Geräte mit einem ValidationDate vor jetzt – 60 Tagen abgemeldet. Die Geräteanzahl wird erneut abgerufen.
  5. Ein Device-Datensatz wird erstellt.

  6. Der Client empfängt die Geräte-ID. Mit der Geräte-ID fordert der Client ein lokales Gerätetoken an.

  7. Der Server erstellt das lokale Gerätetoken und antwortet damit. Das Ablaufdatum wird auf einen Monat in der Zukunft gesetzt, wenn der Abonnementstatus aktiv ist. Wenn der Abonnementstatus gekündigt ist, wird das Ablaufdatum auf das Enddatum des aktuellen Abrechnungszeitraums gesetzt. Der Client schreibt das Token in den lokalen Speicher.

Registrierung über die Befehlszeile (/register)

Der Befehl /register führt eine rechnerweite Registrierung durch: Er registriert EmEditor für jeden Windows-Benutzer des Rechners, während das Dialogfeld Produkt registrieren EmEditor nur für den aktuellen Benutzer registriert. Er ist für IT-Administratoren gedacht, die EmEditor für mehrere Benutzer auf einem Windows-System einrichten. Der Befehl schreibt sein Ergebnis in den Standardfehlerstrom.

emeditor.exe /register /regname "Name or organization name" /regkey "Registration Key" /regemail "user@example.com" /reglabel "Label for PC"

Die Parameter sind dieselben Registrierungsfelder wie im Dialogfeld „Produkt registrieren“: Der Lizenznehmername (/regname), der Registrierungsschlüssel (/regkey) und die E-Mail-Adresse (/regemail) sind erforderlich, und das Gerätelabel (/reglabel) ist optional. Der Name wird nicht an den Registrierungsserver gesendet, und das Label kann weggelassen werden.

Wenn der Befehl ausgeführt wird, führt er Folgendes aus:

  1. Er hebt die vorhandene Registrierung auf dem Computer auf, falls eine vorhanden ist.
  2. Er kontaktiert den Registrierungsserver und registriert den Rechner als ein Gerät. Dieser Schritt erfordert eine Internetverbindung.
  3. Er zeigt eine UAC-Eingabeaufforderung (Benutzerkontensteuerung) an, damit neue Registrierungseinträge in HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common geschrieben werden dürfen.

EmEditor muss die HKLM-Einträge ein Jahr lang nicht ändern. Wenn das Abonnement nach einem Jahr erneuert wird, führen Sie emeditor /registrerrenew aus, um die Registrierungseinträge zu aktualisieren und sicherzustellen, dass EmEditor registriert ist.

Erneuern der rechnerweiten Registrierung über die Befehlszeile (/registerrenew)

Ein mit /register registriertes Gerät speichert sein Gerätetoken in HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common\LocalDeviceToken. Da dieser Eintrag zum Ändern Administratorrechte erfordert, muss er manuell erneuert werden.

emeditor.exe /registerrenew

Der Befehl benötigt keine Parameter. Wie /register und /unregister schreibt er sein Ergebnis in den Standardfehlerstrom.

Der Befehl wird in den folgenden Fällen abgelehnt:

  • Ein anderer EmEditor.exe-Prozess wird ausgeführt, da er den Registrierungszustand, den der Befehl ändert, neu schreiben könnte.
  • EmEditor ist eine portable Installation oder eine Microsoft-Store-Installation, da keine von beiden das rechnerweite Token schreiben kann.
  • Die Befehlszeile enthält außerdem /register oder /unregister.
  • Der rechnerweite Eintrag LocalDeviceToken existiert nicht. Ein Rechner, der nur mit einer benutzerbezogenen Registrierung oder einer Offline-Lizenz registriert wurde, hat kein rechnerweites Token und wird daher von diesem Befehl nicht erneuert.

Wenn der Befehl ausgeführt wird, führt er Folgendes aus:

  1. Er liest den rechnerweiten Eintrag LocalDeviceToken direkt aus HKEY_LOCAL_MACHINE. Die benutzerbezogenen Einträge werden nicht gelesen, auch wenn sie vorhanden sind.
  2. Er registriert das Gerät auf dem Server. Dieser Schritt erfordert eine Internetverbindung.
  3. Er fordert den Gerätedatensatz vom Server an, um das Gerät zu validieren.
  4. Er fordert ein neues rechnerweites Gerätetoken vom Server an.
  5. Er schreibt das neue Token über eeadmin.exe /writedevice, das eine UAC-Eingabeaufforderung auslöst, in HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common\LocalDeviceToken.
  6. Er gibt eine Meldung im Standardfehlerstrom aus. Die erneuerte Registrierung ist ein Jahr lang gültig oder bis das Gerät abgemeldet wird.

Registrierung mit Offline-Lizenz (StoreOfflineLicenseAndValidate())

Der Benutzer registriert eine Offline-Lizenz, indem er die Lizenzdatei im Dateisystem speichert und dann die Befehlszeilenoption ausführt.

/ol "licenseFilePath"

Diese Liste beschreibt den Offline-Registrierungsablauf.

  1. Den Registrierungsschlüssel, das lokale Gerätetoken und das Offline-Lizenz-Token aus der Registrierung löschen.
  2. Die Lizenzdatei lesen und in der Registrierung speichern.
  3. ValidateDevice() ausführen.

Validierungsprozess (ValidateDevice())

Die Validierung erfolgt bei jedem Öffnen der App.

  1. Den vorhandenen lokalen Gerätetoken-Eintrag in der Registrierung abfragen. Zuerst den Eintrag HKEY_CURRENT_USER\Software\EmSoft\EmEditor v3\Common\LocalDeviceToken abrufen. Wenn er nicht existiert, den Eintrag HKEY_LOCAL_MACHINE\SOFTWARE\EmSoft\EmEditor v3\Common\LocalDeviceToken abrufen.

    1. Wenn an keinem der beiden Orte ein lokales Gerätetoken vorhanden war, ValidateOfflineLicense() aufrufen.
  2. Die Signatur des Tokens wird validiert. Die tatsächliche Maschinen-ID wird mit der Maschinen-ID im Token verglichen. Das Ergebnis wird ignoriert, wenn die App auf einem Wechseldatenträger ausgeführt wird.

    • Wenn die Validierung aus erwarteten Gründen wie einer nicht übereinstimmenden Maschinen-ID fehlschlägt, wird der Grund als Statustext ausgegeben.
    • Wenn das Token abgelaufen ist, wird überprüft, ob das Abonnement gültig ist, und dann wird versucht, ein neues Token abzurufen.
    • Bei anderen unerwarteten Fehlern wie einem Netzwerkfehler ist die Validierung erfolgreich.
  3. Ein Zufallszahlengenerator entscheidet, ob die Validierung hier beendet werden soll. Dies dient dazu, die Last der Anfragen an unseren Server zu verringern.

  4. Die Validierungsfunktion versetzt den Thread für eine bestimmte Dauer in den Ruhezustand. Auch dies dient dazu, die Anfragelast zu verringern, da wir davon ausgehen, dass Makros und andere automatisierte Anwendungsfälle, die die App schnell starten und schließen, sie nur für kurze Zeit ausführen würden.

  5. Der Client fordert die Device-Daten für die gespeicherte Geräte-ID an.

  6. Wenn das Gerät einem Stripe-Abonnement zugeordnet ist, überprüft der Server, ob das Stripe-Abonnement gültig ist.

  7. Wenn device.Unregistered == true ist, versucht der Client, das Gerät zu registrieren.

  8. Die device.ValidationDate wird aktualisiert.

  9. Wenn das Token vor current time - 7 days ausgestellt wurde und das Gerätetoken aus HKEY_CURRENT_USER abgefragt wurde, wird ein neues Token erstellt, um das alte Token zu erneuern. Das neue Token hat ein Ablaufdatum von einem Monat.

Offline-Lizenz-Validierungsprozess (ValidateOfflineLicense())

Die Offline-Lizenz-Validierung erfolgt, wenn die Registrierung das lokale Gerätetoken nicht enthält. Wenn ein unerwarteter Fehler auftritt, ist die Validierung erfolgreich. Das bedeutet, dass die Validierung auch dann erfolgreich ist, wenn der Benutzer offline ist.

  1. Wenn das Offline-Lizenz-Token nicht existiert, ist die Validierung erfolgreich. Ein Fall, in dem dies auftreten kann, ist, wenn die Registrierung zuvor aufgrund eines Netzwerkfehlers fehlgeschlagen ist, der Registrierungsschlüssel jedoch gültig war. Dadurch kann EmEditor in diesem Fall verwendet werden.
  2. Das Token lesen und validieren.
  3. Den Server auffordern, die Offline-Lizenz mit dem Token und der Maschinen-ID zu validieren.
  4. Der Server validiert das Token.
  5. Bei Stripe-Abonnements prüft der Server, ob das Abonnement den Status active hat.
  6. Wenn kein OfflineLicense-Eintrag für die Lizenz-ID existiert, wird er mit den Tokendaten erstellt.
  7. Wenn der Eintrag existiert und license.Revoked == true ist, wird StatusLicenseRevoked zurückgegeben. Andernfalls ist die Validierung erfolgreich.

Aufheben der Registrierung

Der neue MSIX-Installer erlaubt das Ausführen eines Skripts bei der Deinstallation nicht, daher können wir das Gerät nicht automatisch abmelden, wenn der Benutzer die App deinstalliert. Dieselbe Einschränkung gilt für die portable Version und die Microsoft-Store-Version, da keine von beiden einen Deinstallationsschritt hat, der ein Skript ausführen kann.

Wir möchten, dass Benutzer eine Lizenz für eine neue Installation einfach freigeben können. Um dies zu ermöglichen, gibt es vier bequeme Möglichkeiten, ein Gerät abzumelden:

  • Öffnen Sie in EmEditor das Dialogfeld „Registrierungsinformationen“ und klicken Sie auf Abmelden.

    • Dadurch wird der Abmelde-Endpunkt aufgerufen, um das Gerät serverseitig abzumelden, und anschließend werden die benutzerbezogenen Registrierungseinträge LocalDeviceToken und EmEditor-14 entfernt. Das Gerät ist nun abgemeldet, und der Benutzer sieht das Registrierungsdialogfeld.
  • Verwenden Sie den Befehl emeditor /unregister.

    • Wie die Schaltfläche „Abmelden“ ruft dieser Befehl den Abmelde-Endpunkt auf. Er löscht außerdem sowohl die benutzerbezogenen als auch die rechnerweiten Registrierungseinträge für LocalDeviceToken, OfflineLicence und EmEditor-14. Diese Methode ist für IT-Administratoren gedacht, die die rechnerweite Registrierungsmethode mit emeditor /register verwendet haben.
    • Wenn der Computer offline ist, tut der Befehl nichts und wird mit einem Fehler beendet.
  • Verwenden Sie die Seite „Registrierte Geräte“ im Emurasoft Customer Center. Klicken Sie bei einem Geräteeintrag auf Bearbeiten und dann auf Klicken, um dieses Gerät abzumelden.

    • Diese Methode löscht den Registrierungseintrag LocalDeviceToken für die EmEditor-Installation nicht, sodass das Gerät lokal registriert bleibt. Wenn der Benutzer danach EmEditor auf diesem Gerät öffnet, wird es automatisch erneut registriert und verbraucht wieder eine Lizenz. Diese Methode ist für Benutzer gedacht, die EmEditor bereits vor dem Abmelden deinstalliert haben.
  • Der Server meldet ungenutzte Geräte automatisch ab.

    • Wenn ein Gerät den Registrierungs-Endpunkt aufruft und die serverseitige Validierung erkennt, dass das Gerätelimit erreicht wurde, führt der Server eine Gerätebereinigung durch. Für jedes für das angeforderte Abonnement registrierte Gerät gilt: Wenn der Eintrag ValidationDate älter als zwei Monate ist, wird dieses Gerät abgemeldet. Dies gilt für jedes solche Gerät, nicht nur für so viele, wie benötigt werden, um unter das Limit zu kommen. Ein so alter ValidationDate-Wert zeigt an, dass das Gerät nicht mehr verwendet wird, da EmEditor es lange nicht validiert hat. Der Server versucht dann erneut die Validierung. Da die Geräteanzahl jetzt möglicherweise niedriger ist, kann die Validierung dieses Mal erfolgreich sein.
    • Dies verhindert, dass Benutzer aufgrund alter Geräte, die sie nicht mehr verwenden, auf unerwartete Gerätelimit-Probleme stoßen.
    • Wenn ein Gerät auf dem Server abgemeldet, aber nicht innerhalb der lokalen EmEditor-App abgemeldet wurde, kann der Benutzer die App ohne Unterbrechung weiter verwenden, es sei denn, das Gerätelimit wurde bereits erreicht. Bei der nächsten Gerätevalidierung registriert der Server das Gerät automatisch erneut, sofern ein Lizenzplatz verfügbar ist.

Sicherheit

Wir verwenden Praktiken des sicheren Designs, um die Privatsphäre zu gewährleisten und uns vor Angriffen auf das Validierungssystem zu schützen. Im Folgenden sind einige der Leitprinzipien aufgeführt, die wir bei der Implementierung des Systems verwendet haben.

  • Ende-zu-Ende-Verschlüsselung

    • Die gesamte Client-zu-Server- und Server-zu-Server-Kommunikation verwendet HTTPS mit CA-validierter TLS-Verschlüsselung ohne unsicheren Fallback.
    • Serverseitige Datenbankdatensätze sind mit Azure-verwalteter Verschlüsselung und sicheren Einstellungen geschützt.
  • Tokensicherheit

    • Das lokale Gerätetoken und das Offline-Lizenz-Token folgen dem JWT-Standard und sind mit ECDSA signiert. Dies ermöglicht eine clientseitige Authentifizierung, ohne den privaten Schlüssel weiterzugeben.
  • Datenschutz personenbezogener Daten

    • Die Label-Option während der Registrierung ist optional.
    • MachineID-Felder werden clientseitig sicher gehasht, bevor sie verschlüsselt und übertragen werden. Der Klartextinhalt dieser Felder wird niemals übertragen oder auf unseren Servern gespeichert.
    • Clientseitige Protokolle werden nicht persistent gespeichert. Serverseitige Protokolle enthalten minimale Daten zu Anfragen und keine Anfragetextinhalte wie die Registrierungsfelder.

Support

Wenn Sie Fragen oder Feedback zum Validierungssystem haben, können Sie uns gerne eine Nachricht senden.