d41546b899e75c0decbf2fe2f0841b33c9b39bc9
9 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
050ba706d3 |
fix: Attempt license renewal when n8n starts (no-changelog) (#7204)
This change is needed so that the newly introduced floating licenses will be attempted to be claimed when n8n starts up. |
||
|
|
9f797b96d8 |
feat(core): Add command to trigger license refresh on workers (#7184)
This PR implements the updated license SDK so that worker and webhook instances do not auto-renew licenses any more. Instead, they receive a `reloadLicense` command via the Redis client that will fetch the updated license after it was saved on the main instance This also contains some refactoring with moving redis sub and pub clients into the event bus directly, to prevent cyclic dependency issues. |
||
|
|
dd233bdf7d |
test: Fix license tests when tenantId is not default (no-changelog) (#6977)
License tests fail if the env has a non-default `tenantId`:
<details>
<summary>Stack trace</summary>
```
nt -- license
> n8n@1.3.0 test /Users/ivov/Development/n8n/packages/cli
> pnpm test:sqlite "--" "license"
> n8n@1.3.0 test:sqlite /Users/ivov/Development/n8n/packages/cli
> N8N_LOG_LEVEL=silent DB_TYPE=sqlite jest "--" "license"
FAIL test/unit/License.test.ts
License
✕ initializes license manager (8 ms)
✓ attempts to activate license with provided key
✓ renews license (1 ms)
✓ check if feature is enabled (2 ms)
✓ check if sharing feature is enabled (1 ms)
✓ check fetching entitlements
✓ check fetching feature values (1 ms)
✓ check management jwt
✓ getMainPlan() returns the right entitlement (3 ms)
✓ getMainPlan() returns undefined if there is no main plan
● License › initializes license manager
expect(jest.fn()).toHaveBeenCalledWith(...expected)
- Expected
+ Received
Object {
"autoRenewEnabled": true,
"autoRenewOffset": 259200,
- "deviceFingerprint": Any<Function>,
- "loadCertStr": Any<Function>,
- "logger": Anything,
+ "deviceFingerprint": [Function deviceFingerprint],
+ "loadCertStr": [Function loadCertStr],
+ "logger": Logger {
+ "logger": DerivedLogger {
+ "_events": Object {
+ "data": [Function ondata],
+ "end": [Function bound onceWrapper],
+ "prefinish": [Function prefinish],
+ },
+ "_eventsCount": 3,
+ "_maxListeners": undefined,
+ "_readableState": ReadableState {
+ "autoDestroy": false,
+ "awaitDrain": 0,
+ "buffer": BufferList {
+ "head": null,
+ "length": 0,
+ "tail": null,
+ },
+ "decoder": null,
+ "defaultEncoding": "utf8",
+ "destroyed": false,
+ "emitClose": true,
+ "emittedReadable": false,
+ "encoding": null,
+ "endEmitted": false,
+ "ended": false,
+ "flowing": true,
+ "highWaterMark": 16,
+ "length": 0,
+ "needReadable": true,
+ "objectMode": true,
+ "paused": false,
+ "pipes": Console {
+ "__winstonerror": [Function bound transportEvent],
+ "__winstonwarn": [Function bound transportEvent],
+ "_events": Object {
+ "close": [Function bound onceWrapper],
+ "drain": [Function pipeOnDrainFunctionResult],
+ "error": Array [
+ [Function onerror],
+ [Function bound transportEvent],
+ ],
+ "finish": [Function bound onceWrapper],
+ "unpipe": Array [
+ [Function bound onceWrapper],
+ [Function onunpipe],
+ ],
+ "warn": [Function bound transportEvent],
+ },
+ "_eventsCount": 6,
+ "_maxListeners": 30,
+ "_writableState": WritableState {
+ "autoDestroy": false,
+ "bufferProcessing": false,
+ "bufferedRequest": null,
+ "bufferedRequestCount": 0,
+ "corked": 0,
+ "corkedRequestsFree": CorkedRequest {
+ "entry": null,
+ "finish": [Function anonymous],
+ "next": null,
+ },
+ "decodeStrings": true,
+ "defaultEncoding": "utf8",
+ "destroyed": false,
+ "emitClose": true,
+ "ended": false,
+ "ending": false,
+ "errorEmitted": false,
+ "finalCalled": false,
+ "finished": false,
+ "highWaterMark": 16,
+ "lastBufferedRequest": null,
+ "length": 0,
+ "needDrain": false,
+ "objectMode": true,
+ "onwrite": [Function anonymous],
+ "pendingcb": 0,
+ "prefinished": false,
+ "sync": true,
+ "writecb": null,
+ "writelen": 0,
+ "writing": false,
+ },
+ "consoleWarnLevels": Object {},
+ "eol": "
+ ",
+ "format": Printf {
+ "template": [Function anonymous],
+ },
+ "handleExceptions": undefined,
+ "handleRejections": undefined,
+ "level": undefined,
+ "levels": Object {
+ "debug": 5,
+ "error": 0,
+ "http": 3,
+ "info": 2,
+ "silly": 6,
+ "verbose": 4,
+ "warn": 1,
+ },
+ "name": "console",
+ "parent": [Circular],
+ "silent": undefined,
+ "stderrLevels": Object {},
+ "writable": true,
+ Symbol(kCapture): false,
+ },
+ "pipesCount": 1,
+ "readableListening": false,
+ "reading": false,
+ "readingMore": false,
+ "resumeScheduled": true,
+ "sync": false,
+ },
+ "_transformState": Object {
+ "afterTransform": [Function bound afterTransform],
+ "needTransform": false,
+ "transforming": false,
+ "writecb": null,
+ "writechunk": null,
+ "writeencoding": null,
+ },
+ "_writableState": WritableState {
+ "autoDestroy": false,
+ "bufferProcessing": false,
+ "bufferedRequest": null,
+ "bufferedRequestCount": 0,
+ "corked": 0,
+ "corkedRequestsFree": CorkedRequest {
+ "entry": null,
+ "finish": [Function anonymous],
+ "next": null,
+ },
+ "decodeStrings": true,
+ "defaultEncoding": "utf8",
+ "destroyed": false,
+ "emitClose": true,
+ "ended": false,
+ "ending": false,
+ "errorEmitted": false,
+ "finalCalled": false,
+ "finished": false,
+ "highWaterMark": 16,
+ "lastBufferedRequest": null,
+ "length": 0,
+ "needDrain": false,
+ "objectMode": true,
+ "onwrite": [Function anonymous],
+ "pendingcb": 0,
+ "prefinished": false,
+ "sync": true,
+ "writecb": null,
+ "writelen": 0,
+ "writing": false,
+ },
+ "allowHalfOpen": true,
+ "defaultMeta": null,
+ "exceptions": ExceptionHandler {
+ "handlers": Map {},
+ "logger": [Circular],
+ },
+ "exitOnError": true,
+ "format": Format {
+ "options": Object {},
+ },
+ "level": "silent",
+ "levels": Object {
+ "debug": 5,
+ "error": 0,
+ "http": 3,
+ "info": 2,
+ "silly": 6,
+ "verbose": 4,
+ "warn": 1,
+ },
+ "profilers": Object {},
+ "readable": true,
+ "rejections": RejectionHandler {
+ "handlers": Map {},
+ "logger": [Circular],
+ },
+ "silent": true,
+ "writable": true,
+ Symbol(kCapture): false,
+ },
+ },
"productIdentifier": "n8n-1.3.0",
- "saveCertStr": Any<Function>,
+ "saveCertStr": [Function saveCertStr],
"server": "https://server.com/v1",
- "tenantId": 1,
+ "tenantId": 1001,
},
Number of calls: 1
29 |
30 | test('initializes license manager', async () => {
> 31 | expect(LicenseManager).toHaveBeenCalledWith({
| ^
32 | autoRenewEnabled: true,
33 | autoRenewOffset: MOCK_RENEW_OFFSET,
34 | deviceFingerprint: expect.any(Function),
at Object.<anonymous> (test/unit/License.test.ts:31:26)
RUNS test/integration/license.api.test.ts
Test Suites: 1 failed, 1 of 2 total
Tests: 1 failed, 9 passed, 10 total
Snapshots: 0 total
Time: 2 s, estimated 4 s
████████████████████████████████████████^C ELIFECYCLE Command failed.
ELIFECYCLE Test failed. See above for more details.
```
</details>
|
||
|
|
e5620ab1e4 |
feat(API): Implement users account quota guards (#6434)
* feat(cli): Implement users account quota guards Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Remove comment Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Address PR comments - Getting `usersQuota` from `Settings` repo - Revert `isUserManagementEnabled` helper - Fix FE listing of users Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Refactor isWithinUserQuota getter and fix tests Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Revert testDb.ts changes Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Cleanup & improve types Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Fix duplicated method * Fix failing test * Remove `isUserManagementEnabled` completely Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Check for globalRole.name to determine if user is owner Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Fix unit tests Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Set isInstanceOwnerSetUp in specs * Fix SettingsUserView UM Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * refactor: License typings suggestions for users quota guards (#6636) refactor: License typings suggestions * Update packages/cli/src/Ldap/helpers.ts Co-authored-by: Iván Ovejero <ivov.src@gmail.com> * Update packages/cli/test/integration/shared/utils.ts Co-authored-by: Iván Ovejero <ivov.src@gmail.com> * Address PR comments Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Use 403 for all user quota related errors Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> --------- Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> Co-authored-by: Iván Ovejero <ivov.src@gmail.com> |
||
|
|
a3d26eff79 |
fix: Prevent invocations of 'GET /rest/license' from returning an error when ephemeral licenses are used (#6154)
* fix: Prevent error when invoking with an ephemeral license * add tests |
||
|
|
8b19fdd5f0 |
refactor: Delete a lot of unused and duplicate code in Server and WebhookServer (#5080)
* store n8n version string in a const and use that everywhere * reduce code duplication between Server and WebhookServer * unify redis checks * fix linting |
||
|
|
0a416eebea |
fix: Remove circular dependencies from cli tests (no-changelog) (#5000)
* fix typescript errors in cli * remove circular dependencies from cli tests |
||
|
|
0da338f9b5 |
feat(editor): Add usage and plan pages (#4819)
* feat(editor): Usage and plan page (#4793) feat(editor): usage and plan page * feat(editor): Update Usage and plan page (#4842) * feat(editor): usage and plan store * feat(editor): usage and plan page updates * feat(editor): usage and plan add buttons and alert * tes(editor): usage and plan store * tes(editor): usage remove refresh button and add link to view plans * tes(editor): usage use info tip * tes(editor): usage info style * feat(editor): Get quotas data (#4866) feat(editor): get quotas data * feat(editor): In-app experience (#4875) * feat: Add license quotas endpoint * feat: Add trigger count to workflow activation process * refactor: Get quotas from db * feat: Add license information * ✨ - finalised GET /license endpoint * 🔨 - getActiveTriggerCount return 0 instead of null * 🐛 - ignore manualTrigger when counting active triggers * ✨ - add activation endpoint * ✨ - added renew endpoint * 🔨 - added return type interfaces * 🔨 - handle license errors where methods are called * 🔨 - rename function to match name from lib * feat(editor): usage add plans buttons logic * 🚨 - testing new License methods * feat(editor): usage add more business logic * chore(editor): code formatting * 🚨 - added license api tests * fix(editor): usage store * fix(editor): usage update translations * feat(editor): usage add license activation modal * feat(editor): usage change subscription app url * feat(editor): usage add contact us link * feat(editor): usage fix modal width * ✨ - Add renewal tracking metric * ✨ - add license data to pulse event * 🔨 - set default triggercount on entity model * ✨ - add db migrations for mysql and postgres * fix(editor): Usage api call data processing and error handling * fix(editor): Usage fix activation query key * 🚨 - add initDb to telemetry tests * 🔨 - move getlicensedata to licenseservice * 🔨 - return 403 instead of 404 to non owners * 🔨 - move owner checking to middleware * 🐛 - fixed incorrectly returned error from middleware * 🐛 - using mock instead of test db for pulse tests * fix(editor): Usage fix activation and add success messages * fix(editor): Usage should not renew activation right after activation * 🚨 - skipping failing pulse tests for now * fix(editor): Usage add telemetry calls and apply design review outcomes * feat(editor): Hide usage page according to BE flag * feat(editor): Usage modify key activation flow * feat(editor): Usage change subscription app url * feat(editor): Usage add telemetry for manage plan * feat(editor): Usage extend link url query params * feat(editor): Usage add line chart if there is a workflow limit * feat(editor): Usage remove query after key activation redirection * fix(editor): Usage handle limit exceeded workflow chart, add focus to input when modal opened * fix(editor): Usage activation can return router promise when removing query * fix(editor): Usage and plan design review * 🐛 - fix renew endpoint hanging issue * 🐛 - fix license activation bug * fix(editor): Usage proper translation for plans and/or editions * fix(editor): Usage apply David's review results * fix(editor): Usage page set as default and first under Settings * fix(editor): Usage open subscription app in new tab * fix(editor): Usage page having key query param a plan links * test: Fix broken test * fix(editor): Usage page address review * 🧪 Flush promises on telemetry tests * ⚡ Extract helper with `setImmediate` * 🔥 Remove leftovers * ⚡ Use Adi's helper * refactor: Comment broken tests * refactor: add Tenant id to settings * feat: add environment to license endpoints * refactor: Move license environment to general settings * fix: fix routing bug * fix(editor): Usage page some code review changes and formatting * fix(editor): Usage page remove direct usage of reusable translation keys * fix(editor): Usage page async await instead of then * fix(editor): Usage page show some content only if network requests in component mounted were successful * chore(editor): code formatting * fix(editor): Usage checking license environment * feat(editor): Improve license activation error messages (no-changelog) (#4958) * fix(editor): Usage changing activation error title * remove unnecessary import * fix(editor): Usage refactor notification showing * fix(editor): Usage using notification directly in store actions Co-authored-by: Omar Ajoue <krynble@gmail.com> Co-authored-by: freyamade <freya@n8n.io> Co-authored-by: Iván Ovejero <ivov.src@gmail.com> Co-authored-by: Mutasem <mutdmour@gmail.com> Co-authored-by: Cornelius Suermann <cornelius@n8n.io> * fix(editor): Usage change mounted lifecycle logic * fix(editor): Usage return after successful activation in mounted * fix: remove console log * test: fix tests related to settings (#4979) Co-authored-by: Omar Ajoue <krynble@gmail.com> Co-authored-by: freyamade <freya@n8n.io> Co-authored-by: Iván Ovejero <ivov.src@gmail.com> Co-authored-by: Mutasem <mutdmour@gmail.com> Co-authored-by: Cornelius Suermann <cornelius@n8n.io> Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> |
||
|
|
30e5d3d04c |
feat(core): Add license support to n8n (#4566)
* add sdk * add license manager * type fix * add basic func * store to db * update default * activate license * add sharing flag * fix setup * clear license * update conosle log to info * refactor * use npm dependency * update error logs * add simple test * add license tests * update tests * update pnpm package * fix error handling types * Update packages/cli/src/config/schema.ts Co-authored-by: Cornelius Suermann <cornelius@n8n.io> * make feature enum * add warning * update sdk * Update packages/cli/src/config/schema.ts Co-authored-by: Cornelius Suermann <cornelius@n8n.io> Co-authored-by: Cornelius Suermann <cornelius@n8n.io> |