diff --git a/packages/adapter/src/lib/_Types.ts b/packages/adapter/src/lib/_Types.ts index a174d6ec9e..105c21916a 100644 --- a/packages/adapter/src/lib/_Types.ts +++ b/packages/adapter/src/lib/_Types.ts @@ -170,15 +170,17 @@ export interface InternalCalculatePermissionsOptions { } export type GetCertificatesCallback = ( - err: string | null, + err?: Error | null, certs?: ioBroker.Certificates, useLetsEncryptCert?: boolean ) => void; +export type GetCertificatesPromiseReturnType = [cert: ioBroker.Certificates, useLetsEncryptCert?: boolean]; + export interface InternalGetCertificatesOptions { - publicName: string; - privateName: string; - chainedName: string; + publicName?: string; + privateName?: string; + chainedName?: string; callback?: GetCertificatesCallback; } diff --git a/packages/adapter/src/lib/adapter/adapter.ts b/packages/adapter/src/lib/adapter/adapter.ts index 6272561651..ef88ad3995 100644 --- a/packages/adapter/src/lib/adapter/adapter.ts +++ b/packages/adapter/src/lib/adapter/adapter.ts @@ -104,7 +104,8 @@ import type { CheckStatesResult, Pattern, MessageCallbackObject, - SendToOptions + SendToOptions, + GetCertificatesPromiseReturnType } from '../_Types'; tools.ensureDNSOrder(); @@ -324,7 +325,11 @@ export interface AdapterClass { options?: unknown ): ioBroker.SetObjectPromise; // TODO: correct types - getCertificatesAsync(...args: any[]): Promise; + getCertificatesAsync( + publicName?: string, + privateName?: string, + chainedName?: string + ): Promise; /** Get all states, channels, devices and folders of this adapter */ getAdapterObjectsAsync(): Promise>; @@ -2259,89 +2264,117 @@ export class AdapterClass extends EventEmitter { * } * ``` */ - getCertificates(publicName: unknown, privateName: unknown, chainedName: unknown, callback: unknown): void { + getCertificates( + publicName: unknown, + privateName: unknown, + chainedName: unknown, + callback: unknown + ): Promise { if (!this.config) { throw new Error(tools.ERRORS.ERROR_NOT_READY); } if (typeof publicName === 'function') { callback = publicName; - publicName = null; + publicName = undefined; } if (typeof privateName === 'function') { callback = privateName; - privateName = null; + privateName = undefined; } if (typeof chainedName === 'function') { callback = chainedName; - chainedName = null; + chainedName = undefined; } publicName = publicName || this.config.certPublic; privateName = privateName || this.config.certPrivate; chainedName = chainedName || this.config.certChained; - Validator.assertString(publicName, 'publicName'); - Validator.assertString(privateName, 'privateName'); - Validator.assertString(chainedName, 'chainedName'); + if (publicName !== undefined) { + Validator.assertString(publicName, 'publicName'); + } + + if (privateName !== undefined) { + Validator.assertString(privateName, 'privateName'); + } + + if (chainedName !== undefined) { + Validator.assertString(chainedName, 'chainedName'); + } + Validator.assertOptionalCallback(callback, 'callback'); return this._getCertificates({ publicName, privateName, chainedName, callback }); } - private _getCertificates(options: InternalGetCertificatesOptions): void { - // Load certificates - this.getForeignObject('system.certificates', null, (err, obj) => { - if ( - err || - !obj || - !obj.native.certificates || - !options.publicName || - !options.privateName || - !obj.native.certificates[options.publicName] || - !obj.native.certificates[options.privateName] || - (options.chainedName && !obj.native.certificates[options.chainedName]) - ) { - this._logger.error( - `${this.namespaceLog} Cannot configure secure web server, because no certificates found: ${options.publicName}, ${options.privateName}, ${options.chainedName}` + private async _getCertificates( + options: InternalGetCertificatesOptions + ): Promise<[cert: ioBroker.Certificates, useLetsEncryptCert?: boolean] | void> { + const { publicName, chainedName, privateName, callback } = options; + let obj: ioBroker.OtherObject | undefined | null; + + if (!adapterObjects) { + this._logger.info( + `${this.namespaceLog} getCertificates not processed because Objects database not connected` + ); + return tools.maybeCallbackWithError(callback, tools.ERRORS.ERROR_DB_CLOSED); + } + + try { + // Load certificates + obj = await adapterObjects.getObject('system.certificates'); + } catch { + // ignore + } + + if ( + !obj || + !obj.native.certificates || + !publicName || + !privateName || + !obj.native.certificates[publicName] || + !obj.native.certificates[privateName] || + (chainedName && !obj.native.certificates[chainedName]) + ) { + this._logger.error( + `${this.namespaceLog} Cannot configure secure web server, because no certificates found: ${publicName}, ${privateName}, ${chainedName}` + ); + if (publicName === 'defaultPublic' || privateName === 'defaultPrivate') { + this._logger.info( + `${this.namespaceLog} Default certificates seem to be configured but missing. You can execute "iobroker cert create" in your shell to create these.` ); - if (options.publicName === 'defaultPublic' || options.privateName === 'defaultPrivate') { - this._logger.info( - `${this.namespaceLog} Default certificates seem to be configured but missing. You can execute "iobroker cert create" in your shell to create these.` - ); - } - // @ts-expect-error - return tools.maybeCallbackWithError(options.callback, tools.ERRORS.ERROR_NOT_FOUND); - } else { - let ca; - if (options.chainedName) { - const chained = this._readFileCertificate(obj.native.certificates[options.chainedName]).split( - '-----END CERTIFICATE-----\r\n' - ); - // it is still file name and the file maybe does not exist, but we can omit this error - if (chained.join('').length >= 512) { - ca = []; - for (const cert of chained) { - if (cert.replace(/(\r\n|\r|\n)/g, '').trim()) { - ca.push(`${cert}-----END CERTIFICATE-----\r\n`); - } + } + + return tools.maybeCallbackWithError(callback, tools.ERRORS.ERROR_NOT_FOUND); + } else { + let ca: string | undefined; + if (chainedName) { + const chained = this._readFileCertificate(obj.native.certificates[chainedName]).split( + '-----END CERTIFICATE-----\r\n' + ); + // it is still file name and the file maybe does not exist, but we can omit this error + if (chained.join('').length >= 512) { + const caArr = []; + for (const cert of chained) { + if (cert.replace(/(\r\n|\r|\n)/g, '').trim()) { + caArr.push(`${cert}-----END CERTIFICATE-----\r\n`); } - ca = ca.join(''); } + ca = caArr.join(''); } - - return tools.maybeCallbackWithError( - // @ts-expect-error - options.callback, - null, - { - key: this._readFileCertificate(obj.native.certificates[options.privateName]), - cert: this._readFileCertificate(obj.native.certificates[options.publicName]), - ca - }, - obj.native.letsEncrypt - ); } - }); + + return tools.maybeCallbackWithError( + callback, + null, + { + key: this._readFileCertificate(obj.native.certificates[privateName]), + cert: this._readFileCertificate(obj.native.certificates[publicName]), + ca + }, + obj.native.letsEncrypt + ); + } } /** diff --git a/packages/controller/test/lib/testAdapter.ts b/packages/controller/test/lib/testAdapter.ts index 45818e5d1a..b5675b7cd5 100644 --- a/packages/controller/test/lib/testAdapter.ts +++ b/packages/controller/test/lib/testAdapter.ts @@ -286,65 +286,6 @@ function testAdapter(options: Record): void { test.register(it, expect, context); } - // sendTo => controller => adapter - // sendToHost - cannot be tested - - // this test is 15 seconds long. Enable it only if ready to push - /* - it(`${options.name} ${context.adapterShortName} adapter: Check if uptime changes`, function (done) { - this.timeout(20_000); - - context.states.getState(`system.adapter.${context.adapterShortName}.0.uptime`, function (err, state1) { - expect(err).to.be.not.ok; - expect(state1).to.be.ok; - expect(state1.val).to.be.ok; - - setTimeout(function () { - context.states.getState( - `system.adapter.${context.adapterShortName}.0.uptime`, - function (err, state2) { - expect(err).to.be.not.ok; - expect(state2).to.be.ok; - expect(state2.val).to.be.ok; - if (state2.val !== state1.val) { - expect(state2.val).to.be.above(state1.val); - done(); - } else { - setTimeout(function () { - context.states.getState( - `system.adapter.${context.adapterShortName}.0.uptime`, - function (err, state2) { - expect(err).to.be.not.ok; - expect(state2).to.be.ok; - expect(state2.val).to.be.ok; - if (state2.val !== state1.val) { - expect(state2.val).to.be.above(state1.val); - done(); - } else { - setTimeout(function () { - context.states.getState( - `system.adapter.${context.adapterShortName}.0.uptime`, - function (err, state2) { - expect(err).to.be.not.ok; - expect(state2).to.be.ok; - expect(state2.val).to.be.ok; - expect(state2.val).to.be.above(state1.val); - done(); - } - ); - }, 6_000); - } - } - ); - }, 5_000); - } - } - ); - }, 5_000); - }); - }); - */ - after(`${options.name} ${context.adapterShortName} adapter: Stop js-controller`, async function () { this.timeout(35_000); diff --git a/packages/controller/test/lib/testAdapterHelpers.ts b/packages/controller/test/lib/testAdapterHelpers.ts index 0e63483462..2b4e14650d 100644 --- a/packages/controller/test/lib/testAdapterHelpers.ts +++ b/packages/controller/test/lib/testAdapterHelpers.ts @@ -92,12 +92,11 @@ export function register(it: Mocha.TestFunction, expect: Chai.ExpectStatic, cont done(); }); - //getCertificates - it(context.name + ' ' + context.adapterShortName + ' adapter: returns SSL certificates by name', function (done) { - this.timeout(3_000); - // TODO: sync - // TODO: async - done(); + // getCertificates + it(context.name + ' ' + context.adapterShortName + ' adapter: returns SSL certificates by name', async () => { + // has to work without chained certificate + const certs = await context.adapter.getCertificatesAsync('defaultPublic', 'defaultPrivate'); + expect(certs).to.be.ok; }); it(context.name + ' ' + context.adapterShortName + ' adapter: get the user id', async () => { diff --git a/packages/types-dev/index.d.ts b/packages/types-dev/index.d.ts index 45bc11ba10..bc31edb754 100644 --- a/packages/types-dev/index.d.ts +++ b/packages/types-dev/index.d.ts @@ -217,11 +217,11 @@ declare global { interface Certificates { /** private key file */ - key: string | Buffer; + key: string; /** public certificate */ - cert: string | Buffer; + cert: string; /** chained CA certificates */ - ca: Array; + ca?: string; } type MessagePayload = any; @@ -395,7 +395,7 @@ declare global { SecondParameterOf, null | undefined >; - /** Infers the return type from a callback-style API and and leaves null and undefined in */ + /** Infers the return type from a callback-style API and leaves null and undefined in */ type CallbackReturnTypeOf any> = SecondParameterOf; type GetStateCallback = (err?: Error | null, state?: State | null) => void; diff --git a/packages/types-dev/objects.d.ts b/packages/types-dev/objects.d.ts index a6b1f12a0f..6a7bf001b6 100644 --- a/packages/types-dev/objects.d.ts +++ b/packages/types-dev/objects.d.ts @@ -295,8 +295,8 @@ declare global { } interface MetaCommon extends ObjectCommon { - // Meta objects have two additional CommonTypes - type: CommonType | 'meta.user' | 'meta.folder'; + // Can be of type `user` for folders, where a user can store files or `folder` for adapter internal structures + type: 'meta.user' | 'meta.folder'; // Make it possible to narrow the object type using the custom property custom?: undefined; diff --git a/schemas/io-package.json b/schemas/io-package.json index 483a99cbff..7e23304b4d 100644 --- a/schemas/io-package.json +++ b/schemas/io-package.json @@ -238,511 +238,532 @@ "description": "License of the software", "type": "string", "enum": [ - "SCEA", - "RSA-MD", - "Leptonica", - "Ruby", - "Zlib", - "Unicode-DFS-2016", - "CC-BY-NC-ND-2.5", - "FSFULLRWD", - "QPL-1.0-INRIA-2004", - "BSD-3-Clause-No-Nuclear-Warranty", - "OSL-2.0", - "mpi-permissive", - "CUA-OPL-1.0", + "LPL-1.02", + "NTP", + "OFL-1.1", + "Bahyph", + "Hippocratic-2.1", + "VOSTROM", "CC-BY-3.0-AT", - "GFDL-1.3-only", - "OLDAP-2.2", - "NCSA", - "LPPL-1.3c", - "OpenPBS-2.3", - "LiLiQ-R-1.1", + "CC-BY-NC-SA-2.5", "W3C-20150513", - "OGDL-Taiwan-1.0", - "O-UDA-1.0", - "CDLA-Permissive-2.0", - "Graphics-Gems", - "PHP-3.01", - "CC-BY-3.0-DE", - "Cube", - "MTLL", - "MIT-0", - "WTFPL", - "EUDatagrid", - "RSCPL", - "Vim", - "gnuplot", - "diffmark", - "OFL-1.1-no-RFN", - "CDDL-1.1", - "SugarCRM-1.1.3", - "BSD-4.3TAHOE", - "OFFIS", - "OFL-1.1-RFN", - "Nokia", - "DSDP", - "AFL-3.0", - "CC-BY-NC-1.0", - "CECILL-C", - "OpenSSL", - "OLDAP-2.7", - "NGPL", - "Linux-man-pages-copyleft", - "OLDAP-2.5", - "CAL-1.0", - "CC-BY-SA-2.0-UK", - "TCP-wrappers", - "Dotseqn", + "LGPL-3.0-only", + "GFDL-1.1-only", + "CDL-1.0", + "CC-BY-ND-2.5", + "CC-BY-NC-SA-3.0-IGO", + "OGC-1.0", + "RPL-1.1", + "GPL-2.0-or-later", + "Sendmail", + "LGPL-2.0-only", "OSL-3.0", + "Libpng", + "MS-RL", + "MIT-CMU", "Linux-OpenIB", - "SMPPL", - "GFDL-1.3-no-invariants-or-later", - "Net-SNMP", - "LAL-1.3", - "HPND-Markus-Kuhn", - "FSFULLR", - "QPL-1.0", - "AFL-1.2", - "AFL-1.1", - "Apache-2.0", - "UPL-1.0", - "GLWTPL", - "RPL-1.5", - "OFL-1.0", - "LPL-1.02", - "OFL-1.1", - "Mup", - "Borceux", + "Latex2e-translated-notice", + "psutils", + "Clips", "CC-BY-NC-SA-2.0-FR", - "BSD-Attribution-HPND-disclaimer", - "OGL-UK-1.0", - "Parity-6.0.0", - "SPL-1.0", - "CECILL-2.0", - "TPDL", - "LOOP", - "BSD-Source-Code", - "MulanPSL-2.0", - "OLDAP-2.8", - "BSD-3-Clause-No-Nuclear-License-2014", - "FDK-AAC", - "GPL-1.0-or-later", - "Sendmail", - "CC-BY-ND-3.0-DE", - "Afmparse", - "MIT-feh", - "CC-BY-ND-2.0", - "SHL-0.5", - "MIT-CMU", - "Adobe-2006", - "EPL-2.0", - "ODbL-1.0", - "CERN-OHL-1.1", - "App-s2p", - "SWL", - "NASA-1.3", - "OLDAP-2.2.1", - "Libpng", - "checkmk", - "ZPL-1.1", - "Saxpath", - "xinetd", - "HP-1986", - "SSH-OpenSSH", - "CC-BY-NC-ND-3.0-DE", - "APAFML", - "PHP-3.0", - "GFDL-1.2-only", - "UCAR", - "ErlPL-1.1", - "LPPL-1.3a", - "CERN-OHL-S-2.0", - "MIT", - "CC-BY-SA-2.1-JP", - "BSD-4.3RENO", - "CMU-Mach", - "CC-BY-3.0-US", - "TOSL", - "Giftware", - "dvipdfm", - "GFDL-1.1-only", - "Crossword", - "NCGL-UK-2.0", - "NPL-1.0", + "EUDatagrid", + "CC-BY-ND-3.0", + "w3m", + "OLDAP-2.3", + "AGPL-3.0-only", + "AGPL-1.0-or-later", + "TMate", + "GFDL-1.3-invariants-only", "SchemeReport", + "NAIST-2003", + "BSD-4-Clause-Shortened", + "PDDL-1.0", + "XSkat", + "CC-BY-ND-4.0", + "BSD-3-Clause-LBNL", + "MIT-open-group", + "UnixCrypt", + "LiLiQ-P-1.1", + "Eurosym", + "JPNIC", + "NPL-1.1", "NLOD-2.0", - "Intel-ACPI", - "LGPL-2.0-or-later", - "SMLNJ", - "GFDL-1.2-or-later", - "Bitstream-Charter", - "Elastic-2.0", - "LGPL-3.0-or-later", - "ECL-1.0", - "Wsuipa", - "Sendmail-8.23", - "CC-BY-SA-4.0", + "NPL-1.0", + "CC-BY-SA-2.1-JP", + "LGPLLR", + "PHP-3.01", + "Ruby", + "CC-BY-2.0", + "QPL-1.0-INRIA-2004", + "Aladdin", "ODC-By-1.0", + "Intel-ACPI", "LGPL-2.1-or-later", - "etalab-2.0", - "Xerox", - "CC-BY-4.0", - "Zend-2.0", - "Zimbra-1.4", - "Qhull", - "curl", - "W3C", - "Hippocratic-2.1", - "CPL-1.0", - "BSD-2-Clause", - "Caldera", - "OPUBL-1.0", - "CC-BY-NC-SA-2.0-DE", - "CDL-1.0", - "MS-LPL", - "NAIST-2003", - "GFDL-1.1-invariants-or-later", - "GPL-2.0-only", - "BitTorrent-1.1", - "IPL-1.0", - "CECILL-1.1", - "CAL-1.0-Combined-Work-Exception", - "PDDL-1.0", - "ANTLR-PD", - "GPL-2.0-or-later", - "IJG", - "AGPL-1.0-only", - "Spencer-99", - "BSD-4-Clause-UC", - "CC0-1.0", - "MPL-2.0", - "LZMA-SDK-9.11-to-9.20", - "Sleepycat", - "CrystalStacker", "MPL-2.0-no-copyleft-exception", - "Unicode-TOU", - "FreeImage", - "AFL-2.1", - "NBPL-1.0", - "NLOD-1.0", + "Parity-6.0.0", + "Zlib", + "CC-BY-SA-1.0", + "CC-BY-SA-2.0-UK", "ADSL", - "SHL-0.51", - "Spencer-94", + "Net-SNMP", + "YPL-1.0", + "Baekmuk", + "BitTorrent-1.1", + "Arphic-1999", + "BSD-3-Clause-No-Nuclear-Warranty", + "MTLL", + "JPL-image", + "ZPL-2.0", + "TCP-wrappers", + "GPL-1.0-or-later", "PSF-2.0", - "OFL-1.0-no-RFN", - "IEC-Code-Components-EULA", - "Jam", + "Nokia", + "Entessa", + "AMPAS", "TU-Berlin-1.0", - "CC-BY-SA-3.0", - "APSL-1.2", - "CC-BY-SA-3.0-AT", - "ImageMagick", - "Newsletr", - "IPA", - "Unlicense", - "MIT-Modern-Variant", - "ECL-2.0", - "Barr", - "BitTorrent-1.0", + "Adobe-Glyph", + "DL-DE-BY-2.0", + "MPL-1.0", + "Dotseqn", + "IBM-pibs", + "Plexus", + "HP-1986", + "LPPL-1.1", + "OLDAP-1.2", + "ZPL-2.1", + "LPL-1.0", + "HPND-sell-variant-MIT-disclaimer", + "OFFIS", + "CrystalStacker", + "Adobe-2006", + "Zimbra-1.3", + "CUA-OPL-1.0", + "EUPL-1.1", + "IJG", + "Afmparse", + "PolyForm-Noncommercial-1.0.0", + "NCGL-UK-2.0", + "EPL-2.0", + "CC-BY-ND-1.0", + "CC-BY-ND-2.0", + "OFL-1.1-no-RFN", + "HPND-Markus-Kuhn", + "Xnet", + "CNRI-Python", + "Zimbra-1.4", + "SGI-B-1.0", + "MakeIndex", + "GFDL-1.1-no-invariants-only", + "TCL", + "BSD-Protection", + "Xdebug-1.03", + "CC-BY-2.5-AU", + "CECILL-C", + "BSD-4.3RENO", "Brian-Gladman-3-Clause", + "CC-BY-NC-SA-1.0", + "OGTSL", + "OLDAP-2.7", + "HaskellReport", + "RPL-1.5", + "Unlicense", + "XFree86-1.1", + "CC-BY-SA-3.0", + "OLDAP-2.2.2", + "CC-BY-3.0-IGO", + "snprintf", + "CC-BY-NC-2.0", + "dtoa", + "MITNFA", + "AML", + "Artistic-2.0", + "CECILL-2.0", + "App-s2p", "SSH-short", - "CC-BY-ND-4.0", + "AAL", "VSL-1.0", - "Info-ZIP", - "SGI-B-1.0", - "BSD-3-Clause-No-Military-License", - "ISC", - "FSFUL", - "OSET-PL-2.1", - "ClArtistic", - "NTP-0", - "NTP", - "AMPAS", - "LGPLLR", "AFL-2.0", - "CC-PDDC", - "Spencer-86", - "W3C-19980720", - "CC-BY-SA-2.5", - "ICU", - "JasPer-2.0", - "Bahyph", - "LPL-1.0", - "Glulxe", - "SISSL-1.2", - "ZPL-2.0", - "TPL-1.0", - "GFDL-1.1-invariants-only", + "OML", + "CC-BY-3.0-US", + "mplus", + "Qhull", + "FDK-AAC", + "BSD-4-Clause-UC", + "PolyForm-Small-Business-1.0.0", + "Sleepycat", + "OLDAP-2.2", + "Spencer-99", + "OGL-UK-1.0", + "EUPL-1.2", + "Linux-man-pages-copyleft-2-para", + "FreeBSD-DOC", + "RSCPL", + "eGenix", + "CC-BY-2.5", + "HPND", + "SCEA", + "GPL-3.0-only", + "Bitstream-Charter", + "LAL-1.2", + "APSL-1.0", + "Caldera", + "Xerox", + "SWL", + "MS-LPL", + "Cube", "APSL-2.0", - "EPICS", - "D-FSL-1.0", - "CERN-OHL-W-2.0", - "IBM-pibs", + "APAFML", + "Watcom-1.0", "SISSL", - "LiLiQ-Rplus-1.1", - "iMatix", - "OLDAP-2.4", - "BSD-3-Clause-No-Nuclear-License", - "Condor-1.1", - "BSL-1.0", - "Community-Spec-1.0", - "DRL-1.0", - "NRL", - "Xnet", - "Artistic-1.0-cl8", - "CC-BY-NC-SA-3.0-IGO", - "YPL-1.1", - "APL-1.0", - "Intel", - "XSkat", - "SNIA", - "NLPL", - "AAL", - "LGPL-3.0-only", - "CC-BY-ND-3.0", - "NIST-PD", - "w3m", - "CC-BY-SA-2.0", - "GFDL-1.2-invariants-or-later", - "JPL-image", - "EFL-2.0", - "CC-BY-NC-4.0", - "PolyForm-Noncommercial-1.0.0", - "Plexus", - "GFDL-1.3-invariants-or-later", - "HPND-sell-variant-MIT-disclaimer", - "X11", - "Arphic-1999", - "CC-BY-2.5-AU", - "APSL-1.1", - "GFDL-1.1-no-invariants-or-later", - "CERN-OHL-P-2.0", - "AGPL-3.0-or-later", - "bzip2-1.0.6", - "OSL-2.1", - "OCCT-PL", - "CPAL-1.0", - "CC-BY-NC-3.0-DE", - "OLDAP-2.0.1", - "NOSL", - "Python-2.0.1", - "Unicode-DFS-2015", - "TU-Berlin-2.0", - "Fair", - "CDLA-Permissive-1.0", - "libpng-2.0", + "CDDL-1.0", + "CC-BY-SA-3.0-AT", + "psfrag", "C-UDA-1.0", - "CC-BY-NC-2.0", - "GPL-3.0-only", - "RPL-1.1", + "MPL-1.1", + "CC-BY-3.0-NL", "GFDL-1.2-invariants-only", - "SGI-B-1.1", - "Frameworx-1.0", "BSD-3-Clause-Attribution", - "CC-BY-NC-SA-1.0", - "CNRI-Jython", - "SSPL-1.0", - "TTWL", - "MirOS", - "OGTSL", - "GL2PS", - "CC-BY-NC-SA-3.0", - "HPND-sell-variant", - "CC-BY-ND-2.5", - "JPNIC", - "CC-BY-2.5", - "Apache-1.1", - "Parity-7.0.0", - "OGC-1.0", - "CC-BY-NC-SA-3.0-DE", - "CERN-OHL-1.2", - "Entessa", - "GPL-3.0-or-later", - "FTL", - "PostgreSQL", - "CC-BY-3.0", - "CC-BY-NC-SA-2.5", - "OCLC-2.0", - "Knuth-CTAN", - "BSD-3-Clause-Open-MPI", - "CECILL-B", - "Abstyles", - "xpp", - "FSFAP", - "HaskellReport", - "X11-distribute-modifications-variant", - "BSD-2-Clause-Patent", - "NIST-PD-fallback", - "Bitstream-Vera", - "OGL-Canada-2.0", - "LAL-1.2", - "LGPL-2.1-only", - "CNRI-Python-GPL-Compatible", - "CC-BY-1.0", - "Zed", - "SunPro", - "TMate", + "CC-BY-NC-3.0-DE", + "GFDL-1.1-or-later", + "NCSA", + "BSD-1-Clause", "ANTLR-PD-fallback", + "BSD-3-Clause-Modification", "COIL-1.0", - "MIT-Wu", - "MITNFA", - "MIT-open-group", - "GFDL-1.1-or-later", - "AGPL-1.0-or-later", - "Latex2e", - "0BSD", - "BSD-Advertising-Acknowledgement", - "CC-BY-NC-ND-2.0", - "BSD-3-Clause-LBNL", - "MPL-1.1", - "libutil-David-Nugent", - "BUSL-1.1", - "LiLiQ-P-1.1", - "MPL-1.0", - "Clips", - "HPND-export-US", - "OLDAP-1.4", + "UPL-1.0", + "CC-BY-1.0", + "Leptonica", + "Frameworx-1.0", "OLDAP-1.1", - "DL-DE-BY-2.0", - "HTMLTIDY", - "GPL-1.0-only", - "EFL-1.0", - "OLDAP-2.1", - "libselinux-1.0", - "psutils", - "Symlinks", - "GFDL-1.2-no-invariants-or-later", - "OLDAP-2.2.2", - "CC-BY-NC-SA-4.0", - "Cornell-Lossless-JPEG", - "NICTA-1.0", - "zlib-acknowledgement", - "CNRI-Python", - "VOSTROM", - "Zimbra-1.3", - "OLDAP-2.0", - "eGenix", - "blessing", - "copyleft-next-0.3.0", - "Motosoto", - "CC-BY-SA-1.0", - "OPL-1.0", - "OLDAP-1.2", - "NPL-1.1", - "CC-BY-ND-1.0", - "ZPL-2.1", + "FTL", + "Artistic-1.0-cl8", + "CC-BY-NC-ND-3.0-IGO", + "CC-BY-SA-3.0-IGO", + "OGL-Canada-2.0", + "YPL-1.1", + "CC-BY-NC-3.0", + "AGPL-3.0-or-later", + "SSPL-1.0", + "IPL-1.0", + "TPL-1.0", + "Knuth-CTAN", + "MIT", + "Rdisc", + "Abstyles", + "CECILL-2.1", + "libtiff", + "ErlPL-1.1", + "Kazlib", + "RPSL-1.0", + "BSD-3-Clause-Clear", + "MIT-feh", + "GPL-1.0-only", + "MPL-2.0", + "LPPL-1.3c", + "CDLA-Permissive-1.0", + "Xfig", + "CC-PDDC", + "Inner-Net-2.0", + "ECL-1.0", + "SMLNJ", + "GFDL-1.2-only", + "ECL-2.0", + "Multics", + "CC-BY-NC-4.0", + "GFDL-1.3-no-invariants-only", + "OFL-1.0-RFN", + "OSL-2.1", + "CC-BY-SA-2.0", "CATOSL-1.1", - "Beerware", - "CFITSIO", - "Watcom-1.0", - "MS-PL", - "snprintf", - "Naumen", - "EUPL-1.2", + "ICU", + "BUSL-1.1", + "OPL-UK-3.0", + "copyleft-next-0.3.0", + "Symlinks", + "Crossword", "DOC", + "ISC", + "Apache-2.0", + "copyleft-next-0.3.1", + "ASWF-Digital-Assets-1.1", + "SISSL-1.2", + "Unicode-TOU", + "BSD-2-Clause", + "CDLA-Permissive-2.0", + "CC-BY-NC-SA-3.0", + "HPND-export-US", + "etalab-2.0", + "OSET-PL-2.1", + "GFDL-1.1-invariants-or-later", + "OpenSSL", + "ASWF-Digital-Assets-1.0", + "SGI-B-2.0", + "CC0-1.0", + "BSD-Attribution-HPND-disclaimer", + "mpich2", "Artistic-1.0", - "Imlib2", + "GFDL-1.3-only", + "OGDL-Taiwan-1.0", + "GFDL-1.2-no-invariants-or-later", + "LiLiQ-Rplus-1.1", + "ImageMagick", + "X11-distribute-modifications-variant", + "dvipdfm", + "MulanPSL-1.0", + "Unicode-DFS-2015", + "CC-BY-NC-1.0", + "LGPL-3.0-or-later", + "GD", + "mpi-permissive", + "OLDAP-2.6", + "Minpack", + "NGPL", + "diffmark", + "Latex2e", "OGL-UK-2.0", - "GFDL-1.3-no-invariants-only", - "PolyForm-Small-Business-1.0.0", - "GFDL-1.3-invariants-only", - "BlueOak-1.0.0", - "MIT-advertising", - "YPL-1.0", - "IJG-short", - "Adobe-Glyph", - "CC-BY-NC-ND-1.0", + "AFL-2.1", + "AFL-1.2", + "Python-2.0.1", + "CECILL-B", + "OCCT-PL", + "OSL-1.1", + "Spencer-86", + "xinetd", + "GFDL-1.2-invariants-or-later", + "Boehm-GC", + "Graphics-Gems", + "CAL-1.0-Combined-Work-Exception", + "CC-BY-3.0-DE", + "GLWTPL", + "NIST-PD-fallback", + "BSD-3-Clause", + "NetCDF", + "CC-BY-ND-3.0-DE", + "Parity-7.0.0", + "OLDAP-2.0.1", + "DRL-1.0", + "TU-Berlin-2.0", + "Borceux", + "OLDAP-1.3", + "Giftware", + "SGI-B-1.1", + "BSD-3-Clause-No-Nuclear-License", + "curl", + "OLDAP-1.4", + "SNIA", + "W3C", + "GFDL-1.3-or-later", + "D-FSL-1.0", + "CC-BY-NC-SA-4.0", + "Naumen", + "FSFAP", + "BSD-3-Clause-No-Military-License", + "CC-BY-SA-4.0", + "xlock", + "Sendmail-8.23", + "MS-PL", + "NIST-PD", + "Community-Spec-1.0", + "CERN-OHL-1.1", + "GFDL-1.2-or-later", + "LGPL-2.0-or-later", + "Condor-1.1", + "CDDL-1.1", "Glide", + "OFL-1.0-no-RFN", + "CMU-Mach", + "ODbL-1.0", + "LOOP", + "Motosoto", + "LGPL-2.1-only", + "NASA-1.3", + "EUPL-1.0", + "zlib-acknowledgement", + "SugarCRM-1.1.3", + "Widget-Workshop", + "Info-ZIP", + "BSD-Advertising-Acknowledgement", + "CC-BY-NC-ND-1.0", + "MIT-0", + "OCLC-2.0", + "OSL-1.0", + "Saxpath", + "IJG-short", + "Zend-2.0", + "Cornell-Lossless-JPEG", + "CECILL-1.0", + "OpenPBS-2.3", + "CC-BY-SA-2.5", + "DSDP", + "Martin-Birgmeier", + "CPOL-1.02", + "MIT-advertising", + "IPA", + "CC-BY-NC-ND-3.0-DE", + "CC-BY-SA-3.0-DE", "AMDPLPA", - "LZMA-SDK-9.22", - "CDDL-1.0", - "MS-RL", - "APSL-1.0", - "CC-BY-NC-SA-2.0", - "JSON", - "OLDAP-2.6", - "GFDL-1.3-or-later", - "SGI-B-2.0", - "mplus", - "CC-BY-NC-ND-3.0", - "XFree86-1.1", - "CC-BY-2.0", - "UCL-1.0", - "BSD-4-Clause", - "GD", - "CC-BY-NC-2.5", + "SimPL-2.0", "EPL-1.0", - "copyleft-next-0.3.1", - "CECILL-1.0", - "AML", - "BSD-Protection", + "AGPL-1.0-only", + "SAX-PD", + "GFDL-1.1-no-invariants-or-later", + "bzip2-1.0.6", + "FSFUL", + "Spencer-94", + "CFITSIO", + "AdaCore-doc", + "BSD-Source-Code", + "Noweb", + "SMPPL", + "Linux-man-pages-copyleft-var", + "Barr", + "OLDAP-2.1", + "TTWL", + "CNRI-Python-GPL-Compatible", + "OSL-2.0", + "GFDL-1.3-invariants-or-later", + "xpp", + "W3C-19980720", + "Linux-man-pages-1-para", + "APL-1.0", + "CPAL-1.0", + "ClArtistic", + "NIST-Software", + "UCL-1.0", + "OGL-UK-3.0", + "TORQUE-1.1", + "NOSL", + "LiLiQ-R-1.1", + "OFL-1.0", + "CC-BY-NC-SA-2.0", + "MIT-Wu", "RHeCos-1.1", - "RPSL-1.0", - "MakeIndex", - "LGPL-2.0-only", - "OSL-1.0", - "MIT-enna", - "Artistic-2.0", + "MIT-Festival", + "HPND-sell-variant", + "GPL-3.0-or-later", + "TOSL", "GFDL-1.2-no-invariants-only", - "Kazlib", - "CPOL-1.02", - "NetCDF", - "Aladdin", - "OML", - "MulanPSL-1.0", - "OFL-1.0-RFN", - "BSD-4-Clause-Shortened", - "LPPL-1.0", - "OLDAP-2.3", - "psfrag", - "GFDL-1.1-no-invariants-only", - "CC-BY-NC-ND-3.0-IGO", - "TCL", - "Rdisc", + "BlueOak-1.0.0", + "LPPL-1.2", + "iMatix", + "LZMA-SDK-9.11-to-9.20", + "TPDL", + "CC-BY-3.0", + "Apache-1.0", + "Fair", + "EFL-2.0", + "GPL-2.0-only", + "CERN-OHL-P-2.0", + "Wsuipa", + "SPL-1.0", + "BSD-3-Clause-No-Nuclear-License-2014", + "MirOS", + "blessing", + "Jam", + "OLDAP-2.4", + "ANTLR-PD", + "LZMA-SDK-9.22", + "PHP-3.0", + "OLDAP-2.2.1", + "CC-BY-NC-SA-2.0-DE", + "libpng-2.0", + "UCAR", + "gnuplot", + "CC-BY-NC-2.5", + "NRL", "Python-2.0", - "CC-BY-3.0-IGO", - "TORQUE-1.1", - "BSD-3-Clause", "CC-BY-NC-SA-2.0-UK", - "libtiff", - "EUPL-1.0", - "LPPL-1.2", - "AdaCore-doc", - "OSL-1.1", - "Multics", - "xlock", - "OLDAP-1.3", - "HPND", - "Baekmuk", - "AGPL-3.0-only", - "CDLA-Sharing-1.0", - "OGL-UK-3.0", - "Noweb", - "Eurosym", - "CC-BY-NC-3.0", - "CECILL-2.1", - "TAPR-OHL-1.0", - "CC-BY-SA-3.0-DE", - "CC-BY-3.0-NL", - "SAX-PD", - "FreeBSD-DOC", - "BSD-1-Clause", + "GL2PS", + "CC-BY-NC-ND-2.0", + "AFL-1.1", + "CC-BY-NC-ND-2.5", + "MIT-enna", "CC-BY-NC-ND-4.0", - "LPPL-1.1", - "Interbase-1.0", - "Martin-Birgmeier", - "BSD-3-Clause-Clear", - "SimPL-2.0", - "mpich2", - "Apache-1.0", - "EUPL-1.1", - "BSD-3-Clause-Modification", + "BSL-1.0", + "Linux-man-pages-copyleft", + "BSD-4-Clause", + "QPL-1.0", + "CERN-OHL-1.2", + "metamail", + "checkmk", + "NTP-0", + "Imlib2", + "CC-BY-NC-ND-3.0", + "APSL-1.2", + "Mup", + "SSH-OpenSSH", + "OLFL-1.3", + "BSD-3-Clause-Open-MPI", + "EFL-1.0", + "Intel", + "Beerware", + "CPL-1.0", + "TermReadKey", + "MulanPSL-2.0", + "CNRI-Jython", + "SHL-0.51", + "CERN-OHL-W-2.0", + "BSD-2-Clause-Patent", + "SunPro", + "TAPR-OHL-1.0", + "CERN-OHL-S-2.0", + "ZPL-1.1", + "CC-BY-4.0", + "BitTorrent-1.0", + "libselinux-1.0", + "AFL-3.0", + "X11", + "CC-BY-NC-SA-3.0-DE", + "Bitstream-Vera", + "RSA-MD", + "BSD-4.3TAHOE", + "EPICS", + "OPL-1.0", + "SHL-0.5", + "FSFULLRWD", + "WTFPL", + "OPUBL-1.0", + "LAL-1.3", + "LPPL-1.3a", + "NBPL-1.0", + "OFL-1.1-RFN", + "OLDAP-2.0", + "SGP4", + "GFDL-1.1-invariants-only", + "CECILL-1.1", + "GFDL-1.3-no-invariants-or-later", + "Apache-1.1", + "NLOD-1.0", + "Vim", + "PostgreSQL", + "FSFULLR", + "NLPL", + "Glulxe", + "libutil-David-Nugent", + "Zed", + "FreeImage", + "0BSD", + "CDLA-Sharing-1.0", + "APSL-1.1", + "JasPer-2.0", + "HTMLTIDY", + "Newsletr", + "OLDAP-2.8", + "LPPL-1.0", + "O-UDA-1.0", + "JSON", + "Unicode-DFS-2016", + "NICTA-1.0", + "IEC-Code-Components-EULA", + "Elastic-2.0", + "MIT-Modern-Variant", + "OLDAP-2.5", "Artistic-1.0-Perl", + "CAL-1.0", "BSD-2-Clause-Views", - "gSOAP-1.3b", - "Minpack", - "NPOSL-3.0" + "Interbase-1.0", + "NPOSL-3.0", + "gSOAP-1.3b" ] }, "type": {