pax_global_header00006660000000000000000000000064151722315020014510gustar00rootroot0000000000000052 comment=636373f598524d7b69096e9d07d604250caa01cd go-spdx-2.6.0/000077500000000000000000000000001517223150200130765ustar00rootroot00000000000000go-spdx-2.6.0/.github/000077500000000000000000000000001517223150200144365ustar00rootroot00000000000000go-spdx-2.6.0/.github/dependabot.yml000066400000000000000000000001551517223150200172670ustar00rootroot00000000000000--- version: 2 updates: - package-ecosystem: github-actions directory: "/" schedule: interval: daily go-spdx-2.6.0/.github/workflows/000077500000000000000000000000001517223150200164735ustar00rootroot00000000000000go-spdx-2.6.0/.github/workflows/fetch-licenses.yaml000066400000000000000000000112711517223150200222550ustar00rootroot00000000000000name: Fetch Licenses on: workflow_dispatch: inputs: force_run: description: 'Force run license extraction' required: false default: 'false' schedule: - cron: '5 4 * * *' # Runs at 0405 UTC (0605 CET, 0005 ET, 2105 PT) jobs: fetch-licenses: runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - name: Setup Git run: | git config --global user.name "GitHub Actions" git config --global user.email "github-actions[bot]@users.noreply.github.com" - name: Checkout this repository uses: actions/checkout@v6 - name: Checkout official SPDX Repository uses: actions/checkout@v6 with: repository: spdx/license-list-data path: official-spdx-licenses # creates a tmp dir to hold the SPDX licenses from the official repo - name: Copy Licenses run: | cp official-spdx-licenses/json/licenses.json cmd/licenses.json cp official-spdx-licenses/json/exceptions.json cmd/exceptions.json - name: Get date id: date run: echo "DT_STAMP"=$(date +'%Y-%m-%d %H:%M UTC') >> $GITHUB_ENV - name: Check for changes in SPDX json files id: src-changes run: | src_changed=true # --quiet: Exits with 1 if there are changes; otherwise, exits with 0 git diff --quiet -- cmd/licenses.json cmd/exceptions.json && src_changed=false if [ $src_changed != 'true' ]; then if [ ${{ github.event.inputs.force_run }} == 'true' ]; then echo -e '***************\nNo changes in spdx json, but skipping abort due to force run\n***************' else echo -e '***************\nABORTING: No changes to spdx json data\n***************' exit 0 fi fi echo "SRC_CHANGED=$src_changed" >> $GITHUB_ENV - name: Run license extraction if: ${{ env.SRC_CHANGED == 'true' || github.event.inputs.force_run == 'true' }} run: | cd cmd echo "Current branch: $(git branch)" go run . extract -l -e cd .. git log --oneline -n 5 - name: Check for changes in generated files id: genfiles-changes run: | genfiles_changed=true # --quiet: Exits with 1 if there are changes; otherwise, exits with 0 git diff --quiet -- spdxexp/spdxlicenses/*.go && genfiles_changed=false if [ $genfiles_changed != 'true' ]; then if [ ${{ github.event.inputs.force_run }} == 'true' ]; then echo -e '***************\nNo changes to generated files, but skipping abort due to force run\n***************' else # This happens when the generated files are already up to date # or the only changes in the source json are data not included in the generated files (e.g. IDs) echo -e '***************\nABORTING: No changes to license data in generated files\n***************' exit 0 fi fi echo "GENFILES_CHANGED=$genfiles_changed" >> $GITHUB_ENV - name: Create Pull Request if: ${{ env.GENFILES_CHANGED == 'true' || github.event.inputs.force_run == 'true' }} uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: Add updated license files branch: auto-update-licenses base: main title: "Update SPDX license files (${{ env.DT_STAMP }})" body: "The files in this PR are auto-generated by the [fetch-licenses](./.git/workflows/fetch-license.yaml) workflow when it runs the `extract` command defined in [cmd/main.go](./cmd/main.go). It updates SPDX licenses based on the latest released set in the [spdx/license-list-data](https://github.com/spdx/license-list-data) repository maintained by [SPDX](https://spdx.org/licenses/). \n\nTODO: [spdxexp/spdxlicenses/license_ranges.go](./spdxexp/spdxlicenses/license_range.go) has to be updated manually." labels: 'auto-update,licenses' go-spdx-2.6.0/.github/workflows/lint.yaml000066400000000000000000000007611517223150200203310ustar00rootroot00000000000000name: "Lint" on: push: branches: [main] pull_request: {} permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-go@v6 with: go-version: "1.24.7" - name: golangci-lint uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 with: version: v2.11.4 args: --verbose --config .golangci.yaml skip-cache: true go-spdx-2.6.0/.github/workflows/test.yaml000066400000000000000000000007441517223150200203430ustar00rootroot00000000000000name: "Build and test" on: push: branches: [main] pull_request: {} workflow_dispatch: # Sometimes tests get stuck in PRs; This allows them to be rerun manually permissions: contents: read jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-go@v6 with: go-version: "1.24.7" - name: Build program run: go build ./... - name: Run tests run: go test -race ./... go-spdx-2.6.0/.gitignore000066400000000000000000000005251517223150200150700ustar00rootroot00000000000000# Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Dependency directories (remove the comment below to include it) # vendor/ # Ignore path setup by fetch-licenses workflow official-spdx-licenses/ go-spdx-2.6.0/.golangci.yaml000066400000000000000000000012101517223150200156150ustar00rootroot00000000000000# prerequisite: # [install golangci-lint](https://golangci-lint.run/usage/install/#local-installation) version: "2" linters: enable: - errcheck - gocritic - gocyclo - gosec - govet - ineffassign - misspell - nakedret - revive - staticcheck - unconvert - unused disable: - gochecknoglobals # we allow global variables in packages - gochecknoinits # we allow inits in packages - goconst # we allow repeated values to go un-const'd - lll # we allow any line length - unparam # we allow function calls to name unused parameters formatters: enable: - gofmt - goimports go-spdx-2.6.0/CODE_OF_CONDUCT.md000066400000000000000000000062341517223150200157020ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at opensource@github.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/go-spdx-2.6.0/CONTRIBUTING.md000066400000000000000000000043541517223150200153350ustar00rootroot00000000000000## Contributing [fork]: https://github.com/github/go-spdx [pr]: https://github.com/github/go-spdx/compare [style]: https://github.com/github/go-spdx/blob/main/.golangci.yaml [code-of-conduct]: CODE_OF_CONDUCT.md Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [MIT License](LICENSE.md). Please note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms. ## Prerequisites for running and testing code These are one time installations required to be able to test your changes locally as part of the pull request (PR) submission process. 1. install Go [through download](https://go.dev/doc/install) | [through Homebrew](https://formulae.brew.sh/formula/go) 1. [install golangci-lint](https://golangci-lint.run/usage/install/#local-installation) ## Submitting a pull request 1. [Fork][fork] and clone the repository 1. Configure and install the dependencies: `script/bootstrap` 1. Make sure the tests pass on your machine: `go test -v ./...` 1. Make sure linter passes on your machine: `golangci-lint run` 1. Create a new branch: `git checkout -b my-branch-name` 1. Make your change, add tests, and make sure the tests and linter still pass 1. Push to your fork and [submit a pull request][pr] 1. Pat your self on the back and wait for your pull request to be reviewed and merged. Here are a few things you can do that will increase the likelihood of your pull request being accepted: - Follow the [style guide][style]. - Write tests. - Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. - Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). ## Resources - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) - [GitHub Help](https://help.github.com) go-spdx-2.6.0/LICENSE000066400000000000000000000020471517223150200141060ustar00rootroot00000000000000MIT License Copyright (c) 2022 GitHub Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. go-spdx-2.6.0/Makefile000066400000000000000000000042571517223150200145460ustar00rootroot00000000000000# Go projects should have a Makefile for commond build-related tasks. # See help target for a list of targets and their descriptions. # # Debug related targets are commented out until they can be tested. # setup defaults SHELL := $(shell which bash) CWD_DIR := $(shell pwd) GITHUB_API_URL ?= https://api.github.com # DLV_BIN := $(shell go env GOPATH)/bin/dlv LINT_FILES := ./... # provide extra information when format fails define goformat files="$$(go fmt ./...)"; \ if [ -n "$${files}" ]; then \ echo "❌ ERROR: go files are not properly formatted:"; \ echo "$$files"; \ echo ""; \ echo "run the 'go fmt ./..' command or configure your editor"; \ exit 1; \ fi; endef # # install dlv if it is not already installed # define dlv # cat /proc/sys/kernel/yama/ptrace_scope | grep 0 || \ # echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope; \ # echo "Checking if '$(DLV_BIN)' exist"; \ # test -f "$(DLV_BIN)" || \ # echo "Installing dlv..." && \ # go install github.com/go-delve/delve/cmd/dlv@latest && \ # echo "Installed dlv"; # endef # NOTE: Targets defined with .PHONY are not files, they execute commands. # clean up the go modules files .PHONY: tidy tidy: @echo "==> starting tidy" go mod tidy # go format this project .PHONY: format format: @echo "==> starting format" @$(call goformat) # run some go test .PHONY: test test: @echo "==> starting test" go test ./... # runs linter for all files .PHONY: lint-all lint-all: @echo "==> starting lint for directory: ${LINT_FILES}" golangci-lint run ${LINT_FILES} # runs linter for only files with diffs from origin/main (useful for PRs) .PHONY: lint lint: @echo "==> starting lint for changed files" golangci-lint run --whole-files --new-from-rev=origin/main .PHONY: help help: @echo "Usage: make " @echo "" @echo "Targets:" @echo " tidy - clean up the go modules files" @echo " format - go format this project" @echo " test - run some go test" @echo " lint-all - runs linter for all files (optional pass in LINT_FILES=path_to_dir_or_file_to_check)" @echo " lint - runs linter for only files with diffs from origin/main (useful for PRs)" @echo " help - this help message" go-spdx-2.6.0/README.md000066400000000000000000000171351517223150200143640ustar00rootroot00000000000000[![Go Reference](https://pkg.go.dev/badge/github.com/github/go-spdx/v2@v2.6.0/spdxexp.svg)](https://pkg.go.dev/github.com/github/go-spdx/v2@v2.6.0/spdxexp) spdxexp
[![Go Reference](https://pkg.go.dev/badge/github.com/github/go-spdx/v2@v2.6.0/spdxexp/spdxlicenses.svg)](https://pkg.go.dev/github.com/github/go-spdx/v2@v2.6.0/spdxexp/spdxlicenses) spdxlicenses # go-spdx Golang implementation of a checker for determining if a set of SPDX IDs satisfies an SPDX Expression. ## Installation There are several ways to include a go package. To download and install, you can use `go get`. The command for that is: ```sh go get github.com/github/go-spdx@latest ``` ## Packages - [spdxexp](https://pkg.go.dev/github.com/github/go-spdx/spdxexp) - Expression package validates licenses and determines if a license expression is satisfied by a list of licenses. Validity of a license is determined by the SPDX license list. ## CLI: spdx-validate `spdx-validate` is a command-line tool that validates SPDX license expressions. ### Building ```sh go build -o spdx-validate ./cmd/spdx-validate/ ``` ### Usage **Validate expressions on stdin:** Stdin is read as a stream of newline-separated expressions: ```sh echo "MIT" | ./spdx-validate printf "MIT\nApache-2.0\nBSD-3-Clause\n" | ./spdx-validate ``` Exits with code 0 if all expressions are valid, or code 1 (with error messages on stderr) if any are invalid. ```sh $ printf "MIT\nBOGUS\nApache-2.0\n" | ./spdx-validate line 2: invalid SPDX expression: "BOGUS" 1 of 3 expressions failed validation ``` **Validate from a file with `-f`/`--file`:** ```sh ./spdx-validate -f licenses.txt ``` The file should contain one SPDX expression per line. Blank lines are skipped. ```sh $ cat licenses.txt MIT NOT-A-LICENSE Apache-2.0 $ ./spdx-validate -f licenses.txt line 2: invalid SPDX expression: "NOT-A-LICENSE" 1 of 3 expressions failed validation ``` ## Public API _NOTE: The public API is initially limited to the Satisfies and ValidateLicenses functions. If there is interest in the output of the parser or license checking being public, please submit an issue for consideration._ ### Function: Satisfies ```go Satisfies(testExpression string, allowedList []string, options *Options) ``` **Parameter: testExpression** testExpression is an [SPDX expression](https://spdx.github.io/spdx-spec/v2.3/SPDX-license-expressions/#d1-overview) describing the licensing terms of source code or a binary file. Example expressions that can be used for testExpression: ```go "MIT" "MIT AND Apache-2.0" "MIT OR Apache-2.0" "MIT AND (Apache-1.0 OR Apache-2.0)" "Apache-1.0+" "DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2" "GPL-2.0 WITH Bison-exception-2.2" ``` _See satisfies_test.go for more example expressions._ **Parameter: allowedList** allowedList is an array of single licenses describing what licenses can be used to satisfy the testExpression. Example allowedList: ```go []string{"MIT"} []string{"MIT", "Apache-2.0"} []string{"MIT", "Apache-2.0", "ISC", "GPL-2.0"} []string{"MIT", "Apache-1.0+"} []string{"GPL-2.0-or-later"} ``` **N.B.** If at least one of expressions from `allowedList` is not a valid SPDX expression, the call to `Satisfies` will produce an error. Use [`ValidateLicenses`](###-ValidateLicenses) function to first check if all of the expressions from `allowedList` are valid. #### Examples: Satisfies returns true [Go Playground for Satisfies](https://go.dev/play/p/Ul8H15hyEpQ) ```go Satisfies("MIT", []string{"MIT"}) Satisfies("MIT", []string{"MIT", "Apache-2.0"}) Satisfies("Apache-2.0", []string{"Apache-1.0+"}) Satisfies("MIT OR Apache-2.0", []string{"Apache-2.0"}) Satisfies("MIT OR Apache-2.0", []string{"MIT", "Apache-2.0"}) Satisfies("MIT AND Apache-2.0", []string{"MIT", "Apache-2.0"}) Satisfies("MIT AND Apache-2.0", []string{"MIT", "Apache-2.0", "GPL-2.0"}) ``` #### Examples: Satisfies returns false ```go Satisfies("MIT", []string{"Apache-2.0"}) Satisfies("Apache-1.0", []string{"Apache-2.0+"}) Satisfies("MIT AND Apache-2.0", []string{"MIT"}) ``` ### ValidateLicenses ```go func ValidateLicenses(licenses []string) (bool, []string) ``` Function `ValidateLicenses` is used to determine if any of the provided license expressions is invalid. **parameter: licenses** Licenses is a slice of strings which must be validated as SPDX expressions. **returns** Function `ValidateLicenses` has 2 return values. First is `bool` which equals `true` if all of the provided licenses provided are valid, and `false` otherwise. The second parameter is a slice of all invalid licenses which were provided. #### Examples: ValidateLicenses returns no invalid licenses ```go valid, invalidLicenses := ValidateLicenses([]string{"Apache-2.0"}) assert.True(valid) assert.Empty(invalidLicenses) ``` #### Examples: ValidateLicenses returns invalid licenses ```go valid, invalidLicenses := ValidateLicenses([]string{"NON-EXISTENT-LICENSE", "MIT"}) assert.False(valid) assert.Contains(invalidLicenses, "NON-EXISTENT-LICENSE") assert.NotContains(invalidLicenses, "MIT") ``` #### Examples: ValidateLicenses works with SPDX expressions ```go valid, invalidLicenses := ValidateLicenses([]string{"MIT AND APACHE-2.0"}) assert.True(valid) assert.NotContains(invalidLicenses, "MIT AND APACHE-2.0") ``` ### ExtractLicenses ```go func ExtractLicenses(expression string) ([]string, error) ``` Function `ExtractLicenses` is used to extract licenses from the given expression without duplicates. **parameter: expression** `expression` is an SPDX expression string. **returns** Function `ExtractLicenses` has 2 return values. First is `[]string` which contains all of the SPDX licenses without duplicates. The second return value is an `error` which is not `nil` if the given expression is not a valid SPDX expression. #### Example ```go licenses, err := ExtractLicenses("(MIT AND APACHE-2.0) OR (APACHE-2.0)") assert.Equal(licenses, []string{"MIT", "Apache-2.0"}) ``` ## Background This package was developed to support testing whether a repository's license requirements are met by an allowed-list of licenses. Dependencies are defined in [go.mod](./go.mod). Contributions and requests are welcome. Refer to the [Contributing](#contributing) section for more information including how to set up a test environment and install dependencies. ## License This project is licensed under the terms of the MIT open source license. Please refer to [MIT](./LICENSE.md) for the full terms. ## Maintainers - @elrayle - @dangoor ## Support You can expect the following support: - bug fixes - review of feature request issues - review of questions in discussions ## Contributing Contributions in the form of bug identification Issues, bug fix PRs, and feature requests are welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for more information on how to get involved and set up a testing environment. _NOTE: The list of valid licenses is maintained manually. If you notice a missing license, an excellent way to contribute to the long term viability of this package is to open an Issue or PR addressing the missing license._ ## Acknowledgement The process for parsing and evaluating expressions is a translation from JavaScript to Go based heavily on the JavaScript implementation defined across several repositories. - [spdx-satisfies.js](https://github.com/clearlydefined/spdx-satisfies.js) - [spdx-expression-parse.js](https://github.com/clearlydefined/spdx-expression-parse.js) - [spdx-ranges](https://github.com/jslicense/spdx-ranges.js) - [spdx-compare](https://github.com/jslicense/spdx-compare.js) - [spdx-license-ids](https://github.com/jslicense/spdx-license-ids) - [spdx-exceptions](https://github.com/jslicense/spdx-exceptions.json) go-spdx-2.6.0/SECURITY.md000066400000000000000000000032701517223150200146710ustar00rootroot00000000000000Thanks for helping make GitHub safe for everyone. ## Security GitHub takes the security of our software products and services seriously, including all of the open source code repositories managed through our GitHub organizations, such as [GitHub](https://github.com/GitHub). Even though [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) and therefore not eligible for bounty rewards, we will ensure that your finding gets passed along to the appropriate maintainers for remediation. ## Reporting Security Issues If you believe you have found a security vulnerability in any GitHub-owned repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please send an email to opensource-security[@]github.com. Please include as much of the information listed below as you can to help us better understand and resolve the issue: - The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) - Full paths of source file(s) related to the manifestation of the issue - The location of the affected source code (tag/branch/commit or direct URL) - Any special configuration required to reproduce the issue - Step-by-step instructions to reproduce the issue - Proof-of-concept or exploit code (if possible) - Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Policy See [GitHub's Safe Harbor Policy](https://docs.github.com/en/github/site-policy/github-bug-bounty-program-legal-safe-harbor#1-safe-harbor-terms) go-spdx-2.6.0/SUPPORT.md000066400000000000000000000020421517223150200145720ustar00rootroot00000000000000# Support ## How to file issues and get help This project uses GitHub [issues](https://github.com/github/go-spdx/issues) to track bugs and feature requests. Please search the existing issues before filing new issues to avoid duplicates. If not found, file your bug or feaure request as a new issue. For help or questions about using this project, please see the project [Discussions](https://github.com/github/go-spdx/discussions) where you can ask a question in [Q&A](https://github.com/github/go-spdx/discussions/categories/q-a), propose an idea in [Ideas](https://github.com/github/go-spdx/discussions/categories/ideas), or share your work in [Show and Tell](https://github.com/github/go-spdx/discussions/categories/show-and-tell). The go-spdx package is under active development and maintained by GitHub staff. Community [contributions](./CONTRIBUTING.md) are always welcome. We will do our best to respond to issues, feature requests, and community questions in a timely manner. Support for this project is limited to the resources listed above. go-spdx-2.6.0/cmd/000077500000000000000000000000001517223150200136415ustar00rootroot00000000000000go-spdx-2.6.0/cmd/deprecated_license_ids.json000066400000000000000000000010041517223150200211700ustar00rootroot00000000000000["AGPL-1.0","AGPL-3.0","BSD-2-Clause-FreeBSD","BSD-2-Clause-NetBSD","bzip2-1.0.5","eCos-2.0","GFDL-1.1","GFDL-1.2","GFDL-1.3","GPL-1.0","GPL-1.0+","GPL-2.0","GPL-2.0+","GPL-2.0-with-autoconf-exception","GPL-2.0-with-bison-exception","GPL-2.0-with-classpath-exception","GPL-2.0-with-font-exception","GPL-2.0-with-GCC-exception","GPL-3.0","GPL-3.0+","GPL-3.0-with-autoconf-exception","GPL-3.0-with-GCC-exception","LGPL-2.0","LGPL-2.0+","LGPL-2.1","LGPL-2.1+","LGPL-3.0","LGPL-3.0+","Nunit","StandardML-NJ","wxWindows"]go-spdx-2.6.0/cmd/deprecated_license_ids.txt000066400000000000000000000011401517223150200210370ustar00rootroot00000000000000 "AGPL-1.0", "AGPL-3.0", "BSD-2-Clause-FreeBSD", "BSD-2-Clause-NetBSD", "bzip2-1.0.5", "eCos-2.0", "GFDL-1.1", "GFDL-1.2", "GFDL-1.3", "GPL-1.0", "GPL-1.0+", "GPL-2.0", "GPL-2.0+", "GPL-2.0-with-autoconf-exception", "GPL-2.0-with-bison-exception", "GPL-2.0-with-classpath-exception", "GPL-2.0-with-font-exception", "GPL-2.0-with-GCC-exception", "GPL-3.0", "GPL-3.0+", "GPL-3.0-with-autoconf-exception", "GPL-3.0-with-GCC-exception", "LGPL-2.0", "LGPL-2.0+", "LGPL-2.1", "LGPL-2.1+", "LGPL-3.0", "LGPL-3.0+", "Nunit", "StandardML-NJ", "wxWindows", go-spdx-2.6.0/cmd/doc.go000066400000000000000000000014371517223150200147420ustar00rootroot00000000000000/* Extracts license, deprecation, and exception ids from the official spdx license list data. The source data needs to be manually updated by copying the licenses.json file from https://github.com/spdx/license-list-data/blob/main/json/licenses.json and exceptions.json file from https://github.com/spdx/license-list-data/blob/main/json/exceptions.json. After running the extract command, the license_ids.json, deprecated_ids.json, and exception_ids.json files will be overwritten with the extracted ids. These license ids can then be used to update the spdxexp/license.go file. Command to run all extractions (run command from the /cmd directory): cd cmd go run . extract -l -e Usage options: -h: prints this help message -l: Extract license ids -e: Extract exception ids */ package main go-spdx-2.6.0/cmd/exception_ids.json000066400000000000000000000020021517223150200173630ustar00rootroot00000000000000["389-exception","Autoconf-exception-2.0","Autoconf-exception-3.0","Bison-exception-2.2","Bootloader-exception","Classpath-exception-2.0","CLISP-exception-2.0","DigiRule-FOSS-exception","eCos-exception-2.0","Fawkes-Runtime-exception","FLTK-exception","Font-exception-2.0","freertos-exception-2.0","GCC-exception-2.0","GCC-exception-3.1","gnu-javamail-exception","GPL-3.0-linking-exception","GPL-3.0-linking-source-exception","GPL-CC-1.0","GStreamer-exception-2005","GStreamer-exception-2008","i2p-gpl-java-exception","KiCad-libraries-exception","LGPL-3.0-linking-exception","Libtool-exception","Linux-syscall-note","LLVM-exception","LZMA-exception","mif-exception","OCaml-LGPL-linking-exception","OCCT-exception-1.0","OpenJDK-assembly-exception-1.0","openvpn-openssl-exception","PS-or-PDF-font-exception-20170817","Qt-GPL-exception-1.0","Qt-LGPL-exception-1.1","Qwt-exception-1.0","SHL-2.0","SHL-2.1","Swift-exception","u-boot-exception-2.0","Universal-FOSS-exception-1.0","WxWindows-exception-3.1","x11vnc-openssl-exception"]go-spdx-2.6.0/cmd/exception_ids.txt000066400000000000000000000022051517223150200172360ustar00rootroot00000000000000 "389-exception", "Autoconf-exception-2.0", "Autoconf-exception-3.0", "Bison-exception-2.2", "Bootloader-exception", "Classpath-exception-2.0", "CLISP-exception-2.0", "DigiRule-FOSS-exception", "eCos-exception-2.0", "Fawkes-Runtime-exception", "FLTK-exception", "Font-exception-2.0", "freertos-exception-2.0", "GCC-exception-2.0", "GCC-exception-3.1", "gnu-javamail-exception", "GPL-3.0-linking-exception", "GPL-3.0-linking-source-exception", "GPL-CC-1.0", "GStreamer-exception-2005", "GStreamer-exception-2008", "i2p-gpl-java-exception", "KiCad-libraries-exception", "LGPL-3.0-linking-exception", "Libtool-exception", "Linux-syscall-note", "LLVM-exception", "LZMA-exception", "mif-exception", "OCaml-LGPL-linking-exception", "OCCT-exception-1.0", "OpenJDK-assembly-exception-1.0", "openvpn-openssl-exception", "PS-or-PDF-font-exception-20170817", "Qt-GPL-exception-1.0", "Qt-LGPL-exception-1.1", "Qwt-exception-1.0", "SHL-2.0", "SHL-2.1", "Swift-exception", "u-boot-exception-2.0", "Universal-FOSS-exception-1.0", "WxWindows-exception-3.1", "x11vnc-openssl-exception", go-spdx-2.6.0/cmd/exceptions.go000066400000000000000000000064601517223150200163570ustar00rootroot00000000000000package main import ( "encoding/json" "fmt" "go/format" "os" "strings" ) type ExceptionData struct { Version string `json:"licenseListVersion"` Exceptions []Exception `json:"exceptions"` } type Exception struct { Reference string `json:"reference"` IsDeprecated bool `json:"isDeprecatedLicenseId"` DetailsURL string `json:"detailsUrl"` ReferenceNumber int `json:"referenceNumber"` Name string `json:"name"` LicenseID string `json:"licenseExceptionId"` SeeAlso []string `json:"seeAlso"` IsOsiApproved bool `json:"isOsiApproved"` } // extractExceptionLicenseIDs read official exception licenses file copied from spdx/license-list-data // and write file exception_license_ids.json containing just the non-deprecated exception license IDs. // NOTE: For now, this function ignores the deprecated exception licenses. func extractExceptionLicenseIDs() error { // open file file, err := os.Open("exceptions.json") if err != nil { fmt.Println(err) return err } // read in all licenses marshalled into a slice of exception structs var exceptionData ExceptionData err = json.NewDecoder(file).Decode(&exceptionData) if err != nil { return err } // create slice of exception license IDs that are not deprecated var exceptionLicenseIDs []string for _, e := range exceptionData.Exceptions { if !e.IsDeprecated { exceptionLicenseIDs = append(exceptionLicenseIDs, e.LicenseID) } } // generate the GetExceptions() function in get_exceptions.go getExceptionsContents := []byte(`package spdxlicenses // Code generated by go-spdx cmd/exceptions.go. DO NOT EDIT. // Source: https://github.com/spdx/license-list-data specifies official SPDX license list. import "strings" // IsException does a case-insensitive lookup for the exception id in the exceptions map. // It returns true and the case-sensitive ID if found, otherwise false and the original id. func IsException(id string) (bool, string) { foundID, ok := exceptionsMap[strings.ToUpper(id)] if ok { return true, foundID } return false, id } // GetExceptionsMap returns a map of exception license IDs keyed by uppercase ID. func GetExceptionsMap() map[string]string { copied := make(map[string]string, len(exceptionsMap)) for k, v := range exceptionsMap { copied[k] = v } return copied } // GetExceptions returns a slice of exception license IDs. func GetExceptions() []string { return []string{ `) for _, id := range exceptionLicenseIDs { getExceptionsContents = append(getExceptionsContents, ` "`+id+`", `...) } getExceptionsContents = append(getExceptionsContents, ` } } `...) getExceptionsContents = append(getExceptionsContents, `var exceptionsMap = map[string]string{ `...) for _, id := range exceptionLicenseIDs { getExceptionsContents = append(getExceptionsContents, ` "`+strings.ToUpper(id)+`": "`+id+`", `...) } getExceptionsContents = append(getExceptionsContents, `} `...) getExceptionsContents, err = format.Source(getExceptionsContents) if err != nil { return fmt.Errorf("format generated get_exceptions.go: %w", err) } err = os.WriteFile("../spdxexp/spdxlicenses/get_exceptions.go", getExceptionsContents, 0600) if err != nil { return err } fmt.Println("Writing `../spdxexp/spdxlicenses/get_exceptions.go`... COMPLETE") return nil } go-spdx-2.6.0/cmd/exceptions.json000066400000000000000000001170461517223150200167260ustar00rootroot00000000000000{ "licenseListVersion": "1ff5448", "exceptions": [ { "reference": "https://spdx.org/licenses/389-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/389-exception.json", "referenceNumber": 42, "name": "389 Directory Server Exception", "licenseExceptionId": "389-exception", "seeAlso": [ "http://directory.fedoraproject.org/wiki/GPL_Exception_License_Text", "https://web.archive.org/web/20080828121337/http://directory.fedoraproject.org/wiki/GPL_Exception_License_Text" ] }, { "reference": "https://spdx.org/licenses/Asterisk-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Asterisk-exception.json", "referenceNumber": 9, "name": "Asterisk exception", "licenseExceptionId": "Asterisk-exception", "seeAlso": [ "https://github.com/asterisk/libpri/blob/7f91151e6bd10957c746c031c1f4a030e8146e9a/pri.c#L22", "https://github.com/asterisk/libss7/blob/03e81bcd0d28ff25d4c77c78351ddadc82ff5c3f/ss7.c#L24" ] }, { "reference": "https://spdx.org/licenses/Asterisk-linking-protocols-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Asterisk-linking-protocols-exception.json", "referenceNumber": 2, "name": "Asterisk linking protocols exception", "licenseExceptionId": "Asterisk-linking-protocols-exception", "seeAlso": [ "https://github.com/asterisk/asterisk/blob/115d7c01e32ccf4566a99e9d74e2b88830985a0b/LICENSE#L27" ] }, { "reference": "https://spdx.org/licenses/Autoconf-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Autoconf-exception-2.0.json", "referenceNumber": 58, "name": "Autoconf exception 2.0", "licenseExceptionId": "Autoconf-exception-2.0", "seeAlso": [ "http://ac-archive.sourceforge.net/doc/copyright.html", "http://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.gz" ] }, { "reference": "https://spdx.org/licenses/Autoconf-exception-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Autoconf-exception-3.0.json", "referenceNumber": 66, "name": "Autoconf exception 3.0", "licenseExceptionId": "Autoconf-exception-3.0", "seeAlso": [ "http://www.gnu.org/licenses/autoconf-exception-3.0.html" ] }, { "reference": "https://spdx.org/licenses/Autoconf-exception-generic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Autoconf-exception-generic.json", "referenceNumber": 43, "name": "Autoconf generic exception", "licenseExceptionId": "Autoconf-exception-generic", "seeAlso": [ "https://launchpad.net/ubuntu/precise/+source/xmltooling/+copyright", "https://tracker.debian.org/media/packages/s/sipwitch/copyright-1.9.15-3", "https://opensource.apple.com/source/launchd/launchd-258.1/launchd/compile.auto.html", "https://git.savannah.gnu.org/gitweb/?p\u003dgnulib.git;a\u003dblob;f\u003dgnulib-tool;h\u003d029a8cf377ad8d8f2d9e54061bf2f20496ad2eef;hb\u003d73c74ba0197e6566da6882c87b1adee63e24d75c#l407" ] }, { "reference": "https://spdx.org/licenses/Autoconf-exception-generic-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Autoconf-exception-generic-3.0.json", "referenceNumber": 18, "name": "Autoconf generic exception for GPL-3.0", "licenseExceptionId": "Autoconf-exception-generic-3.0", "seeAlso": [ "https://src.fedoraproject.org/rpms/redhat-rpm-config/blob/rawhide/f/config.guess" ] }, { "reference": "https://spdx.org/licenses/Autoconf-exception-macro.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Autoconf-exception-macro.json", "referenceNumber": 75, "name": "Autoconf macro exception", "licenseExceptionId": "Autoconf-exception-macro", "seeAlso": [ "https://github.com/freedesktop/xorg-macros/blob/39f07f7db58ebbf3dcb64a2bf9098ed5cf3d1223/xorg-macros.m4.in", "https://www.gnu.org/software/autoconf-archive/ax_pthread.html", "https://launchpad.net/ubuntu/precise/+source/xmltooling/+copyright" ] }, { "reference": "https://spdx.org/licenses/Bison-exception-1.24.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bison-exception-1.24.json", "referenceNumber": 35, "name": "Bison exception 1.24", "licenseExceptionId": "Bison-exception-1.24", "seeAlso": [ "https://github.com/arineng/rwhoisd/blob/master/rwhoisd/mkdb/y.tab.c#L180" ] }, { "reference": "https://spdx.org/licenses/Bison-exception-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bison-exception-2.2.json", "referenceNumber": 53, "name": "Bison exception 2.2", "licenseExceptionId": "Bison-exception-2.2", "seeAlso": [ "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" ] }, { "reference": "https://spdx.org/licenses/Bootloader-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bootloader-exception.json", "referenceNumber": 5, "name": "Bootloader Distribution Exception", "licenseExceptionId": "Bootloader-exception", "seeAlso": [ "https://github.com/pyinstaller/pyinstaller/blob/develop/COPYING.txt" ] }, { "reference": "https://spdx.org/licenses/CGAL-linking-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CGAL-linking-exception.json", "referenceNumber": 79, "name": "CGAL Linking Exception", "licenseExceptionId": "CGAL-linking-exception", "seeAlso": [ "https://github.com/openscad/openscad/blob/openscad-2021.01/COPYING#L3", "https://github.com/floriankirsch/OpenCSG/blob/opencsg-1-4-2-release/license.txt#L3" ] }, { "reference": "https://spdx.org/licenses/Classpath-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Classpath-exception-2.0.json", "referenceNumber": 20, "name": "Classpath exception 2.0", "licenseExceptionId": "Classpath-exception-2.0", "seeAlso": [ "http://www.gnu.org/software/classpath/license.html", "https://fedoraproject.org/wiki/Licensing/GPL_Classpath_Exception" ] }, { "reference": "https://spdx.org/licenses/Classpath-exception-2.0-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Classpath-exception-2.0-short.json", "referenceNumber": 21, "name": "Classpath exception 2.0 - short", "licenseExceptionId": "Classpath-exception-2.0-short", "seeAlso": [ "https://sourceforge.net/projects/lazarus/files/Lazarus%20Zip%20_%20GZip/Lazarus%204.2/lazarus-4.2-0.tar.gz/download" ] }, { "reference": "https://spdx.org/licenses/CLISP-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CLISP-exception-2.0.json", "referenceNumber": 11, "name": "CLISP exception 2.0", "licenseExceptionId": "CLISP-exception-2.0", "seeAlso": [ "http://sourceforge.net/p/clisp/clisp/ci/default/tree/COPYRIGHT" ] }, { "reference": "https://spdx.org/licenses/cryptsetup-OpenSSL-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/cryptsetup-OpenSSL-exception.json", "referenceNumber": 61, "name": "cryptsetup OpenSSL exception", "licenseExceptionId": "cryptsetup-OpenSSL-exception", "seeAlso": [ "https://gitlab.com/cryptsetup/cryptsetup/-/blob/main/COPYING", "https://gitlab.nic.cz/datovka/datovka/-/blob/develop/COPYING", "https://github.com/nbs-system/naxsi/blob/951123ad456bdf5ac94e8d8819342fe3d49bc002/naxsi_src/naxsi_raw.c", "http://web.mit.edu/jgross/arch/amd64_deb60/bin/mosh", "https://sourceforge.net/p/linux-ima/ima-evm-utils/ci/master/tree/src/evmctl.c#l30", "https://github.com/ocaml-omake/omake/blob/master/LICENSE.OMake#L20" ] }, { "reference": "https://spdx.org/licenses/Digia-Qt-LGPL-exception-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Digia-Qt-LGPL-exception-1.1.json", "referenceNumber": 73, "name": "Digia Qt LGPL Exception version 1.1", "licenseExceptionId": "Digia-Qt-LGPL-exception-1.1", "seeAlso": [ "https://src.fedoraproject.org/rpms/qtlockedfile/blob/rawhide/f/LGPL_EXCEPTION" ] }, { "reference": "https://spdx.org/licenses/DigiRule-FOSS-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DigiRule-FOSS-exception.json", "referenceNumber": 67, "name": "DigiRule FOSS License Exception", "licenseExceptionId": "DigiRule-FOSS-exception", "seeAlso": [ "http://www.digirulesolutions.com/drupal/foss" ] }, { "reference": "https://spdx.org/licenses/eCos-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eCos-exception-2.0.json", "referenceNumber": 26, "name": "eCos exception 2.0", "licenseExceptionId": "eCos-exception-2.0", "seeAlso": [ "http://ecos.sourceware.org/license-overview.html" ] }, { "reference": "https://spdx.org/licenses/erlang-otp-linking-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/erlang-otp-linking-exception.json", "referenceNumber": 51, "name": "Erlang/OTP Linking Exception", "licenseExceptionId": "erlang-otp-linking-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs", "https://erlang.org/pipermail/erlang-questions/2012-May/066355.html", "https://gitea.osmocom.org/erlang/osmo_ss7/src/commit/2286c1b8738d715950026650bf53f19a69d6ed0e/src/ss7_links.erl#L20" ] }, { "reference": "https://spdx.org/licenses/Fawkes-Runtime-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fawkes-Runtime-exception.json", "referenceNumber": 63, "name": "Fawkes Runtime Exception", "licenseExceptionId": "Fawkes-Runtime-exception", "seeAlso": [ "http://www.fawkesrobotics.org/about/license/" ] }, { "reference": "https://spdx.org/licenses/FLTK-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FLTK-exception.json", "referenceNumber": 3, "name": "FLTK exception", "licenseExceptionId": "FLTK-exception", "seeAlso": [ "http://www.fltk.org/COPYING.php" ] }, { "reference": "https://spdx.org/licenses/fmt-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/fmt-exception.json", "referenceNumber": 49, "name": "fmt exception", "licenseExceptionId": "fmt-exception", "seeAlso": [ "https://github.com/fmtlib/fmt/blob/master/LICENSE", "https://github.com/fmtlib/fmt/blob/2eb363297b24cd71a68ccfb20ff755430f17e60f/LICENSE#L22C1-L27C62" ] }, { "reference": "https://spdx.org/licenses/Font-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Font-exception-2.0.json", "referenceNumber": 36, "name": "Font exception 2.0", "licenseExceptionId": "Font-exception-2.0", "seeAlso": [ "http://www.gnu.org/licenses/gpl-faq.html#FontException" ] }, { "reference": "https://spdx.org/licenses/freertos-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/freertos-exception-2.0.json", "referenceNumber": 69, "name": "FreeRTOS Exception 2.0", "licenseExceptionId": "freertos-exception-2.0", "seeAlso": [ "https://web.archive.org/web/20060809182744/http://www.freertos.org/a00114.html" ] }, { "reference": "https://spdx.org/licenses/GCC-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GCC-exception-2.0.json", "referenceNumber": 82, "name": "GCC Runtime Library exception 2.0", "licenseExceptionId": "GCC-exception-2.0", "seeAlso": [ "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10", "https://sourceware.org/git/?p\u003dglibc.git;a\u003dblob;f\u003dcsu/abi-note.c;h\u003dc2ec208e94fbe91f63d3c375bd254b884695d190;hb\u003dHEAD" ] }, { "reference": "https://spdx.org/licenses/GCC-exception-2.0-note.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GCC-exception-2.0-note.json", "referenceNumber": 70, "name": "GCC Runtime Library exception 2.0 - note variant", "licenseExceptionId": "GCC-exception-2.0-note", "seeAlso": [ "https://sourceware.org/git/?p\u003dglibc.git;a\u003dblob;f\u003dsysdeps/x86_64/start.S" ] }, { "reference": "https://spdx.org/licenses/GCC-exception-3.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GCC-exception-3.1.json", "referenceNumber": 56, "name": "GCC Runtime Library exception 3.1", "licenseExceptionId": "GCC-exception-3.1", "seeAlso": [ "http://www.gnu.org/licenses/gcc-exception-3.1.html" ] }, { "reference": "https://spdx.org/licenses/Gmsh-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Gmsh-exception.json", "referenceNumber": 30, "name": "Gmsh exception", "licenseExceptionId": "Gmsh-exception", "seeAlso": [ "https://gitlab.onelab.info/gmsh/gmsh/-/raw/master/LICENSE.txt" ] }, { "reference": "https://spdx.org/licenses/GNAT-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GNAT-exception.json", "referenceNumber": 77, "name": "GNAT exception", "licenseExceptionId": "GNAT-exception", "seeAlso": [ "https://github.com/AdaCore/florist/blob/master/libsrc/posix-configurable_file_limits.adb" ] }, { "reference": "https://spdx.org/licenses/GNOME-examples-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GNOME-examples-exception.json", "referenceNumber": 71, "name": "GNOME examples exception", "licenseExceptionId": "GNOME-examples-exception", "seeAlso": [ "https://gitlab.gnome.org/Archive/gnome-devel-docs/-/blob/master/platform-demos/C/legal.xml?ref_type\u003dheads", "http://meldmerge.org/help/" ] }, { "reference": "https://spdx.org/licenses/GNU-compiler-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GNU-compiler-exception.json", "referenceNumber": 27, "name": "GNU Compiler Exception", "licenseExceptionId": "GNU-compiler-exception", "seeAlso": [ "https://sourceware.org/git?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dlibiberty/unlink-if-ordinary.c;h\u003de49f2f2f67bfdb10d6b2bd579b0e01cad0fd708e;hb\u003dHEAD#l19", "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/powerpc/lib/crtsavres.S?h\u003dv6.16-rc6#n34" ] }, { "reference": "https://spdx.org/licenses/gnu-javamail-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnu-javamail-exception.json", "referenceNumber": 16, "name": "GNU JavaMail exception", "licenseExceptionId": "gnu-javamail-exception", "seeAlso": [ "http://www.gnu.org/software/classpathx/javamail/javamail.html" ] }, { "reference": "https://spdx.org/licenses/GPL-3.0-389-ds-base-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-389-ds-base-exception.json", "referenceNumber": 44, "name": "GPL-3.0 389 DS Base Exception", "licenseExceptionId": "GPL-3.0-389-ds-base-exception", "seeAlso": [] }, { "reference": "https://spdx.org/licenses/GPL-3.0-interface-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-interface-exception.json", "referenceNumber": 64, "name": "GPL-3.0 Interface Exception", "licenseExceptionId": "GPL-3.0-interface-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#LinkingOverControlledInterface" ] }, { "reference": "https://spdx.org/licenses/GPL-3.0-linking-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-linking-exception.json", "referenceNumber": 33, "name": "GPL-3.0 Linking Exception", "licenseExceptionId": "GPL-3.0-linking-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs" ] }, { "reference": "https://spdx.org/licenses/GPL-3.0-linking-source-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-linking-source-exception.json", "referenceNumber": 45, "name": "GPL-3.0 Linking Exception (with Corresponding Source)", "licenseExceptionId": "GPL-3.0-linking-source-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs", "https://github.com/mirror/wget/blob/master/src/http.c#L20" ] }, { "reference": "https://spdx.org/licenses/GPL-CC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-CC-1.0.json", "referenceNumber": 55, "name": "GPL Cooperation Commitment 1.0", "licenseExceptionId": "GPL-CC-1.0", "seeAlso": [ "https://github.com/gplcc/gplcc/blob/master/Project/COMMITMENT", "https://gplcc.github.io/gplcc/Project/README-PROJECT.html" ] }, { "reference": "https://spdx.org/licenses/GStreamer-exception-2005.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GStreamer-exception-2005.json", "referenceNumber": 19, "name": "GStreamer Exception (2005)", "licenseExceptionId": "GStreamer-exception-2005", "seeAlso": [ "https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/licensing.html?gi-language\u003dc#licensing-of-applications-using-gstreamer" ] }, { "reference": "https://spdx.org/licenses/GStreamer-exception-2008.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GStreamer-exception-2008.json", "referenceNumber": 72, "name": "GStreamer Exception (2008)", "licenseExceptionId": "GStreamer-exception-2008", "seeAlso": [ "https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/licensing.html?gi-language\u003dc#licensing-of-applications-using-gstreamer" ] }, { "reference": "https://spdx.org/licenses/harbour-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/harbour-exception.json", "referenceNumber": 78, "name": "harbour exception", "licenseExceptionId": "harbour-exception", "seeAlso": [ "https://github.com/harbour/core/blob/master/LICENSE.txt#L44-L66" ] }, { "reference": "https://spdx.org/licenses/i2p-gpl-java-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/i2p-gpl-java-exception.json", "referenceNumber": 4, "name": "i2p GPL+Java Exception", "licenseExceptionId": "i2p-gpl-java-exception", "seeAlso": [ "http://geti2p.net/en/get-involved/develop/licenses#java_exception" ] }, { "reference": "https://spdx.org/licenses/Independent-modules-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Independent-modules-exception.json", "referenceNumber": 60, "name": "Independent Module Linking exception", "licenseExceptionId": "Independent-modules-exception", "seeAlso": [ "https://gitlab.com/freepascal.org/fpc/source/-/blob/release_3_2_2/rtl/COPYING.FPC" ] }, { "reference": "https://spdx.org/licenses/KiCad-libraries-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/KiCad-libraries-exception.json", "referenceNumber": 29, "name": "KiCad Libraries Exception", "licenseExceptionId": "KiCad-libraries-exception", "seeAlso": [ "https://www.kicad.org/libraries/license/" ] }, { "reference": "https://spdx.org/licenses/kvirc-openssl-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/kvirc-openssl-exception.json", "referenceNumber": 1, "name": "kvirc OpenSSL Exception", "licenseExceptionId": "kvirc-openssl-exception", "seeAlso": [ "https://github.com/kvirc/KVIrc/blob/ba18690abb4f5ce77bb10164ee0835cc150f4a2a/doc/ABOUT-LICENSE#L34" ] }, { "reference": "https://spdx.org/licenses/LGPL-3.0-linking-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-linking-exception.json", "referenceNumber": 34, "name": "LGPL-3.0 Linking Exception", "licenseExceptionId": "LGPL-3.0-linking-exception", "seeAlso": [ "https://raw.githubusercontent.com/go-xmlpath/xmlpath/v2/LICENSE", "https://github.com/goamz/goamz/blob/master/LICENSE", "https://github.com/juju/errors/blob/master/LICENSE" ] }, { "reference": "https://spdx.org/licenses/libpri-OpenH323-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpri-OpenH323-exception.json", "referenceNumber": 52, "name": "libpri OpenH323 exception", "licenseExceptionId": "libpri-OpenH323-exception", "seeAlso": [ "https://github.com/asterisk/libpri/blob/1.6.0/README#L19-L22" ] }, { "reference": "https://spdx.org/licenses/Libtool-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libtool-exception.json", "referenceNumber": 76, "name": "Libtool Exception", "licenseExceptionId": "Libtool-exception", "seeAlso": [ "http://git.savannah.gnu.org/cgit/libtool.git/tree/m4/libtool.m4", "https://git.savannah.gnu.org/cgit/libtool.git/tree/libltdl/lt__alloc.c#n15" ] }, { "reference": "https://spdx.org/licenses/Linux-syscall-note.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-syscall-note.json", "referenceNumber": 59, "name": "Linux Syscall Note", "licenseExceptionId": "Linux-syscall-note", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/COPYING" ] }, { "reference": "https://spdx.org/licenses/LLGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LLGPL.json", "referenceNumber": 39, "name": "LLGPL Preamble", "licenseExceptionId": "LLGPL", "seeAlso": [ "http://opensource.franz.com/preamble.html" ] }, { "reference": "https://spdx.org/licenses/LLVM-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LLVM-exception.json", "referenceNumber": 65, "name": "LLVM Exception", "licenseExceptionId": "LLVM-exception", "seeAlso": [ "http://llvm.org/foundation/relicensing/LICENSE.txt", "https://web.archive.org/web/20240423023852/https://foundation.llvm.org/relicensing/LICENSE.txt" ] }, { "reference": "https://spdx.org/licenses/LZMA-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-exception.json", "referenceNumber": 10, "name": "LZMA exception", "licenseExceptionId": "LZMA-exception", "seeAlso": [ "http://nsis.sourceforge.net/Docs/AppendixI.html#I.6" ] }, { "reference": "https://spdx.org/licenses/mif-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mif-exception.json", "referenceNumber": 14, "name": "Macros and Inline Functions Exception", "licenseExceptionId": "mif-exception", "seeAlso": [ "http://www.scs.stanford.edu/histar/src/lib/cppsup/exception", "http://dev.bertos.org/doxygen/", "https://www.threadingbuildingblocks.org/licensing" ] }, { "reference": "https://spdx.org/licenses/mxml-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mxml-exception.json", "referenceNumber": 57, "name": "mxml Exception", "licenseExceptionId": "mxml-exception", "seeAlso": [ "https://github.com/michaelrsweet/mxml/blob/master/NOTICE", "https://github.com/michaelrsweet/mxml/blob/master/LICENSE" ] }, { "reference": "https://spdx.org/licenses/Nokia-Qt-exception-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nokia-Qt-exception-1.1.json", "referenceNumber": 41, "name": "Nokia Qt LGPL exception 1.1", "licenseExceptionId": "Nokia-Qt-exception-1.1", "seeAlso": [ "https://www.keepassx.org/dev/projects/keepassx/repository/revisions/b8dfb9cc4d5133e0f09cd7533d15a4f1c19a40f2/entry/LICENSE.NOKIA-LGPL-EXCEPTION" ] }, { "reference": "https://spdx.org/licenses/OCaml-LGPL-linking-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCaml-LGPL-linking-exception.json", "referenceNumber": 8, "name": "OCaml LGPL Linking Exception", "licenseExceptionId": "OCaml-LGPL-linking-exception", "seeAlso": [ "https://caml.inria.fr/ocaml/license.en.html" ] }, { "reference": "https://spdx.org/licenses/OCCT-exception-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-exception-1.0.json", "referenceNumber": 22, "name": "Open CASCADE Exception 1.0", "licenseExceptionId": "OCCT-exception-1.0", "seeAlso": [ "http://www.opencascade.com/content/licensing" ] }, { "reference": "https://spdx.org/licenses/OpenJDK-assembly-exception-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenJDK-assembly-exception-1.0.json", "referenceNumber": 15, "name": "OpenJDK Assembly exception 1.0", "licenseExceptionId": "OpenJDK-assembly-exception-1.0", "seeAlso": [ "http://openjdk.java.net/legal/assembly-exception.html" ] }, { "reference": "https://spdx.org/licenses/openvpn-openssl-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/openvpn-openssl-exception.json", "referenceNumber": 24, "name": "OpenVPN OpenSSL Exception", "licenseExceptionId": "openvpn-openssl-exception", "seeAlso": [ "http://openvpn.net/index.php/license.html", "https://github.com/psycopg/psycopg2/blob/2_9_3/LICENSE#L14" ] }, { "reference": "https://spdx.org/licenses/PCRE2-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PCRE2-exception.json", "referenceNumber": 68, "name": "PCRE2 exception", "licenseExceptionId": "PCRE2-exception", "seeAlso": [ "https://www.pcre.org/licence.txt" ] }, { "reference": "https://spdx.org/licenses/polyparse-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/polyparse-exception.json", "referenceNumber": 54, "name": "Polyparse Exception", "licenseExceptionId": "polyparse-exception", "seeAlso": [ "https://hackage.haskell.org/package/polyparse-1.13/src/COPYRIGHT" ] }, { "reference": "https://spdx.org/licenses/PS-or-PDF-font-exception-20170817.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PS-or-PDF-font-exception-20170817.json", "referenceNumber": 31, "name": "PS/PDF font exception (2017-08-17)", "licenseExceptionId": "PS-or-PDF-font-exception-20170817", "seeAlso": [ "https://github.com/ArtifexSoftware/urw-base35-fonts/blob/65962e27febc3883a17e651cdb23e783668c996f/LICENSE" ] }, { "reference": "https://spdx.org/licenses/QPL-1.0-INRIA-2004-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0-INRIA-2004-exception.json", "referenceNumber": 6, "name": "INRIA QPL 1.0 2004 variant exception", "licenseExceptionId": "QPL-1.0-INRIA-2004-exception", "seeAlso": [ "https://git.frama-c.com/pub/frama-c/-/blob/master/licenses/Q_MODIFIED_LICENSE", "https://github.com/maranget/hevea/blob/master/LICENSE" ] }, { "reference": "https://spdx.org/licenses/Qt-GPL-exception-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qt-GPL-exception-1.0.json", "referenceNumber": 23, "name": "Qt GPL exception 1.0", "licenseExceptionId": "Qt-GPL-exception-1.0", "seeAlso": [ "http://code.qt.io/cgit/qt/qtbase.git/tree/LICENSE.GPL3-EXCEPT" ] }, { "reference": "https://spdx.org/licenses/Qt-LGPL-exception-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qt-LGPL-exception-1.1.json", "referenceNumber": 48, "name": "Qt LGPL exception 1.1", "licenseExceptionId": "Qt-LGPL-exception-1.1", "seeAlso": [ "http://code.qt.io/cgit/qt/qtbase.git/tree/LGPL_EXCEPTION.txt" ] }, { "reference": "https://spdx.org/licenses/Qwt-exception-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qwt-exception-1.0.json", "referenceNumber": 17, "name": "Qwt exception 1.0", "licenseExceptionId": "Qwt-exception-1.0", "seeAlso": [ "http://qwt.sourceforge.net/qwtlicense.html" ] }, { "reference": "https://spdx.org/licenses/romic-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/romic-exception.json", "referenceNumber": 62, "name": "Romic Exception", "licenseExceptionId": "romic-exception", "seeAlso": [ "https://web.archive.org/web/20210124015834/http://mo.morsi.org/blog/2009/08/13/lesser_affero_gplv3/", "https://sourceforge.net/p/romic/code/ci/3ab2856180cf0d8b007609af53154cf092efc58f/tree/COPYING", "https://github.com/moll/node-mitm/blob/bbf24b8bd7596dc6e091e625363161ce91984fc7/LICENSE#L8-L11", "https://github.com/zenbones/SmallMind/blob/3c62b5995fe7f27c453f140ff9b60560a0893f2a/COPYRIGHT#L25-L30", "https://github.com/CubeArtisan/cubeartisan/blob/2c6ab53455237b88a3ea07be02a838a135c4ab79/LICENSE.LESSER#L10-L15", "https://github.com/savearray2/py.js/blob/b781273c08c8afa89f4954de4ecf42ec01429bae/README.md#license" ] }, { "reference": "https://spdx.org/licenses/RRDtool-FLOSS-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RRDtool-FLOSS-exception-2.0.json", "referenceNumber": 40, "name": "RRDtool FLOSS exception 2.0", "licenseExceptionId": "RRDtool-FLOSS-exception-2.0", "seeAlso": [ "https://github.com/oetiker/rrdtool-1.x/blob/master/COPYRIGHT#L25-L90", "https://oss.oetiker.ch/rrdtool/license.en.html" ] }, { "reference": "https://spdx.org/licenses/rsync-linking-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/rsync-linking-exception.json", "referenceNumber": 28, "name": "rsync Linking Exception", "licenseExceptionId": "rsync-linking-exception", "seeAlso": [ "https://github.com/RsyncProject/rsync/blob/master/COPYING" ] }, { "reference": "https://spdx.org/licenses/SANE-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SANE-exception.json", "referenceNumber": 47, "name": "SANE Exception", "licenseExceptionId": "SANE-exception", "seeAlso": [ "https://github.com/alexpevzner/sane-airscan/blob/master/LICENSE", "https://gitlab.com/sane-project/backends/-/blob/master/sanei/sanei_pp.c?ref_type\u003dheads", "https://gitlab.com/sane-project/frontends/-/blob/master/sanei/sanei_codec_ascii.c?ref_type\u003dheads" ] }, { "reference": "https://spdx.org/licenses/SHL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-2.0.json", "referenceNumber": 37, "name": "Solderpad Hardware License v2.0", "licenseExceptionId": "SHL-2.0", "seeAlso": [ "https://solderpad.org/licenses/SHL-2.0/" ] }, { "reference": "https://spdx.org/licenses/SHL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-2.1.json", "referenceNumber": 12, "name": "Solderpad Hardware License v2.1", "licenseExceptionId": "SHL-2.1", "seeAlso": [ "https://solderpad.org/licenses/SHL-2.1/" ] }, { "reference": "https://spdx.org/licenses/Simple-Library-Usage-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Simple-Library-Usage-exception.json", "referenceNumber": 38, "name": "Simple Library Usage Exception", "licenseExceptionId": "Simple-Library-Usage-exception", "seeAlso": [ "https://sourceforge.net/p/teem/code/HEAD/tree/teem/trunk/LICENSE.txt" ] }, { "reference": "https://spdx.org/licenses/sqlitestudio-OpenSSL-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/sqlitestudio-OpenSSL-exception.json", "referenceNumber": 25, "name": "sqlitestudio OpenSSL exception", "licenseExceptionId": "sqlitestudio-OpenSSL-exception", "seeAlso": [ "https://github.com/pawelsalawa/sqlitestudio/blob/master/LICENSE" ] }, { "reference": "https://spdx.org/licenses/stunnel-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/stunnel-exception.json", "referenceNumber": 7, "name": "stunnel Exception", "licenseExceptionId": "stunnel-exception", "seeAlso": [ "https://github.com/mtrojnar/stunnel/blob/master/COPYING.md" ] }, { "reference": "https://spdx.org/licenses/SWI-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWI-exception.json", "referenceNumber": 13, "name": "SWI exception", "licenseExceptionId": "SWI-exception", "seeAlso": [ "https://github.com/SWI-Prolog/packages-clpqr/blob/bfa80b9270274f0800120d5b8e6fef42ac2dc6a5/clpqr/class.pl" ] }, { "reference": "https://spdx.org/licenses/Swift-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Swift-exception.json", "referenceNumber": 80, "name": "Swift Exception", "licenseExceptionId": "Swift-exception", "seeAlso": [ "https://swift.org/LICENSE.txt", "https://github.com/apple/swift-package-manager/blob/7ab2275f447a5eb37497ed63a9340f8a6d1e488b/LICENSE.txt#L205" ] }, { "reference": "https://spdx.org/licenses/Texinfo-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Texinfo-exception.json", "referenceNumber": 32, "name": "Texinfo exception", "licenseExceptionId": "Texinfo-exception", "seeAlso": [ "https://git.savannah.gnu.org/cgit/automake.git/tree/lib/texinfo.tex?h\u003dv1.16.5#n23" ] }, { "reference": "https://spdx.org/licenses/u-boot-exception-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/u-boot-exception-2.0.json", "referenceNumber": 81, "name": "U-Boot exception 2.0", "licenseExceptionId": "u-boot-exception-2.0", "seeAlso": [ "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003dLicenses/Exceptions" ] }, { "reference": "https://spdx.org/licenses/UBDL-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UBDL-exception.json", "referenceNumber": 50, "name": "Unmodified Binary Distribution exception", "licenseExceptionId": "UBDL-exception", "seeAlso": [ "https://github.com/ipxe/ipxe/blob/master/COPYING.UBDL" ] }, { "reference": "https://spdx.org/licenses/Universal-FOSS-exception-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Universal-FOSS-exception-1.0.json", "referenceNumber": 74, "name": "Universal FOSS Exception, Version 1.0", "licenseExceptionId": "Universal-FOSS-exception-1.0", "seeAlso": [ "https://oss.oracle.com/licenses/universal-foss-exception/" ] }, { "reference": "https://spdx.org/licenses/vsftpd-openssl-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/vsftpd-openssl-exception.json", "referenceNumber": 83, "name": "vsftpd OpenSSL exception", "licenseExceptionId": "vsftpd-openssl-exception", "seeAlso": [ "https://git.stg.centos.org/source-git/vsftpd/blob/f727873674d9c9cd7afcae6677aa782eb54c8362/f/LICENSE", "https://launchpad.net/debian/squeeze/+source/vsftpd/+copyright", "https://github.com/richardcochran/vsftpd/blob/master/COPYING" ] }, { "reference": "https://spdx.org/licenses/WxWindows-exception-3.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WxWindows-exception-3.1.json", "referenceNumber": 46, "name": "WxWindows Library Exception 3.1", "licenseExceptionId": "WxWindows-exception-3.1", "seeAlso": [ "http://www.opensource.org/licenses/WXwindows" ] }, { "reference": "https://spdx.org/licenses/x11vnc-openssl-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/x11vnc-openssl-exception.json", "referenceNumber": 84, "name": "x11vnc OpenSSL Exception", "licenseExceptionId": "x11vnc-openssl-exception", "seeAlso": [ "https://github.com/LibVNC/x11vnc/blob/master/src/8to24.c#L22" ] } ], "releaseDate": "2026-03-05T00:00:00Z" }go-spdx-2.6.0/cmd/license.go000066400000000000000000000123101517223150200156070ustar00rootroot00000000000000package main import ( "encoding/json" "fmt" "go/format" "os" "strings" ) type LicenseData struct { Version string `json:"licenseListVersion"` Licenses []License `json:"licenses"` } type License struct { Reference string `json:"reference"` IsDeprecated bool `json:"isDeprecatedLicenseId"` DetailsURL string `json:"detailsUrl"` ReferenceNumber int `json:"referenceNumber"` Name string `json:"name"` LicenseID string `json:"licenseId"` SeeAlso []string `json:"seeAlso"` IsOsiApproved bool `json:"isOsiApproved"` } // extractLicenseIDs reads the official licenses.json file copied from spdx/license-list-data // and writes two files, license_ids.json and deprecated_license_ids.json, containing just // the license IDs and deprecated license IDs, respectively. It returns an error if it // encounters one. func extractLicenseIDs() error { // open file file, err := os.Open("licenses.json") if err != nil { fmt.Println(err) return err } // read in all licenses marshalled into a slice of license structs var licenseData LicenseData err = json.NewDecoder(file).Decode(&licenseData) if err != nil { fmt.Println(err) return err } // create two slices of license IDs, one for deprecated and one for active var activeLicenseIDs []string var deprecatedLicenseIDs []string for _, l := range licenseData.Licenses { if l.IsDeprecated { deprecatedLicenseIDs = append(deprecatedLicenseIDs, l.LicenseID) } else { activeLicenseIDs = append(activeLicenseIDs, l.LicenseID) } } // generate the GetLicenses() function in get_licenses.go getLicensesContents := []byte(`package spdxlicenses // Code generated by go-spdx cmd/license.go. DO NOT EDIT. // Source: https://github.com/spdx/license-list-data specifies official SPDX license list. import "strings" // IsActiveLicense does a case-insensitive lookup for the license id in the active licenses map. // It returns true and the case-sensitive ID if found, otherwise false and the original id. func IsActiveLicense(id string) (bool, string) { foundID, ok := licensesMap[strings.ToUpper(id)] if ok { return true, foundID } return false, id } // GetLicensesMap returns a map of active license IDs keyed by uppercase ID. func GetLicensesMap() map[string]string { copied := make(map[string]string, len(licensesMap)) for k, v := range licensesMap { copied[k] = v } return copied } // GetLicenses returns a slice of active license IDs. func GetLicenses() []string { return []string{ `) for _, id := range activeLicenseIDs { getLicensesContents = append(getLicensesContents, ` "`+id+`", `...) } getLicensesContents = append(getLicensesContents, ` } } `...) getLicensesContents = append(getLicensesContents, `var licensesMap = map[string]string{ `...) for _, id := range activeLicenseIDs { getLicensesContents = append(getLicensesContents, ` "`+strings.ToUpper(id)+`": "`+id+`", `...) } getLicensesContents = append(getLicensesContents, `} `...) getLicensesContents, err = format.Source(getLicensesContents) if err != nil { return fmt.Errorf("format generated get_licenses.go: %w", err) } err = os.WriteFile("../spdxexp/spdxlicenses/get_licenses.go", getLicensesContents, 0600) if err != nil { return err } fmt.Println("Writing `../spdxexp/spdxlicenses/get_licenses.go`... COMPLETE") // generate the GetDeprecated() function in get_deprecated.go getDeprecatedContents := []byte(`package spdxlicenses // Code generated by go-spdx cmd/license.go. DO NOT EDIT. // Source: https://github.com/spdx/license-list-data specifies official SPDX license list. import "strings" // IsDeprecatedLicense does a case-insensitive lookup for the license id in the deprecated licenses map. // It returns true and the case-sensitive ID if found, otherwise false and the original id. func IsDeprecatedLicense(id string) (bool, string) { foundID, ok := deprecatedMap[strings.ToUpper(id)] if ok { return true, foundID } return false, id } // GetDeprecatedMap returns a map of deprecated license IDs keyed by uppercase ID. func GetDeprecatedMap() map[string]string { copied := make(map[string]string, len(deprecatedMap)) for k, v := range deprecatedMap { copied[k] = v } return copied } // GetDeprecated returns a slice of deprecated license IDs. func GetDeprecated() []string { return []string{ `) for _, id := range deprecatedLicenseIDs { getDeprecatedContents = append(getDeprecatedContents, ` "`+id+`", `...) } getDeprecatedContents = append(getDeprecatedContents, ` } } `...) getDeprecatedContents = append(getDeprecatedContents, `var deprecatedMap = map[string]string{ `...) for _, id := range deprecatedLicenseIDs { getDeprecatedContents = append(getDeprecatedContents, ` "`+strings.ToUpper(id)+`": "`+id+`", `...) } getDeprecatedContents = append(getDeprecatedContents, `} `...) getDeprecatedContents, err = format.Source(getDeprecatedContents) if err != nil { return fmt.Errorf("format generated get_deprecated.go: %w", err) } err = os.WriteFile("../spdxexp/spdxlicenses/get_deprecated.go", getDeprecatedContents, 0600) if err != nil { return err } fmt.Println("Writing `../spdxexp/spdxlicenses/get_deprecated.go`... COMPLETE") return nil } go-spdx-2.6.0/cmd/license_ids.json000066400000000000000000000145121517223150200170200ustar00rootroot00000000000000["0BSD","AAL","Abstyles","Adobe-2006","Adobe-Glyph","ADSL","AFL-1.1","AFL-1.2","AFL-2.0","AFL-2.1","AFL-3.0","Afmparse","AGPL-1.0-only","AGPL-1.0-or-later","AGPL-3.0-only","AGPL-3.0-or-later","Aladdin","AMDPLPA","AML","AMPAS","ANTLR-PD","ANTLR-PD-fallback","Apache-1.0","Apache-1.1","Apache-2.0","APAFML","APL-1.0","App-s2p","APSL-1.0","APSL-1.1","APSL-1.2","APSL-2.0","Arphic-1999","Artistic-1.0","Artistic-1.0-cl8","Artistic-1.0-Perl","Artistic-2.0","Baekmuk","Bahyph","Barr","Beerware","Bitstream-Charter","Bitstream-Vera","BitTorrent-1.0","BitTorrent-1.1","blessing","BlueOak-1.0.0","Borceux","BSD-1-Clause","BSD-2-Clause","BSD-2-Clause-Patent","BSD-2-Clause-Views","BSD-3-Clause","BSD-3-Clause-Attribution","BSD-3-Clause-Clear","BSD-3-Clause-LBNL","BSD-3-Clause-Modification","BSD-3-Clause-No-Military-License","BSD-3-Clause-No-Nuclear-License","BSD-3-Clause-No-Nuclear-License-2014","BSD-3-Clause-No-Nuclear-Warranty","BSD-3-Clause-Open-MPI","BSD-4-Clause","BSD-4-Clause-Shortened","BSD-4-Clause-UC","BSD-Protection","BSD-Source-Code","BSL-1.0","BUSL-1.1","bzip2-1.0.6","C-UDA-1.0","CAL-1.0","CAL-1.0-Combined-Work-Exception","Caldera","CATOSL-1.1","CC-BY-1.0","CC-BY-2.0","CC-BY-2.5","CC-BY-2.5-AU","CC-BY-3.0","CC-BY-3.0-AT","CC-BY-3.0-DE","CC-BY-3.0-IGO","CC-BY-3.0-NL","CC-BY-3.0-US","CC-BY-4.0","CC-BY-NC-1.0","CC-BY-NC-2.0","CC-BY-NC-2.5","CC-BY-NC-3.0","CC-BY-NC-3.0-DE","CC-BY-NC-4.0","CC-BY-NC-ND-1.0","CC-BY-NC-ND-2.0","CC-BY-NC-ND-2.5","CC-BY-NC-ND-3.0","CC-BY-NC-ND-3.0-DE","CC-BY-NC-ND-3.0-IGO","CC-BY-NC-ND-4.0","CC-BY-NC-SA-1.0","CC-BY-NC-SA-2.0","CC-BY-NC-SA-2.0-DE","CC-BY-NC-SA-2.0-FR","CC-BY-NC-SA-2.0-UK","CC-BY-NC-SA-2.5","CC-BY-NC-SA-3.0","CC-BY-NC-SA-3.0-DE","CC-BY-NC-SA-3.0-IGO","CC-BY-NC-SA-4.0","CC-BY-ND-1.0","CC-BY-ND-2.0","CC-BY-ND-2.5","CC-BY-ND-3.0","CC-BY-ND-3.0-DE","CC-BY-ND-4.0","CC-BY-SA-1.0","CC-BY-SA-2.0","CC-BY-SA-2.0-UK","CC-BY-SA-2.1-JP","CC-BY-SA-2.5","CC-BY-SA-3.0","CC-BY-SA-3.0-AT","CC-BY-SA-3.0-DE","CC-BY-SA-4.0","CC-PDDC","CC0-1.0","CDDL-1.0","CDDL-1.1","CDL-1.0","CDLA-Permissive-1.0","CDLA-Permissive-2.0","CDLA-Sharing-1.0","CECILL-1.0","CECILL-1.1","CECILL-2.0","CECILL-2.1","CECILL-B","CECILL-C","CERN-OHL-1.1","CERN-OHL-1.2","CERN-OHL-P-2.0","CERN-OHL-S-2.0","CERN-OHL-W-2.0","checkmk","ClArtistic","CNRI-Jython","CNRI-Python","CNRI-Python-GPL-Compatible","COIL-1.0","Community-Spec-1.0","Condor-1.1","copyleft-next-0.3.0","copyleft-next-0.3.1","CPAL-1.0","CPL-1.0","CPOL-1.02","Crossword","CrystalStacker","CUA-OPL-1.0","Cube","curl","D-FSL-1.0","diffmark","DL-DE-BY-2.0","DOC","Dotseqn","DRL-1.0","DSDP","dvipdfm","ECL-1.0","ECL-2.0","EFL-1.0","EFL-2.0","eGenix","Elastic-2.0","Entessa","EPICS","EPL-1.0","EPL-2.0","ErlPL-1.1","etalab-2.0","EUDatagrid","EUPL-1.0","EUPL-1.1","EUPL-1.2","Eurosym","Fair","FDK-AAC","Frameworx-1.0","FreeBSD-DOC","FreeImage","FSFAP","FSFUL","FSFULLR","FSFULLRWD","FTL","GD","GFDL-1.1-invariants-only","GFDL-1.1-invariants-or-later","GFDL-1.1-no-invariants-only","GFDL-1.1-no-invariants-or-later","GFDL-1.1-only","GFDL-1.1-or-later","GFDL-1.2-invariants-only","GFDL-1.2-invariants-or-later","GFDL-1.2-no-invariants-only","GFDL-1.2-no-invariants-or-later","GFDL-1.2-only","GFDL-1.2-or-later","GFDL-1.3-invariants-only","GFDL-1.3-invariants-or-later","GFDL-1.3-no-invariants-only","GFDL-1.3-no-invariants-or-later","GFDL-1.3-only","GFDL-1.3-or-later","Giftware","GL2PS","Glide","Glulxe","GLWTPL","gnuplot","GPL-1.0-only","GPL-1.0-or-later","GPL-2.0-only","GPL-2.0-or-later","GPL-3.0-only","GPL-3.0-or-later","Graphics-Gems","gSOAP-1.3b","HaskellReport","Hippocratic-2.1","HPND","HPND-export-US","HPND-sell-variant","HTMLTIDY","IBM-pibs","ICU","IJG","IJG-short","ImageMagick","iMatix","Imlib2","Info-ZIP","Intel","Intel-ACPI","Interbase-1.0","IPA","IPL-1.0","ISC","Jam","JasPer-2.0","JPNIC","JSON","Knuth-CTAN","LAL-1.2","LAL-1.3","Latex2e","Leptonica","LGPL-2.0-only","LGPL-2.0-or-later","LGPL-2.1-only","LGPL-2.1-or-later","LGPL-3.0-only","LGPL-3.0-or-later","LGPLLR","Libpng","libpng-2.0","libselinux-1.0","libtiff","libutil-David-Nugent","LiLiQ-P-1.1","LiLiQ-R-1.1","LiLiQ-Rplus-1.1","Linux-man-pages-copyleft","Linux-OpenIB","LOOP","LPL-1.0","LPL-1.02","LPPL-1.0","LPPL-1.1","LPPL-1.2","LPPL-1.3a","LPPL-1.3c","LZMA-SDK-9.11-to-9.20","LZMA-SDK-9.22","MakeIndex","Minpack","MirOS","MIT","MIT-0","MIT-advertising","MIT-CMU","MIT-enna","MIT-feh","MIT-Modern-Variant","MIT-open-group","MIT-Wu","MITNFA","Motosoto","mpi-permissive","mpich2","MPL-1.0","MPL-1.1","MPL-2.0","MPL-2.0-no-copyleft-exception","mplus","MS-LPL","MS-PL","MS-RL","MTLL","MulanPSL-1.0","MulanPSL-2.0","Multics","Mup","NAIST-2003","NASA-1.3","Naumen","NBPL-1.0","NCGL-UK-2.0","NCSA","Net-SNMP","NetCDF","Newsletr","NGPL","NICTA-1.0","NIST-PD","NIST-PD-fallback","NLOD-1.0","NLOD-2.0","NLPL","Nokia","NOSL","Noweb","NPL-1.0","NPL-1.1","NPOSL-3.0","NRL","NTP","NTP-0","O-UDA-1.0","OCCT-PL","OCLC-2.0","ODbL-1.0","ODC-By-1.0","OFL-1.0","OFL-1.0-no-RFN","OFL-1.0-RFN","OFL-1.1","OFL-1.1-no-RFN","OFL-1.1-RFN","OGC-1.0","OGDL-Taiwan-1.0","OGL-Canada-2.0","OGL-UK-1.0","OGL-UK-2.0","OGL-UK-3.0","OGTSL","OLDAP-1.1","OLDAP-1.2","OLDAP-1.3","OLDAP-1.4","OLDAP-2.0","OLDAP-2.0.1","OLDAP-2.1","OLDAP-2.2","OLDAP-2.2.1","OLDAP-2.2.2","OLDAP-2.3","OLDAP-2.4","OLDAP-2.5","OLDAP-2.6","OLDAP-2.7","OLDAP-2.8","OML","OpenSSL","OPL-1.0","OPUBL-1.0","OSET-PL-2.1","OSL-1.0","OSL-1.1","OSL-2.0","OSL-2.1","OSL-3.0","Parity-6.0.0","Parity-7.0.0","PDDL-1.0","PHP-3.0","PHP-3.01","Plexus","PolyForm-Noncommercial-1.0.0","PolyForm-Small-Business-1.0.0","PostgreSQL","PSF-2.0","psfrag","psutils","Python-2.0","Python-2.0.1","Qhull","QPL-1.0","Rdisc","RHeCos-1.1","RPL-1.1","RPL-1.5","RPSL-1.0","RSA-MD","RSCPL","Ruby","SAX-PD","Saxpath","SCEA","SchemeReport","Sendmail","Sendmail-8.23","SGI-B-1.0","SGI-B-1.1","SGI-B-2.0","SHL-0.5","SHL-0.51","SimPL-2.0","SISSL","SISSL-1.2","Sleepycat","SMLNJ","SMPPL","SNIA","Spencer-86","Spencer-94","Spencer-99","SPL-1.0","SSH-OpenSSH","SSH-short","SSPL-1.0","SugarCRM-1.1.3","SWL","Symlinks","TAPR-OHL-1.0","TCL","TCP-wrappers","TMate","TORQUE-1.1","TOSL","TPDL","TTWL","TU-Berlin-1.0","TU-Berlin-2.0","UCL-1.0","Unicode-DFS-2015","Unicode-DFS-2016","Unicode-TOU","Unlicense","UPL-1.0","Vim","VOSTROM","VSL-1.0","W3C","W3C-19980720","W3C-20150513","Watcom-1.0","Wsuipa","WTFPL","X11","X11-distribute-modifications-variant","Xerox","XFree86-1.1","xinetd","Xnet","xpp","XSkat","YPL-1.0","YPL-1.1","Zed","Zend-2.0","Zimbra-1.3","Zimbra-1.4","Zlib","zlib-acknowledgement","ZPL-1.1","ZPL-2.0","ZPL-2.1"]go-spdx-2.6.0/cmd/license_ids.txt000066400000000000000000000173461517223150200166760ustar00rootroot00000000000000 "0BSD", "AAL", "Abstyles", "Adobe-2006", "Adobe-Glyph", "ADSL", "AFL-1.1", "AFL-1.2", "AFL-2.0", "AFL-2.1", "AFL-3.0", "Afmparse", "AGPL-1.0-only", "AGPL-1.0-or-later", "AGPL-3.0-only", "AGPL-3.0-or-later", "Aladdin", "AMDPLPA", "AML", "AMPAS", "ANTLR-PD", "ANTLR-PD-fallback", "Apache-1.0", "Apache-1.1", "Apache-2.0", "APAFML", "APL-1.0", "App-s2p", "APSL-1.0", "APSL-1.1", "APSL-1.2", "APSL-2.0", "Arphic-1999", "Artistic-1.0", "Artistic-1.0-cl8", "Artistic-1.0-Perl", "Artistic-2.0", "Baekmuk", "Bahyph", "Barr", "Beerware", "Bitstream-Charter", "Bitstream-Vera", "BitTorrent-1.0", "BitTorrent-1.1", "blessing", "BlueOak-1.0.0", "Borceux", "BSD-1-Clause", "BSD-2-Clause", "BSD-2-Clause-Patent", "BSD-2-Clause-Views", "BSD-3-Clause", "BSD-3-Clause-Attribution", "BSD-3-Clause-Clear", "BSD-3-Clause-LBNL", "BSD-3-Clause-Modification", "BSD-3-Clause-No-Military-License", "BSD-3-Clause-No-Nuclear-License", "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-Clause-No-Nuclear-Warranty", "BSD-3-Clause-Open-MPI", "BSD-4-Clause", "BSD-4-Clause-Shortened", "BSD-4-Clause-UC", "BSD-Protection", "BSD-Source-Code", "BSL-1.0", "BUSL-1.1", "bzip2-1.0.6", "C-UDA-1.0", "CAL-1.0", "CAL-1.0-Combined-Work-Exception", "Caldera", "CATOSL-1.1", "CC-BY-1.0", "CC-BY-2.0", "CC-BY-2.5", "CC-BY-2.5-AU", "CC-BY-3.0", "CC-BY-3.0-AT", "CC-BY-3.0-DE", "CC-BY-3.0-IGO", "CC-BY-3.0-NL", "CC-BY-3.0-US", "CC-BY-4.0", "CC-BY-NC-1.0", "CC-BY-NC-2.0", "CC-BY-NC-2.5", "CC-BY-NC-3.0", "CC-BY-NC-3.0-DE", "CC-BY-NC-4.0", "CC-BY-NC-ND-1.0", "CC-BY-NC-ND-2.0", "CC-BY-NC-ND-2.5", "CC-BY-NC-ND-3.0", "CC-BY-NC-ND-3.0-DE", "CC-BY-NC-ND-3.0-IGO", "CC-BY-NC-ND-4.0", "CC-BY-NC-SA-1.0", "CC-BY-NC-SA-2.0", "CC-BY-NC-SA-2.0-DE", "CC-BY-NC-SA-2.0-FR", "CC-BY-NC-SA-2.0-UK", "CC-BY-NC-SA-2.5", "CC-BY-NC-SA-3.0", "CC-BY-NC-SA-3.0-DE", "CC-BY-NC-SA-3.0-IGO", "CC-BY-NC-SA-4.0", "CC-BY-ND-1.0", "CC-BY-ND-2.0", "CC-BY-ND-2.5", "CC-BY-ND-3.0", "CC-BY-ND-3.0-DE", "CC-BY-ND-4.0", "CC-BY-SA-1.0", "CC-BY-SA-2.0", "CC-BY-SA-2.0-UK", "CC-BY-SA-2.1-JP", "CC-BY-SA-2.5", "CC-BY-SA-3.0", "CC-BY-SA-3.0-AT", "CC-BY-SA-3.0-DE", "CC-BY-SA-4.0", "CC-PDDC", "CC0-1.0", "CDDL-1.0", "CDDL-1.1", "CDL-1.0", "CDLA-Permissive-1.0", "CDLA-Permissive-2.0", "CDLA-Sharing-1.0", "CECILL-1.0", "CECILL-1.1", "CECILL-2.0", "CECILL-2.1", "CECILL-B", "CECILL-C", "CERN-OHL-1.1", "CERN-OHL-1.2", "CERN-OHL-P-2.0", "CERN-OHL-S-2.0", "CERN-OHL-W-2.0", "checkmk", "ClArtistic", "CNRI-Jython", "CNRI-Python", "CNRI-Python-GPL-Compatible", "COIL-1.0", "Community-Spec-1.0", "Condor-1.1", "copyleft-next-0.3.0", "copyleft-next-0.3.1", "CPAL-1.0", "CPL-1.0", "CPOL-1.02", "Crossword", "CrystalStacker", "CUA-OPL-1.0", "Cube", "curl", "D-FSL-1.0", "diffmark", "DL-DE-BY-2.0", "DOC", "Dotseqn", "DRL-1.0", "DSDP", "dvipdfm", "ECL-1.0", "ECL-2.0", "EFL-1.0", "EFL-2.0", "eGenix", "Elastic-2.0", "Entessa", "EPICS", "EPL-1.0", "EPL-2.0", "ErlPL-1.1", "etalab-2.0", "EUDatagrid", "EUPL-1.0", "EUPL-1.1", "EUPL-1.2", "Eurosym", "Fair", "FDK-AAC", "Frameworx-1.0", "FreeBSD-DOC", "FreeImage", "FSFAP", "FSFUL", "FSFULLR", "FSFULLRWD", "FTL", "GD", "GFDL-1.1-invariants-only", "GFDL-1.1-invariants-or-later", "GFDL-1.1-no-invariants-only", "GFDL-1.1-no-invariants-or-later", "GFDL-1.1-only", "GFDL-1.1-or-later", "GFDL-1.2-invariants-only", "GFDL-1.2-invariants-or-later", "GFDL-1.2-no-invariants-only", "GFDL-1.2-no-invariants-or-later", "GFDL-1.2-only", "GFDL-1.2-or-later", "GFDL-1.3-invariants-only", "GFDL-1.3-invariants-or-later", "GFDL-1.3-no-invariants-only", "GFDL-1.3-no-invariants-or-later", "GFDL-1.3-only", "GFDL-1.3-or-later", "Giftware", "GL2PS", "Glide", "Glulxe", "GLWTPL", "gnuplot", "GPL-1.0-only", "GPL-1.0-or-later", "GPL-2.0-only", "GPL-2.0-or-later", "GPL-3.0-only", "GPL-3.0-or-later", "Graphics-Gems", "gSOAP-1.3b", "HaskellReport", "Hippocratic-2.1", "HPND", "HPND-export-US", "HPND-sell-variant", "HTMLTIDY", "IBM-pibs", "ICU", "IJG", "IJG-short", "ImageMagick", "iMatix", "Imlib2", "Info-ZIP", "Intel", "Intel-ACPI", "Interbase-1.0", "IPA", "IPL-1.0", "ISC", "Jam", "JasPer-2.0", "JPNIC", "JSON", "Knuth-CTAN", "LAL-1.2", "LAL-1.3", "Latex2e", "Leptonica", "LGPL-2.0-only", "LGPL-2.0-or-later", "LGPL-2.1-only", "LGPL-2.1-or-later", "LGPL-3.0-only", "LGPL-3.0-or-later", "LGPLLR", "Libpng", "libpng-2.0", "libselinux-1.0", "libtiff", "libutil-David-Nugent", "LiLiQ-P-1.1", "LiLiQ-R-1.1", "LiLiQ-Rplus-1.1", "Linux-man-pages-copyleft", "Linux-OpenIB", "LOOP", "LPL-1.0", "LPL-1.02", "LPPL-1.0", "LPPL-1.1", "LPPL-1.2", "LPPL-1.3a", "LPPL-1.3c", "LZMA-SDK-9.11-to-9.20", "LZMA-SDK-9.22", "MakeIndex", "Minpack", "MirOS", "MIT", "MIT-0", "MIT-advertising", "MIT-CMU", "MIT-enna", "MIT-feh", "MIT-Modern-Variant", "MIT-open-group", "MIT-Wu", "MITNFA", "Motosoto", "mpi-permissive", "mpich2", "MPL-1.0", "MPL-1.1", "MPL-2.0", "MPL-2.0-no-copyleft-exception", "mplus", "MS-LPL", "MS-PL", "MS-RL", "MTLL", "MulanPSL-1.0", "MulanPSL-2.0", "Multics", "Mup", "NAIST-2003", "NASA-1.3", "Naumen", "NBPL-1.0", "NCGL-UK-2.0", "NCSA", "Net-SNMP", "NetCDF", "Newsletr", "NGPL", "NICTA-1.0", "NIST-PD", "NIST-PD-fallback", "NLOD-1.0", "NLOD-2.0", "NLPL", "Nokia", "NOSL", "Noweb", "NPL-1.0", "NPL-1.1", "NPOSL-3.0", "NRL", "NTP", "NTP-0", "O-UDA-1.0", "OCCT-PL", "OCLC-2.0", "ODbL-1.0", "ODC-By-1.0", "OFL-1.0", "OFL-1.0-no-RFN", "OFL-1.0-RFN", "OFL-1.1", "OFL-1.1-no-RFN", "OFL-1.1-RFN", "OGC-1.0", "OGDL-Taiwan-1.0", "OGL-Canada-2.0", "OGL-UK-1.0", "OGL-UK-2.0", "OGL-UK-3.0", "OGTSL", "OLDAP-1.1", "OLDAP-1.2", "OLDAP-1.3", "OLDAP-1.4", "OLDAP-2.0", "OLDAP-2.0.1", "OLDAP-2.1", "OLDAP-2.2", "OLDAP-2.2.1", "OLDAP-2.2.2", "OLDAP-2.3", "OLDAP-2.4", "OLDAP-2.5", "OLDAP-2.6", "OLDAP-2.7", "OLDAP-2.8", "OML", "OpenSSL", "OPL-1.0", "OPUBL-1.0", "OSET-PL-2.1", "OSL-1.0", "OSL-1.1", "OSL-2.0", "OSL-2.1", "OSL-3.0", "Parity-6.0.0", "Parity-7.0.0", "PDDL-1.0", "PHP-3.0", "PHP-3.01", "Plexus", "PolyForm-Noncommercial-1.0.0", "PolyForm-Small-Business-1.0.0", "PostgreSQL", "PSF-2.0", "psfrag", "psutils", "Python-2.0", "Python-2.0.1", "Qhull", "QPL-1.0", "Rdisc", "RHeCos-1.1", "RPL-1.1", "RPL-1.5", "RPSL-1.0", "RSA-MD", "RSCPL", "Ruby", "SAX-PD", "Saxpath", "SCEA", "SchemeReport", "Sendmail", "Sendmail-8.23", "SGI-B-1.0", "SGI-B-1.1", "SGI-B-2.0", "SHL-0.5", "SHL-0.51", "SimPL-2.0", "SISSL", "SISSL-1.2", "Sleepycat", "SMLNJ", "SMPPL", "SNIA", "Spencer-86", "Spencer-94", "Spencer-99", "SPL-1.0", "SSH-OpenSSH", "SSH-short", "SSPL-1.0", "SugarCRM-1.1.3", "SWL", "Symlinks", "TAPR-OHL-1.0", "TCL", "TCP-wrappers", "TMate", "TORQUE-1.1", "TOSL", "TPDL", "TTWL", "TU-Berlin-1.0", "TU-Berlin-2.0", "UCL-1.0", "Unicode-DFS-2015", "Unicode-DFS-2016", "Unicode-TOU", "Unlicense", "UPL-1.0", "Vim", "VOSTROM", "VSL-1.0", "W3C", "W3C-19980720", "W3C-20150513", "Watcom-1.0", "Wsuipa", "WTFPL", "X11", "X11-distribute-modifications-variant", "Xerox", "XFree86-1.1", "xinetd", "Xnet", "xpp", "XSkat", "YPL-1.0", "YPL-1.1", "Zed", "Zend-2.0", "Zimbra-1.3", "Zimbra-1.4", "Zlib", "zlib-acknowledgement", "ZPL-1.1", "ZPL-2.0", "ZPL-2.1", go-spdx-2.6.0/cmd/licenses.json000066400000000000000000012112441517223150200163460ustar00rootroot00000000000000{ "licenseListVersion": "1ff5448", "licenses": [ { "reference": "https://spdx.org/licenses/0BSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/0BSD.json", "referenceNumber": 459, "name": "BSD Zero Clause License", "licenseId": "0BSD", "seeAlso": [ "http://landley.net/toybox/license.html", "https://opensource.org/licenses/0BSD" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/3D-Slicer-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/3D-Slicer-1.0.json", "referenceNumber": 490, "name": "3D Slicer License v1.0", "licenseId": "3D-Slicer-1.0", "seeAlso": [ "https://slicer.org/LICENSE", "https://github.com/Slicer/Slicer/blob/main/License.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AAL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AAL.json", "referenceNumber": 314, "name": "Attribution Assurance License", "licenseId": "AAL", "seeAlso": [ "https://opensource.org/licenses/attribution" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Abstyles.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Abstyles.json", "referenceNumber": 336, "name": "Abstyles License", "licenseId": "Abstyles", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Abstyles" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AdaCore-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AdaCore-doc.json", "referenceNumber": 363, "name": "AdaCore Doc License", "licenseId": "AdaCore-doc", "seeAlso": [ "https://github.com/AdaCore/xmlada/blob/master/docs/index.rst", "https://github.com/AdaCore/gnatcoll-core/blob/master/docs/index.rst", "https://github.com/AdaCore/gnatcoll-db/blob/master/docs/index.rst" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-2006.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", "referenceNumber": 48, "name": "Adobe Systems Incorporated Source Code License Agreement", "licenseId": "Adobe-2006", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AdobeLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-Display-PostScript.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Display-PostScript.json", "referenceNumber": 62, "name": "Adobe Display PostScript License", "licenseId": "Adobe-Display-PostScript", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L752" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-Glyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", "referenceNumber": 538, "name": "Adobe Glyph List License", "licenseId": "Adobe-Glyph", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-Utopia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Utopia.json", "referenceNumber": 1, "name": "Adobe Utopia Font License", "licenseId": "Adobe-Utopia", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/font/adobe-utopia-100dpi/-/blob/master/COPYING?ref_type\u003dheads" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ADSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ADSL.json", "referenceNumber": 157, "name": "Amazon Digital Services License", "licenseId": "ADSL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Advanced-Cryptics-Dictionary.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Advanced-Cryptics-Dictionary.json", "referenceNumber": 635, "name": "Advanced Cryptics Dictionary License", "licenseId": "Advanced-Cryptics-Dictionary", "seeAlso": [ "https://ftp.gnu.org/gnu/aspell/dict/en/aspell6-en-2020.12.07-0.tar.bz2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", "referenceNumber": 545, "name": "Academic Free License v1.1", "licenseId": "AFL-1.1", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", "http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", "referenceNumber": 492, "name": "Academic Free License v1.2", "licenseId": "AFL-1.2", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", "http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", "referenceNumber": 19, "name": "Academic Free License v2.0", "licenseId": "AFL-2.0", "seeAlso": [ "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", "referenceNumber": 262, "name": "Academic Free License v2.1", "licenseId": "AFL-2.1", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-2.1.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", "referenceNumber": 620, "name": "Academic Free License v3.0", "licenseId": "AFL-3.0", "seeAlso": [ "http://www.rosenlaw.com/AFL3.0.htm", "https://opensource.org/licenses/afl-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Afmparse.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Afmparse.json", "referenceNumber": 224, "name": "Afmparse License", "licenseId": "Afmparse", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Afmparse" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", "referenceNumber": 198, "name": "Affero General Public License v1.0", "licenseId": "AGPL-1.0", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", "referenceNumber": 123, "name": "Affero General Public License v1.0 only", "licenseId": "AGPL-1.0-only", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-or-later.json", "referenceNumber": 493, "name": "Affero General Public License v1.0 or later", "licenseId": "AGPL-1.0-or-later", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", "referenceNumber": 695, "name": "GNU Affero General Public License v3.0", "licenseId": "AGPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", "referenceNumber": 448, "name": "GNU Affero General Public License v3.0 only", "licenseId": "AGPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-or-later.json", "referenceNumber": 348, "name": "GNU Affero General Public License v3.0 or later", "licenseId": "AGPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Aladdin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aladdin.json", "referenceNumber": 104, "name": "Aladdin Free Public License", "licenseId": "Aladdin", "seeAlso": [ "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/ALGLIB-Documentation.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ALGLIB-Documentation.json", "referenceNumber": 537, "name": "ALGLIB Documentation License", "licenseId": "ALGLIB-Documentation", "seeAlso": [], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/AMD-newlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMD-newlib.json", "referenceNumber": 171, "name": "AMD newlib License", "licenseId": "AMD-newlib", "seeAlso": [ "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/sys/a29khif/_close.S;h\u003d04f52ae00de1dafbd9055ad8d73c5c697a3aae7f;hb\u003dHEAD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AMDPLPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", "referenceNumber": 181, "name": "AMD\u0027s plpa_map.c License", "licenseId": "AMDPLPA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML.json", "referenceNumber": 684, "name": "Apple MIT License", "licenseId": "AML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AML-glslang.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML-glslang.json", "referenceNumber": 407, "name": "AML glslang variant License", "licenseId": "AML-glslang", "seeAlso": [ "https://github.com/KhronosGroup/glslang/blob/main/LICENSE.txt#L949", "https://docs.omniverse.nvidia.com/install-guide/latest/common/licenses.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AMPAS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMPAS.json", "referenceNumber": 691, "name": "Academy of Motion Picture Arts and Sciences BSD", "licenseId": "AMPAS", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ANTLR-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", "referenceNumber": 91, "name": "ANTLR Software Rights Notice", "licenseId": "ANTLR-PD", "seeAlso": [ "http://www.antlr2.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ANTLR-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD-fallback.json", "referenceNumber": 599, "name": "ANTLR Software Rights Notice with license fallback", "licenseId": "ANTLR-PD-fallback", "seeAlso": [ "http://www.antlr2.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/any-OSI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/any-OSI.json", "referenceNumber": 42, "name": "Any OSI License", "licenseId": "any-OSI", "seeAlso": [ "https://metacpan.org/pod/Exporter::Tidy#LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/any-OSI-perl-modules.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/any-OSI-perl-modules.json", "referenceNumber": 590, "name": "Any OSI License - Perl Modules", "licenseId": "any-OSI-perl-modules", "seeAlso": [ "https://metacpan.org/release/JUERD/Exporter-Tidy-0.09/view/Tidy.pm#LICENSE", "https://metacpan.org/pod/Qmail::Deliverable::Client#LICENSE", "https://metacpan.org/pod/Net::MQTT::Simple#LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Apache-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", "referenceNumber": 474, "name": "Apache License 1.0", "licenseId": "Apache-1.0", "seeAlso": [ "http://www.apache.org/licenses/LICENSE-1.0" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Apache-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", "referenceNumber": 239, "name": "Apache License 1.1", "licenseId": "Apache-1.1", "seeAlso": [ "http://apache.org/licenses/LICENSE-1.1", "https://opensource.org/licenses/Apache-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Apache-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", "referenceNumber": 36, "name": "Apache License 2.0", "licenseId": "Apache-2.0", "seeAlso": [ "https://www.apache.org/licenses/LICENSE-2.0", "https://opensource.org/licenses/Apache-2.0", "https://opensource.org/license/apache-2-0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/APAFML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APAFML.json", "referenceNumber": 232, "name": "Adobe Postscript AFM License", "licenseId": "APAFML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", "referenceNumber": 286, "name": "Adaptive Public License 1.0", "licenseId": "APL-1.0", "seeAlso": [ "https://opensource.org/licenses/APL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/App-s2p.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/App-s2p.json", "referenceNumber": 382, "name": "App::s2p License", "licenseId": "App-s2p", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/App-s2p" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", "referenceNumber": 132, "name": "Apple Public Source License 1.0", "licenseId": "APSL-1.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/APSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", "referenceNumber": 193, "name": "Apple Public Source License 1.1", "licenseId": "APSL-1.1", "seeAlso": [ "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/APSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", "referenceNumber": 120, "name": "Apple Public Source License 1.2", "licenseId": "APSL-1.2", "seeAlso": [ "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/APSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", "referenceNumber": 344, "name": "Apple Public Source License 2.0", "licenseId": "APSL-2.0", "seeAlso": [ "http://www.opensource.apple.com/license/apsl/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Arphic-1999.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Arphic-1999.json", "referenceNumber": 347, "name": "Arphic Public License", "licenseId": "Arphic-1999", "seeAlso": [ "http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Artistic-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", "referenceNumber": 80, "name": "Artistic License 1.0", "licenseId": "Artistic-1.0", "seeAlso": [ "https://opensource.org/licenses/Artistic-1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", "referenceNumber": 360, "name": "Artistic License 1.0 w/clause 8", "licenseId": "Artistic-1.0-cl8", "seeAlso": [ "https://opensource.org/licenses/Artistic-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", "referenceNumber": 427, "name": "Artistic License 1.0 (Perl)", "licenseId": "Artistic-1.0-Perl", "seeAlso": [ "http://dev.perl.org/licenses/artistic.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Artistic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", "referenceNumber": 330, "name": "Artistic License 2.0", "licenseId": "Artistic-2.0", "seeAlso": [ "http://www.perlfoundation.org/artistic_license_2_0", "https://www.perlfoundation.org/artistic-license-20.html", "https://opensource.org/licenses/artistic-license-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Artistic-dist.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-dist.json", "referenceNumber": 166, "name": "Artistic License 1.0 (dist)", "licenseId": "Artistic-dist", "seeAlso": [ "https://github.com/pexip/os-perl/blob/833cf4c86cc465ccfc627ff16db67e783156a248/debian/copyright#L2720-L2845" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Aspell-RU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aspell-RU.json", "referenceNumber": 495, "name": "Aspell Russian License", "licenseId": "Aspell-RU", "seeAlso": [ "https://ftp.gnu.org/gnu/aspell/dict/ru/aspell6-ru-0.99f7-1.tar.bz2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.json", "referenceNumber": 249, "name": "ASWF Digital Assets License version 1.0", "licenseId": "ASWF-Digital-Assets-1.0", "seeAlso": [ "https://github.com/AcademySoftwareFoundation/foundation/blob/main/digital_assets/aswf_digital_assets_license_v1.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.json", "referenceNumber": 177, "name": "ASWF Digital Assets License 1.1", "licenseId": "ASWF-Digital-Assets-1.1", "seeAlso": [ "https://github.com/AcademySoftwareFoundation/foundation/blob/main/digital_assets/aswf_digital_assets_license_v1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Baekmuk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Baekmuk.json", "referenceNumber": 295, "name": "Baekmuk License", "licenseId": "Baekmuk", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:Baekmuk?rd\u003dLicensing/Baekmuk" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bahyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bahyph.json", "referenceNumber": 521, "name": "Bahyph License", "licenseId": "Bahyph", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Bahyph" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Barr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Barr.json", "referenceNumber": 443, "name": "Barr License", "licenseId": "Barr", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Barr" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/bcrypt-Solar-Designer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bcrypt-Solar-Designer.json", "referenceNumber": 403, "name": "bcrypt Solar Designer License", "licenseId": "bcrypt-Solar-Designer", "seeAlso": [ "https://github.com/bcrypt-ruby/bcrypt-ruby/blob/master/ext/mri/crypt_blowfish.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Beerware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Beerware.json", "referenceNumber": 580, "name": "Beerware License", "licenseId": "Beerware", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Beerware", "https://people.freebsd.org/~phk/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bitstream-Charter.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Charter.json", "referenceNumber": 661, "name": "Bitstream Charter Font License", "licenseId": "Bitstream-Charter", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Charter#License_Text", "https://raw.githubusercontent.com/blackhole89/notekit/master/data/fonts/Charter%20license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bitstream-Vera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Vera.json", "referenceNumber": 679, "name": "Bitstream Vera Font License", "licenseId": "Bitstream-Vera", "seeAlso": [ "https://web.archive.org/web/20080207013128/http://www.gnome.org/fonts/", "https://docubrain.com/sites/default/files/licenses/bitstream-vera.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BitTorrent-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", "referenceNumber": 226, "name": "BitTorrent Open Source License v1.0", "licenseId": "BitTorrent-1.0", "seeAlso": [ "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1\u003d1.1\u0026r2\u003d1.1.1.1\u0026diff_format\u003ds" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BitTorrent-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", "referenceNumber": 616, "name": "BitTorrent Open Source License v1.1", "licenseId": "BitTorrent-1.1", "seeAlso": [ "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/blessing.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/blessing.json", "referenceNumber": 131, "name": "SQLite Blessing", "licenseId": "blessing", "seeAlso": [ "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln\u003d4-9", "https://sqlite.org/src/artifact/df5091916dbb40e6" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", "referenceNumber": 61, "name": "Blue Oak Model License 1.0.0", "licenseId": "BlueOak-1.0.0", "seeAlso": [ "https://blueoakcouncil.org/license/1.0.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Boehm-GC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Boehm-GC.json", "referenceNumber": 402, "name": "Boehm-Demers-Weiser GC License", "licenseId": "Boehm-GC", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT#Another_Minimal_variant_(found_in_libatomic_ops)", "https://github.com/uim/libgcroots/blob/master/COPYING", "https://github.com/ivmai/libatomic_ops/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Boehm-GC-without-fee.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Boehm-GC-without-fee.json", "referenceNumber": 21, "name": "Boehm-Demers-Weiser GC License (without fee)", "licenseId": "Boehm-GC-without-fee", "seeAlso": [ "https://github.com/MariaDB/server/blob/11.6/libmysqld/lib_sql.cc" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BOLA-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BOLA-1.1.json", "referenceNumber": 246, "name": "Buena Onda License Agreement v1.1", "licenseId": "BOLA-1.1", "seeAlso": [ "https://blitiri.com.ar/p/bola/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Borceux.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Borceux.json", "referenceNumber": 457, "name": "Borceux license", "licenseId": "Borceux", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Borceux" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Brian-Gladman-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-2-Clause.json", "referenceNumber": 542, "name": "Brian Gladman 2-Clause License", "licenseId": "Brian-Gladman-2-Clause", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L140-L156", "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Brian-Gladman-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-3-Clause.json", "referenceNumber": 119, "name": "Brian Gladman 3-Clause License", "licenseId": "Brian-Gladman-3-Clause", "seeAlso": [ "https://github.com/SWI-Prolog/packages-clib/blob/master/sha1/brg_endian.h" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-1-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", "referenceNumber": 133, "name": "BSD 1-Clause License", "licenseId": "BSD-1-Clause", "seeAlso": [ "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision\u003d326823" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", "referenceNumber": 503, "name": "BSD 2-Clause \"Simplified\" License", "licenseId": "BSD-2-Clause", "seeAlso": [ "https://opensource.org/licenses/BSD-2-Clause" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Darwin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Darwin.json", "referenceNumber": 696, "name": "BSD 2-Clause - Ian Darwin variant", "licenseId": "BSD-2-Clause-Darwin", "seeAlso": [ "https://github.com/file/file/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-first-lines.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-first-lines.json", "referenceNumber": 562, "name": "BSD 2-Clause - first lines requirement", "licenseId": "BSD-2-Clause-first-lines", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L664-L690", "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", "referenceNumber": 364, "name": "BSD 2-Clause FreeBSD License", "licenseId": "BSD-2-Clause-FreeBSD", "seeAlso": [ "http://www.freebsd.org/copyright/freebsd-license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", "referenceNumber": 71, "name": "BSD 2-Clause NetBSD License", "licenseId": "BSD-2-Clause-NetBSD", "seeAlso": [ "http://www.netbsd.org/about/redistribution.html#default" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", "referenceNumber": 546, "name": "BSD-2-Clause Plus Patent License", "licenseId": "BSD-2-Clause-Patent", "seeAlso": [ "https://opensource.org/licenses/BSDplusPatent" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-pkgconf-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-pkgconf-disclaimer.json", "referenceNumber": 573, "name": "BSD 2-Clause pkgconf disclaimer variant", "licenseId": "BSD-2-Clause-pkgconf-disclaimer", "seeAlso": [ "https://github.com/audacious-media-player/audacious/blob/master/src/audacious/main.cc", "https://github.com/audacious-media-player/audacious/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", "referenceNumber": 323, "name": "BSD 2-Clause with views sentence", "licenseId": "BSD-2-Clause-Views", "seeAlso": [ "http://www.freebsd.org/copyright/freebsd-license.html", "https://people.freebsd.org/~ivoras/wine/patch-wine-nvidia.sh", "https://github.com/protegeproject/protege/blob/master/license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", "referenceNumber": 468, "name": "BSD 3-Clause \"New\" or \"Revised\" License", "licenseId": "BSD-3-Clause", "seeAlso": [ "https://opensource.org/licenses/BSD-3-Clause", "https://www.eclipse.org/org/documents/edl-v10.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-acpica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-acpica.json", "referenceNumber": 156, "name": "BSD 3-Clause acpica variant", "licenseId": "BSD-3-Clause-acpica", "seeAlso": [ "https://github.com/acpica/acpica/blob/master/source/common/acfileio.c#L119" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", "referenceNumber": 95, "name": "BSD with attribution", "licenseId": "BSD-3-Clause-Attribution", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", "referenceNumber": 622, "name": "BSD 3-Clause Clear License", "licenseId": "BSD-3-Clause-Clear", "seeAlso": [ "http://labs.metacarta.com/license-explanation.html#license" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-flex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-flex.json", "referenceNumber": 135, "name": "BSD 3-Clause Flex variant", "licenseId": "BSD-3-Clause-flex", "seeAlso": [ "https://github.com/westes/flex/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-HP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-HP.json", "referenceNumber": 229, "name": "Hewlett-Packard BSD variant license", "licenseId": "BSD-3-Clause-HP", "seeAlso": [ "https://github.com/zdohnal/hplip/blob/master/COPYING#L939" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", "referenceNumber": 60, "name": "Lawrence Berkeley National Labs BSD variant license", "licenseId": "BSD-3-Clause-LBNL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/LBNLBSD" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", "referenceNumber": 190, "name": "BSD 3-Clause Modification", "licenseId": "BSD-3-Clause-Modification", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:BSD#Modification_Variant" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.json", "referenceNumber": 274, "name": "BSD 3-Clause No Military License", "licenseId": "BSD-3-Clause-No-Military-License", "seeAlso": [ "https://gitlab.syncad.com/hive/dhive/-/blob/master/LICENSE", "https://github.com/greymass/swift-eosio/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json", "referenceNumber": 252, "name": "BSD 3-Clause No Nuclear License", "licenseId": "BSD-3-Clause-No-Nuclear-License", "seeAlso": [ "http://download.oracle.com/otn-pub/java/licenses/bsd.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json", "referenceNumber": 437, "name": "BSD 3-Clause No Nuclear License 2014", "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", "seeAlso": [ "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json", "referenceNumber": 261, "name": "BSD 3-Clause No Nuclear Warranty", "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", "seeAlso": [ "https://jogamp.org/git/?p\u003dgluegen.git;a\u003dblob_plain;f\u003dLICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.json", "referenceNumber": 189, "name": "BSD 3-Clause Open MPI variant", "licenseId": "BSD-3-Clause-Open-MPI", "seeAlso": [ "https://www.open-mpi.org/community/license.php", "http://www.netlib.org/lapack/LICENSE.txt" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Sun.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Sun.json", "referenceNumber": 338, "name": "BSD 3-Clause Sun Microsystems", "licenseId": "BSD-3-Clause-Sun", "seeAlso": [ "https://github.com/xmlark/msv/blob/b9316e2f2270bc1606952ea4939ec87fbba157f3/xsdlib/src/main/java/com/sun/msv/datatype/regexp/InternalImpl.java" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Tso.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Tso.json", "referenceNumber": 86, "name": "BSD 3-Clause Tso variant", "licenseId": "BSD-3-Clause-Tso", "seeAlso": [ "https://www.x.org/archive/current/doc/xorg-docs/License.html#Theodore_Tso" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", "referenceNumber": 439, "name": "BSD 4-Clause \"Original\" or \"Old\" License", "licenseId": "BSD-4-Clause", "seeAlso": [ "http://directory.fsf.org/wiki/License:BSD_4Clause", "https://github.com/jsommers/pytricia/blob/master/patricia.c#L33-L67" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", "referenceNumber": 182, "name": "BSD 4 Clause Shortened", "licenseId": "BSD-4-Clause-Shortened", "seeAlso": [ "https://metadata.ftp-master.debian.org/changelogs//main/a/arpwatch/arpwatch_2.1a15-7_copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", "referenceNumber": 624, "name": "BSD-4-Clause (University of California-Specific)", "licenseId": "BSD-4-Clause-UC", "seeAlso": [ "http://www.freebsd.org/copyright/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4.3RENO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3RENO.json", "referenceNumber": 433, "name": "BSD 4.3 RENO License", "licenseId": "BSD-4.3RENO", "seeAlso": [ "https://sourceware.org/git/?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dlibiberty/strcasecmp.c;h\u003d131d81c2ce7881fa48c363dc5bf5fb302c61ce0b;hb\u003dHEAD", "https://git.openldap.org/openldap/openldap/-/blob/master/COPYRIGHT#L55-63" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4.3TAHOE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3TAHOE.json", "referenceNumber": 376, "name": "BSD 4.3 TAHOE License", "licenseId": "BSD-4.3TAHOE", "seeAlso": [ "https://github.com/389ds/389-ds-base/blob/main/ldap/include/sysexits-compat.h#L15", "https://git.savannah.gnu.org/cgit/indent.git/tree/doc/indent.texi?id\u003da74c6b4ee49397cf330b333da1042bffa60ed14f#n1788" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.json", "referenceNumber": 105, "name": "BSD Advertising Acknowledgement License", "licenseId": "BSD-Advertising-Acknowledgement", "seeAlso": [ "https://github.com/python-excel/xlrd/blob/master/LICENSE#L33" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.json", "referenceNumber": 421, "name": "BSD with Attribution and HPND disclaimer", "licenseId": "BSD-Attribution-HPND-disclaimer", "seeAlso": [ "https://github.com/cyrusimap/cyrus-sasl/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Inferno-Nettverk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Inferno-Nettverk.json", "referenceNumber": 38, "name": "BSD-Inferno-Nettverk", "licenseId": "BSD-Inferno-Nettverk", "seeAlso": [ "https://www.inet.no/dante/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Mark-Modifications.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Mark-Modifications.json", "referenceNumber": 614, "name": "BSD Mark Modifications License", "licenseId": "BSD-Mark-Modifications", "seeAlso": [ "https://ftp.gnu.org/gnu/aspell/dict/en/aspell6-en-2020.12.07-0.tar.bz2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Protection.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", "referenceNumber": 399, "name": "BSD Protection License", "licenseId": "BSD-Protection", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Source-beginning-file.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-beginning-file.json", "referenceNumber": 167, "name": "BSD Source Code Attribution - beginning of file variant", "licenseId": "BSD-Source-beginning-file", "seeAlso": [ "https://github.com/lattera/freebsd/blob/master/sys/cam/cam.c#L4" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Source-Code.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", "referenceNumber": 253, "name": "BSD Source Code Attribution", "licenseId": "BSD-Source-Code", "seeAlso": [ "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Systemics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Systemics.json", "referenceNumber": 216, "name": "Systemics BSD variant license", "licenseId": "BSD-Systemics", "seeAlso": [ "https://metacpan.org/release/DPARIS/Crypt-DES-2.07/source/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Systemics-W3Works.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Systemics-W3Works.json", "referenceNumber": 235, "name": "Systemics W3Works BSD variant license", "licenseId": "BSD-Systemics-W3Works", "seeAlso": [ "https://metacpan.org/release/DPARIS/Crypt-Blowfish-2.14/source/COPYRIGHT#L7" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", "referenceNumber": 541, "name": "Boost Software License 1.0", "licenseId": "BSL-1.0", "seeAlso": [ "http://www.boost.org/LICENSE_1_0.txt", "https://opensource.org/licenses/BSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Buddy.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Buddy.json", "referenceNumber": 50, "name": "Buddy License", "licenseId": "Buddy", "seeAlso": [ "https://sourceforge.net/p/buddy/gitcode/ci/master/tree/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BUSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", "referenceNumber": 374, "name": "Business Source License 1.1", "licenseId": "BUSL-1.1", "seeAlso": [ "https://mariadb.com/bsl11/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/bzip2-1.0.5.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", "referenceNumber": 578, "name": "bzip2 and libbzip2 License v1.0.5", "licenseId": "bzip2-1.0.5", "seeAlso": [ "https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/bzip2-1.0.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", "referenceNumber": 304, "name": "bzip2 and libbzip2 License v1.0.6", "licenseId": "bzip2-1.0.6", "seeAlso": [ "https://sourceware.org/git/?p\u003dbzip2.git;a\u003dblob;f\u003dLICENSE;hb\u003dbzip2-1.0.6", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html", "https://sourceware.org/cgit/valgrind/tree/mpi/libmpiwrap.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/C-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", "referenceNumber": 560, "name": "Computational Use of Data Agreement v1.0", "licenseId": "C-UDA-1.0", "seeAlso": [ "https://github.com/microsoft/Computational-Use-of-Data-Agreement/blob/master/C-UDA-1.0.md", "https://cdla.dev/computational-use-of-data-agreement-v1-0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", "referenceNumber": 644, "name": "Cryptographic Autonomy License 1.0", "licenseId": "CAL-1.0", "seeAlso": [ "http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json", "referenceNumber": 721, "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", "licenseId": "CAL-1.0-Combined-Work-Exception", "seeAlso": [ "http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Caldera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera.json", "referenceNumber": 598, "name": "Caldera License", "licenseId": "Caldera", "seeAlso": [ "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Caldera-no-preamble.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera-no-preamble.json", "referenceNumber": 101, "name": "Caldera License (without preamble)", "licenseId": "Caldera-no-preamble", "seeAlso": [ "https://github.com/apache/apr/blob/trunk/LICENSE#L298C6-L298C29" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CAPEC-tou.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAPEC-tou.json", "referenceNumber": 196, "name": "Common Attack Pattern Enumeration and Classification License", "licenseId": "CAPEC-tou", "seeAlso": [ "https://capec.mitre.org/about/termsofuse.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Catharon.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Catharon.json", "referenceNumber": 504, "name": "Catharon License", "licenseId": "Catharon", "seeAlso": [ "https://github.com/scummvm/scummvm/blob/v2.8.0/LICENSES/CatharonLicense.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CATOSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", "referenceNumber": 2, "name": "Computer Associates Trusted Open Source License 1.1", "licenseId": "CATOSL-1.1", "seeAlso": [ "https://opensource.org/licenses/CATOSL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CC-BY-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", "referenceNumber": 58, "name": "Creative Commons Attribution 1.0 Generic", "licenseId": "CC-BY-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", "referenceNumber": 227, "name": "Creative Commons Attribution 2.0 Generic", "licenseId": "CC-BY-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", "referenceNumber": 718, "name": "Creative Commons Attribution 2.5 Generic", "licenseId": "CC-BY-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-2.5-AU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5-AU.json", "referenceNumber": 613, "name": "Creative Commons Attribution 2.5 Australia", "licenseId": "CC-BY-2.5-AU", "seeAlso": [ "https://creativecommons.org/licenses/by/2.5/au/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", "referenceNumber": 114, "name": "Creative Commons Attribution 3.0 Unported", "licenseId": "CC-BY-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AT.json", "referenceNumber": 499, "name": "Creative Commons Attribution 3.0 Austria", "licenseId": "CC-BY-3.0-AT", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/at/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-AU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AU.json", "referenceNumber": 265, "name": "Creative Commons Attribution 3.0 Australia", "licenseId": "CC-BY-3.0-AU", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/au/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-DE.json", "referenceNumber": 10, "name": "Creative Commons Attribution 3.0 Germany", "licenseId": "CC-BY-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-IGO.json", "referenceNumber": 209, "name": "Creative Commons Attribution 3.0 IGO", "licenseId": "CC-BY-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/igo/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-NL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-NL.json", "referenceNumber": 584, "name": "Creative Commons Attribution 3.0 Netherlands", "licenseId": "CC-BY-3.0-NL", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/nl/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-US.json", "referenceNumber": 563, "name": "Creative Commons Attribution 3.0 United States", "licenseId": "CC-BY-3.0-US", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/us/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", "referenceNumber": 302, "name": "Creative Commons Attribution 4.0 International", "licenseId": "CC-BY-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CC-BY-NC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-1.0.json", "referenceNumber": 144, "name": "Creative Commons Attribution Non Commercial 1.0 Generic", "licenseId": "CC-BY-NC-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.0.json", "referenceNumber": 4, "name": "Creative Commons Attribution Non Commercial 2.0 Generic", "licenseId": "CC-BY-NC-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/2.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.5.json", "referenceNumber": 400, "name": "Creative Commons Attribution Non Commercial 2.5 Generic", "licenseId": "CC-BY-NC-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/2.5/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0.json", "referenceNumber": 637, "name": "Creative Commons Attribution Non Commercial 3.0 Unported", "licenseId": "CC-BY-NC-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/3.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.json", "referenceNumber": 37, "name": "Creative Commons Attribution Non Commercial 3.0 Germany", "licenseId": "CC-BY-NC-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-4.0.json", "referenceNumber": 535, "name": "Creative Commons Attribution Non Commercial 4.0 International", "licenseId": "CC-BY-NC-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.json", "referenceNumber": 288, "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", "licenseId": "CC-BY-NC-ND-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.json", "referenceNumber": 568, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", "licenseId": "CC-BY-NC-ND-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.json", "referenceNumber": 570, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", "licenseId": "CC-BY-NC-ND-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.json", "referenceNumber": 329, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", "licenseId": "CC-BY-NC-ND-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.json", "referenceNumber": 234, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", "licenseId": "CC-BY-NC-ND-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.json", "referenceNumber": 311, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", "licenseId": "CC-BY-NC-ND-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/igo/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.json", "referenceNumber": 264, "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", "licenseId": "CC-BY-NC-ND-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.json", "referenceNumber": 359, "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", "licenseId": "CC-BY-NC-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.json", "referenceNumber": 17, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", "licenseId": "CC-BY-NC-SA-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.json", "referenceNumber": 441, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Germany", "licenseId": "CC-BY-NC-SA-2.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.json", "referenceNumber": 449, "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", "licenseId": "CC-BY-NC-SA-2.0-FR", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/fr/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.json", "referenceNumber": 93, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", "licenseId": "CC-BY-NC-SA-2.0-UK", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/uk/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.json", "referenceNumber": 137, "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", "licenseId": "CC-BY-NC-SA-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.json", "referenceNumber": 89, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", "licenseId": "CC-BY-NC-SA-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.json", "referenceNumber": 142, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", "licenseId": "CC-BY-NC-SA-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.json", "referenceNumber": 186, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", "licenseId": "CC-BY-NC-SA-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/igo/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.json", "referenceNumber": 714, "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", "licenseId": "CC-BY-NC-SA-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-1.0.json", "referenceNumber": 217, "name": "Creative Commons Attribution No Derivatives 1.0 Generic", "licenseId": "CC-BY-ND-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.0.json", "referenceNumber": 394, "name": "Creative Commons Attribution No Derivatives 2.0 Generic", "licenseId": "CC-BY-ND-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/2.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.5.json", "referenceNumber": 683, "name": "Creative Commons Attribution No Derivatives 2.5 Generic", "licenseId": "CC-BY-ND-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/2.5/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0.json", "referenceNumber": 597, "name": "Creative Commons Attribution No Derivatives 3.0 Unported", "licenseId": "CC-BY-ND-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/3.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.json", "referenceNumber": 74, "name": "Creative Commons Attribution No Derivatives 3.0 Germany", "licenseId": "CC-BY-ND-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-4.0.json", "referenceNumber": 245, "name": "Creative Commons Attribution No Derivatives 4.0 International", "licenseId": "CC-BY-ND-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-1.0.json", "referenceNumber": 140, "name": "Creative Commons Attribution Share Alike 1.0 Generic", "licenseId": "CC-BY-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0.json", "referenceNumber": 187, "name": "Creative Commons Attribution Share Alike 2.0 Generic", "licenseId": "CC-BY-SA-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.json", "referenceNumber": 383, "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", "licenseId": "CC-BY-SA-2.0-UK", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.0/uk/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.json", "referenceNumber": 345, "name": "Creative Commons Attribution Share Alike 2.1 Japan", "licenseId": "CC-BY-SA-2.1-JP", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.5.json", "referenceNumber": 706, "name": "Creative Commons Attribution Share Alike 2.5 Generic", "licenseId": "CC-BY-SA-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0.json", "referenceNumber": 520, "name": "Creative Commons Attribution Share Alike 3.0 Unported", "licenseId": "CC-BY-SA-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.json", "referenceNumber": 561, "name": "Creative Commons Attribution Share Alike 3.0 Austria", "licenseId": "CC-BY-SA-3.0-AT", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/at/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.json", "referenceNumber": 398, "name": "Creative Commons Attribution Share Alike 3.0 Germany", "licenseId": "CC-BY-SA-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.json", "referenceNumber": 112, "name": "Creative Commons Attribution-ShareAlike 3.0 IGO", "licenseId": "CC-BY-SA-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/igo/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-4.0.json", "referenceNumber": 138, "name": "Creative Commons Attribution Share Alike 4.0 International", "licenseId": "CC-BY-SA-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CC-PDDC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", "referenceNumber": 333, "name": "Creative Commons Public Domain Dedication and Certification", "licenseId": "CC-PDDC", "seeAlso": [ "https://creativecommons.org/licenses/publicdomain/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-PDM-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDM-1.0.json", "referenceNumber": 147, "name": "Creative Commons Public Domain Mark 1.0 Universal", "licenseId": "CC-PDM-1.0", "seeAlso": [ "https://creativecommons.org/publicdomain/mark/1.0/", "https://creativecommons.org/share-your-work/cclicenses/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-SA-1.0.json", "referenceNumber": 7, "name": "Creative Commons Share Alike 1.0 Generic", "licenseId": "CC-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/sa/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC0-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", "referenceNumber": 278, "name": "Creative Commons Zero v1.0 Universal", "licenseId": "CC0-1.0", "seeAlso": [ "https://creativecommons.org/publicdomain/zero/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", "referenceNumber": 548, "name": "Common Development and Distribution License 1.0", "licenseId": "CDDL-1.0", "seeAlso": [ "https://opensource.org/licenses/cddl1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CDDL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", "referenceNumber": 619, "name": "Common Development and Distribution License 1.1", "licenseId": "CDDL-1.1", "seeAlso": [ "http://glassfish.java.net/public/CDDL+GPL_1_1.html", "https://javaee.github.io/glassfish/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", "referenceNumber": 354, "name": "Common Documentation License 1.0", "licenseId": "CDL-1.0", "seeAlso": [ "http://www.opensource.apple.com/cdl/", "https://fedoraproject.org/wiki/Licensing/Common_Documentation_License", "https://www.gnu.org/licenses/license-list.html#ACDL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", "referenceNumber": 313, "name": "Community Data License Agreement Permissive 1.0", "licenseId": "CDLA-Permissive-1.0", "seeAlso": [ "https://cdla.io/permissive-1-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", "referenceNumber": 672, "name": "Community Data License Agreement Permissive 2.0", "licenseId": "CDLA-Permissive-2.0", "seeAlso": [ "https://cdla.dev/permissive-2-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", "referenceNumber": 176, "name": "Community Data License Agreement Sharing 1.0", "licenseId": "CDLA-Sharing-1.0", "seeAlso": [ "https://cdla.io/sharing-1-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", "referenceNumber": 155, "name": "CeCILL Free Software License Agreement v1.0", "licenseId": "CECILL-1.0", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", "referenceNumber": 455, "name": "CeCILL Free Software License Agreement v1.1", "licenseId": "CECILL-1.1", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", "referenceNumber": 197, "name": "CeCILL Free Software License Agreement v2.0", "licenseId": "CECILL-2.0", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CECILL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", "referenceNumber": 477, "name": "CeCILL Free Software License Agreement v2.1", "licenseId": "CECILL-2.1", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CECILL-B.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", "referenceNumber": 606, "name": "CeCILL-B Free Software License Agreement", "licenseId": "CECILL-B", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CECILL-C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", "referenceNumber": 136, "name": "CeCILL-C Free Software License Agreement", "licenseId": "CECILL-C", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", "referenceNumber": 341, "name": "CERN Open Hardware Licence v1.1", "licenseId": "CERN-OHL-1.1", "seeAlso": [ "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", "referenceNumber": 46, "name": "CERN Open Hardware Licence v1.2", "licenseId": "CERN-OHL-1.2", "seeAlso": [ "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CERN-OHL-P-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-P-2.0.json", "referenceNumber": 66, "name": "CERN Open Hardware Licence Version 2 - Permissive", "licenseId": "CERN-OHL-P-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CERN-OHL-S-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-S-2.0.json", "referenceNumber": 390, "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", "licenseId": "CERN-OHL-S-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CERN-OHL-W-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-W-2.0.json", "referenceNumber": 109, "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", "licenseId": "CERN-OHL-W-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CFITSIO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CFITSIO.json", "referenceNumber": 386, "name": "CFITSIO License", "licenseId": "CFITSIO", "seeAlso": [ "https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/f_user/node9.html", "https://heasarc.gsfc.nasa.gov/docs/software/ftools/fv/doc/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/check-cvs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/check-cvs.json", "referenceNumber": 353, "name": "check-cvs License", "licenseId": "check-cvs", "seeAlso": [ "http://cvs.savannah.gnu.org/viewvc/cvs/ccvs/contrib/check_cvs.in?revision\u003d1.1.4.3\u0026view\u003dmarkup\u0026pathrev\u003dcvs1-11-23#l2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/checkmk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/checkmk.json", "referenceNumber": 725, "name": "Checkmk License", "licenseId": "checkmk", "seeAlso": [ "https://github.com/libcheck/check/blob/master/checkmk/checkmk.in" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ClArtistic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", "referenceNumber": 99, "name": "Clarified Artistic License", "licenseId": "ClArtistic", "seeAlso": [ "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", "http://www.ncftp.com/ncftp/doc/LICENSE.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Clips.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Clips.json", "referenceNumber": 331, "name": "Clips License", "licenseId": "Clips", "seeAlso": [ "https://github.com/DrItanium/maya/blob/master/LICENSE.CLIPS" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CMU-Mach.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CMU-Mach.json", "referenceNumber": 689, "name": "CMU Mach License", "licenseId": "CMU-Mach", "seeAlso": [ "https://www.cs.cmu.edu/~410/licenses.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CMU-Mach-nodoc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CMU-Mach-nodoc.json", "referenceNumber": 426, "name": "CMU Mach - no notices-in-documentation variant", "licenseId": "CMU-Mach-nodoc", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L718-L728", "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CNRI-Jython.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", "referenceNumber": 125, "name": "CNRI Jython License", "licenseId": "CNRI-Jython", "seeAlso": [ "http://www.jython.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CNRI-Python.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", "referenceNumber": 291, "name": "CNRI Python License", "licenseId": "CNRI-Python", "seeAlso": [ "https://opensource.org/licenses/CNRI-Python" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", "referenceNumber": 170, "name": "CNRI Python Open Source GPL Compatible License Agreement", "licenseId": "CNRI-Python-GPL-Compatible", "seeAlso": [ "http://www.python.org/download/releases/1.6.1/download_win/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/COIL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", "referenceNumber": 395, "name": "Copyfree Open Innovation License", "licenseId": "COIL-1.0", "seeAlso": [ "https://coil.apotheon.org/plaintext/01.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Community-Spec-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", "referenceNumber": 720, "name": "Community Specification License 1.0", "licenseId": "Community-Spec-1.0", "seeAlso": [ "https://github.com/CommunitySpecification/1.0/blob/master/1._Community_Specification_License-v1.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Condor-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", "referenceNumber": 5, "name": "Condor Public License v1.1", "licenseId": "Condor-1.1", "seeAlso": [ "http://research.cs.wisc.edu/condor/license.html#condor", "http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/copyleft-next-0.3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.0.json", "referenceNumber": 248, "name": "copyleft-next 0.3.0", "licenseId": "copyleft-next-0.3.0", "seeAlso": [ "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/copyleft-next-0.3.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.1.json", "referenceNumber": 203, "name": "copyleft-next 0.3.1", "licenseId": "copyleft-next-0.3.1", "seeAlso": [ "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Cornell-Lossless-JPEG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cornell-Lossless-JPEG.json", "referenceNumber": 184, "name": "Cornell Lossless JPEG License", "licenseId": "Cornell-Lossless-JPEG", "seeAlso": [ "https://android.googlesource.com/platform/external/dng_sdk/+/refs/heads/master/source/dng_lossless_jpeg.cpp#16", "https://www.mssl.ucl.ac.uk/~mcrw/src/20050920/proto.h", "https://gitlab.freedesktop.org/libopenraw/libopenraw/blob/master/lib/ljpegdecompressor.cpp#L32" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CPAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", "referenceNumber": 266, "name": "Common Public Attribution License 1.0", "licenseId": "CPAL-1.0", "seeAlso": [ "https://opensource.org/licenses/CPAL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", "referenceNumber": 43, "name": "Common Public License 1.0", "licenseId": "CPL-1.0", "seeAlso": [ "https://opensource.org/licenses/CPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CPOL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", "referenceNumber": 275, "name": "Code Project Open License 1.02", "licenseId": "CPOL-1.02", "seeAlso": [ "http://www.codeproject.com/info/cpol10.aspx" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Cronyx.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cronyx.json", "referenceNumber": 309, "name": "Cronyx License", "licenseId": "Cronyx", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/font/alias/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/font/cronyx-cyrillic/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/font/misc-cyrillic/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/font/screen-cyrillic/-/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Crossword.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Crossword.json", "referenceNumber": 366, "name": "Crossword License", "licenseId": "Crossword", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Crossword" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CryptoSwift.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CryptoSwift.json", "referenceNumber": 255, "name": "CryptoSwift License", "licenseId": "CryptoSwift", "seeAlso": [ "https://github.com/krzyzanowskim/CryptoSwift/blob/main/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CrystalStacker.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", "referenceNumber": 609, "name": "CrystalStacker License", "licenseId": "CrystalStacker", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd\u003dLicensing/CrystalStacker" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", "referenceNumber": 708, "name": "CUA Office Public License v1.0", "licenseId": "CUA-OPL-1.0", "seeAlso": [ "https://opensource.org/licenses/CUA-OPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Cube.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cube.json", "referenceNumber": 292, "name": "Cube License", "licenseId": "Cube", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Cube" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/curl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/curl.json", "referenceNumber": 600, "name": "curl License", "licenseId": "curl", "seeAlso": [ "https://github.com/bagder/curl/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/cve-tou.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/cve-tou.json", "referenceNumber": 464, "name": "Common Vulnerability Enumeration ToU License", "licenseId": "cve-tou", "seeAlso": [ "https://www.cve.org/Legal/TermsOfUse" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/D-FSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/D-FSL-1.0.json", "referenceNumber": 128, "name": "Deutsche Freie Software Lizenz", "licenseId": "D-FSL-1.0", "seeAlso": [ "http://www.dipp.nrw.de/d-fsl/lizenzen/", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DEC-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DEC-3-Clause.json", "referenceNumber": 405, "name": "DEC 3-Clause License", "licenseId": "DEC-3-Clause", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L239" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/diffmark.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/diffmark.json", "referenceNumber": 90, "name": "diffmark license", "licenseId": "diffmark", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/diffmark" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DL-DE-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-BY-2.0.json", "referenceNumber": 162, "name": "Data licence Germany – attribution – version 2.0", "licenseId": "DL-DE-BY-2.0", "seeAlso": [ "https://www.govdata.de/dl-de/by-2-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DL-DE-ZERO-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-ZERO-2.0.json", "referenceNumber": 130, "name": "Data licence Germany – zero – version 2.0", "licenseId": "DL-DE-ZERO-2.0", "seeAlso": [ "https://www.govdata.de/dl-de/zero-2-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DOC.json", "referenceNumber": 501, "name": "DOC License", "licenseId": "DOC", "seeAlso": [ "http://www.cs.wustl.edu/~schmidt/ACE-copying.html", "https://www.dre.vanderbilt.edu/~schmidt/ACE-copying.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DocBook-DTD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DocBook-DTD.json", "referenceNumber": 110, "name": "DocBook DTD License", "licenseId": "DocBook-DTD", "seeAlso": [ "http://www.docbook.org/xml/simple/1.1/docbook-simple-1.1.zip" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DocBook-Schema.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DocBook-Schema.json", "referenceNumber": 335, "name": "DocBook Schema License", "licenseId": "DocBook-Schema", "seeAlso": [ "https://github.com/docbook/xslt10-stylesheets/blob/efd62655c11cc8773708df7a843613fa1e932bf8/xsl/assembly/schema/docbook51b7.rnc" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DocBook-Stylesheet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DocBook-Stylesheet.json", "referenceNumber": 431, "name": "DocBook Stylesheet License", "licenseId": "DocBook-Stylesheet", "seeAlso": [ "http://www.docbook.org/xml/5.0/docbook-5.0.zip" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DocBook-XML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DocBook-XML.json", "referenceNumber": 195, "name": "DocBook XML License", "licenseId": "DocBook-XML", "seeAlso": [ "https://github.com/docbook/xslt10-stylesheets/blob/efd62655c11cc8773708df7a843613fa1e932bf8/xsl/COPYING#L27" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Dotseqn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", "referenceNumber": 349, "name": "Dotseqn License", "licenseId": "Dotseqn", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Dotseqn" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DRL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", "referenceNumber": 648, "name": "Detection Rule License 1.0", "licenseId": "DRL-1.0", "seeAlso": [ "https://github.com/Neo23x0/sigma/blob/master/LICENSE.Detection.Rules.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DRL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.1.json", "referenceNumber": 318, "name": "Detection Rule License 1.1", "licenseId": "DRL-1.1", "seeAlso": [ "https://github.com/SigmaHQ/Detection-Rule-License/blob/6ec7fbde6101d101b5b5d1fcb8f9b69fbc76c04a/LICENSE.Detection.Rules.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DSDP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DSDP.json", "referenceNumber": 663, "name": "DSDP License", "licenseId": "DSDP", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/DSDP" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/dtoa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dtoa.json", "referenceNumber": 208, "name": "David M. Gay dtoa License", "licenseId": "dtoa", "seeAlso": [ "https://github.com/SWI-Prolog/swipl-devel/blob/master/src/os/dtoa.c", "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/stdlib/mprec.h;hb\u003dHEAD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/dvipdfm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", "referenceNumber": 621, "name": "dvipdfm License", "licenseId": "dvipdfm", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/dvipdfm" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ECL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", "referenceNumber": 634, "name": "Educational Community License v1.0", "licenseId": "ECL-1.0", "seeAlso": [ "https://opensource.org/licenses/ECL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/ECL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", "referenceNumber": 381, "name": "Educational Community License v2.0", "licenseId": "ECL-2.0", "seeAlso": [ "https://opensource.org/licenses/ECL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/eCos-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", "referenceNumber": 169, "name": "eCos license version 2.0", "licenseId": "eCos-2.0", "seeAlso": [ "https://www.gnu.org/licenses/ecos-license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", "referenceNumber": 458, "name": "Eiffel Forum License v1.0", "licenseId": "EFL-1.0", "seeAlso": [ "http://www.eiffel-nice.org/license/forum.txt", "https://opensource.org/licenses/EFL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/EFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", "referenceNumber": 51, "name": "Eiffel Forum License v2.0", "licenseId": "EFL-2.0", "seeAlso": [ "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", "https://opensource.org/licenses/EFL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/eGenix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eGenix.json", "referenceNumber": 488, "name": "eGenix.com Public License 1.1.0", "licenseId": "eGenix", "seeAlso": [ "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", "https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Elastic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Elastic-2.0.json", "referenceNumber": 710, "name": "Elastic License 2.0", "licenseId": "Elastic-2.0", "seeAlso": [ "https://www.elastic.co/licensing/elastic-license", "https://github.com/elastic/elasticsearch/blob/master/licenses/ELASTIC-LICENSE-2.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Entessa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Entessa.json", "referenceNumber": 69, "name": "Entessa Public License v1.0", "licenseId": "Entessa", "seeAlso": [ "https://opensource.org/licenses/Entessa" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/EPICS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPICS.json", "referenceNumber": 413, "name": "EPICS Open License", "licenseId": "EPICS", "seeAlso": [ "https://epics.anl.gov/license/open.php" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", "referenceNumber": 566, "name": "Eclipse Public License 1.0", "licenseId": "EPL-1.0", "seeAlso": [ "http://www.eclipse.org/legal/epl-v10.html", "https://opensource.org/licenses/EPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", "referenceNumber": 115, "name": "Eclipse Public License 2.0", "licenseId": "EPL-2.0", "seeAlso": [ "https://www.eclipse.org/legal/epl-2.0", "https://www.opensource.org/licenses/EPL-2.0", "https://www.eclipse.org/legal/epl-v20.html", "https://projects.eclipse.org/license/epl-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ErlPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", "referenceNumber": 305, "name": "Erlang Public License v1.1", "licenseId": "ErlPL-1.1", "seeAlso": [ "http://www.erlang.org/EPLICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ESA-PL-permissive-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ESA-PL-permissive-2.4.json", "referenceNumber": 593, "name": "European Space Agency Public License – v2.4 – Permissive (Type 3)", "licenseId": "ESA-PL-permissive-2.4", "seeAlso": [ "https://essr.esa.int/license/european-space-agency-public-license-v2-4-permissive-type-3" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ESA-PL-strong-copyleft-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ESA-PL-strong-copyleft-2.4.json", "referenceNumber": 476, "name": "European Space Agency Public License (ESA-PL) - V2.4 - Strong Copyleft (Type 1)", "licenseId": "ESA-PL-strong-copyleft-2.4", "seeAlso": [ "https://essr.esa.int/license/european-space-agency-public-license-v2-4-strong-copyleft-type-1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ESA-PL-weak-copyleft-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ESA-PL-weak-copyleft-2.4.json", "referenceNumber": 636, "name": "European Space Agency Public License – v2.4 – Weak Copyleft (Type 2)", "licenseId": "ESA-PL-weak-copyleft-2.4", "seeAlso": [ "https://essr.esa.int/license/european-space-agency-public-license-v2-4-weak-copyleft-type-2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/etalab-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", "referenceNumber": 703, "name": "Etalab Open License 2.0", "licenseId": "etalab-2.0", "seeAlso": [ "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", "https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUDatagrid.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", "referenceNumber": 148, "name": "EU DataGrid Software License", "licenseId": "EUDatagrid", "seeAlso": [ "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", "https://opensource.org/licenses/EUDatagrid" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EUPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", "referenceNumber": 480, "name": "European Union Public License 1.0", "licenseId": "EUPL-1.0", "seeAlso": [ "http://ec.europa.eu/idabc/en/document/7330.html", "http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id\u003d31096" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", "referenceNumber": 221, "name": "European Union Public License 1.1", "licenseId": "EUPL-1.1", "seeAlso": [ "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf", "https://opensource.org/licenses/EUPL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EUPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", "referenceNumber": 532, "name": "European Union Public License 1.2", "licenseId": "EUPL-1.2", "seeAlso": [ "https://joinup.ec.europa.eu/page/eupl-text-11-12", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/2020-03/EUPL-1.2%20EN.txt", "https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt", "http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri\u003dCELEX:32017D0863", "https://opensource.org/licenses/EUPL-1.2" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Eurosym.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Eurosym.json", "referenceNumber": 26, "name": "Eurosym License", "licenseId": "Eurosym", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Eurosym" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Fair.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fair.json", "referenceNumber": 591, "name": "Fair License", "licenseId": "Fair", "seeAlso": [ "https://web.archive.org/web/20150926120323/http://fairlicense.org/", "https://opensource.org/licenses/Fair" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/FBM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FBM.json", "referenceNumber": 549, "name": "Fuzzy Bitmap License", "licenseId": "FBM", "seeAlso": [ "https://github.com/SWI-Prolog/packages-xpce/blob/161a40cd82004f731ba48024f9d30af388a7edf5/src/img/gifwrite.c#L21-L26" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FDK-AAC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", "referenceNumber": 219, "name": "Fraunhofer FDK AAC Codec Library", "licenseId": "FDK-AAC", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FDK-AAC", "https://directory.fsf.org/wiki/License:Fdk" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Ferguson-Twofish.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ferguson-Twofish.json", "referenceNumber": 466, "name": "Ferguson Twofish License", "licenseId": "Ferguson-Twofish", "seeAlso": [ "https://github.com/wernerd/ZRTPCPP/blob/6b3cd8e6783642292bad0c21e3e5e5ce45ff3e03/cryptcommon/twofish.c#L113C3-L127" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Frameworx-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", "referenceNumber": 414, "name": "Frameworx Open License 1.0", "licenseId": "Frameworx-1.0", "seeAlso": [ "https://opensource.org/licenses/Frameworx-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/FreeBSD-DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", "referenceNumber": 451, "name": "FreeBSD Documentation License", "licenseId": "FreeBSD-DOC", "seeAlso": [ "https://www.freebsd.org/copyright/freebsd-doc-license/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FreeImage.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeImage.json", "referenceNumber": 416, "name": "FreeImage Public License v1.0", "licenseId": "FreeImage", "seeAlso": [ "http://freeimage.sourceforge.net/freeimage-license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFAP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP.json", "referenceNumber": 719, "name": "FSF All Permissive License", "licenseId": "FSFAP", "seeAlso": [ "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.json", "referenceNumber": 375, "name": "FSF All Permissive License (without Warranty)", "licenseId": "FSFAP-no-warranty-disclaimer", "seeAlso": [ "https://git.savannah.gnu.org/cgit/wget.git/tree/util/trunc.c?h\u003dv1.21.3\u0026id\u003d40747a11e44ced5a8ac628a41f879ced3e2ebce9#n6" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFUL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFUL.json", "referenceNumber": 53, "name": "FSF Unlimited License", "licenseId": "FSFUL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFULLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", "referenceNumber": 629, "name": "FSF Unlimited License (with License Retention)", "licenseId": "FSFULLR", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFULLRSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLRSD.json", "referenceNumber": 625, "name": "FSF Unlimited License (with License Retention and Short Disclaimer)", "licenseId": "FSFULLRSD", "seeAlso": [ "https://git.savannah.gnu.org/cgit/gnulib.git/tree/modules/COPYING?id\u003d7b08932179d0d6b017f7df01a2ddf6e096b038e3" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFULLRWD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLRWD.json", "referenceNumber": 116, "name": "FSF Unlimited License (With License Retention and Warranty Disclaimer)", "licenseId": "FSFULLRWD", "seeAlso": [ "https://lists.gnu.org/archive/html/autoconf/2012-04/msg00061.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSL-1.1-ALv2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSL-1.1-ALv2.json", "referenceNumber": 534, "name": "Functional Source License, Version 1.1, ALv2 Future License", "licenseId": "FSL-1.1-ALv2", "seeAlso": [ "https://fsl.software/FSL-1.1-ALv2.template.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSL-1.1-MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSL-1.1-MIT.json", "referenceNumber": 65, "name": "Functional Source License, Version 1.1, MIT Future License", "licenseId": "FSL-1.1-MIT", "seeAlso": [ "https://fsl.software/FSL-1.1-MIT.template.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FTL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FTL.json", "referenceNumber": 618, "name": "Freetype Project License", "licenseId": "FTL", "seeAlso": [ "http://freetype.fis.uniroma2.it/FTL.TXT", "http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT", "http://gitlab.freedesktop.org/freetype/freetype/-/raw/master/docs/FTL.TXT" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Furuseth.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Furuseth.json", "referenceNumber": 18, "name": "Furuseth License", "licenseId": "Furuseth", "seeAlso": [ "https://git.openldap.org/openldap/openldap/-/blob/master/COPYRIGHT?ref_type\u003dheads#L39-51" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/fwlw.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/fwlw.json", "referenceNumber": 484, "name": "fwlw License", "licenseId": "fwlw", "seeAlso": [ "https://mirrors.nic.cz/tex-archive/macros/latex/contrib/fwlw/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Game-Programming-Gems.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Game-Programming-Gems.json", "referenceNumber": 588, "name": "Game Programming Gems License", "licenseId": "Game-Programming-Gems", "seeAlso": [ "https://github.com/OGRECave/ogre/blob/master/OgreMain/include/OgreSingleton.h#L28C3-L35C46" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GCR-docs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GCR-docs.json", "referenceNumber": 410, "name": "Gnome GCR Documentation License", "licenseId": "GCR-docs", "seeAlso": [ "https://github.com/GNOME/gcr/blob/master/docs/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GD.json", "referenceNumber": 667, "name": "GD License", "licenseId": "GD", "seeAlso": [ "https://libgd.github.io/manuals/2.3.0/files/license-txt.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/generic-xts.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/generic-xts.json", "referenceNumber": 698, "name": "Generic XTS License", "licenseId": "generic-xts", "seeAlso": [ "https://github.com/mhogomchungu/zuluCrypt/blob/master/external_libraries/tcplay/generic_xts.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", "referenceNumber": 595, "name": "GNU Free Documentation License v1.1", "licenseId": "GFDL-1.1", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-only.json", "referenceNumber": 285, "name": "GNU Free Documentation License v1.1 only - invariants", "licenseId": "GFDL-1.1-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.json", "referenceNumber": 586, "name": "GNU Free Documentation License v1.1 or later - invariants", "licenseId": "GFDL-1.1-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.json", "referenceNumber": 665, "name": "GNU Free Documentation License v1.1 only - no invariants", "licenseId": "GFDL-1.1-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json", "referenceNumber": 145, "name": "GNU Free Documentation License v1.1 or later - no invariants", "licenseId": "GFDL-1.1-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", "referenceNumber": 108, "name": "GNU Free Documentation License v1.1 only", "licenseId": "GFDL-1.1-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-or-later.json", "referenceNumber": 150, "name": "GNU Free Documentation License v1.1 or later", "licenseId": "GFDL-1.1-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.2.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", "referenceNumber": 517, "name": "GNU Free Documentation License v1.2", "licenseId": "GFDL-1.2", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-only.json", "referenceNumber": 406, "name": "GNU Free Documentation License v1.2 only - invariants", "licenseId": "GFDL-1.2-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.json", "referenceNumber": 515, "name": "GNU Free Documentation License v1.2 or later - invariants", "licenseId": "GFDL-1.2-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.json", "referenceNumber": 650, "name": "GNU Free Documentation License v1.2 only - no invariants", "licenseId": "GFDL-1.2-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json", "referenceNumber": 284, "name": "GNU Free Documentation License v1.2 or later - no invariants", "licenseId": "GFDL-1.2-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.2-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", "referenceNumber": 387, "name": "GNU Free Documentation License v1.2 only", "licenseId": "GFDL-1.2-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.2-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-or-later.json", "referenceNumber": 22, "name": "GNU Free Documentation License v1.2 or later", "licenseId": "GFDL-1.2-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.3.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", "referenceNumber": 467, "name": "GNU Free Documentation License v1.3", "licenseId": "GFDL-1.3", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-only.json", "referenceNumber": 371, "name": "GNU Free Documentation License v1.3 only - invariants", "licenseId": "GFDL-1.3-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.json", "referenceNumber": 623, "name": "GNU Free Documentation License v1.3 or later - invariants", "licenseId": "GFDL-1.3-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.json", "referenceNumber": 612, "name": "GNU Free Documentation License v1.3 only - no invariants", "licenseId": "GFDL-1.3-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json", "referenceNumber": 361, "name": "GNU Free Documentation License v1.3 or later - no invariants", "licenseId": "GFDL-1.3-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.3-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", "referenceNumber": 470, "name": "GNU Free Documentation License v1.3 only", "licenseId": "GFDL-1.3-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.3-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-or-later.json", "referenceNumber": 475, "name": "GNU Free Documentation License v1.3 or later", "licenseId": "GFDL-1.3-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Giftware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Giftware.json", "referenceNumber": 178, "name": "Giftware License", "licenseId": "Giftware", "seeAlso": [ "http://liballeg.org/license.html#allegro-4-the-giftware-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GL2PS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GL2PS.json", "referenceNumber": 660, "name": "GL2PS License", "licenseId": "GL2PS", "seeAlso": [ "http://www.geuz.org/gl2ps/COPYING.GL2PS" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Glide.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glide.json", "referenceNumber": 428, "name": "3dfx Glide License", "licenseId": "Glide", "seeAlso": [ "http://www.users.on.net/~triforce/glidexp/COPYING.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Glulxe.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glulxe.json", "referenceNumber": 100, "name": "Glulxe License", "licenseId": "Glulxe", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Glulxe" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GLWTPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", "referenceNumber": 271, "name": "Good Luck With That Public License", "licenseId": "GLWTPL", "seeAlso": [ "https://github.com/me-shaon/GLWTPL/commit/da5f6bc734095efbacb442c0b31e33a65b9d6e85" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/gnuplot.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnuplot.json", "referenceNumber": 94, "name": "gnuplot License", "licenseId": "gnuplot", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Gnuplot" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", "referenceNumber": 268, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", "referenceNumber": 27, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", "referenceNumber": 340, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-or-later.json", "referenceNumber": 494, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", "referenceNumber": 122, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", "referenceNumber": 651, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", "referenceNumber": 585, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt", "https://opensource.org/licenses/GPL-2.0", "https://github.com/openjdk/jdk/blob/6162e2c5213c5dd7c1127fd9616b543efa898962/LICENSE" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-or-later.json", "referenceNumber": 544, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0", "https://github.com/openjdk/jdk/blob/6162e2c5213c5dd7c1127fd9616b543efa898962/LICENSE" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json", "referenceNumber": 705, "name": "GNU General Public License v2.0 w/Autoconf exception", "licenseId": "GPL-2.0-with-autoconf-exception", "seeAlso": [ "http://ac-archive.sourceforge.net/doc/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.json", "referenceNumber": 222, "name": "GNU General Public License v2.0 w/Bison exception", "licenseId": "GPL-2.0-with-bison-exception", "seeAlso": [ "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.json", "referenceNumber": 279, "name": "GNU General Public License v2.0 w/Classpath exception", "licenseId": "GPL-2.0-with-classpath-exception", "seeAlso": [ "https://www.gnu.org/software/classpath/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-2.0-with-font-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-font-exception.json", "referenceNumber": 641, "name": "GNU General Public License v2.0 w/Font exception", "licenseId": "GPL-2.0-with-font-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.html#FontException" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.json", "referenceNumber": 519, "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", "licenseId": "GPL-2.0-with-GCC-exception", "seeAlso": [ "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", "referenceNumber": 397, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", "referenceNumber": 528, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0+", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", "referenceNumber": 518, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-or-later.json", "referenceNumber": 152, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json", "referenceNumber": 557, "name": "GNU General Public License v3.0 w/Autoconf exception", "licenseId": "GPL-3.0-with-autoconf-exception", "seeAlso": [ "https://www.gnu.org/licenses/autoconf-exception-3.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.json", "referenceNumber": 241, "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", "licenseId": "GPL-3.0-with-GCC-exception", "seeAlso": [ "https://www.gnu.org/licenses/gcc-exception-3.1.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Graphics-Gems.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Graphics-Gems.json", "referenceNumber": 30, "name": "Graphics Gems License", "licenseId": "Graphics-Gems", "seeAlso": [ "https://github.com/erich666/GraphicsGems/blob/master/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/gSOAP-1.3b.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", "referenceNumber": 98, "name": "gSOAP Public License v1.3b", "licenseId": "gSOAP-1.3b", "seeAlso": [ "http://www.cs.fsu.edu/~engelen/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/gtkbook.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gtkbook.json", "referenceNumber": 554, "name": "gtkbook License", "licenseId": "gtkbook", "seeAlso": [ "https://github.com/slogan621/gtkbook", "https://github.com/oetiker/rrdtool-1.x/blob/master/src/plbasename.c#L8-L11" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Gutmann.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Gutmann.json", "referenceNumber": 430, "name": "Gutmann License", "licenseId": "Gutmann", "seeAlso": [ "https://www.cs.auckland.ac.nz/~pgut001/dumpasn1.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HaskellReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", "referenceNumber": 524, "name": "Haskell Language Report License", "licenseId": "HaskellReport", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HDF5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HDF5.json", "referenceNumber": 273, "name": "HDF5 License", "licenseId": "HDF5", "seeAlso": [ "https://github.com/HDFGroup/hdf5/?tab\u003dLicense-1-ov-file#readme" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/hdparm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/hdparm.json", "referenceNumber": 701, "name": "hdparm License", "licenseId": "hdparm", "seeAlso": [ "https://github.com/Distrotech/hdparm/blob/4517550db29a91420fb2b020349523b1b4512df2/LICENSE.TXT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HIDAPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HIDAPI.json", "referenceNumber": 478, "name": "HIDAPI License", "licenseId": "HIDAPI", "seeAlso": [ "https://github.com/signal11/hidapi/blob/master/LICENSE-orig.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Hippocratic-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", "referenceNumber": 129, "name": "Hippocratic License 2.1", "licenseId": "Hippocratic-2.1", "seeAlso": [ "https://firstdonoharm.dev/version/2/1/license.html", "https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HP-1986.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1986.json", "referenceNumber": 415, "name": "Hewlett-Packard 1986 License", "licenseId": "HP-1986", "seeAlso": [ "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/machine/hppa/memchr.S;h\u003d1cca3e5e8867aa4bffef1f75a5c1bba25c0c441e;hb\u003dHEAD#l2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HP-1989.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1989.json", "referenceNumber": 527, "name": "Hewlett-Packard 1989 License", "licenseId": "HP-1989", "seeAlso": [ "https://github.com/bleargh45/Data-UUID/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND.json", "referenceNumber": 269, "name": "Historical Permission Notice and Disclaimer", "licenseId": "HPND", "seeAlso": [ "https://opensource.org/licenses/HPND", "http://lists.opensource.org/pipermail/license-discuss_lists.opensource.org/2002-November/006304.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/HPND-DEC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-DEC.json", "referenceNumber": 368, "name": "Historical Permission Notice and Disclaimer - DEC variant", "licenseId": "HPND-DEC", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/app/xkbcomp/-/blob/master/COPYING?ref_type\u003dheads#L69" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-doc.json", "referenceNumber": 106, "name": "Historical Permission Notice and Disclaimer - documentation variant", "licenseId": "HPND-doc", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/lib/libxext/-/blob/master/COPYING?ref_type\u003dheads#L185-197", "https://gitlab.freedesktop.org/xorg/lib/libxtst/-/blob/master/COPYING?ref_type\u003dheads#L70-77" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-doc-sell.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-doc-sell.json", "referenceNumber": 158, "name": "Historical Permission Notice and Disclaimer - documentation sell variant", "licenseId": "HPND-doc-sell", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/lib/libxtst/-/blob/master/COPYING?ref_type\u003dheads#L108-117", "https://gitlab.freedesktop.org/xorg/lib/libxext/-/blob/master/COPYING?ref_type\u003dheads#L153-162" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-export-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US.json", "referenceNumber": 41, "name": "HPND with US Government export control warning", "licenseId": "HPND-export-US", "seeAlso": [ "https://www.kermitproject.org/ck90.html#source" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-export-US-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US-acknowledgement.json", "referenceNumber": 723, "name": "HPND with US Government export control warning and acknowledgment", "licenseId": "HPND-export-US-acknowledgement", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L831-L852", "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-export-US-modify.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US-modify.json", "referenceNumber": 97, "name": "HPND with US Government export control warning and modification rqmt", "licenseId": "HPND-export-US-modify", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L1157-L1182", "https://github.com/pythongssapi/k5test/blob/v0.10.3/K5TEST-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-export2-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export2-US.json", "referenceNumber": 281, "name": "HPND with US Government export control and 2 disclaimers", "licenseId": "HPND-export2-US", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L111-L133", "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Fenneberg-Livingston.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Fenneberg-Livingston.json", "referenceNumber": 596, "name": "Historical Permission Notice and Disclaimer - Fenneberg-Livingston variant", "licenseId": "HPND-Fenneberg-Livingston", "seeAlso": [ "https://github.com/FreeRADIUS/freeradius-client/blob/master/COPYRIGHT#L32", "https://github.com/radcli/radcli/blob/master/COPYRIGHT#L34" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-INRIA-IMAG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-INRIA-IMAG.json", "referenceNumber": 320, "name": "Historical Permission Notice and Disclaimer - INRIA-IMAG variant", "licenseId": "HPND-INRIA-IMAG", "seeAlso": [ "https://github.com/ppp-project/ppp/blob/master/pppd/ipv6cp.c#L75-L83" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Intel.json", "referenceNumber": 662, "name": "Historical Permission Notice and Disclaimer - Intel variant", "licenseId": "HPND-Intel", "seeAlso": [ "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/machine/i960/memcpy.S;hb\u003dHEAD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Kevlin-Henney.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Kevlin-Henney.json", "referenceNumber": 500, "name": "Historical Permission Notice and Disclaimer - Kevlin Henney variant", "licenseId": "HPND-Kevlin-Henney", "seeAlso": [ "https://github.com/mruby/mruby/blob/83d12f8d52522cdb7c8cc46fad34821359f453e6/mrbgems/mruby-dir/src/Win/dirent.c#L127-L140" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Markus-Kuhn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Markus-Kuhn.json", "referenceNumber": 411, "name": "Historical Permission Notice and Disclaimer - Markus Kuhn variant", "licenseId": "HPND-Markus-Kuhn", "seeAlso": [ "https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c", "https://sourceware.org/git/?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dreadline/readline/support/wcwidth.c;h\u003d0f5ec995796f4813abbcf4972aec0378ab74722a;hb\u003dHEAD#l55" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-merchantability-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-merchantability-variant.json", "referenceNumber": 231, "name": "Historical Permission Notice and Disclaimer - merchantability variant", "licenseId": "HPND-merchantability-variant", "seeAlso": [ "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/misc/fini.c;hb\u003dHEAD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-MIT-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-MIT-disclaimer.json", "referenceNumber": 220, "name": "Historical Permission Notice and Disclaimer with MIT disclaimer", "licenseId": "HPND-MIT-disclaimer", "seeAlso": [ "https://metacpan.org/release/NLNETLABS/Net-DNS-SEC-1.22/source/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Netrek.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Netrek.json", "referenceNumber": 369, "name": "Historical Permission Notice and Disclaimer - Netrek variant", "licenseId": "HPND-Netrek", "seeAlso": [], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Pbmplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Pbmplus.json", "referenceNumber": 280, "name": "Historical Permission Notice and Disclaimer - Pbmplus variant", "licenseId": "HPND-Pbmplus", "seeAlso": [ "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/netpbm.c#l8" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.json", "referenceNumber": 724, "name": "Historical Permission Notice and Disclaimer - sell xserver variant with MIT disclaimer", "licenseId": "HPND-sell-MIT-disclaimer-xserver", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L1781" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-regexpr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-regexpr.json", "referenceNumber": 212, "name": "Historical Permission Notice and Disclaimer - sell regexpr variant", "licenseId": "HPND-sell-regexpr", "seeAlso": [ "https://gitlab.com/bacula-org/bacula/-/blob/Branch-11.0/bacula/LICENSE-FOSS?ref_type\u003dheads#L245" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", "referenceNumber": 3, "name": "Historical Permission Notice and Disclaimer - sell variant", "licenseId": "HPND-sell-variant", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h\u003dv4.19", "https://github.com/kfish/xsel/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-variant-critical-systems.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-critical-systems.json", "referenceNumber": 422, "name": "HPND - sell variant with safety critical systems clause", "licenseId": "HPND-sell-variant-critical-systems", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/driver/xf86-video-voodoo/-/blob/68a5b6d98ae34749cca889f4373b4043d00bfe6a/src/voodoo_dga.c#L12-33" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.json", "referenceNumber": 434, "name": "HPND sell variant with MIT disclaimer", "licenseId": "HPND-sell-variant-MIT-disclaimer", "seeAlso": [ "https://github.com/sigmavirus24/x11-ssh-askpass/blob/master/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer-rev.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer-rev.json", "referenceNumber": 107, "name": "HPND sell variant with MIT disclaimer - reverse", "licenseId": "HPND-sell-variant-MIT-disclaimer-rev", "seeAlso": [ "https://github.com/sigmavirus24/x11-ssh-askpass/blob/master/dynlist.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-SMC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-SMC.json", "referenceNumber": 365, "name": "Historical Permission Notice and Disclaimer - SMC variant", "licenseId": "HPND-SMC", "seeAlso": [ "https://docs.python.org/3/license.html#execution-tracing" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-UC.json", "referenceNumber": 652, "name": "Historical Permission Notice and Disclaimer - University of California variant", "licenseId": "HPND-UC", "seeAlso": [ "https://core.tcl-lang.org/tk/file?name\u003dcompat/unistd.h" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-UC-export-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-UC-export-US.json", "referenceNumber": 469, "name": "Historical Permission Notice and Disclaimer - University of California, US export warning", "licenseId": "HPND-UC-export-US", "seeAlso": [ "https://github.com/RTimothyEdwards/magic/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HTMLTIDY.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", "referenceNumber": 159, "name": "HTML Tidy License", "licenseId": "HTMLTIDY", "seeAlso": [ "https://github.com/htacg/tidy-html5/blob/next/README/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/hyphen-bulgarian.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/hyphen-bulgarian.json", "referenceNumber": 351, "name": "hyphen-bulgarian License", "licenseId": "hyphen-bulgarian", "seeAlso": [ "https://ctan.math.illinois.edu/systems/texlive/tlnet/archive/hyphen-bulgarian.tar.xz", "https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/blob/959538769bfad6a73bdf34275d46520ec0f9cbb5/COPYING#L176-185" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IBM-pibs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", "referenceNumber": 677, "name": "IBM PowerPC Initialization and Boot Software", "licenseId": "IBM-pibs", "seeAlso": [ "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003darch/powerpc/cpu/ppc4xx/miiphy.c;h\u003d297155fdafa064b955e53e9832de93bfb0cfb85b;hb\u003d9fab4bf4cc077c21e43941866f3f2c196f28670d" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ICU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ICU.json", "referenceNumber": 472, "name": "ICU License", "licenseId": "ICU", "seeAlso": [ "http://source.icu-project.org/repos/icu/icu/trunk/license.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/IEC-Code-Components-EULA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IEC-Code-Components-EULA.json", "referenceNumber": 552, "name": "IEC Code Components End-user licence agreement", "licenseId": "IEC-Code-Components-EULA", "seeAlso": [ "https://www.iec.ch/webstore/custserv/pdf/CC-EULA.pdf", "https://www.iec.ch/CCv1", "https://www.iec.ch/copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IJG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG.json", "referenceNumber": 180, "name": "Independent JPEG Group License", "licenseId": "IJG", "seeAlso": [ "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev\u003d1.2", "https://github.com/vstroebel/jpeg-encoder/blob/main/src/fdct.rs#L1-L72", "https://github.com/libjpeg-turbo/libjpeg-turbo/blob/main/README.ijg#L117-L161" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/IJG-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG-short.json", "referenceNumber": 254, "name": "Independent JPEG Group License - short", "licenseId": "IJG-short", "seeAlso": [ "https://sourceforge.net/p/xmedcon/code/ci/master/tree/libs/ljpg/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ImageMagick.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", "referenceNumber": 726, "name": "ImageMagick License", "licenseId": "ImageMagick", "seeAlso": [ "http://www.imagemagick.org/script/license.php" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/iMatix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/iMatix.json", "referenceNumber": 645, "name": "iMatix Standard Function Library Agreement", "licenseId": "iMatix", "seeAlso": [ "http://legacy.imatix.com/html/sfl/sfl4.htm#license" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Imlib2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Imlib2.json", "referenceNumber": 577, "name": "Imlib2 License", "licenseId": "Imlib2", "seeAlso": [ "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", "https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Info-ZIP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", "referenceNumber": 228, "name": "Info-ZIP License", "licenseId": "Info-ZIP", "seeAlso": [ "http://www.info-zip.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Inner-Net-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Inner-Net-2.0.json", "referenceNumber": 346, "name": "Inner Net License v2.0", "licenseId": "Inner-Net-2.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Inner_Net_License", "https://sourceware.org/git/?p\u003dglibc.git;a\u003dblob;f\u003dLICENSES;h\u003d530893b1dc9ea00755603c68fb36bd4fc38a7be8;hb\u003dHEAD#l207" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/InnoSetup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/InnoSetup.json", "referenceNumber": 312, "name": "Inno Setup License", "licenseId": "InnoSetup", "seeAlso": [ "https://github.com/jrsoftware/issrc/blob/HEAD/license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel.json", "referenceNumber": 127, "name": "Intel Open Source License", "licenseId": "Intel", "seeAlso": [ "https://opensource.org/licenses/Intel" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Intel-ACPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", "referenceNumber": 15, "name": "Intel ACPI Software License Agreement", "licenseId": "Intel-ACPI", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Interbase-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", "referenceNumber": 452, "name": "Interbase Public License v1.0", "licenseId": "Interbase-1.0", "seeAlso": [ "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPA.json", "referenceNumber": 225, "name": "IPA Font License", "licenseId": "IPA", "seeAlso": [ "https://opensource.org/licenses/IPA" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/IPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", "referenceNumber": 168, "name": "IBM Public License v1.0", "licenseId": "IPL-1.0", "seeAlso": [ "https://opensource.org/licenses/IPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ISC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC.json", "referenceNumber": 68, "name": "ISC License", "licenseId": "ISC", "seeAlso": [ "https://www.isc.org/licenses/", "https://www.isc.org/downloads/software-support-policy/isc-license/", "https://opensource.org/licenses/ISC" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ISC-Veillard.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC-Veillard.json", "referenceNumber": 358, "name": "ISC Veillard variant", "licenseId": "ISC-Veillard", "seeAlso": [ "https://raw.githubusercontent.com/GNOME/libxml2/4c2e7c651f6c2f0d1a74f350cbda95f7df3e7017/hash.c", "https://github.com/GNOME/libxml2/blob/master/dict.c", "https://sourceforge.net/p/ctrio/git/ci/master/tree/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ISO-permission.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISO-permission.json", "referenceNumber": 709, "name": "ISO permission notice", "licenseId": "ISO-permission", "seeAlso": [ "https://gitlab.com/agmartin/linuxdoc-tools/-/blob/master/iso-entities/COPYING?ref_type\u003dheads", "https://www.itu.int/ITU-T/formal-language/itu-t/t/t173/1997/ISOMHEG-sir.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Jam.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Jam.json", "referenceNumber": 486, "name": "Jam License", "licenseId": "Jam", "seeAlso": [ "https://www.boost.org/doc/libs/1_35_0/doc/html/jam.html", "https://web.archive.org/web/20160330173339/https://swarm.workshop.perforce.com/files/guest/perforce_software/jam/src/README" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/JasPer-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", "referenceNumber": 96, "name": "JasPer License", "licenseId": "JasPer-2.0", "seeAlso": [ "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/jove.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/jove.json", "referenceNumber": 615, "name": "Jove License", "licenseId": "jove", "seeAlso": [ "https://github.com/jonmacs/jove/blob/4_17/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JPL-image.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPL-image.json", "referenceNumber": 688, "name": "JPL Image Use Policy", "licenseId": "JPL-image", "seeAlso": [ "https://www.jpl.nasa.gov/jpl-image-use-policy" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JPNIC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPNIC.json", "referenceNumber": 81, "name": "Japan Network Information Center License", "licenseId": "JPNIC", "seeAlso": [ "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JSON.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JSON.json", "referenceNumber": 603, "name": "JSON License", "licenseId": "JSON", "seeAlso": [ "http://www.json.org/license.html" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Kastrup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kastrup.json", "referenceNumber": 299, "name": "Kastrup License", "licenseId": "Kastrup", "seeAlso": [ "https://ctan.math.utah.edu/ctan/tex-archive/macros/generic/kastrup/binhex.dtx" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Kazlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kazlib.json", "referenceNumber": 185, "name": "Kazlib License", "licenseId": "Kazlib", "seeAlso": [ "http://git.savannah.gnu.org/cgit/kazlib.git/tree/except.c?id\u003d0062df360c2d17d57f6af19b0e444c51feb99036" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Knuth-CTAN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Knuth-CTAN.json", "referenceNumber": 39, "name": "Knuth CTAN License", "licenseId": "Knuth-CTAN", "seeAlso": [ "https://ctan.org/license/knuth" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LAL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", "referenceNumber": 536, "name": "Licence Art Libre 1.2", "licenseId": "LAL-1.2", "seeAlso": [ "http://artlibre.org/licence/lal/licence-art-libre-12/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LAL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", "referenceNumber": 139, "name": "Licence Art Libre 1.3", "licenseId": "LAL-1.3", "seeAlso": [ "https://artlibre.org/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Latex2e.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e.json", "referenceNumber": 673, "name": "Latex2e License", "licenseId": "Latex2e", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Latex2e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Latex2e-translated-notice.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e-translated-notice.json", "referenceNumber": 373, "name": "Latex2e with translated notice permission", "licenseId": "Latex2e-translated-notice", "seeAlso": [ "https://git.savannah.gnu.org/cgit/indent.git/tree/doc/indent.texi?id\u003da74c6b4ee49397cf330b333da1042bffa60ed14f#n74" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Leptonica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Leptonica.json", "referenceNumber": 174, "name": "Leptonica License", "licenseId": "Leptonica", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Leptonica" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", "referenceNumber": 339, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", "referenceNumber": 270, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", "referenceNumber": 498, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-or-later.json", "referenceNumber": 343, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", "referenceNumber": 666, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", "referenceNumber": 423, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", "referenceNumber": 424, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-or-later.json", "referenceNumber": 496, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", "referenceNumber": 447, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", "referenceNumber": 628, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0+", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", "referenceNumber": 194, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-or-later.json", "referenceNumber": 523, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPLLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", "referenceNumber": 124, "name": "Lesser General Public License For Linguistic Resources", "licenseId": "LGPLLR", "seeAlso": [ "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Libpng.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libpng.json", "referenceNumber": 54, "name": "libpng License", "licenseId": "Libpng", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libpng-1.6.35.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-1.6.35.json", "referenceNumber": 325, "name": "PNG Reference Library License v1 (for libpng 0.5 through 1.6.35)", "licenseId": "libpng-1.6.35", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libpng-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", "referenceNumber": 250, "name": "PNG Reference Library version 2", "licenseId": "libpng-2.0", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libselinux-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", "referenceNumber": 664, "name": "libselinux public domain notice", "licenseId": "libselinux-1.0", "seeAlso": [ "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libtiff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libtiff.json", "referenceNumber": 461, "name": "libtiff License", "licenseId": "libtiff", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/libtiff" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libutil-David-Nugent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libutil-David-Nugent.json", "referenceNumber": 111, "name": "libutil David Nugent License", "licenseId": "libutil-David-Nugent", "seeAlso": [ "http://web.mit.edu/freebsd/head/lib/libutil/login_ok.3", "https://cgit.freedesktop.org/libbsd/tree/man/setproctitle.3bsd" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", "referenceNumber": 88, "name": "Licence Libre du Québec – Permissive version 1.1", "licenseId": "LiLiQ-P-1.1", "seeAlso": [ "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", "http://opensource.org/licenses/LiLiQ-P-1.1", "https://forge.gouv.qc.ca/licence/liliq-p/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", "referenceNumber": 540, "name": "Licence Libre du Québec – Réciprocité version 1.1", "licenseId": "LiLiQ-R-1.1", "seeAlso": [ "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-R-1.1", "https://forge.gouv.qc.ca/licence/liliq-p" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", "referenceNumber": 70, "name": "Licence Libre du Québec – Réciprocité forte version 1.1", "licenseId": "LiLiQ-Rplus-1.1", "seeAlso": [ "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-Rplus-1.1", "https://forge.gouv.qc.ca/licence/liliq-r+/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Linux-man-pages-1-para.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-1-para.json", "referenceNumber": 200, "name": "Linux man-pages - 1 paragraph", "licenseId": "Linux-man-pages-1-para", "seeAlso": [ "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/getcpu.2#n4" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", "referenceNumber": 417, "name": "Linux man-pages Copyleft", "licenseId": "Linux-man-pages-copyleft", "seeAlso": [ "https://www.kernel.org/doc/man-pages/licenses.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.json", "referenceNumber": 713, "name": "Linux man-pages Copyleft - 2 paragraphs", "licenseId": "Linux-man-pages-copyleft-2-para", "seeAlso": [ "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/move_pages.2#n5", "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/migrate_pages.2#n8" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.json", "referenceNumber": 438, "name": "Linux man-pages Copyleft Variant", "licenseId": "Linux-man-pages-copyleft-var", "seeAlso": [ "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/set_mempolicy.2#n5" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-OpenIB.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", "referenceNumber": 680, "name": "Linux Kernel Variant of OpenIB.org license", "licenseId": "Linux-OpenIB", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LOOP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LOOP.json", "referenceNumber": 201, "name": "Common Lisp LOOP License", "licenseId": "LOOP", "seeAlso": [ "https://gitlab.com/embeddable-common-lisp/ecl/-/blob/develop/src/lsp/loop.lsp", "http://git.savannah.gnu.org/cgit/gcl.git/tree/gcl/lsp/gcl_loop.lsp?h\u003dVersion_2_6_13pre", "https://sourceforge.net/p/sbcl/sbcl/ci/master/tree/src/code/loop.lisp", "https://github.com/cl-adams/adams/blob/master/LICENSE.md", "https://github.com/blakemcbride/eclipse-lisp/blob/master/lisp/loop.lisp", "https://gitlab.common-lisp.net/cmucl/cmucl/-/blob/master/src/code/loop.lisp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPD-document.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPD-document.json", "referenceNumber": 722, "name": "LPD Documentation License", "licenseId": "LPD-document", "seeAlso": [ "https://github.com/Cyan4973/xxHash/blob/dev/doc/xxhash_spec.md", "https://www.ietf.org/rfc/rfc1952.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", "referenceNumber": 308, "name": "Lucent Public License Version 1.0", "licenseId": "LPL-1.0", "seeAlso": [ "https://opensource.org/licenses/LPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LPL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", "referenceNumber": 581, "name": "Lucent Public License v1.02", "licenseId": "LPL-1.02", "seeAlso": [ "http://plan9.bell-labs.com/plan9/license.html", "https://opensource.org/licenses/LPL-1.02" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", "referenceNumber": 25, "name": "LaTeX Project Public License v1.0", "licenseId": "LPPL-1.0", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", "referenceNumber": 32, "name": "LaTeX Project Public License v1.1", "licenseId": "LPPL-1.1", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", "referenceNumber": 626, "name": "LaTeX Project Public License v1.2", "licenseId": "LPPL-1.2", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.3a.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", "referenceNumber": 76, "name": "LaTeX Project Public License v1.3a", "licenseId": "LPPL-1.3a", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-3a.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.3c.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", "referenceNumber": 526, "name": "LaTeX Project Public License v1.3c", "licenseId": "LPPL-1.3c", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-3c.txt", "https://opensource.org/licenses/LPPL-1.3c" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/lsof.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/lsof.json", "referenceNumber": 514, "name": "lsof License", "licenseId": "lsof", "seeAlso": [ "https://github.com/lsof-org/lsof/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.json", "referenceNumber": 78, "name": "Lucida Bitmap Fonts License", "licenseId": "Lucida-Bitmap-Fonts", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/font/bh-100dpi/-/blob/master/COPYING?ref_type\u003dheads" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.json", "referenceNumber": 11, "name": "LZMA SDK License (versions 9.11 to 9.20)", "licenseId": "LZMA-SDK-9.11-to-9.20", "seeAlso": [ "https://www.7-zip.org/sdk.html", "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LZMA-SDK-9.22.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.22.json", "referenceNumber": 482, "name": "LZMA SDK License (versions 9.22 and beyond)", "licenseId": "LZMA-SDK-9.22", "seeAlso": [ "https://www.7-zip.org/sdk.html", "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Mackerras-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mackerras-3-Clause.json", "referenceNumber": 653, "name": "Mackerras 3-Clause License", "licenseId": "Mackerras-3-Clause", "seeAlso": [ "https://github.com/ppp-project/ppp/blob/master/pppd/chap_ms.c#L6-L28" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Mackerras-3-Clause-acknowledgment.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mackerras-3-Clause-acknowledgment.json", "referenceNumber": 357, "name": "Mackerras 3-Clause - acknowledgment variant", "licenseId": "Mackerras-3-Clause-acknowledgment", "seeAlso": [ "https://github.com/ppp-project/ppp/blob/master/pppd/auth.c#L6-L28" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/magaz.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/magaz.json", "referenceNumber": 483, "name": "magaz License", "licenseId": "magaz", "seeAlso": [ "https://mirrors.nic.cz/tex-archive/macros/latex/contrib/magaz/magaz.tex", "https://mirrors.ctan.org/macros/latex/contrib/version/version.sty" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/mailprio.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mailprio.json", "referenceNumber": 290, "name": "mailprio License", "licenseId": "mailprio", "seeAlso": [ "https://fossies.org/linux/sendmail/contrib/mailprio" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MakeIndex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", "referenceNumber": 579, "name": "MakeIndex License", "licenseId": "MakeIndex", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MakeIndex" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/man2html.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/man2html.json", "referenceNumber": 207, "name": "man2html License", "licenseId": "man2html", "seeAlso": [ "http://primates.ximian.com/~flucifredi/man/man-1.6g.tar.gz", "https://github.com/hamano/man2html/blob/master/man2html.c", "https://docs.oracle.com/cd/E81115_01/html/E81116/licenses.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Martin-Birgmeier.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Martin-Birgmeier.json", "referenceNumber": 118, "name": "Martin Birgmeier License", "licenseId": "Martin-Birgmeier", "seeAlso": [ "https://github.com/Perl/perl5/blob/blead/util.c#L6136" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/McPhee-slideshow.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/McPhee-slideshow.json", "referenceNumber": 233, "name": "McPhee Slideshow License", "licenseId": "McPhee-slideshow", "seeAlso": [ "https://mirror.las.iastate.edu/tex-archive/graphics/metapost/contrib/macros/slideshow/slideshow.mp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/metamail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/metamail.json", "referenceNumber": 697, "name": "metamail License", "licenseId": "metamail", "seeAlso": [ "https://github.com/Dual-Life/mime-base64/blob/master/Base64.xs#L12" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Minpack.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Minpack.json", "referenceNumber": 223, "name": "Minpack License", "licenseId": "Minpack", "seeAlso": [ "http://www.netlib.org/minpack/disclaimer", "https://gitlab.com/libeigen/eigen/-/blob/master/COPYING.MINPACK" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIPS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIPS.json", "referenceNumber": 236, "name": "MIPS License", "licenseId": "MIPS", "seeAlso": [ "https://sourceware.org/cgit/binutils-gdb/tree/include/coff/sym.h#n11" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MirOS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MirOS.json", "referenceNumber": 12, "name": "The MirOS Licence", "licenseId": "MirOS", "seeAlso": [ "https://opensource.org/licenses/MirOS" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT.json", "referenceNumber": 516, "name": "MIT License", "licenseId": "MIT", "seeAlso": [ "https://opensource.org/license/mit/", "http://opensource.org/licenses/MIT" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MIT-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-0.json", "referenceNumber": 362, "name": "MIT No Attribution", "licenseId": "MIT-0", "seeAlso": [ "https://github.com/aws/mit-0", "https://romanrm.net/mit-zero", "https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MIT-advertising.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", "referenceNumber": 238, "name": "Enlightenment License (e16)", "licenseId": "MIT-advertising", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Click.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Click.json", "referenceNumber": 702, "name": "MIT Click License", "licenseId": "MIT-Click", "seeAlso": [ "https://github.com/kohler/t1utils/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-CMU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", "referenceNumber": 324, "name": "CMU License", "licenseId": "MIT-CMU", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT?rd\u003dLicensing/MIT#CMU_Style", "https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-enna.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", "referenceNumber": 553, "name": "enna License", "licenseId": "MIT-enna", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#enna" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-feh.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", "referenceNumber": 646, "name": "feh License", "licenseId": "MIT-feh", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#feh" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Festival.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Festival.json", "referenceNumber": 13, "name": "MIT Festival Variant", "licenseId": "MIT-Festival", "seeAlso": [ "https://github.com/festvox/flite/blob/master/COPYING", "https://github.com/festvox/speech_tools/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Khronos-old.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Khronos-old.json", "referenceNumber": 121, "name": "MIT Khronos - old variant", "licenseId": "MIT-Khronos-old", "seeAlso": [ "https://github.com/KhronosGroup/SPIRV-Cross/blob/main/LICENSES/LicenseRef-KhronosFreeUse.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", "referenceNumber": 151, "name": "MIT License Modern Variant", "licenseId": "MIT-Modern-Variant", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT#Modern_Variants", "https://ptolemy.berkeley.edu/copyright.htm", "https://pirlwww.lpl.arizona.edu/resources/guide/software/PerlTk/Tixlic.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MIT-open-group.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", "referenceNumber": 84, "name": "MIT Open Group variant", "licenseId": "MIT-open-group", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/app/iceauth/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xsetroot/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xauth/-/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-STK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-STK.json", "referenceNumber": 380, "name": "MIT-STK License", "licenseId": "MIT-STK", "seeAlso": [ "https://github.com/thestk/stk/blob/6aacd357d76250bb7da2b1ddf675651828784bbc/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-testregex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-testregex.json", "referenceNumber": 420, "name": "MIT testregex Variant", "licenseId": "MIT-testregex", "seeAlso": [ "https://github.com/dotnet/runtime/blob/55e1ac7c07df62c4108d4acedf78f77574470ce5/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/AttRegexTests.cs#L12-L28" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Wu.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Wu.json", "referenceNumber": 103, "name": "MIT Tom Wu Variant", "licenseId": "MIT-Wu", "seeAlso": [ "https://github.com/chromium/octane/blob/master/crypto.js" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MITNFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MITNFA.json", "referenceNumber": 656, "name": "MIT +no-false-attribs license", "licenseId": "MITNFA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MITNFA" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MMIXware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MMIXware.json", "referenceNumber": 75, "name": "MMIXware License", "licenseId": "MMIXware", "seeAlso": [ "https://gitlab.lrz.de/mmix/mmixware/-/blob/master/boilerplate.w" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MMPL-1.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MMPL-1.0.1.json", "referenceNumber": 681, "name": "Minecraft Mod Public License v1.0.1", "licenseId": "MMPL-1.0.1", "seeAlso": [ "https://github.com/BuildCraft/BuildCraft/blob/623d323b1868712f29f4a8b0979a02e8d1835131/LICENSE", "https://mod-buildcraft.com/MMPL-1.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Motosoto.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Motosoto.json", "referenceNumber": 205, "name": "Motosoto License", "licenseId": "Motosoto", "seeAlso": [ "https://opensource.org/licenses/Motosoto" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MPEG-SSG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPEG-SSG.json", "referenceNumber": 316, "name": "MPEG Software Simulation", "licenseId": "MPEG-SSG", "seeAlso": [ "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/converter/ppm/ppmtompeg/jrevdct.c#l1189" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/mpi-permissive.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpi-permissive.json", "referenceNumber": 700, "name": "mpi Permissive License", "licenseId": "mpi-permissive", "seeAlso": [ "https://sources.debian.org/src/openmpi/4.1.0-10/ompi/debuggers/msgq_interface.h/?hl\u003d19#L19" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/mpich2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpich2.json", "referenceNumber": 243, "name": "mpich2 License", "licenseId": "mpich2", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", "referenceNumber": 551, "name": "Mozilla Public License 1.0", "licenseId": "MPL-1.0", "seeAlso": [ "http://www.mozilla.org/MPL/MPL-1.0.html", "https://opensource.org/licenses/MPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", "referenceNumber": 460, "name": "Mozilla Public License 1.1", "licenseId": "MPL-1.1", "seeAlso": [ "http://www.mozilla.org/MPL/MPL-1.1.html", "https://opensource.org/licenses/MPL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", "referenceNumber": 657, "name": "Mozilla Public License 2.0", "licenseId": "MPL-2.0", "seeAlso": [ "https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json", "referenceNumber": 658, "name": "Mozilla Public License 2.0 (no copyleft exception)", "licenseId": "MPL-2.0-no-copyleft-exception", "seeAlso": [ "https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/mplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mplus.json", "referenceNumber": 686, "name": "mplus Font License", "licenseId": "mplus", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:Mplus?rd\u003dLicensing/mplus" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MS-LPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-LPL.json", "referenceNumber": 117, "name": "Microsoft Limited Public License", "licenseId": "MS-LPL", "seeAlso": [ "https://www.openhub.net/licenses/mslpl", "https://github.com/gabegundy/atlserver/blob/master/License.txt", "https://en.wikipedia.org/wiki/Shared_Source_Initiative#Microsoft_Limited_Public_License_(Ms-LPL)" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MS-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-PL.json", "referenceNumber": 29, "name": "Microsoft Public License", "licenseId": "MS-PL", "seeAlso": [ "http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-PL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MS-RL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-RL.json", "referenceNumber": 445, "name": "Microsoft Reciprocal License", "licenseId": "MS-RL", "seeAlso": [ "http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-RL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MTLL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MTLL.json", "referenceNumber": 8, "name": "Matrix Template Library License", "licenseId": "MTLL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MulanPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", "referenceNumber": 334, "name": "Mulan Permissive Software License, Version 1", "licenseId": "MulanPSL-1.0", "seeAlso": [ "https://license.coscl.org.cn/MulanPSL/", "https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MulanPSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", "referenceNumber": 419, "name": "Mulan Permissive Software License, Version 2", "licenseId": "MulanPSL-2.0", "seeAlso": [ "https://license.coscl.org.cn/MulanPSL2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Multics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Multics.json", "referenceNumber": 425, "name": "Multics License", "licenseId": "Multics", "seeAlso": [ "https://opensource.org/licenses/Multics" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Mup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mup.json", "referenceNumber": 485, "name": "Mup License", "licenseId": "Mup", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Mup" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NAIST-2003.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", "referenceNumber": 678, "name": "Nara Institute of Science and Technology License (2003)", "licenseId": "NAIST-2003", "seeAlso": [ "https://enterprise.dejacode.com/licenses/public/naist-2003/#license-text", "https://github.com/nodejs/node/blob/4a19cc8947b1bba2b2d27816ec3d0edf9b28e503/LICENSE#L343" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NASA-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", "referenceNumber": 297, "name": "NASA Open Source Agreement 1.3", "licenseId": "NASA-1.3", "seeAlso": [ "http://ti.arc.nasa.gov/opensource/nosa/", "https://opensource.org/licenses/NASA-1.3" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Naumen.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Naumen.json", "referenceNumber": 143, "name": "Naumen Public License", "licenseId": "Naumen", "seeAlso": [ "https://opensource.org/licenses/Naumen" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NBPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", "referenceNumber": 164, "name": "Net Boolean Public License v1", "licenseId": "NBPL-1.0", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d37b4b3f6cc4bf34e1d3dec61e69914b9819d8894" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NCBI-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCBI-PD.json", "referenceNumber": 617, "name": "NCBI Public Domain Notice", "licenseId": "NCBI-PD", "seeAlso": [ "https://github.com/ncbi/sra-tools/blob/e8e5b6af4edc460156ad9ce5902d0779cffbf685/LICENSE", "https://github.com/ncbi/datasets/blob/0ea4cd16b61e5b799d9cc55aecfa016d6c9bd2bf/LICENSE.md", "https://github.com/ncbi/gprobe/blob/de64d30fee8b4c4013094d7d3139ea89b5dd1ace/LICENSE", "https://github.com/ncbi/egapx/blob/08930b9dec0c69b2d1a05e5153c7b95ef0a3eb0f/LICENSE", "https://github.com/ncbi/datasets/blob/master/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NCGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCGL-UK-2.0.json", "referenceNumber": 627, "name": "Non-Commercial Government Licence", "licenseId": "NCGL-UK-2.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCL.json", "referenceNumber": 487, "name": "NCL Source Code License", "licenseId": "NCL", "seeAlso": [ "https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/modules/module-filter-chain/pffft.c?ref_type\u003dheads#L1-52" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NCSA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCSA.json", "referenceNumber": 471, "name": "University of Illinois/NCSA Open Source License", "licenseId": "NCSA", "seeAlso": [ "http://otm.illinois.edu/uiuc_openSource", "https://opensource.org/licenses/NCSA" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Net-SNMP.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", "referenceNumber": 28, "name": "Net-SNMP License", "licenseId": "Net-SNMP", "seeAlso": [ "http://net-snmp.sourceforge.net/about/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NetCDF.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NetCDF.json", "referenceNumber": 654, "name": "NetCDF license", "licenseId": "NetCDF", "seeAlso": [ "http://www.unidata.ucar.edu/software/netcdf/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Newsletr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Newsletr.json", "referenceNumber": 630, "name": "Newsletr License", "licenseId": "Newsletr", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Newsletr" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NGPL.json", "referenceNumber": 6, "name": "Nethack General Public License", "licenseId": "NGPL", "seeAlso": [ "https://opensource.org/licenses/NGPL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/ngrep.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ngrep.json", "referenceNumber": 282, "name": "ngrep License", "licenseId": "ngrep", "seeAlso": [ "https://github.com/jpr5/ngrep/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NICTA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NICTA-1.0.json", "referenceNumber": 632, "name": "NICTA Public Software License, Version 1.0", "licenseId": "NICTA-1.0", "seeAlso": [ "https://opensource.apple.com/source/mDNSResponder/mDNSResponder-320.10/mDNSPosix/nss_ReadMe.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", "referenceNumber": 670, "name": "NIST Public Domain Notice", "licenseId": "NIST-PD", "seeAlso": [ "https://github.com/tcheneau/simpleRPL/blob/e645e69e38dd4e3ccfeceb2db8cba05b7c2e0cd3/LICENSE.txt", "https://github.com/tcheneau/Routing/blob/f09f46fcfe636107f22f2c98348188a65a135d98/README.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", "referenceNumber": 465, "name": "NIST Public Domain Notice with license fallback", "licenseId": "NIST-PD-fallback", "seeAlso": [ "https://github.com/usnistgov/jsip/blob/59700e6926cbe96c5cdae897d9a7d2656b42abe3/LICENSE", "https://github.com/usnistgov/fipy/blob/86aaa5c2ba2c6f1be19593c5986071cf6568cc34/LICENSE.rst" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-PD-TNT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-TNT.json", "referenceNumber": 682, "name": "NIST Public Domain Notice TNT variant", "licenseId": "NIST-PD-TNT", "seeAlso": [ "https://math.nist.gov/tnt/download.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-Software.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-Software.json", "referenceNumber": 675, "name": "NIST Software License", "licenseId": "NIST-Software", "seeAlso": [ "https://github.com/open-quantum-safe/liboqs/blob/40b01fdbb270f8614fde30e65d30e9da18c02393/src/common/rand/rand_nist.c#L1-L15" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLOD-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", "referenceNumber": 56, "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", "licenseId": "NLOD-1.0", "seeAlso": [ "http://data.norge.no/nlod/en/1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLOD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", "referenceNumber": 175, "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", "licenseId": "NLOD-2.0", "seeAlso": [ "http://data.norge.no/nlod/en/2.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLPL.json", "referenceNumber": 647, "name": "No Limit Public License", "licenseId": "NLPL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/NLPL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Nokia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Nokia.json", "referenceNumber": 404, "name": "Nokia Open Source License", "licenseId": "Nokia", "seeAlso": [ "https://opensource.org/licenses/nokia" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NOSL.json", "referenceNumber": 237, "name": "Netizen Open Source License", "licenseId": "NOSL", "seeAlso": [ "http://bits.netizen.com.au/licenses/NOSL/nosl.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Noweb.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Noweb.json", "referenceNumber": 511, "name": "Noweb License", "licenseId": "Noweb", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Noweb" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", "referenceNumber": 582, "name": "Netscape Public License v1.0", "licenseId": "NPL-1.0", "seeAlso": [ "http://www.mozilla.org/MPL/NPL/1.0/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", "referenceNumber": 179, "name": "Netscape Public License v1.1", "licenseId": "NPL-1.1", "seeAlso": [ "http://www.mozilla.org/MPL/NPL/1.1/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NPOSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", "referenceNumber": 693, "name": "Non-Profit Open Software License 3.0", "licenseId": "NPOSL-3.0", "seeAlso": [ "https://opensource.org/licenses/NOSL3.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NRL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NRL.json", "referenceNumber": 35, "name": "NRL License", "licenseId": "NRL", "seeAlso": [ "http://web.mit.edu/network/isakmp/nrllicense.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NTIA-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTIA-PD.json", "referenceNumber": 510, "name": "NTIA Public Domain Notice", "licenseId": "NTIA-PD", "seeAlso": [ "https://raw.githubusercontent.com/NTIA/itm/refs/heads/master/LICENSE.md", "https://raw.githubusercontent.com/NTIA/scos-sensor/refs/heads/master/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NTP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP.json", "referenceNumber": 502, "name": "NTP License", "licenseId": "NTP", "seeAlso": [ "https://opensource.org/licenses/NTP" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NTP-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP-0.json", "referenceNumber": 690, "name": "NTP No Attribution", "licenseId": "NTP-0", "seeAlso": [ "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Nunit.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nunit.json", "referenceNumber": 569, "name": "Nunit License", "licenseId": "Nunit", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Nunit" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/O-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", "referenceNumber": 507, "name": "Open Use of Data Agreement v1.0", "licenseId": "O-UDA-1.0", "seeAlso": [ "https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md", "https://cdla.dev/open-use-of-data-agreement-v1-0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OAR.json", "referenceNumber": 242, "name": "OAR License", "licenseId": "OAR", "seeAlso": [ "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/string/strsignal.c;hb\u003dHEAD#l35" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OCCT-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", "referenceNumber": 283, "name": "Open CASCADE Technology Public License", "licenseId": "OCCT-PL", "seeAlso": [ "http://www.opencascade.com/content/occt-public-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OCLC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", "referenceNumber": 715, "name": "OCLC Research Public License 2.0", "licenseId": "OCLC-2.0", "seeAlso": [ "http://www.oclc.org/research/activities/software/license/v2final.htm", "https://opensource.org/licenses/OCLC-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/ODbL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", "referenceNumber": 481, "name": "Open Data Commons Open Database License v1.0", "licenseId": "ODbL-1.0", "seeAlso": [ "http://www.opendatacommons.org/licenses/odbl/1.0/", "https://opendatacommons.org/licenses/odbl/1-0/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ODC-By-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", "referenceNumber": 24, "name": "Open Data Commons Attribution License v1.0", "licenseId": "ODC-By-1.0", "seeAlso": [ "https://opendatacommons.org/licenses/by/1.0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFFIS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFFIS.json", "referenceNumber": 453, "name": "OFFIS License", "licenseId": "OFFIS", "seeAlso": [ "https://sourceforge.net/p/xmedcon/code/ci/master/tree/libs/dicom/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", "referenceNumber": 165, "name": "SIL Open Font License 1.0", "licenseId": "OFL-1.0", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OFL-1.0-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-no-RFN.json", "referenceNumber": 432, "name": "SIL Open Font License 1.0 with no Reserved Font Name", "licenseId": "OFL-1.0-no-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", "referenceNumber": 717, "name": "SIL Open Font License 1.0 with Reserved Font Name", "licenseId": "OFL-1.0-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", "referenceNumber": 639, "name": "SIL Open Font License 1.1", "licenseId": "OFL-1.1", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OFL-1.1-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-no-RFN.json", "referenceNumber": 260, "name": "SIL Open Font License 1.1 with no Reserved Font Name", "licenseId": "OFL-1.1-no-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", "referenceNumber": 547, "name": "SIL Open Font License 1.1 with Reserved Font Name", "licenseId": "OFL-1.1-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OGC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", "referenceNumber": 550, "name": "OGC Software License, Version 1.0", "licenseId": "OGC-1.0", "seeAlso": [ "https://www.ogc.org/ogc/software/1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", "referenceNumber": 643, "name": "Taiwan Open Government Data License, version 1.0", "licenseId": "OGDL-Taiwan-1.0", "seeAlso": [ "https://data.gov.tw/license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", "referenceNumber": 40, "name": "Open Government Licence - Canada", "licenseId": "OGL-Canada-2.0", "seeAlso": [ "https://open.canada.ca/en/open-government-licence-canada" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-UK-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", "referenceNumber": 34, "name": "Open Government Licence v1.0", "licenseId": "OGL-UK-1.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", "referenceNumber": 640, "name": "Open Government Licence v2.0", "licenseId": "OGL-UK-2.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", "referenceNumber": 473, "name": "Open Government Licence v3.0", "licenseId": "OGL-UK-3.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGTSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGTSL.json", "referenceNumber": 83, "name": "Open Group Test Suite License", "licenseId": "OGTSL", "seeAlso": [ "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", "https://opensource.org/licenses/OGTSL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLDAP-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", "referenceNumber": 389, "name": "Open LDAP Public License v1.1", "licenseId": "OLDAP-1.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d806557a5ad59804ef3a44d5abfbe91d706b0791f" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", "referenceNumber": 322, "name": "Open LDAP Public License v1.2", "licenseId": "OLDAP-1.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d42b0383c50c299977b5893ee695cf4e486fb0dc7" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", "referenceNumber": 20, "name": "Open LDAP Public License v1.3", "licenseId": "OLDAP-1.3", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003de5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", "referenceNumber": 699, "name": "Open LDAP Public License v1.4", "licenseId": "OLDAP-1.4", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dc9f95c2f3f2ffb5e0ae55fe7388af75547660941" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", "referenceNumber": 247, "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", "licenseId": "OLDAP-2.0", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcbf50f4e1185a21abd4c0a54d3f4341fe28f36ea" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", "referenceNumber": 59, "name": "Open LDAP Public License v2.0.1", "licenseId": "OLDAP-2.0.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db6d68acd14e51ca3aab4428bf26522aa74873f0e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", "referenceNumber": 694, "name": "Open LDAP Public License v2.1", "licenseId": "OLDAP-2.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db0d176738e96a0d3b9f85cb51e140a86f21be715" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", "referenceNumber": 587, "name": "Open LDAP Public License v2.2", "licenseId": "OLDAP-2.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d470b0c18ec67621c85881b2733057fecf4a1acc3" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", "referenceNumber": 49, "name": "Open LDAP Public License v2.2.1", "licenseId": "OLDAP-2.2.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d4bc786f34b50aa301be6f5600f58a980070f481e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", "referenceNumber": 608, "name": "Open LDAP Public License 2.2.2", "licenseId": "OLDAP-2.2.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003ddf2cc1e21eb7c160695f5b7cffd6296c151ba188" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", "referenceNumber": 307, "name": "Open LDAP Public License v2.3", "licenseId": "OLDAP-2.3", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dd32cf54a32d581ab475d23c810b0a7fbaf8d63c3" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", "referenceNumber": 16, "name": "Open LDAP Public License v2.4", "licenseId": "OLDAP-2.4", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcd1284c4a91a8a380d904eee68d1583f989ed386" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", "referenceNumber": 191, "name": "Open LDAP Public License v2.5", "licenseId": "OLDAP-2.5", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d6852b9d90022e8593c98205413380536b1b5a7cf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", "referenceNumber": 572, "name": "Open LDAP Public License v2.6", "licenseId": "OLDAP-2.6", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d1cae062821881f41b73012ba816434897abf4205" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.7.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", "referenceNumber": 163, "name": "Open LDAP Public License v2.7", "licenseId": "OLDAP-2.7", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d47c2415c1df81556eeb39be6cad458ef87c534a2" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", "referenceNumber": 491, "name": "Open LDAP Public License v2.8", "licenseId": "OLDAP-2.8", "seeAlso": [ "http://www.openldap.org/software/release/license.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLFL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLFL-1.3.json", "referenceNumber": 102, "name": "Open Logistics Foundation License Version 1.3", "licenseId": "OLFL-1.3", "seeAlso": [ "https://openlogisticsfoundation.org/licenses/", "https://opensource.org/license/olfl-1-3/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OML.json", "referenceNumber": 319, "name": "Open Market License", "licenseId": "OML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Open_Market_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenMDW-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenMDW-1.0.json", "referenceNumber": 202, "name": "OpenMDW License Agreement v1.0", "licenseId": "OpenMDW-1.0", "seeAlso": [ "https://raw.githubusercontent.com/OpenMDW/OpenMDW/refs/heads/main/1.0/LICENSE.openmdw", "https://openmdw.ai/license/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenPBS-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenPBS-2.3.json", "referenceNumber": 401, "name": "OpenPBS v2.3 Software License", "licenseId": "OpenPBS-2.3", "seeAlso": [ "https://github.com/adaptivecomputing/torque/blob/master/PBS_License.txt", "https://www.mcs.anl.gov/research/projects/openpbs/PBS_License.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenSSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", "referenceNumber": 350, "name": "OpenSSL License", "licenseId": "OpenSSL", "seeAlso": [ "http://www.openssl.org/source/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OpenSSL-standalone.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL-standalone.json", "referenceNumber": 317, "name": "OpenSSL License - standalone", "licenseId": "OpenSSL-standalone", "seeAlso": [ "https://library.netapp.com/ecm/ecm_download_file/ECMP1196395", "https://hstechdocs.helpsystems.com/manuals/globalscape/archive/cuteftp6/open_ssl_license_agreement.htm" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenVision.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenVision.json", "referenceNumber": 14, "name": "OpenVision License", "licenseId": "OpenVision", "seeAlso": [ "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L66-L98", "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html", "https://fedoraproject.org/wiki/Licensing:MIT#OpenVision_Variant" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", "referenceNumber": 605, "name": "Open Public License v1.0", "licenseId": "OPL-1.0", "seeAlso": [ "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", "https://fedoraproject.org/wiki/Licensing/Open_Public_License" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/OPL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-UK-3.0.json", "referenceNumber": 610, "name": "United Kingdom Open Parliament Licence v3.0", "licenseId": "OPL-UK-3.0", "seeAlso": [ "https://www.parliament.uk/site-information/copyright-parliament/open-parliament-licence/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OPUBL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", "referenceNumber": 55, "name": "Open Publication License v1.0", "licenseId": "OPUBL-1.0", "seeAlso": [ "http://opencontent.org/openpub/", "https://www.debian.org/opl", "https://www.ctan.org/license/opl" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSC-1.0.json", "referenceNumber": 267, "name": "OSC License 1.0", "licenseId": "OSC-1.0", "seeAlso": [ "https://opensource.org/license/osc-license-1-0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OSET-PL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", "referenceNumber": 206, "name": "OSET Public License version 2.1", "licenseId": "OSET-PL-2.1", "seeAlso": [ "http://www.osetfoundation.org/public-license", "https://opensource.org/licenses/OPL-2.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", "referenceNumber": 67, "name": "Open Software License 1.0", "licenseId": "OSL-1.0", "seeAlso": [ "https://opensource.org/licenses/OSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", "referenceNumber": 63, "name": "Open Software License 1.1", "licenseId": "OSL-1.1", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/OSL1.1" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", "referenceNumber": 388, "name": "Open Software License 2.0", "licenseId": "OSL-2.0", "seeAlso": [ "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", "referenceNumber": 87, "name": "Open Software License 2.1", "licenseId": "OSL-2.1", "seeAlso": [ "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", "https://opensource.org/licenses/OSL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", "referenceNumber": 92, "name": "Open Software License 3.0", "licenseId": "OSL-3.0", "seeAlso": [ "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", "https://opensource.org/licenses/OSL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSSP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSSP.json", "referenceNumber": 0, "name": "OSSP License", "licenseId": "OSSP", "seeAlso": [ "https://git.sr.ht/~nabijaczleweli/ossp-var" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PADL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PADL.json", "referenceNumber": 296, "name": "PADL License", "licenseId": "PADL", "seeAlso": [ "https://git.openldap.org/openldap/openldap/-/blob/master/libraries/libldap/os-local.c?ref_type\u003dheads#L19-23" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ParaType-Free-Font-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ParaType-Free-Font-1.3.json", "referenceNumber": 52, "name": "ParaType Free Font Licensing Agreement v1.3", "licenseId": "ParaType-Free-Font-1.3", "seeAlso": [ "https://web.archive.org/web/20161209023955/http://www.paratype.ru/public/pt_openlicense_eng.asp", "https://metadata.ftp-master.debian.org/changelogs//main/f/fonts-paratype/fonts-paratype_20181108-4_copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Parity-6.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", "referenceNumber": 556, "name": "The Parity Public License 6.0.0", "licenseId": "Parity-6.0.0", "seeAlso": [ "https://paritylicense.com/versions/6.0.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Parity-7.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", "referenceNumber": 676, "name": "The Parity Public License 7.0.0", "licenseId": "Parity-7.0.0", "seeAlso": [ "https://paritylicense.com/versions/7.0.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", "referenceNumber": 704, "name": "Open Data Commons Public Domain Dedication \u0026 License 1.0", "licenseId": "PDDL-1.0", "seeAlso": [ "http://opendatacommons.org/licenses/pddl/1.0/", "https://opendatacommons.org/licenses/pddl/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PHP-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", "referenceNumber": 522, "name": "PHP License v3.0", "licenseId": "PHP-3.0", "seeAlso": [ "http://www.php.net/license/3_0.txt", "https://opensource.org/licenses/PHP-3.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/PHP-3.01.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", "referenceNumber": 244, "name": "PHP License v3.01", "licenseId": "PHP-3.01", "seeAlso": [ "http://www.php.net/license/3_01.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Pixar.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Pixar.json", "referenceNumber": 293, "name": "Pixar License", "licenseId": "Pixar", "seeAlso": [ "https://github.com/PixarAnimationStudios/OpenSubdiv/raw/v3_5_0/LICENSE.txt", "https://graphics.pixar.com/opensubdiv/docs/license.html", "https://github.com/PixarAnimationStudios/OpenSubdiv/blob/v3_5_0/opensubdiv/version.cpp#L2-L22" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/pkgconf.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/pkgconf.json", "referenceNumber": 409, "name": "pkgconf License", "licenseId": "pkgconf", "seeAlso": [ "https://github.com/pkgconf/pkgconf/blob/master/cli/main.c#L8" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Plexus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Plexus.json", "referenceNumber": 47, "name": "Plexus Classworlds License", "licenseId": "Plexus", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/pnmstitch.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/pnmstitch.json", "referenceNumber": 462, "name": "pnmstitch License", "licenseId": "pnmstitch", "seeAlso": [ "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/editor/pnmstitch.c#l2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json", "referenceNumber": 64, "name": "PolyForm Noncommercial License 1.0.0", "licenseId": "PolyForm-Noncommercial-1.0.0", "seeAlso": [ "https://polyformproject.org/licenses/noncommercial/1.0.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json", "referenceNumber": 213, "name": "PolyForm Small Business License 1.0.0", "licenseId": "PolyForm-Small-Business-1.0.0", "seeAlso": [ "https://polyformproject.org/licenses/small-business/1.0.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PostgreSQL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", "referenceNumber": 79, "name": "PostgreSQL License", "licenseId": "PostgreSQL", "seeAlso": [ "http://www.postgresql.org/about/licence", "https://opensource.org/licenses/PostgreSQL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/PPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PPL.json", "referenceNumber": 211, "name": "Peer Production License", "licenseId": "PPL", "seeAlso": [ "https://wiki.p2pfoundation.net/Peer_Production_License", "http://www.networkcultures.org/_uploads/%233notebook_telekommunist.pdf" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/PSF-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", "referenceNumber": 558, "name": "Python Software Foundation License 2.0", "licenseId": "PSF-2.0", "seeAlso": [ "https://opensource.org/licenses/Python-2.0", "https://matplotlib.org/stable/project/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/psfrag.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psfrag.json", "referenceNumber": 215, "name": "psfrag License", "licenseId": "psfrag", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/psfrag" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/psutils.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psutils.json", "referenceNumber": 529, "name": "psutils License", "licenseId": "psutils", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/psutils" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Python-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", "referenceNumber": 160, "name": "Python License 2.0", "licenseId": "Python-2.0", "seeAlso": [ "https://opensource.org/licenses/Python-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Python-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.1.json", "referenceNumber": 321, "name": "Python License 2.0.1", "licenseId": "Python-2.0.1", "seeAlso": [ "https://www.python.org/download/releases/2.0.1/license/", "https://docs.python.org/3/license.html", "https://github.com/python/cpython/blob/main/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/python-ldap.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/python-ldap.json", "referenceNumber": 601, "name": "Python ldap License", "licenseId": "python-ldap", "seeAlso": [ "https://github.com/python-ldap/python-ldap/blob/main/LICENCE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Qhull.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qhull.json", "referenceNumber": 332, "name": "Qhull License", "licenseId": "Qhull", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Qhull" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/QPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", "referenceNumber": 450, "name": "Q Public License 1.0", "licenseId": "QPL-1.0", "seeAlso": [ "http://doc.qt.nokia.com/3.3/license.html", "https://opensource.org/licenses/QPL-1.0", "https://doc.qt.io/archives/3.3/license.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.json", "referenceNumber": 631, "name": "Q Public License 1.0 - INRIA 2004 variant", "licenseId": "QPL-1.0-INRIA-2004", "seeAlso": [ "https://github.com/maranget/hevea/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/radvd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/radvd.json", "referenceNumber": 298, "name": "radvd License", "licenseId": "radvd", "seeAlso": [ "https://github.com/radvd-project/radvd/blob/master/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Rdisc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Rdisc.json", "referenceNumber": 31, "name": "Rdisc License", "licenseId": "Rdisc", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Rdisc_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/RHeCos-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", "referenceNumber": 173, "name": "Red Hat eCos Public License v1.1", "licenseId": "RHeCos-1.1", "seeAlso": [ "http://ecos.sourceware.org/old-license.html" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/RPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", "referenceNumber": 497, "name": "Reciprocal Public License 1.1", "licenseId": "RPL-1.1", "seeAlso": [ "https://opensource.org/licenses/RPL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/RPL-1.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", "referenceNumber": 575, "name": "Reciprocal Public License 1.5", "licenseId": "RPL-1.5", "seeAlso": [ "https://opensource.org/licenses/RPL-1.5" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/RPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", "referenceNumber": 655, "name": "RealNetworks Public Source License v1.0", "licenseId": "RPSL-1.0", "seeAlso": [ "https://helixcommunity.org/content/rpsl", "https://opensource.org/licenses/RPSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/RSA-MD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", "referenceNumber": 303, "name": "RSA Message-Digest License", "licenseId": "RSA-MD", "seeAlso": [ "http://www.faqs.org/rfcs/rfc1321.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/RSCPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSCPL.json", "referenceNumber": 659, "name": "Ricoh Source Code Public License", "licenseId": "RSCPL", "seeAlso": [ "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", "https://opensource.org/licenses/RSCPL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Ruby.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby.json", "referenceNumber": 210, "name": "Ruby License", "licenseId": "Ruby", "seeAlso": [ "https://www.ruby-lang.org/en/about/license.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Ruby-pty.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby-pty.json", "referenceNumber": 306, "name": "Ruby pty extension license", "licenseId": "Ruby-pty", "seeAlso": [ "https://github.com/ruby/ruby/blob/9f6deaa6888a423720b4b127b5314f0ad26cc2e6/ext/pty/pty.c#L775-L786", "https://github.com/ruby/ruby/commit/0a64817fb80016030c03518fb9459f63c11605ea#diff-ef5fa30838d6d0cecad9e675cc50b24628cfe2cb277c346053fafcc36c91c204", "https://github.com/ruby/ruby/commit/0a64817fb80016030c03518fb9459f63c11605ea#diff-fedf217c1ce44bda01f0a678d3ff8b198bed478754d699c527a698ad933979a0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SAX-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", "referenceNumber": 149, "name": "Sax Public Domain Notice", "licenseId": "SAX-PD", "seeAlso": [ "http://www.saxproject.org/copying.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SAX-PD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD-2.0.json", "referenceNumber": 489, "name": "Sax Public Domain Notice 2.0", "licenseId": "SAX-PD-2.0", "seeAlso": [ "http://www.saxproject.org/copying.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Saxpath.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Saxpath.json", "referenceNumber": 668, "name": "Saxpath License", "licenseId": "Saxpath", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Saxpath_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SCEA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SCEA.json", "referenceNumber": 531, "name": "SCEA Shared Source License", "licenseId": "SCEA", "seeAlso": [ "http://research.scea.com/scea_shared_source_license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SchemeReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SchemeReport.json", "referenceNumber": 287, "name": "Scheme Language Report License", "licenseId": "SchemeReport", "seeAlso": [], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail.json", "referenceNumber": 263, "name": "Sendmail License", "licenseId": "Sendmail", "seeAlso": [ "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", "https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail-8.23.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", "referenceNumber": 638, "name": "Sendmail License 8.23", "licenseId": "Sendmail-8.23", "seeAlso": [ "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", "https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail-Open-Source-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-Open-Source-1.1.json", "referenceNumber": 711, "name": "Sendmail Open Source License v1.1", "licenseId": "Sendmail-Open-Source-1.1", "seeAlso": [ "https://github.com/trusteddomainproject/OpenDMARC/blob/master/LICENSE.Sendmail" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", "referenceNumber": 391, "name": "SGI Free Software License B v1.0", "licenseId": "SGI-B-1.0", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", "referenceNumber": 444, "name": "SGI Free Software License B v1.1", "licenseId": "SGI-B-1.1", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", "referenceNumber": 687, "name": "SGI Free Software License B v2.0", "licenseId": "SGI-B-2.0", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SGI-OpenGL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-OpenGL.json", "referenceNumber": 539, "name": "SGI OpenGL License", "licenseId": "SGI-OpenGL", "seeAlso": [ "https://gitlab.freedesktop.org/mesa/glw/-/blob/master/README?ref_type\u003dheads" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGMLUG-PM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGMLUG-PM.json", "referenceNumber": 23, "name": "SGMLUG Parser Materials License", "licenseId": "SGMLUG-PM", "seeAlso": [ "https://gitweb.gentoo.org/repo/gentoo.git/tree/licenses/SGMLUG?id\u003d7d999af4a47bf55e53e54713d98d145f935935c1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGP4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGP4.json", "referenceNumber": 412, "name": "SGP4 Permission Notice", "licenseId": "SGP4", "seeAlso": [ "https://celestrak.org/publications/AIAA/2006-6753/faq.php" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SHL-0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", "referenceNumber": 342, "name": "Solderpad Hardware License v0.5", "licenseId": "SHL-0.5", "seeAlso": [ "https://solderpad.org/licenses/SHL-0.5/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SHL-0.51.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", "referenceNumber": 72, "name": "Solderpad Hardware License, Version 0.51", "licenseId": "SHL-0.51", "seeAlso": [ "https://solderpad.org/licenses/SHL-0.51/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SimPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", "referenceNumber": 512, "name": "Simple Public License 2.0", "licenseId": "SimPL-2.0", "seeAlso": [ "https://opensource.org/licenses/SimPL-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/SISSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL.json", "referenceNumber": 218, "name": "Sun Industry Standards Source License v1.1", "licenseId": "SISSL", "seeAlso": [ "http://www.openoffice.org/licenses/sissl_license.html", "https://opensource.org/licenses/SISSL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SISSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", "referenceNumber": 509, "name": "Sun Industry Standards Source License v1.2", "licenseId": "SISSL-1.2", "seeAlso": [ "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SL.json", "referenceNumber": 712, "name": "SL License", "licenseId": "SL", "seeAlso": [ "https://github.com/mtoyoda/sl/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sleepycat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", "referenceNumber": 192, "name": "Sleepycat License", "licenseId": "Sleepycat", "seeAlso": [ "https://opensource.org/licenses/Sleepycat" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SMAIL-GPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMAIL-GPL.json", "referenceNumber": 146, "name": "SMAIL General Public License", "licenseId": "SMAIL-GPL", "seeAlso": [ "https://sources.debian.org/copyright/license/debianutils/4.11.2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SMLNJ.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", "referenceNumber": 199, "name": "Standard ML of New Jersey License", "licenseId": "SMLNJ", "seeAlso": [ "https://www.smlnj.org/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SMPPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMPPL.json", "referenceNumber": 9, "name": "Secure Messaging Protocol Public License", "licenseId": "SMPPL", "seeAlso": [ "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SNIA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SNIA.json", "referenceNumber": 204, "name": "SNIA Public License 1.1", "licenseId": "SNIA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/snprintf.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/snprintf.json", "referenceNumber": 183, "name": "snprintf License", "licenseId": "snprintf", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/bsd-snprintf.c#L2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SOFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SOFA.json", "referenceNumber": 126, "name": "SOFA Software License", "licenseId": "SOFA", "seeAlso": [ "http://www.iausofa.org/tandc.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/softSurfer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/softSurfer.json", "referenceNumber": 530, "name": "softSurfer License", "licenseId": "softSurfer", "seeAlso": [ "https://github.com/mm2/Little-CMS/blob/master/src/cmssm.c#L207", "https://fedoraproject.org/wiki/Licensing/softSurfer" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Soundex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Soundex.json", "referenceNumber": 685, "name": "Soundex License", "licenseId": "Soundex", "seeAlso": [ "https://metacpan.org/release/RJBS/Text-Soundex-3.05/source/Soundex.pm#L3-11" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-86.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", "referenceNumber": 594, "name": "Spencer License 86", "licenseId": "Spencer-86", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-94.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", "referenceNumber": 379, "name": "Spencer License 94", "licenseId": "Spencer-94", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", "https://metacpan.org/release/KNOK/File-MMagic-1.30/source/COPYING#L28" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-99.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", "referenceNumber": 172, "name": "Spencer License 99", "licenseId": "Spencer-99", "seeAlso": [ "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", "referenceNumber": 85, "name": "Sun Public License v1.0", "licenseId": "SPL-1.0", "seeAlso": [ "https://opensource.org/licenses/SPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ssh-keyscan.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ssh-keyscan.json", "referenceNumber": 257, "name": "ssh-keyscan License", "licenseId": "ssh-keyscan", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/master/LICENCE#L82" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSH-OpenSSH.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", "referenceNumber": 33, "name": "SSH OpenSSH license", "licenseId": "SSH-OpenSSH", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSH-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-short.json", "referenceNumber": 611, "name": "SSH short notice", "licenseId": "SSH-short", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", "http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1", "https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSLeay-standalone.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSLeay-standalone.json", "referenceNumber": 669, "name": "SSLeay License - standalone", "licenseId": "SSLeay-standalone", "seeAlso": [ "https://www.tq-group.com/filedownloads/files/software-license-conditions/OriginalSSLeay/OriginalSSLeay.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", "referenceNumber": 45, "name": "Server Side Public License, v 1", "licenseId": "SSPL-1.0", "seeAlso": [ "https://www.mongodb.com/licensing/server-side-public-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/StandardML-NJ.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", "referenceNumber": 300, "name": "Standard ML of New Jersey License", "licenseId": "StandardML-NJ", "seeAlso": [ "https://www.smlnj.org/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", "referenceNumber": 301, "name": "SugarCRM Public License v1.1.3", "licenseId": "SugarCRM-1.1.3", "seeAlso": [ "http://www.sugarcrm.com/crm/SPL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SUL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SUL-1.0.json", "referenceNumber": 372, "name": "Sustainable Use License v1.0", "licenseId": "SUL-1.0", "seeAlso": [ "https://github.com/n8n-io/n8n/blob/master/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sun-PPP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sun-PPP.json", "referenceNumber": 378, "name": "Sun PPP License", "licenseId": "Sun-PPP", "seeAlso": [ "https://github.com/ppp-project/ppp/blob/master/pppd/eap.c#L7-L16" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sun-PPP-2000.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sun-PPP-2000.json", "referenceNumber": 456, "name": "Sun PPP License (2000)", "licenseId": "Sun-PPP-2000", "seeAlso": [ "https://github.com/ppp-project/ppp/blob/master/modules/ppp_ahdlc.c#L7-L19" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SunPro.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SunPro.json", "referenceNumber": 230, "name": "SunPro License", "licenseId": "SunPro", "seeAlso": [ "https://github.com/freebsd/freebsd-src/blob/main/lib/msun/src/e_acosh.c", "https://github.com/freebsd/freebsd-src/blob/main/lib/msun/src/e_lgammal.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWL.json", "referenceNumber": 134, "name": "Scheme Widget Library (SWL) Software License Agreement", "licenseId": "SWL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/SWL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/swrule.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/swrule.json", "referenceNumber": 567, "name": "swrule License", "licenseId": "swrule", "seeAlso": [ "https://ctan.math.utah.edu/ctan/tex-archive/macros/generic/misc/swrule.sty" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Symlinks.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Symlinks.json", "referenceNumber": 574, "name": "Symlinks License", "licenseId": "Symlinks", "seeAlso": [ "https://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg11494.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", "referenceNumber": 533, "name": "TAPR Open Hardware License v1.0", "licenseId": "TAPR-OHL-1.0", "seeAlso": [ "https://www.tapr.org/OHL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCL.json", "referenceNumber": 559, "name": "TCL/TK License", "licenseId": "TCL", "seeAlso": [ "http://www.tcl.tk/software/tcltk/license.html", "https://fedoraproject.org/wiki/Licensing/TCL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TCP-wrappers.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", "referenceNumber": 454, "name": "TCP Wrappers License", "licenseId": "TCP-wrappers", "seeAlso": [ "http://rc.quest.com/topics/openssh/license.php#tcpwrappers" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TekHVC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TekHVC.json", "referenceNumber": 352, "name": "TekHVC License", "licenseId": "TekHVC", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/master/COPYING?ref_type\u003dheads#L138-171" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TermReadKey.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TermReadKey.json", "referenceNumber": 564, "name": "TermReadKey License", "licenseId": "TermReadKey", "seeAlso": [ "https://github.com/jonathanstowe/TermReadKey/blob/master/README#L9-L10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TGPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TGPPL-1.0.json", "referenceNumber": 602, "name": "Transitive Grace Period Public Licence 1.0", "licenseId": "TGPPL-1.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TGPPL", "https://tahoe-lafs.org/trac/tahoe-lafs/browser/trunk/COPYING.TGPPL.rst" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ThirdEye.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ThirdEye.json", "referenceNumber": 392, "name": "ThirdEye License", "licenseId": "ThirdEye", "seeAlso": [ "https://sourceware.org/cgit/binutils-gdb/tree/include/coff/symconst.h#n11" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/threeparttable.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/threeparttable.json", "referenceNumber": 356, "name": "threeparttable License", "licenseId": "threeparttable", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Threeparttable" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TMate.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TMate.json", "referenceNumber": 408, "name": "TMate Open Source License", "licenseId": "TMate", "seeAlso": [ "http://svnkit.com/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TORQUE-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", "referenceNumber": 377, "name": "TORQUE v2.5+ Software License v1.1", "licenseId": "TORQUE-1.1", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TOSL.json", "referenceNumber": 479, "name": "Trusster Open Source License", "licenseId": "TOSL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TOSL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TPDL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPDL.json", "referenceNumber": 337, "name": "Time::ParseDate License", "licenseId": "TPDL", "seeAlso": [ "https://metacpan.org/pod/Time::ParseDate#LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPL-1.0.json", "referenceNumber": 707, "name": "THOR Public License 1.0", "licenseId": "TPL-1.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:ThorPublicLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TrustedQSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TrustedQSL.json", "referenceNumber": 294, "name": "TrustedQSL License", "licenseId": "TrustedQSL", "seeAlso": [ "https://sourceforge.net/p/trustedqsl/tqsl/ci/master/tree/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TTWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTWL.json", "referenceNumber": 277, "name": "Text-Tabs+Wrap License", "licenseId": "TTWL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TTWL", "https://github.com/ap/Text-Tabs/blob/master/lib.modern/Text/Tabs.pm#L148" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TTYP0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTYP0.json", "referenceNumber": 315, "name": "TTYP0 License", "licenseId": "TTYP0", "seeAlso": [ "https://people.mpi-inf.mpg.de/~uwe/misc/uw-ttyp0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", "referenceNumber": 446, "name": "Technische Universitaet Berlin License 1.0", "licenseId": "TU-Berlin-1.0", "seeAlso": [ "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", "referenceNumber": 649, "name": "Technische Universitaet Berlin License 2.0", "licenseId": "TU-Berlin-2.0", "seeAlso": [ "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Ubuntu-font-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ubuntu-font-1.0.json", "referenceNumber": 328, "name": "Ubuntu Font Licence v1.0", "licenseId": "Ubuntu-font-1.0", "seeAlso": [ "https://ubuntu.com/legal/font-licence", "https://assets.ubuntu.com/v1/81e5605d-ubuntu-font-licence-1.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UCAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCAR.json", "referenceNumber": 367, "name": "UCAR License", "licenseId": "UCAR", "seeAlso": [ "https://github.com/Unidata/UDUNITS-2/blob/master/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UCL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", "referenceNumber": 326, "name": "Upstream Compatibility License v1.0", "licenseId": "UCL-1.0", "seeAlso": [ "https://opensource.org/licenses/UCL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/ulem.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ulem.json", "referenceNumber": 463, "name": "ulem License", "licenseId": "ulem", "seeAlso": [ "https://mirrors.ctan.org/macros/latex/contrib/ulem/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UMich-Merit.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UMich-Merit.json", "referenceNumber": 385, "name": "Michigan/Merit Networks License", "licenseId": "UMich-Merit", "seeAlso": [ "https://github.com/radcli/radcli/blob/master/COPYRIGHT#L64" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unicode-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-3.0.json", "referenceNumber": 327, "name": "Unicode License v3", "licenseId": "Unicode-3.0", "seeAlso": [ "https://www.unicode.org/license.txt" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", "referenceNumber": 692, "name": "Unicode License Agreement - Data Files and Software (2015)", "licenseId": "Unicode-DFS-2015", "seeAlso": [ "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", "referenceNumber": 272, "name": "Unicode License Agreement - Data Files and Software (2016)", "licenseId": "Unicode-DFS-2016", "seeAlso": [ "https://www.unicode.org/license.txt", "http://web.archive.org/web/20160823201924/http://www.unicode.org/copyright.html#License", "http://www.unicode.org/copyright.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Unicode-TOU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", "referenceNumber": 418, "name": "Unicode Terms of Use", "licenseId": "Unicode-TOU", "seeAlso": [ "http://web.archive.org/web/20140704074106/http://www.unicode.org/copyright.html", "http://www.unicode.org/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UnixCrypt.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UnixCrypt.json", "referenceNumber": 113, "name": "UnixCrypt License", "licenseId": "UnixCrypt", "seeAlso": [ "https://foss.heptapod.net/python-libs/passlib/-/blob/branch/stable/LICENSE#L70", "https://opensource.apple.com/source/JBoss/JBoss-737/jboss-all/jetty/src/main/org/mortbay/util/UnixCrypt.java.auto.html", "https://archive.eclipse.org/jetty/8.0.1.v20110908/xref/org/eclipse/jetty/http/security/UnixCrypt.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unlicense.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense.json", "referenceNumber": 671, "name": "The Unlicense", "licenseId": "Unlicense", "seeAlso": [ "https://unlicense.org/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Unlicense-libtelnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense-libtelnet.json", "referenceNumber": 73, "name": "Unlicense - libtelnet variant", "licenseId": "Unlicense-libtelnet", "seeAlso": [ "https://github.com/seanmiddleditch/libtelnet/blob/develop/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unlicense-libwhirlpool.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense-libwhirlpool.json", "referenceNumber": 396, "name": "Unlicense - libwhirlpool variant", "licenseId": "Unlicense-libwhirlpool", "seeAlso": [ "https://github.com/dfateyev/libwhirlpool/blob/master/README#L27" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UnRAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UnRAR.json", "referenceNumber": 393, "name": "UnRAR License", "licenseId": "UnRAR", "seeAlso": [ "https://public.dhe.ibm.com/aix/freeSoftware/aixtoolbox/LICENSES/unRAR.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", "referenceNumber": 276, "name": "Universal Permissive License v1.0", "licenseId": "UPL-1.0", "seeAlso": [ "https://opensource.org/licenses/UPL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/URT-RLE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/URT-RLE.json", "referenceNumber": 153, "name": "Utah Raster Toolkit Run Length Encoded License", "licenseId": "URT-RLE", "seeAlso": [ "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/converter/other/pnmtorle.c", "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/converter/other/rletopnm.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Vim.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vim.json", "referenceNumber": 716, "name": "Vim License", "licenseId": "Vim", "seeAlso": [ "http://vimdoc.sourceforge.net/htmldoc/uganda.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Vixie-Cron.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vixie-Cron.json", "referenceNumber": 607, "name": "Vixie Cron License", "licenseId": "Vixie-Cron", "seeAlso": [ "https://github.com/vixie/cron/tree/545b3f5246824a9cda5905eeb7cf019c95e66995" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/VOSTROM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", "referenceNumber": 592, "name": "VOSTROM Public License for Open Source", "licenseId": "VOSTROM", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/VOSTROM" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/VSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", "referenceNumber": 256, "name": "Vovida Software License v1.0", "licenseId": "VSL-1.0", "seeAlso": [ "https://opensource.org/licenses/VSL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/W3C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C.json", "referenceNumber": 576, "name": "W3C Software Notice and License (2002-12-31)", "licenseId": "W3C", "seeAlso": [ "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", "https://opensource.org/licenses/W3C" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/W3C-19980720.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", "referenceNumber": 44, "name": "W3C Software Notice and License (1998-07-20)", "licenseId": "W3C-19980720", "seeAlso": [ "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/W3C-20150513.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", "referenceNumber": 604, "name": "W3C Software Notice and Document License (2015-05-13)", "licenseId": "W3C-20150513", "seeAlso": [ "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document", "https://www.w3.org/copyright/software-license-2015/", "https://www.w3.org/copyright/software-license-2023/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/w3m.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/w3m.json", "referenceNumber": 258, "name": "w3m License", "licenseId": "w3m", "seeAlso": [ "https://github.com/tats/w3m/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Watcom-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", "referenceNumber": 355, "name": "Sybase Open Watcom Public License 1.0", "licenseId": "Watcom-1.0", "seeAlso": [ "https://opensource.org/licenses/Watcom-1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Widget-Workshop.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Widget-Workshop.json", "referenceNumber": 513, "name": "Widget Workshop License", "licenseId": "Widget-Workshop", "seeAlso": [ "https://github.com/novnc/noVNC/blob/master/core/crypto/des.js#L24" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/WordNet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WordNet.json", "referenceNumber": 633, "name": "WordNet License", "licenseId": "WordNet", "seeAlso": [ "https://wordnet.princeton.edu/license-and-commercial-use" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Wsuipa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", "referenceNumber": 77, "name": "Wsuipa License", "licenseId": "Wsuipa", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Wsuipa" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/WTFNMFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFNMFPL.json", "referenceNumber": 674, "name": "Do What The F*ck You Want To But It\u0027s Not My Fault Public License", "licenseId": "WTFNMFPL", "seeAlso": [ "https://github.com/adversary-org/wtfnmf/raw/refs/tags/1.0/COPYING.WTFNMFPL", "https://github.com/adversary-org/wtfnmf/raw/3f2cd8235a64350a57a51b9739715edaea63ec1a/COPYING.WTFNMFPL-utf8" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/WTFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFPL.json", "referenceNumber": 289, "name": "Do What The F*ck You Want To Public License", "licenseId": "WTFPL", "seeAlso": [ "http://www.wtfpl.net/about/", "http://sam.zoy.org/wtfpl/COPYING" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/wwl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/wwl.json", "referenceNumber": 82, "name": "WWL License", "licenseId": "wwl", "seeAlso": [ "http://www.db.net/downloads/wwl+db-1.3.tgz" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/wxWindows.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/wxWindows.json", "referenceNumber": 440, "name": "wxWindows Library License", "licenseId": "wxWindows", "seeAlso": [ "https://opensource.org/licenses/WXwindows" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/X11.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11.json", "referenceNumber": 188, "name": "X11 License", "licenseId": "X11", "seeAlso": [ "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/X11-distribute-modifications-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-distribute-modifications-variant.json", "referenceNumber": 642, "name": "X11 License Distribution Modification Variant", "licenseId": "X11-distribute-modifications-variant", "seeAlso": [ "https://github.com/mirror/ncurses/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/X11-no-permit-persons.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-no-permit-persons.json", "referenceNumber": 442, "name": "X11 no permit persons clause", "licenseId": "X11-no-permit-persons", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/lib/libxinerama/-/blob/cc22c2f60c3862482562955116d5455263b443dc/COPYING#L44-66" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/X11-swapped.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-swapped.json", "referenceNumber": 543, "name": "X11 swapped final paragraphs", "licenseId": "X11-swapped", "seeAlso": [ "https://github.com/fedeinthemix/chez-srfi/blob/master/srfi/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xdebug-1.03.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xdebug-1.03.json", "referenceNumber": 506, "name": "Xdebug License v 1.03", "licenseId": "Xdebug-1.03", "seeAlso": [ "https://github.com/xdebug/xdebug/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xerox.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xerox.json", "referenceNumber": 240, "name": "Xerox License", "licenseId": "Xerox", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Xerox" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xfig.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xfig.json", "referenceNumber": 508, "name": "Xfig License", "licenseId": "Xfig", "seeAlso": [ "https://github.com/Distrotech/transfig/blob/master/transfig/transfig.c", "https://fedoraproject.org/wiki/Licensing:MIT#Xfig_Variant", "https://sourceforge.net/p/mcj/xfig/ci/master/tree/src/Makefile.am" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/XFree86-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", "referenceNumber": 505, "name": "XFree86 License 1.1", "licenseId": "XFree86-1.1", "seeAlso": [ "http://www.xfree86.org/current/LICENSE4.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/xinetd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xinetd.json", "referenceNumber": 571, "name": "xinetd License", "licenseId": "xinetd", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Xinetd_License" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.json", "referenceNumber": 583, "name": "xkeyboard-config Zinoviev License", "licenseId": "xkeyboard-config-Zinoviev", "seeAlso": [ "https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/blob/master/COPYING?ref_type\u003dheads#L178" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/xlock.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xlock.json", "referenceNumber": 435, "name": "xlock License", "licenseId": "xlock", "seeAlso": [ "https://fossies.org/linux/tiff/contrib/ras/ras2tif.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xnet.json", "referenceNumber": 57, "name": "X.Net License", "licenseId": "Xnet", "seeAlso": [ "https://opensource.org/licenses/Xnet" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/xpp.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xpp.json", "referenceNumber": 525, "name": "XPP License", "licenseId": "xpp", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/xpp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/XSkat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XSkat.json", "referenceNumber": 565, "name": "XSkat License", "licenseId": "XSkat", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/XSkat_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/xzoom.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xzoom.json", "referenceNumber": 436, "name": "xzoom License", "licenseId": "xzoom", "seeAlso": [ "https://metadata.ftp-master.debian.org/changelogs//main/x/xzoom/xzoom_0.3-27_copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/YPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", "referenceNumber": 259, "name": "Yahoo! Public License v1.0", "licenseId": "YPL-1.0", "seeAlso": [ "http://www.zimbra.com/license/yahoo_public_license_1.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/YPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", "referenceNumber": 141, "name": "Yahoo! Public License v1.1", "licenseId": "YPL-1.1", "seeAlso": [ "http://www.zimbra.com/license/yahoo_public_license_1.1.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zed.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zed.json", "referenceNumber": 384, "name": "Zed License", "licenseId": "Zed", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Zed" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zeeff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zeeff.json", "referenceNumber": 370, "name": "Zeeff License", "licenseId": "Zeeff", "seeAlso": [ "ftp://ftp.tin.org/pub/news/utils/newsx/newsx-1.6.tar.gz" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zend-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", "referenceNumber": 154, "name": "Zend License v2.0", "licenseId": "Zend-2.0", "seeAlso": [ "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zimbra-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", "referenceNumber": 214, "name": "Zimbra Public License v1.3", "licenseId": "Zimbra-1.3", "seeAlso": [ "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zimbra-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", "referenceNumber": 161, "name": "Zimbra Public License v1.4", "licenseId": "Zimbra-1.4", "seeAlso": [ "http://www.zimbra.com/legal/zimbra-public-license-1-4" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zlib.json", "referenceNumber": 251, "name": "zlib License", "licenseId": "Zlib", "seeAlso": [ "http://www.zlib.net/zlib_license.html", "https://opensource.org/licenses/Zlib" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/zlib-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", "referenceNumber": 555, "name": "zlib/libpng License with Acknowledgement", "licenseId": "zlib-acknowledgement", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ZPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", "referenceNumber": 310, "name": "Zope Public License 1.1", "licenseId": "ZPL-1.1", "seeAlso": [ "http://old.zope.org/Resources/License/ZPL-1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ZPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", "referenceNumber": 429, "name": "Zope Public License 2.0", "licenseId": "ZPL-2.0", "seeAlso": [ "http://old.zope.org/Resources/License/ZPL-2.0", "https://opensource.org/licenses/ZPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ZPL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", "referenceNumber": 589, "name": "Zope Public License 2.1", "licenseId": "ZPL-2.1", "seeAlso": [ "http://old.zope.org/Resources/ZPL/" ], "isOsiApproved": true, "isFsfLibre": true } ], "releaseDate": "2026-03-05T00:00:00Z" }go-spdx-2.6.0/cmd/main.go000066400000000000000000000046671517223150200151310ustar00rootroot00000000000000package main import ( "flag" "fmt" "os" ) func main() { cmd := "extract" if len(os.Args) > 1 { cmd = os.Args[1] } argsRemainder := []string{} if len(os.Args) > 2 { argsRemainder = os.Args[2:] } flagSet := flag.NewFlagSet("run", flag.ExitOnError) extractLicenses := flagSet.Bool("l", false, "Should license ids be extracted?") extractExceptions := flagSet.Bool("e", false, "Should exception ids be extracted?") help := flagSet.Bool("h", false, "Show help") err := flagSet.Parse(argsRemainder) if err != nil { fmt.Printf("error parsing flags for run: %v\n", err) os.Exit(1) } switch cmd { case "extract": if *help || (!*extractLicenses && !*extractExceptions) { writeHelpMessage() os.Exit(0) } if *extractLicenses { fmt.Println("-------------------------") fmt.Println("Extracting license ids...") err := extractLicenseIDs() if err != nil { fmt.Printf("error extracting license ids: %v\n", err) os.Exit(1) } fmt.Println("Done!") } if *extractExceptions { fmt.Println("---------------------------") fmt.Println("Extracting exception ids...") err := extractExceptionLicenseIDs() if err != nil { fmt.Printf("error extracting exception ids: %v\n", err) os.Exit(1) } fmt.Println("Done!") fmt.Println("---------------------------") } default: writeHelpMessage() os.Exit(0) } } func writeHelpMessage() { fmt.Println("") fmt.Println("Extracts license, deprecation, and exception ids from the official spdx license list data.") fmt.Println("The source data needs to be manually updated by copying the licenses.json file from") fmt.Println("https://github.com/spdx/license-list-data/blob/main/json/licenses.json and exceptions.json") fmt.Println("file from https://github.com/spdx/license-list-data/blob/main/json/exceptions.json.") fmt.Println("") fmt.Println("After running the extract command, the license_ids.json, deprecated_ids.json, and exception_ids.json") fmt.Println("files will be overwritten with the extracted ids. These license ids can then be used to update the") fmt.Println("spdxexp/license.go file.") fmt.Println("") fmt.Println("Command to run all extractions (run command from the /cmd directory):") fmt.Println(" `go run . extract -l -e`") fmt.Println("") fmt.Println("Usage options:") fmt.Println(" -h: prints this help message") fmt.Println(" -l: Extract license ids") fmt.Println(" -e: Extract exception ids") fmt.Println("") os.Exit(0) } go-spdx-2.6.0/cmd/spdx-validate/000077500000000000000000000000001517223150200164065ustar00rootroot00000000000000go-spdx-2.6.0/cmd/spdx-validate/main.go000066400000000000000000000047571517223150200176760ustar00rootroot00000000000000// Package main validates newline-separated SPDX expressions from stdin or a file. package main import ( "bufio" "fmt" "io" "os" "strings" "github.com/github/go-spdx/v2/spdxexp" "github.com/spf13/cobra" ) var filePath string var rootCmd = &cobra.Command{ Use: "spdx-validate", Short: "Validate SPDX license expressions", Long: `spdx-validate reads newline-separated SPDX license expressions and validates them. It reads from stdin by default, or from a file specified with -f/--file. Blank lines are skipped. Exits 0 if all expressions are valid, or 1 if any are invalid. Examples: echo "MIT" | spdx-validate printf "MIT\nApache-2.0\n" | spdx-validate spdx-validate -f licenses.txt`, RunE: func(_ *cobra.Command, _ []string) error { var r io.Reader = os.Stdin if filePath != "" { // #nosec G304 -- file path is an explicit CLI input for this command. f, err := os.Open(filePath) if err != nil { return fmt.Errorf("unable to open file: %w", err) } defer func() { _ = f.Close() }() r = f } ok, err := validateExpressions(r, os.Stderr) if err != nil { return err } if !ok { os.Exit(1) } return nil }, SilenceUsage: true, SilenceErrors: true, } func init() { rootCmd.Flags().StringVarP(&filePath, "file", "f", "", "path to a newline-separated file of SPDX expressions") } // validateExpressions reads newline-separated SPDX expressions from r, // validates each one, and writes error messages to w for any that are invalid. // Returns (true, nil) when all are valid, (false, nil) when any are invalid, or // (false, err) on read errors or when no expressions are found. func validateExpressions(r io.Reader, w io.Writer) (bool, error) { scanner := bufio.NewScanner(r) lineNum := 0 failures := 0 for scanner.Scan() { lineNum++ line := strings.TrimSpace(scanner.Text()) if line == "" { continue } valid, _ := spdxexp.ValidateLicenses([]string{line}) if !valid { failures++ _, _ = fmt.Fprintf(w, "line %d: invalid SPDX expression: %q\n", lineNum, line) } } if err := scanner.Err(); err != nil { return false, fmt.Errorf("error reading file: %w", err) } if lineNum == 0 || (lineNum > 0 && failures == lineNum) { return false, fmt.Errorf("no valid expressions found") } if failures > 0 { _, _ = fmt.Fprintf(w, "%d of %d expressions failed validation\n", failures, lineNum) return false, nil } return true, nil } func main() { if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } go-spdx-2.6.0/cmd/spdx-validate/main_test.go000066400000000000000000000134341517223150200207250ustar00rootroot00000000000000package main import ( "bytes" "os" "path/filepath" "strings" "testing" ) // --- Tests for single expression on stdin --- func TestValidateExpressions_SingleValid(t *testing.T) { tests := []string{ "MIT", "Apache-2.0", "BSD-3-Clause", "Apache-2.0 OR MIT", "MIT AND ISC", "GPL-3.0-only WITH Classpath-exception-2.0", } for _, expr := range tests { t.Run(expr, func(t *testing.T) { r := strings.NewReader(expr + "\n") var w bytes.Buffer ok, err := validateExpressions(r, &w) if err != nil { t.Fatalf("unexpected error: %v", err) } if !ok { t.Errorf("expected valid, got invalid; stderr: %s", w.String()) } if w.Len() != 0 { t.Errorf("expected no stderr output, got: %s", w.String()) } }) } } func TestValidateExpressions_SingleInvalid(t *testing.T) { tests := []string{ "BOGUS-LICENSE", "NOT-A-REAL-ID", "MIT ANDOR Apache-2.0", } for _, expr := range tests { t.Run(expr, func(t *testing.T) { r := strings.NewReader(expr + "\n") var w bytes.Buffer ok, err := validateExpressions(r, &w) if err == nil { t.Fatal("expected error for single invalid expression, got nil") } if ok { t.Error("expected invalid, got valid") } if !strings.Contains(w.String(), "invalid SPDX expression") { t.Errorf("expected error message in output, got: %s", w.String()) } if !strings.Contains(w.String(), expr) { t.Errorf("expected expression %q in output, got: %s", expr, w.String()) } }) } } // --- Tests for multiple expressions --- func TestValidateExpressions_AllValid(t *testing.T) { input := "MIT\nApache-2.0\nBSD-3-Clause OR MIT\n" r := strings.NewReader(input) var w bytes.Buffer ok, err := validateExpressions(r, &w) if err != nil { t.Fatalf("unexpected error: %v", err) } if !ok { t.Errorf("expected all valid, got invalid; stderr: %s", w.String()) } if w.Len() != 0 { t.Errorf("expected no stderr output, got: %s", w.String()) } } func TestValidateExpressions_SomeInvalid(t *testing.T) { input := "MIT\nNOT-A-LICENSE\nApache-2.0\nALSO-BOGUS\n" r := strings.NewReader(input) var w bytes.Buffer ok, err := validateExpressions(r, &w) if err != nil { t.Fatalf("unexpected error: %v", err) } if ok { t.Error("expected invalid result, got valid") } output := w.String() if !strings.Contains(output, `"NOT-A-LICENSE"`) { t.Errorf("expected NOT-A-LICENSE in output, got: %s", output) } if !strings.Contains(output, `"ALSO-BOGUS"`) { t.Errorf("expected ALSO-BOGUS in output, got: %s", output) } if !strings.Contains(output, "line 2:") { t.Errorf("expected 'line 2:' in output, got: %s", output) } if !strings.Contains(output, "line 4:") { t.Errorf("expected 'line 4:' in output, got: %s", output) } if !strings.Contains(output, "2 of 4 expressions failed") { t.Errorf("expected summary in output, got: %s", output) } } func TestValidateExpressions_AllInvalid(t *testing.T) { input := "BOGUS-1\nBOGUS-2\n" r := strings.NewReader(input) var w bytes.Buffer ok, err := validateExpressions(r, &w) if err == nil { t.Fatal("expected error when all expressions are invalid, got nil") } if ok { t.Error("expected ok=false") } if !strings.Contains(err.Error(), "no valid expressions found") { t.Errorf("expected 'no valid expressions found' error, got: %v", err) } } func TestValidateExpressions_EmptyFile(t *testing.T) { r := strings.NewReader("") var w bytes.Buffer ok, err := validateExpressions(r, &w) if err == nil { t.Fatal("expected error for empty file, got nil") } if ok { t.Error("expected ok=false for empty file") } if !strings.Contains(err.Error(), "no valid expressions found") { t.Errorf("expected 'no valid expressions found' error, got: %v", err) } } func TestValidateExpressions_SkipsBlankLines(t *testing.T) { input := "\nMIT\n\n\nApache-2.0\n\n" r := strings.NewReader(input) var w bytes.Buffer ok, err := validateExpressions(r, &w) if err != nil { t.Fatalf("unexpected error: %v", err) } if !ok { t.Errorf("expected all valid, got invalid; stderr: %s", w.String()) } } // --- Integration test using a temp file --- func TestValidateExpressions_FromTempFile(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "licenses.txt") content := "MIT\nApache-2.0\nBSD-2-Clause\n" if err := os.WriteFile(path, []byte(content), 0600); err != nil { t.Fatalf("failed to write temp file: %v", err) } // #nosec G304 -- path is created within t.TempDir for this test. f, err := os.Open(path) if err != nil { t.Fatalf("failed to open temp file: %v", err) } defer func() { _ = f.Close() }() var w bytes.Buffer ok, err := validateExpressions(f, &w) if err != nil { t.Fatalf("unexpected error: %v", err) } if !ok { t.Errorf("expected all valid from file, got invalid; stderr: %s", w.String()) } } func TestValidateExpressions_FromTempFileWithFailures(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "licenses.txt") content := "MIT\nINVALID-1\nApache-2.0\nINVALID-2\nBSD-2-Clause\n" if err := os.WriteFile(path, []byte(content), 0600); err != nil { t.Fatalf("failed to write temp file: %v", err) } // #nosec G304 -- path is created within t.TempDir for this test. f, err := os.Open(path) if err != nil { t.Fatalf("failed to open temp file: %v", err) } defer func() { _ = f.Close() }() var w bytes.Buffer ok, err := validateExpressions(f, &w) if err != nil { t.Fatalf("unexpected error: %v", err) } if ok { t.Error("expected invalid result from file with bad entries") } output := w.String() if !strings.Contains(output, `"INVALID-1"`) { t.Errorf("expected INVALID-1 in output, got: %s", output) } if !strings.Contains(output, `"INVALID-2"`) { t.Errorf("expected INVALID-2 in output, got: %s", output) } if !strings.Contains(output, "2 of 5 expressions failed") { t.Errorf("expected summary in output, got: %s", output) } } go-spdx-2.6.0/go.mod000066400000000000000000000006521517223150200142070ustar00rootroot00000000000000module github.com/github/go-spdx/v2 retract v2.3.0 // Compatibility issues with go 1.22 go 1.24 require ( github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.8.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.9 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) go-spdx-2.6.0/go.sum000066400000000000000000000044061517223150200142350ustar00rootroot00000000000000github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= go-spdx-2.6.0/script/000077500000000000000000000000001517223150200144025ustar00rootroot00000000000000go-spdx-2.6.0/script/bootstrap000077500000000000000000000000761517223150200163500ustar00rootroot00000000000000#!/bin/bash -e # download dependencies go mod download -json go-spdx-2.6.0/spdxexp/000077500000000000000000000000001517223150200145715ustar00rootroot00000000000000go-spdx-2.6.0/spdxexp/benchmark_satisfies_test.go000066400000000000000000000215521517223150200221700ustar00rootroot00000000000000package spdxexp import ( "fmt" "testing" ) type satisfiesBenchmarkScenario struct { name string testExpression string } var satisfiesBenchmarkScenarios = []satisfiesBenchmarkScenario{ // Scenario order is used as-is in the summary table. {"MIT--exact", "MIT"}, {"mit--caseinsensitive", "mit"}, {"mit--extra-space", " MIT "}, {"Apache-2.0--active-early", "Apache-2.0"}, {"Zed--active-end", "Zed"}, {"MIT AND Apache-2.0--complex", "MIT AND Apache-2.0"}, {"MIT AND Apache-2.0 OR Zed--complex", "MIT AND Apache-2.0 OR Zed"}, {"BSD-2-Clause-FreeBSD--deprecated", "BSD-2-Clause-FreeBSD"}, {"GPL-2.0-or-later--range", "GPL-2.0-or-later"}, {"Apache-1.0+--plus-range", "Apache-1.0+"}, {"LicenseRef-scancode-adobe-postscript", "LicenseRef-scancode-adobe-postscript"}, {"DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", "DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2"}, } func BenchmarkSatisfies(b *testing.B) { for _, scenario := range satisfiesBenchmarkScenarios { scenario := scenario b.Run(scenario.name, func(b *testing.B) { benchmarkSatisfiesScenario(b, scenario.testExpression) }) } } func benchmarkSatisfiesScenario(b *testing.B, expression string) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { _, err := Satisfies(expression, allowList()) if err != nil { b.Fatalf("Satisfies(%q, allowList) error: %v", expression, err) } } } func computeSatisfiesBenchmarkTableRows(repeats int) []benchmarkTableRow { rows := make([]benchmarkTableRow, 0, len(satisfiesBenchmarkScenarios)) for _, scenario := range satisfiesBenchmarkScenarios { scenario := scenario avg := runBenchmarkNsAvg(repeats, func(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { _, err := Satisfies(scenario.testExpression, allowList()) if err != nil { panic(fmt.Sprintf("Satisfies scenario %q error: %v", scenario.name, err)) } } }) rows = append(rows, benchmarkTableRow{label: scenario.name, nsOpAvg: avg}) } return rows } func allowList() []string { // common list of permissive licenses to simulate a realistic use case for Satisfies return []string{ "0BSD", "3D-Slicer-1.0", "AAL", "Abstyles", "AdaCore-doc", "Adobe-2006", "Adobe-Display-PostScript", "Adobe-Glyph", "Adobe-Utopia", "ADSL", "AFL-1.1", "AFL-1.2", "AFL-2.0", "AFL-2.1", "AFL-3.0", "Afmparse", "AMD-newlib", "AMDPLPA", "AML", "AML-glslang", "AMPAS", "ANTLR-PD", "ANTLR-PD-fallback", "Apache-1.0", "Apache-1.1", "Apache-2.0", "APAFML", "App-s2p", "Aspell-RU", "Baekmuk", "Bahyph", "Barr", "bcrypt-Solar-Designer", "Beerware", "Bitstream-Charter", "Bitstream-Vera", "blessing", "BlueOak-1.0.0", "Boehm-GC", "Boehm-GC-without-fee", "Borceux", "Brian-Gladman-2-Clause", "Brian-Gladman-3-Clause", "BSD-1-Clause", "BSD-2-Clause", "BSD-2-Clause-Darwin", "BSD-2-Clause-first-lines", "BSD-2-Clause-Patent", "BSD-2-Clause-pkgconf-disclaimer", "BSD-2-Clause-Views", "BSD-3-Clause", "BSD-3-Clause-acpica", "BSD-3-Clause-Attribution", "BSD-3-Clause-Clear", "BSD-3-Clause-flex", "BSD-3-Clause-HP", "BSD-3-Clause-LBNL", "BSD-3-Clause-Modification", "BSD-3-Clause-Open-MPI", "BSD-3-Clause-Sun", "BSD-4-Clause", "BSD-4-Clause-Shortened", "BSD-4-Clause-UC", "BSD-4.3RENO", "BSD-4.3TAHOE", "BSD-Advertising-Acknowledgement", "BSD-Attribution-HPND-disclaimer", "BSD-Inferno-Nettverk", "BSD-Source-beginning-file", "BSD-Source-Code", "BSD-Systemics", "BSD-Systemics-W3Works", "BSL-1.0", "bzip2-1.0.6", "Caldera-no-preamble", "Catharon", "CC-BY-1.0", "CC-BY-2.0", "CC-BY-2.5", "CC-BY-2.5-AU", "CC-BY-3.0", "CC-BY-3.0-AT", "CC-BY-3.0-AU", "CC-BY-3.0-DE", "CC-BY-3.0-IGO", "CC-BY-3.0-NL", "CC-BY-3.0-US", "CC-BY-4.0", "CC-PDDC", "CC-PDM-1.0", "CC0-1.0", "CDLA-Permissive-1.0", "CDLA-Permissive-2.0", "CECILL-B", "CERN-OHL-1.1", "CERN-OHL-1.2", "CERN-OHL-P-2.0", "CFITSIO", "check-cvs", "checkmk", "Clips", "CMU-Mach", "CMU-Mach-nodoc", "CNRI-Jython", "CNRI-Python", "CNRI-Python-GPL-Compatible", "COIL-1.0", "Community-Spec-1.0", "Condor-1.1", "Cornell-Lossless-JPEG", "Cronyx", "Crossword", "CryptoSwift", "CrystalStacker", "Cube", "curl", "cve-tou", "DEC-3-Clause", "diffmark", "DL-DE-BY-2.0", "DL-DE-ZERO-2.0", "DOC", "DocBook-DTD", "DocBook-Schema", "DocBook-Stylesheet", "DocBook-XML", "Dotseqn", "DRL-1.0", "DRL-1.1", "DSDP", "dtoa", "dvipdfm", "ECL-1.0", "ECL-2.0", "EFL-1.0", "EFL-2.0", "eGenix", "Entessa", "EPICS", "etalab-2.0", "EUDatagrid", "Fair", "FBM", "Ferguson-Twofish", "FreeBSD-DOC", "FSFAP", "FSFAP-no-warranty-disclaimer", "FSFUL", "FSFULLR", "FSFULLRSD", "FSFULLRWD", "FTL", "Furuseth", "fwlw", "Game-Programming-Gems", "GD", "generic-xts", "Giftware", "Glulxe", "GLWTPL", "Graphics-Gems", "gtkbook", "Gutmann", "HaskellReport", "HDF5", "hdparm", "HIDAPI", "HP-1986", "HP-1989", "HPND", "HPND-DEC", "HPND-doc", "HPND-doc-sell", "HPND-export-US-modify", "HPND-export2-US", "HPND-Fenneberg-Livingston", "HPND-INRIA-IMAG", "HPND-Intel", "HPND-Kevlin-Henney", "HPND-Markus-Kuhn", "HPND-merchantability-variant", "HPND-MIT-disclaimer", "HPND-Netrek", "HPND-Pbmplus", "HPND-sell-MIT-disclaimer-xserver", "HPND-sell-regexpr", "HPND-sell-variant", "HPND-sell-variant-MIT-disclaimer", "HPND-sell-variant-MIT-disclaimer-rev", "HPND-UC", "HTMLTIDY", "IBM-pibs", "ICU", "IEC-Code-Components-EULA", "IJG", "IJG-short", "ImageMagick", "iMatix", "Info-ZIP", "Inner-Net-2.0", "InnoSetup", "Intel", "Intel-ACPI", "ISC", "ISC-Veillard", "Jam", "JasPer-2.0", "jove", "JPNIC", "JSON", "Kastrup", "Kazlib", "Knuth-CTAN", "Latex2e", "Latex2e-translated-notice", "Leptonica", "Libpng", "libpng-1.6.35", "libpng-2.0", "libselinux-1.0", "libtiff", "libutil-David-Nugent", "Linux-OpenIB", "LOOP", "LPD-document", "lsof", "Lucida-Bitmap-Fonts", "LZMA-SDK-9.11-to-9.20", "LZMA-SDK-9.22", "Mackerras-3-Clause", "Mackerras-3-Clause-acknowledgment", "magaz", "mailprio", "man2html", "Martin-Birgmeier", "McPhee-slideshow", "metamail", "Minpack", "MIPS", "MirOS", "MIT", "MIT-0", "MIT-advertising", "MIT-Click", "MIT-CMU", "MIT-enna", "MIT-feh", "MIT-Festival", "MIT-Khronos-old", "MIT-Modern-Variant", "MIT-open-group", "MIT-testregex", "MIT-Wu", "MITNFA", "MMIXware", "MPEG-SSG", "mpi-permissive", "mpich2", "mplus", "MS-LPL", "MS-PL", "MTLL", "MulanPSL-1.0", "MulanPSL-2.0", "Multics", "Mup", "NAIST-2003", "Naumen", "NCBI-PD", "NCL", "NCSA", "NetCDF", "Newsletr", "ngrep", "NICTA-1.0", "NIST-PD", "NIST-PD-fallback", "NIST-Software", "NLOD-1.0", "NLOD-2.0", "NLPL", "NRL", "NTIA-PD", "NTP", "NTP-0", "O-UDA-1.0", "OAR", "ODC-By-1.0", "OFFIS", "OFL-1.0", "OFL-1.0-no-RFN", "OFL-1.0-RFN", "OFL-1.1-no-RFN", "OFL-1.1-RFN", "OGC-1.0", "OGDL-Taiwan-1.0", "OGL-Canada-2.0", "OGL-UK-1.0", "OGL-UK-2.0", "OGL-UK-3.0", "OLDAP-2.0", "OLDAP-2.0.1", "OLDAP-2.1", "OLDAP-2.2", "OLDAP-2.2.1", "OLDAP-2.2.2", "OLDAP-2.3", "OLDAP-2.4", "OLDAP-2.5", "OLDAP-2.6", "OLDAP-2.7", "OLDAP-2.8", "OLFL-1.3", "OML", "OpenSSL", "OpenSSL-standalone", "OpenVision", "OPL-UK-3.0", "OPUBL-1.0", "PADL", "PDDL-1.0", "PHP-3.0", "PHP-3.01", "Pixar", "pkgconf", "Plexus", "pnmstitch", "PostgreSQL", "PSF-2.0", "psfrag", "psutils", "Python-2.0", "Python-2.0.1", "python-ldap", "radvd", "Rdisc", "RSA-MD", "Ruby-pty", "SAX-PD", "SAX-PD-2.0", "Saxpath", "SCEA", "SchemeReport", "Sendmail", "Sendmail-Open-Source-1.1", "SGI-B-1.1", "SGI-B-2.0", "SGI-OpenGL", "SGP4", "SHL-0.5", "SHL-0.51", "SL", "SMLNJ", "snprintf", "softSurfer", "Soundex", "Spencer-86", "Spencer-94", "Spencer-99", "ssh-keyscan", "SSH-OpenSSH", "SSH-short", "SSLeay-standalone", "Sun-PPP", "Sun-PPP-2000", "SunPro", "SWL", "swrule", "Symlinks", "TCL", "TCP-wrappers", "TermReadKey", "ThirdEye", "threeparttable", "TPDL", "TrustedQSL", "TTWL", "TTYP0", "TU-Berlin-1.0", "TU-Berlin-2.0", "UCAR", "ulem", "UMich-Merit", "Unicode-3.0", "Unicode-DFS-2015", "Unicode-DFS-2016", "UnixCrypt", "Unlicense", "Unlicense-libtelnet", "Unlicense-libwhirlpool", "UPL-1.0", "VSL-1.0", "W3C", "W3C-19980720", "W3C-20150513", "w3m", "Widget-Workshop", "Wsuipa", "WTFPL", "wwl", "X11", "X11-distribute-modifications-variant", "X11-swapped", "Xdebug-1.03", "Xerox", "Xfig", "XFree86-1.1", "xinetd", "xkeyboard-config-Zinoviev", "xlock", "Xnet", "xpp", "XSkat", "xzoom", "Zed", "Zeeff", "Zend-2.0", "Zlib", "zlib-acknowledgement", "ZPL-1.1", "ZPL-2.0", "ZPL-2.1", } } go-spdx-2.6.0/spdxexp/benchmark_setup_test.go000066400000000000000000000107211517223150200213320ustar00rootroot00000000000000package spdxexp import ( "flag" "fmt" "math" "os" "strings" "testing" "time" ) const benchmarkRepeatsForSummary = 4 // Fixed baselines for the Scale column in the summary tables. // Using constants makes the scale values comparable across runs/branches. const ( benchmarkScaleBaselineValidateLicensesNsOp = 5.0 benchmarkScaleBaselineSatisfiesNsOp = 1500.0 ) func TestMain(m *testing.M) { // When TestMain is present, it's safest to explicitly parse flags before // inspecting any -test.* settings. if !flag.Parsed() { flag.Parse() } benchPattern := "" benchFlag := flag.Lookup("test.bench") if benchFlag != nil { benchPattern = benchFlag.Value.String() } shouldPrintBenchOutput := benchPattern != "" if shouldPrintBenchOutput { // Benchmarks are executed as part of summary table generation (via // testing.Benchmark). Suppress the default go test benchmark execution so // we don't run benchmarks twice in a single invocation. if benchFlag != nil { _ = benchFlag.Value.Set("$^") } _, _ = fmt.Fprintln(os.Stdout, "Benchmark summary tables:") _, _ = fmt.Fprintln(os.Stdout, "- ns/op average: average time per operation") _, _ = fmt.Fprintln(os.Stdout, "- Scale: relative to a fixed baseline per table") _, _ = fmt.Fprintln(os.Stdout, "") } code := m.Run() if shouldPrintBenchOutput { validateRows := withScaleColumn(computeValidateLicensesBenchmarkTableRows(benchmarkRepeatsForSummary), benchmarkScaleBaselineValidateLicensesNsOp) printBenchmarkTable(os.Stdout, "Benchmark ValidateLicenses", validateRows, benchmarkScaleBaselineValidateLicensesNsOp) satisfiesRows := withScaleColumn(computeSatisfiesBenchmarkTableRows(benchmarkRepeatsForSummary), benchmarkScaleBaselineSatisfiesNsOp) printBenchmarkTable(os.Stdout, "Benchmark Satisfies", satisfiesRows, benchmarkScaleBaselineSatisfiesNsOp) } os.Exit(code) } type benchmarkTableRow struct { label string nsOpAvg float64 scale string } func withScaleColumn(rows []benchmarkTableRow, benchmarkScaleBaselineNsOp float64) []benchmarkTableRow { if len(rows) == 0 { return rows } for i := range rows { rows[i].scale = formatScale(rows[i].nsOpAvg, benchmarkScaleBaselineNsOp) } return rows } func formatScale(ns, baseline float64) string { if ns <= 0 || baseline <= 0 { return "n/a" } ratio := ns / baseline if ratio >= 0.95 && ratio <= 1.05 { return "1x" } if ratio >= 10 { return fmt.Sprintf("~%sx", formatWithCommas(int64(math.Round(ratio)))) } return fmt.Sprintf("~%.1fx", math.Round(ratio*10)/10) } func runBenchmarkNsAvg(repeats int, fn func(b *testing.B)) float64 { if repeats <= 0 { repeats = 1 } sum := 0.0 count := 0 for i := 0; i < repeats; i++ { res := testing.Benchmark(fn) if res.N <= 0 { continue } ns := float64(res.T.Nanoseconds()) / float64(res.N) sum += ns count++ } if count == 0 { return 0 } return sum / float64(count) } func printBenchmarkTable(w *os.File, title string, rows []benchmarkTableRow, benchmarkScaleBaselineNsOp float64) { header1 := title header2 := "ns/op average" header3 := fmt.Sprintf("Scale (%dns/op=1x)", int(benchmarkScaleBaselineNsOp)) col1 := len(header1) for _, r := range rows { if len(r.label) > col1 { col1 = len(r.label) } } formatNsAvg := func(r benchmarkTableRow) string { num := nsNumberString(r.nsOpAvg) return fmt.Sprintf("~%s ns/op", num) } col2 := len(header2) for _, r := range rows { if l := len(formatNsAvg(r)); l > col2 { col2 = l } } col3 := len(header3) for _, r := range rows { if len(r.scale) > col3 { col3 = len(r.scale) } } line := func() { _, _ = fmt.Fprintf(w, "+-%s-+-%s-+-%s-+\n", strings.Repeat("-", col1), strings.Repeat("-", col2), strings.Repeat("-", col3)) } row := func(c1, c2, c3 string) { _, _ = fmt.Fprintf(w, "| %-*s | %-*s | %-*s |\n", col1, c1, col2, c2, col3, c3) } line() row(header1, header2, header3) line() for _, r := range rows { ns := formatNsAvg(r) row(r.label, ns, r.scale) } line() _, _ = fmt.Fprintln(w, "") } func nsNumberString(ns float64) string { if ns <= 0 { return "0" } if ns < float64(10*time.Microsecond.Nanoseconds()) { return fmt.Sprintf("%.1f", ns) } return formatWithCommas(int64(ns + 0.5)) } func formatWithCommas(n int64) string { s := fmt.Sprintf("%d", n) if len(s) <= 3 { return s } var b strings.Builder pre := len(s) % 3 if pre == 0 { pre = 3 } b.WriteString(s[:pre]) for i := pre; i < len(s); i += 3 { b.WriteByte(',') b.WriteString(s[i : i+3]) } return b.String() } go-spdx-2.6.0/spdxexp/benchmark_validate_licenses_test.go000066400000000000000000000044611517223150200236540ustar00rootroot00000000000000package spdxexp import ( "fmt" "testing" ) type validateLicensesBenchmarkScenario struct { name string testLicenses []string } var validateLicensesBenchmarkScenarios = []validateLicensesBenchmarkScenario{ // Scenario order is used as-is in the summary table. {"MIT--exact", []string{"MIT"}}, {"mit--caseinsensitive", []string{"mit"}}, {"mit--extra-space", []string{" MIT "}}, {"Apache-2.0--active-early", []string{"Apache-2.0"}}, {"Zed--active-end", []string{"Zed"}}, {"MIT AND Apache-2.0--complex", []string{"MIT", "Apache-2.0"}}, {"MIT AND Apache-2.0 OR Zed--complex", []string{"MIT", "Apache-2.0", "Zed"}}, {"BSD-2-Clause-FreeBSD--deprecated", []string{"BSD-2-Clause-FreeBSD"}}, {"GPL-2.0-or-later--range", []string{"GPL-2.0-or-later"}}, {"Apache-1.0+--plus-range", []string{"Apache-1.0+"}}, {"LicenseRef-scancode-adobe-postscript", []string{"LicenseRef-scancode-adobe-postscript"}}, {"DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", []string{"DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2"}}, } func BenchmarkValidateLicenses(b *testing.B) { for _, scenario := range validateLicensesBenchmarkScenarios { scenario := scenario b.Run(scenario.name, func(b *testing.B) { benchmarkValidateLicensesScenario(b, scenario.testLicenses) }) } } func benchmarkValidateLicensesScenario(b *testing.B, licenses []string) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { valid, invalidLicenses := ValidateLicenses(licenses) if !valid || len(invalidLicenses) != 0 { b.Fatalf("ValidateLicenses(%v) returned valid=%v invalid=%v", licenses, valid, invalidLicenses) } } } func computeValidateLicensesBenchmarkTableRows(repeats int) []benchmarkTableRow { rows := make([]benchmarkTableRow, 0, len(validateLicensesBenchmarkScenarios)) for _, scenario := range validateLicensesBenchmarkScenarios { scenario := scenario avg := runBenchmarkNsAvg(repeats, func(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { valid, invalidLicenses := ValidateLicenses(scenario.testLicenses) if !valid || len(invalidLicenses) != 0 { panic(fmt.Sprintf("ValidateLicenses scenario %q failed: valid=%v invalid=%v", scenario.name, valid, invalidLicenses)) } } }) rows = append(rows, benchmarkTableRow{label: scenario.name, nsOpAvg: avg}) } return rows } go-spdx-2.6.0/spdxexp/compare.go000066400000000000000000000051041517223150200165460ustar00rootroot00000000000000package spdxexp // The compare methods determine if two ranges are greater than, less than or equal within the same license group. // NOTE: Ranges are organized into groups (referred to as license groups) of the same base license (e.g. GPL). // Groups have sub-groups of license versions (referred to as the range) where each member is considered // to be the same version (e.g. {GPL-2.0, GPL-2.0-only}). The sub-groups are in ascending order within // the license group, such that the first sub-group is considered to be less than the second sub-group, // and so on. (e.g. {{GPL-1.0}, {GPL-2.0, GPL-2.0-only}} implies {GPL-1.0} < {GPL-2.0, GPL-2.0-only}). // compareGT returns true if the first range is greater than the second range within the same license group; otherwise, false. func compareGT(first *node, second *node) bool { if !first.isLicense() || !second.isLicense() { return false } firstRange := getLicenseRange(*first.license()) secondRange := getLicenseRange(*second.license()) if !sameLicenseGroup(firstRange, secondRange) { return false } return firstRange.location[versionGroup] > secondRange.location[versionGroup] } // compareLT returns true if the first range is less than the second range within the same license group; otherwise, false. func compareLT(first *node, second *node) bool { if !first.isLicense() || !second.isLicense() { return false } firstRange := getLicenseRange(*first.license()) secondRange := getLicenseRange(*second.license()) if !sameLicenseGroup(firstRange, secondRange) { return false } return firstRange.location[versionGroup] < secondRange.location[versionGroup] } // compareEQ returns true if the first and second range are the same range within the same license group; otherwise, false. func compareEQ(first *node, second *node) bool { if !first.isLicense() || !second.isLicense() { return false } if first.lic.license == second.lic.license { return true } firstRange := getLicenseRange(*first.license()) secondRange := getLicenseRange(*second.license()) if !sameLicenseGroup(firstRange, secondRange) { return false } return firstRange.location[versionGroup] == secondRange.location[versionGroup] } // sameLicenseGroup returns false if either license isn't in a range or the two ranges are // not in the same license group (e.g. group GPL != group Apache); otherwise, true func sameLicenseGroup(firstRange *licenseRange, secondRange *licenseRange) bool { if firstRange == nil || secondRange == nil || firstRange.location[licenseGroup] != secondRange.location[licenseGroup] { return false } return true } go-spdx-2.6.0/spdxexp/compare_test.go000066400000000000000000000146101517223150200176070ustar00rootroot00000000000000package spdxexp import ( "testing" "github.com/stretchr/testify/assert" ) func TestCompareGT(t *testing.T) { tests := []struct { name string first *node second *node result bool }{ {"expect greater than: GPL-3.0 > GPL-2.0", getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-2.0", false), true}, {"expect greater than: GPL-3.0-only > GPL-2.0-only", getLicenseNode("GPL-3.0-only", false), getLicenseNode("GPL-2.0-only", false), true}, {"expect greater than: LPPL-1.3a > LPPL-1.0", getLicenseNode("LPPL-1.3a", false), getLicenseNode("LPPL-1.0", false), true}, {"expect greater than: LPPL-1.3c > LPPL-1.3a", getLicenseNode("LPPL-1.3c", false), getLicenseNode("LPPL-1.3a", false), true}, {"expect greater than: AGPL-3.0 > AGPL-1.0", getLicenseNode("AGPL-3.0", false), getLicenseNode("AGPL-1.0", false), true}, {"expect equal: GPL-2.0-or-later > GPL-2.0-only", getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0-only", false), false}, {"expect equal: GPL-2.0-or-later > GPL-2.0", getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0", false), false}, {"expect equal: GPL-2.0-only > GPL-2.0", getLicenseNode("GPL-2.0-only", false), getLicenseNode("GPL-2.0", false), false}, {"expect equal: GPL-3.0 > GPL-3.0", getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-3.0", false), false}, {"expect equal: MIT > MIT", getLicenseNode("MIT", false), getLicenseNode("MIT", false), false}, {"expect less than: MPL-1.0 > MPL-2.0", getLicenseNode("MPL-1.0", false), getLicenseNode("MPL-2.0", false), false}, {"incompatible: MIT > ISC", getLicenseNode("MIT", false), getLicenseNode("ISC", false), false}, {"incompatible: MIT > GPL-2.0-only", getLicenseNode("MIT", false), getLicenseNode("GPL-2.0-only", false), false}, {"incompatible: OSL-1.0 > OPL-1.0", getLicenseNode("OSL-1.0", false), getLicenseNode("OPL-1.0", false), false}, {"not simple license: (MIT OR ISC) > GPL-3.0", getLicenseNode("(MIT OR ISC)", false), getLicenseNode("GPL-3.0", false), false}, // TODO: should it raise error? } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, compareGT(test.first, test.second)) }) } } func TestCompareEQ(t *testing.T) { tests := []struct { name string first *node second *node result bool }{ {"expect greater than: GPL-3.0 == GPL-2.0", getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-2.0", false), false}, {"expect greater than: GPL-3.0-only == GPL-2.0-only", getLicenseNode("GPL-3.0-only", false), getLicenseNode("GPL-2.0-only", false), false}, {"expect greater than: LPPL-1.3a == LPPL-1.0", getLicenseNode("LPPL-1.3a", false), getLicenseNode("LPPL-1.0", false), false}, {"expect greater than: LPPL-1.3c == LPPL-1.3a", getLicenseNode("LPPL-1.3c", false), getLicenseNode("LPPL-1.3a", false), false}, {"expect greater than: AGPL-3.0 == AGPL-1.0", getLicenseNode("AGPL-3.0", false), getLicenseNode("AGPL-1.0", false), false}, {"expect equal: GPL-2.0-or-later > GPL-2.0-only", getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0-only", false), true}, {"expect equal: GPL-2.0-or-later > GPL-2.0", getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0", false), true}, {"expect equal: GPL-2.0-only == GPL-2.0", getLicenseNode("GPL-2.0-only", false), getLicenseNode("GPL-2.0", false), true}, {"expect equal: GPL-3.0 == GPL-3.0", getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-3.0", false), true}, {"expect equal: MIT == MIT", getLicenseNode("MIT", false), getLicenseNode("MIT", false), true}, {"expect less than: MPL-1.0 == MPL-2.0", getLicenseNode("MPL-1.0", false), getLicenseNode("MPL-2.0", false), false}, {"incompatible: MIT == ISC", getLicenseNode("MIT", false), getLicenseNode("ISC", false), false}, {"incompatible: MIT == GPL-2.0-only", getLicenseNode("MIT", false), getLicenseNode("GPL-2.0-only", false), false}, {"incompatible: OSL-1.0 == OPL-1.0", getLicenseNode("OSL-1.0", false), getLicenseNode("OPL-1.0", false), false}, {"not simple license: (MIT OR ISC) == GPL-3.0", getLicenseNode("(MIT OR ISC)", false), getLicenseNode("GPL-3.0", false), false}, // TODO: should it raise error? } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, compareEQ(test.first, test.second)) }) } } func TestCompareLT(t *testing.T) { tests := []struct { name string first *node second *node result bool }{ {"expect greater than: GPL-3.0 < GPL-2.0", getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-2.0", false), false}, {"expect greater than: GPL-3.0-only < GPL-2.0-only", getLicenseNode("GPL-3.0-only", false), getLicenseNode("GPL-2.0-only", false), false}, {"expect greater than: LPPL-1.3a < LPPL-1.0", getLicenseNode("LPPL-1.3a", false), getLicenseNode("LPPL-1.0", false), false}, {"expect greater than: LPPL-1.3c < LPPL-1.3a", getLicenseNode("LPPL-1.3c", false), getLicenseNode("LPPL-1.3a", false), false}, {"expect greater than: AGPL-3.0 < AGPL-1.0", getLicenseNode("AGPL-3.0", false), getLicenseNode("AGPL-1.0", false), false}, {"expect greater than: GPL-2.0-or-later < GPL-2.0-only", getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0-only", false), false}, {"expect greater than: GPL-2.0-or-later == GPL-2.0", getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0", false), false}, {"expect equal: GPL-2.0-only < GPL-2.0", getLicenseNode("GPL-2.0-only", false), getLicenseNode("GPL-2.0", false), false}, {"expect equal: GPL-3.0 < GPL-3.0", getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-3.0", false), false}, {"expect equal: MIT < MIT", getLicenseNode("MIT", false), getLicenseNode("MIT", false), false}, {"expect less than: MPL-1.0 < MPL-2.0", getLicenseNode("MPL-1.0", false), getLicenseNode("MPL-2.0", false), true}, {"incompatible: MIT < ISC", getLicenseNode("MIT", false), getLicenseNode("ISC", false), false}, {"incompatible: MIT < GPL-2.0-only", getLicenseNode("MIT", false), getLicenseNode("GPL-2.0-only", false), false}, {"incompatible: OSL-1.0 < OPL-1.0", getLicenseNode("OSL-1.0", false), getLicenseNode("OPL-1.0", false), false}, {"not simple license: (MIT OR ISC) < GPL-3.0", getLicenseNode("(MIT OR ISC)", false), getLicenseNode("GPL-3.0", false), false}, // TODO: should it raise error? } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, compareLT(test.first, test.second)) }) } } go-spdx-2.6.0/spdxexp/doc.go000066400000000000000000000003651517223150200156710ustar00rootroot00000000000000/* Package spdxexp validates licenses and determines if a license expression is satisfied by a list of licenses. Validity of a license is determined by the [SPDX license list]. [SPDX license list]: https://spdx.org/licenses/ */ package spdxexp go-spdx-2.6.0/spdxexp/extracts.go000066400000000000000000000015371517223150200167630ustar00rootroot00000000000000package spdxexp import ( "maps" "slices" ) // ExtractLicenses extracts licenses from the given expression without duplicates. // Returns an array of licenses or error if error occurs during processing. func ExtractLicenses(expression string) ([]string, error) { node, err := parse(expression) if err != nil { return nil, err } seen := map[string]struct{}{} collectExtractedLicenses(node, seen) return slices.Collect(maps.Keys(seen)), nil } func collectExtractedLicenses(n *node, seen map[string]struct{}) { if n == nil { return } if n.isExpression() { collectExtractedLicenses(n.left(), seen) collectExtractedLicenses(n.right(), seen) return } reconstructed := n.reconstructedLicenseString() if reconstructed == nil { return } license := *reconstructed if _, ok := seen[license]; ok { return } seen[license] = struct{}{} } go-spdx-2.6.0/spdxexp/extracts_test.go000066400000000000000000000117371517223150200200250ustar00rootroot00000000000000package spdxexp import ( "context" "os" "os/exec" "testing" "time" "github.com/stretchr/testify/assert" ) const kernelHeadersLicense = `(GPL-2.0-only WITH Linux-syscall-note OR BSD-2-Clause) AND (GPL-2.0-only WITH Linux-syscall-note OR BSD-3-Clause) AND (GPL-2.0-only WITH Linux-syscall-note OR CDDL-1.0) AND (GPL-2.0-only WITH Linux-syscall-note OR Linux-OpenIB) AND (GPL-2.0-only WITH Linux-syscall-note OR MIT) AND (GPL-2.0-or-later WITH Linux-syscall-note OR BSD-3-Clause) AND (GPL-2.0-or-later WITH Linux-syscall-note OR MIT) AND Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND BSD-3-Clause-Clear AND GFDL-1.1-no-invariants-or-later AND GPL-1.0-or-later AND (GPL-1.0-or-later OR BSD-3-Clause) AND GPL-1.0-or-later WITH Linux-syscall-note AND GPL-2.0-only AND (GPL-2.0-only OR Apache-2.0) AND (GPL-2.0-only OR BSD-2-Clause) AND (GPL-2.0-only OR BSD-3-Clause) AND (GPL-2.0-only OR CDDL-1.0) AND (GPL-2.0-only OR GFDL-1.1-no-invariants-or-later) AND (GPL-2.0-only OR GFDL-1.2-no-invariants-only) AND GPL-2.0-only WITH Linux-syscall-note AND GPL-2.0-or-later AND (GPL-2.0-or-later OR BSD-2-Clause) AND (GPL-2.0-or-later OR BSD-3-Clause) AND (GPL-2.0-or-later OR CC-BY-4.0) AND GPL-2.0-or-later WITH GCC-exception-2.0 AND GPL-2.0-or-later WITH Linux-syscall-note AND ISC AND LGPL-2.0-or-later AND (LGPL-2.0-or-later OR BSD-2-Clause) AND LGPL-2.0-or-later WITH Linux-syscall-note AND LGPL-2.1-only AND (LGPL-2.1-only OR BSD-2-Clause) AND LGPL-2.1-only WITH Linux-syscall-note AND LGPL-2.1-or-later AND LGPL-2.1-or-later WITH Linux-syscall-note AND (Linux-OpenIB OR GPL-2.0-only) AND (Linux-OpenIB OR GPL-2.0-only OR BSD-2-Clause) AND Linux-man-pages-copyleft AND MIT AND (MIT OR GPL-2.0-only) AND (MIT OR GPL-2.0-or-later) AND (MIT OR LGPL-2.1-only) AND (MPL-1.1 OR GPL-2.0-only) AND (X11 OR GPL-2.0-only) AND (X11 OR GPL-2.0-or-later) AND Zlib AND (copyleft-next-0.3.1 OR GPL-2.0-or-later)` var expectedKernelHeadersLicenses = []string{ "GPL-2.0-only WITH Linux-syscall-note", "BSD-2-Clause", "BSD-3-Clause", "CDDL-1.0", "Linux-OpenIB", "MIT", "GPL-2.0-or-later WITH Linux-syscall-note", "Apache-2.0", "BSD-3-Clause-Clear", "GFDL-1.1-no-invariants-or-later", "GPL-1.0-or-later", "GPL-1.0-or-later WITH Linux-syscall-note", "GPL-2.0-only", "GFDL-1.2-no-invariants-only", "GPL-2.0-or-later", "CC-BY-4.0", "GPL-2.0-or-later WITH GCC-exception-2.0", "ISC", "LGPL-2.0-or-later", "LGPL-2.0-or-later WITH Linux-syscall-note", "LGPL-2.1-only", "LGPL-2.1-only WITH Linux-syscall-note", "LGPL-2.1-or-later", "LGPL-2.1-or-later WITH Linux-syscall-note", "Linux-man-pages-copyleft", "MPL-1.1", "X11", "Zlib", "copyleft-next-0.3.1", } func TestExtractLicenses(t *testing.T) { tests := []struct { name string inputExpression string extractedLicenses []string }{ {"Single license", "MIT", []string{"MIT"}}, {"AND'ed licenses", "MIT AND Apache-2.0", []string{"MIT", "Apache-2.0"}}, {"AND'ed & OR'ed licenses", "(MIT AND Apache-2.0) OR GPL-3.0", []string{"GPL-3.0", "MIT", "Apache-2.0"}}, {"ONLY modifiers", "LGPL-2.1-only OR MIT OR BSD-3-Clause", []string{"MIT", "BSD-3-Clause", "LGPL-2.1-only"}}, {"WITH modifiers", "GPL-2.0-or-later WITH Bison-exception-2.2", []string{"GPL-2.0-or-later WITH Bison-exception-2.2"}}, {"Invalid SPDX expression", "MIT OR INVALID", nil}, {"-or-later suffix with mixed case", "GPL-2.0-Or-later", []string{"GPL-2.0-or-later"}}, {"+ operator in Apache", "APACHE-2.0+", []string{"Apache-2.0+"}}, {"+ operator in GPL", "GPL-2.0+", []string{"GPL-2.0-or-later"}}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { licenses, err := ExtractLicenses(test.inputExpression) assert.ElementsMatch(t, test.extractedLicenses, licenses) if test.extractedLicenses == nil { assert.Error(t, err) } else { assert.NoError(t, err) } }) } } func TestExtractLicensesLicenseRefAndDedup(t *testing.T) { licenses, err := ExtractLicenses("(LicenseRef-custom OR LicenseRef-custom) AND (DocumentRef-spdx-tool-1.2:LicenseRef-custom OR MIT)") assert.NoError(t, err) assert.ElementsMatch(t, []string{"LicenseRef-custom", "DocumentRef-spdx-tool-1.2:LicenseRef-custom", "MIT"}, licenses) } func TestExtractLicensesLongExpressionDoesNotHang(t *testing.T) { if os.Getenv("GO_SPDX_EXTRACT_LICENSES_LONG_CHILD") == "1" { licenses, err := ExtractLicenses(kernelHeadersLicense) assert.NoError(t, err) assert.ElementsMatch(t, expectedKernelHeadersLicenses, licenses) return } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // #nosec G204 G702 -- safe in tests: re-executes current test binary with fixed arg cmd := exec.CommandContext(ctx, os.Args[0], "-test.run", "^TestExtractLicensesLongExpressionDoesNotHang$") cmd.Env = append(os.Environ(), "GO_SPDX_EXTRACT_LICENSES_LONG_CHILD=1") output, err := cmd.CombinedOutput() if ctx.Err() == context.DeadlineExceeded { t.Fatalf("ExtractLicenses timed out on long expression: %s", output) } if err != nil { t.Fatalf("child process failed: %v\n%s", err, output) } } go-spdx-2.6.0/spdxexp/license.go000066400000000000000000000030651517223150200165460ustar00rootroot00000000000000package spdxexp import ( "strings" "github.com/github/go-spdx/v2/spdxexp/spdxlicenses" ) // activeLicense returns true if the id is an active license. func activeLicense(id string) (bool, string) { return spdxlicenses.IsActiveLicense(id) } // ActiveLicense returns true if the id is an active license. func ActiveLicense(id string) (bool, string) { return activeLicense(id) } // deprecatedLicense returns true if the id is a deprecated license. func deprecatedLicense(id string) (bool, string) { return spdxlicenses.IsDeprecatedLicense(id) } // exceptionLicense returns true if the id is an exception license. func exceptionLicense(id string) (bool, string) { return spdxlicenses.IsException(id) } const ( licenseGroup uint8 = iota versionGroup licenseIndex ) type licenseRange struct { licenses []string location map[uint8]int // licenseGroup, versionGroup, licenseIndex } // getLicenseRange returns a range of licenses from licenseRanges func getLicenseRange(id string) *licenseRange { simpleID := simplifyLicense(id) allRanges := spdxlicenses.LicenseRanges() for i, licenseGrp := range allRanges { for j, versionGrp := range licenseGrp { for k, license := range versionGrp { if simpleID == license { location := map[uint8]int{ licenseGroup: i, versionGroup: j, licenseIndex: k, } return &licenseRange{ licenses: versionGrp, location: location, } } } } } return nil } func simplifyLicense(id string) string { if strings.HasSuffix(id, "-or-later") { return id[0 : len(id)-9] } return id } go-spdx-2.6.0/spdxexp/license_test.go000066400000000000000000000120731517223150200176040ustar00rootroot00000000000000package spdxexp import ( "testing" "github.com/stretchr/testify/assert" ) func TestActiveLicense(t *testing.T) { tests := []struct { name string inputID string outputID string result bool }{ {"active license - direct match", "Apache-2.0", "Apache-2.0", true}, {"active license - all upper", "APACHE-2.0", "Apache-2.0", true}, {"active license - all lower", "apache-2.0", "Apache-2.0", true}, {"active license - mixed case", "apACHe-2.0", "Apache-2.0", true}, {"deprecated license - direct match", "eCos-2.0", "eCos-2.0", false}, {"deprecated license - all upper", "ECOS-2.0", "eCos-2.0", false}, {"deprecated license - all lower", "ecos-2.0", "eCos-2.0", false}, {"deprecated license - mixed case", "ECos-2.0", "eCos-2.0", false}, {"exception license - direct match", "Bison-exception-2.2", "Bison-exception-2.2", false}, {"exception license - all upper", "BISON-EXCEPTION-2.2", "Bison-exception-2.2", false}, {"exception license - all lower", "bison-exception-2.2", "Bison-exception-2.2", false}, {"exception license - mixed case", "BisoN-Exception-2.2", "Bison-exception-2.2", false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { result, license := activeLicense((test.inputID)) assert.Equal(t, test.result, result) if result { // updated to the proper case if found assert.Equal(t, test.outputID, license) } else { // no change in case if not found assert.Equal(t, test.inputID, license) } }) } } func TestDeprecatedLicense(t *testing.T) { tests := []struct { name string inputID string outputID string result bool }{ {"active license - direct match", "Apache-2.0", "Apache-2.0", false}, {"active license - all upper", "APACHE-2.0", "Apache-2.0", false}, {"active license - all lower", "apache-2.0", "Apache-2.0", false}, {"active license - mixed case", "apACHe-2.0", "Apache-2.0", false}, {"deprecated license - direct match", "eCos-2.0", "eCos-2.0", true}, {"deprecated license - all upper", "ECOS-2.0", "eCos-2.0", true}, {"deprecated license - all lower", "ecos-2.0", "eCos-2.0", true}, {"deprecated license - mixed case", "ECos-2.0", "eCos-2.0", true}, {"exception license - direct match", "Bison-exception-2.2", "Bison-exception-2.2", false}, {"exception license - all upper", "BISON-EXCEPTION-2.2", "Bison-exception-2.2", false}, {"exception license - all lower", "bison-exception-2.2", "Bison-exception-2.2", false}, {"exception license - mixed case", "BisoN-Exception-2.2", "Bison-exception-2.2", false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { result, license := deprecatedLicense((test.inputID)) assert.Equal(t, test.result, result) if result { // updated to the proper case if found assert.Equal(t, test.outputID, license) } else { // no change in case if not found assert.Equal(t, test.inputID, license) } }) } } func TestExceptionLicense(t *testing.T) { tests := []struct { name string inputID string outputID string result bool }{ {"active license - direct match", "Apache-2.0", "Apache-2.0", false}, {"active license - all upper", "APACHE-2.0", "Apache-2.0", false}, {"active license - all lower", "apache-2.0", "Apache-2.0", false}, {"active license - mixed case", "apACHe-2.0", "Apache-2.0", false}, {"deprecated license - direct match", "eCos-2.0", "eCos-2.0", false}, {"deprecated license - all upper", "ECOS-2.0", "eCos-2.0", false}, {"deprecated license - all lower", "ecos-2.0", "eCos-2.0", false}, {"deprecated license - mixed case", "ECos-2.0", "eCos-2.0", false}, {"exception license - direct match", "Bison-exception-2.2", "Bison-exception-2.2", true}, {"exception license - all upper", "BISON-EXCEPTION-2.2", "Bison-exception-2.2", true}, {"exception license - all lower", "bison-exception-2.2", "Bison-exception-2.2", true}, {"exception license - mixed case", "BisoN-Exception-2.2", "Bison-exception-2.2", true}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { result, license := exceptionLicense((test.inputID)) assert.Equal(t, test.result, result) if result { // updated to the proper case if found assert.Equal(t, test.outputID, license) } else { // no change in case if not found assert.Equal(t, test.inputID, license) } }) } } func TestGetLicenseRange(t *testing.T) { tests := []struct { name string id string licenseRange *licenseRange }{ {"no multi-element ranges", "Apache-2.0", &licenseRange{ licenses: []string{"Apache-2.0"}, location: map[uint8]int{licenseGroup: 2, versionGroup: 2, licenseIndex: 0}}}, {"multi-element ranges", "GFDL-1.2-only", &licenseRange{ licenses: []string{"GFDL-1.2", "GFDL-1.2-only"}, location: map[uint8]int{licenseGroup: 21, versionGroup: 1, licenseIndex: 1}}}, {"no range", "Bison-exception-2.2", nil}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { licenseRange := getLicenseRange(test.id) assert.Equal(t, test.licenseRange, licenseRange) }) } } go-spdx-2.6.0/spdxexp/node.go000066400000000000000000000205561517223150200160550ustar00rootroot00000000000000package spdxexp import ( "sort" "strings" ) type nodePair struct { firstNode *node secondNode *node } type nodeRole uint8 const ( expressionNode nodeRole = iota licenseRefNode licenseNode ) type node struct { role nodeRole exp *expressionNodePartial lic *licenseNodePartial ref *referenceNodePartial } type expressionNodePartial struct { left *node conjunction string right *node } type licenseNodePartial struct { license string hasPlus bool hasException bool exception string } type referenceNodePartial struct { hasDocumentRef bool documentRef string licenseRef string } // ---------------------- Helper Methods ---------------------- func (n *node) isExpression() bool { return n.role == expressionNode } func (n *node) isOrExpression() bool { if !n.isExpression() { return false } return *n.conjunction() == "or" } func (n *node) isAndExpression() bool { if !n.isExpression() { return false } return *n.conjunction() == "and" } func (n *node) left() *node { if !n.isExpression() { return nil } return n.exp.left } func (n *node) conjunction() *string { if !n.isExpression() { return nil } return &(n.exp.conjunction) } func (n *node) right() *node { if !n.isExpression() { return nil } return n.exp.right } func (n *node) isLicense() bool { return n.role == licenseNode } // license returns the value of the license field. // See also reconstructedLicenseString() func (n *node) license() *string { if !n.isLicense() { return nil } return &(n.lic.license) } func (n *node) exception() *string { if !n.hasException() { return nil } return &(n.lic.exception) } func (n *node) hasPlus() bool { if !n.isLicense() { return false } return n.lic.hasPlus } func (n *node) hasException() bool { if !n.isLicense() { return false } return n.lic.hasException } func (n *node) isLicenseRef() bool { return n.role == licenseRefNode } func (n *node) licenseRef() *string { if !n.isLicenseRef() { return nil } return &(n.ref.licenseRef) } func (n *node) documentRef() *string { if !n.hasDocumentRef() { return nil } return &(n.ref.documentRef) } func (n *node) hasDocumentRef() bool { if !n.isLicenseRef() { return false } return n.ref.hasDocumentRef } // reconstructedLicenseString returns the string representation of the license or license ref. // TODO: Original had "NOASSERTION". Does that still apply? func (n *node) reconstructedLicenseString() *string { switch n.role { case licenseNode: license := *n.license() if n.hasPlus() && !strings.HasSuffix(strings.ToLower(license), "-or-later") { license += "+" } if n.hasException() { license += " WITH " + *n.exception() } return &license case licenseRefNode: license := "LicenseRef-" + *n.licenseRef() if n.hasDocumentRef() { license = "DocumentRef-" + *n.documentRef() + ":" + license } return &license } return nil } // sortLicenses sorts an array of license and license reference nodes alphabetically based // on their reconstructedLicenseString() representation. The sort function does not expect // expression nodes, but if one is in the nodes list, it will sort to the end. func sortLicenses(nodes []*node) { sort.Slice(nodes, func(i, j int) bool { if nodes[j].isExpression() { // push second license toward end by saying first license is less than return true } if nodes[i].isExpression() { // push first license toward end by saying second license is less than return false } return *nodes[i].reconstructedLicenseString() < *nodes[j].reconstructedLicenseString() }) } // ---------------------- Comparator Methods ---------------------- // licensesAreCompatible returns true if two licenses are compatible; otherwise, false. // Two licenses are compatible if they are the same license or if they are in the same // license group and they meet one of the following rules: // // * both licenses have the `hasPlus` flag set to true // * the first license has the `hasPlus` flag and the second license is in the first license's range or greater // * the second license has the `hasPlus` flag and the first license is in the second license's range or greater // * both licenses are in the same range func (nodes *nodePair) licensesAreCompatible() bool { // checking ranges is expensive, so check for simple cases first if !nodes.firstNode.isLicense() || !nodes.secondNode.isLicense() { return false } if !nodes.exceptionsAreCompatible() { return false } if nodes.licensesExactlyEqual() { return true } // simple cases don't apply, so check license ranges // NOTE: Ranges are organized into groups (referred to as license groups) of the same base license (e.g. GPL). // Groups have sub-groups of license versions (referred to as the range) where each member is considered // to be the same version (e.g. {GPL-2.0, GPL-2.0-only}). The sub-groups are in ascending order within // the license group, such that the first sub-group is considered to be less than the second sub-group, // and so on. (e.g. {{GPL-1.0}, {GPL-2.0, GPL-2.0-only}} implies {GPL-1.0} < {GPL-2.0, GPL-2.0-only}). if nodes.secondNode.hasPlus() { if nodes.firstNode.hasPlus() { // first+, second+ just need to be in same range group return nodes.rangesAreCompatible() } // first, second+ requires first to be in range of second return nodes.identifierInRange() } // else secondNode does not have plus if nodes.firstNode.hasPlus() { // first+, second requires second to be in range of first revNodes := &nodePair{firstNode: nodes.secondNode, secondNode: nodes.firstNode} return revNodes.identifierInRange() } // first, second requires both to be in same range group return nodes.rangesEqual() } // licenseRefsAreCompatible returns true if two license references are compatible; otherwise, false. func (nodes *nodePair) licenseRefsAreCompatible() bool { if !nodes.firstNode.isLicenseRef() || !nodes.secondNode.isLicenseRef() { return false } compatible := *nodes.firstNode.licenseRef() == *nodes.secondNode.licenseRef() compatible = compatible && (nodes.firstNode.hasDocumentRef() == nodes.secondNode.hasDocumentRef()) if compatible && nodes.firstNode.hasDocumentRef() { compatible = compatible && (*nodes.firstNode.documentRef() == *nodes.secondNode.documentRef()) } return compatible } // licenseRefsAreCompatible returns true if two licenses are in the same license group (e.g. all "GPL" licenses are in the same // license group); otherwise, false. func (nodes *nodePair) rangesAreCompatible() bool { firstNode := *nodes.firstNode secondNode := *nodes.secondNode firstRange := getLicenseRange(*firstNode.license()) secondRange := getLicenseRange(*secondNode.license()) // When both licenses allow later versions (i.e. hasPlus==true), being in the same license // group is sufficient for compatibility, as long as, any exception is also compatible // Example: All Apache licenses (e.g. Apache-1.0, Apache-2.0) are in the same license group return sameLicenseGroup(firstRange, secondRange) } // identifierInRange returns true if the (first) simple license is in range of the (second) // ranged license; otherwise, false. func (nodes *nodePair) identifierInRange() bool { simpleLicense := nodes.firstNode plusLicense := nodes.secondNode return compareGT(simpleLicense, plusLicense) || compareEQ(simpleLicense, plusLicense) } // exceptionsAreCompatible returns true if neither license has an exception or they have // the same exception; otherwise, false func (nodes *nodePair) exceptionsAreCompatible() bool { firstNode := *nodes.firstNode secondNode := *nodes.secondNode if !firstNode.hasException() && !secondNode.hasException() { // if neither has an exception, then licenses are compatible return true } if firstNode.hasException() != secondNode.hasException() { // if one has and exception and the other does not, then the license are NOT compatible return false } return *nodes.firstNode.exception() == *nodes.secondNode.exception() } // rangesEqual returns true if the licenses are in the same range; otherwise, false // (e.g. GPL-2.0-only == GPL-2.0) func (nodes *nodePair) rangesEqual() bool { return compareEQ(nodes.firstNode, nodes.secondNode) } // licensesExactlyEqual returns true if the licenses are the same; otherwise, false func (nodes *nodePair) licensesExactlyEqual() bool { return strings.EqualFold(*nodes.firstNode.reconstructedLicenseString(), *nodes.secondNode.reconstructedLicenseString()) } go-spdx-2.6.0/spdxexp/node_test.go000066400000000000000000000153361517223150200171140ustar00rootroot00000000000000package spdxexp import ( "testing" "github.com/stretchr/testify/assert" ) func TestReconstructedLicenseString(t *testing.T) { tests := []struct { name string node *node result string }{ {"License node - simple", getLicenseNode("MIT", false), "MIT"}, {"License node - plus", getLicenseNode("Apache-1.0", true), "Apache-1.0+"}, {"License node - exception", &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: true, exception: "Bison-exception-2.2"}, ref: nil, }, "GPL-2.0 WITH Bison-exception-2.2"}, {"LicenseRef node - simple", &node{ role: licenseRefNode, exp: nil, lic: nil, ref: &referenceNodePartial{ hasDocumentRef: false, documentRef: "", licenseRef: "MIT-Style-2", }, }, "LicenseRef-MIT-Style-2"}, {"LicenseRef node - with DocumentRef", &node{ role: licenseRefNode, exp: nil, lic: nil, ref: &referenceNodePartial{ hasDocumentRef: true, documentRef: "spdx-tool-1.2", licenseRef: "MIT-Style-2", }, }, "DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2"}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { license := *test.node.reconstructedLicenseString() assert.Equal(t, test.result, license) }) } } func TestLicensesAreCompatible(t *testing.T) { tests := []struct { name string nodes *nodePair result bool }{ {"compatible (exact equal): GPL-3.0, GPL-3.0", &nodePair{ getLicenseNode("GPL-3.0", false), getLicenseNode("GPL-3.0", false)}, true}, {"compatible (diff case equal): Apache-2.0, APACHE-2.0", &nodePair{ getLicenseNode("Apache-2.0", false), getLicenseNode("APACHE-2.0", false)}, true}, {"compatible (same version with +): Apache-1.0+, Apache-1.0", &nodePair{ getLicenseNode("Apache-1.0", true), getLicenseNode("Apache-1.0", false)}, true}, {"compatible (later version with +): Apache-1.0+, Apache-2.0", &nodePair{ getLicenseNode("Apache-1.0", true), getLicenseNode("Apache-2.0", false)}, true}, {"compatible (second version with +): Apache-2.0, Apache-1.0+", &nodePair{ getLicenseNode("Apache-2.0", false), getLicenseNode("Apache-1.0", true)}, true}, {"compatible (later version with both +): Apache-1.0+, Apache-2.0+", &nodePair{ getLicenseNode("Apache-1.0", true), getLicenseNode("Apache-2.0", true)}, true}, {"compatible (same version with -or-later): GPL-2.0-or-later, GPL-2.0", &nodePair{ getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0", false)}, true}, {"compatible (same version with -or-later and -only): GPL-2.0-or-later, GPL-2.0-only", &nodePair{ getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-2.0-only", false)}, true}, // TODO: Double check that -or-later and -only should be true for GT {"compatible (later version with -or-later): GPL-2.0-or-later, GPL-3.0", &nodePair{ getLicenseNode("GPL-2.0-or-later", true), getLicenseNode("GPL-3.0", false)}, true}, {"incompatible (same version with -or-later exception): GPL-2.0, GPL-2.0-or-later WITH Bison-exception-2.2", &nodePair{ getLicenseNode("GPL-2.0", true), &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: true, hasException: true, exception: "Bison-exception-2.2"}, ref: nil, }}, false}, {"incompatible (different versions using -only): GPL-3.0-only, GPL-2.0-only", &nodePair{ getLicenseNode("GPL-3.0-only", false), getLicenseNode("GPL-2.0-only", false)}, false}, {"incompatible (different versions with letter): LPPL-1.3c, LPPL-1.3a", &nodePair{ getLicenseNode("LPPL-1.3c", false), getLicenseNode("LPPL-1.3a", false)}, false}, {"incompatible (first > second): AGPL-3.0, AGPL-1.0", &nodePair{ getLicenseNode("AGPL-3.0", false), getLicenseNode("AGPL-1.0", false)}, false}, {"incompatible (second > first): MPL-1.0, MPL-2.0", &nodePair{ getLicenseNode("MPL-1.0", false), getLicenseNode("MPL-2.0", false)}, false}, {"incompatible (diff licenses): MIT, ISC", &nodePair{ getLicenseNode("MIT", false), getLicenseNode("ISC", false)}, false}, {"not simple license: (MIT OR ISC), GPL-3.0", &nodePair{ getParsedNode("(MIT OR ISC)"), getLicenseNode("GPL-3.0", false)}, false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, test.nodes.licensesAreCompatible()) }) } } func TestRangesAreCompatible(t *testing.T) { tests := []struct { name string nodes *nodePair result bool }{ {"compatible - both use -or-later", &nodePair{ firstNode: getLicenseNode("GPL-1.0-or-later", true), secondNode: getLicenseNode("GPL-2.0-or-later", true)}, true}, {"compatible - both use +", &nodePair{ firstNode: getLicenseNode("Apache-1.0", true), secondNode: getLicenseNode("Apache-2.0", true)}, true}, {"not compatible", &nodePair{ firstNode: getLicenseNode("GPL-1.0-or-later", true), secondNode: getLicenseNode("LGPL-3.0-or-later", true)}, false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, test.nodes.rangesAreCompatible()) }) } } func TestIdentifierInRange(t *testing.T) { tests := []struct { name string nodes *nodePair result bool }{ {"in or-later range (later)", &nodePair{ firstNode: getLicenseNode("GPL-3.0", false), secondNode: getLicenseNode("GPL-2.0-or-later", true)}, true}, {"in or-later range (same)", &nodePair{ firstNode: getLicenseNode("GPL-2.0", false), secondNode: getLicenseNode("GPL-2.0-or-later", true)}, true}, {"in + range (1.0+)", &nodePair{ firstNode: getLicenseNode("Apache-2.0", false), secondNode: getLicenseNode("Apache-1.0", true)}, true}, {"not in range", &nodePair{ firstNode: getLicenseNode("GPL-1.0", false), secondNode: getLicenseNode("GPL-2.0-or-later", true)}, false}, {"different base license", &nodePair{ firstNode: getLicenseNode("GPL-1.0", false), secondNode: getLicenseNode("LGPL-2.0-or-later", true)}, false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, test.nodes.identifierInRange()) }) } } func TestLicensesExactlyEqual(t *testing.T) { tests := []struct { name string nodes *nodePair result bool }{ {"equal", &nodePair{ firstNode: getLicenseNode("GPL-2.0", false), secondNode: getLicenseNode("GPL-2.0", false)}, true}, {"not equal", &nodePair{ firstNode: getLicenseNode("GPL-1.0", false), secondNode: getLicenseNode("GPL-2.0", false)}, false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, test.nodes.licensesExactlyEqual()) }) } } go-spdx-2.6.0/spdxexp/parse.go000066400000000000000000000226271517223150200162430ustar00rootroot00000000000000package spdxexp import ( "errors" "strings" ) // The ABNF grammar in the spec is totally ambiguous. // // This parser follows the operator precedence defined in the // `Order of Precedence and Parentheses` section. type tokenStream struct { tokens []token index int err error } func parse(source string) (*node, error) { if len(source) == 0 { return nil, errors.New("parse error - cannot parse empty string") } tokens, err := scan(source) if err != nil { return nil, err } tokns := &tokenStream{tokens: tokens, index: 0, err: nil} return tokns.parseTokens(), tokns.err } func (t *tokenStream) parseTokens() *node { if len(t.tokens) == 0 { // malformed with no tokens t.err = errors.New("no tokens to parse") return nil } node := t.parseExpression() if t.err != nil { return nil } if node == nil { // unable to parse expression for unknown reason t.err = errors.New("syntax error") return nil } else if t.hasMore() { // malformed with too many tokens - try to determine the cause // check for close parenthesis without matching open parenthesis closeParen := t.parseOperator(")") if closeParen != nil { t.err = errors.New("close parenthesis does not have a matching open parenthesis") return nil } // check for licenses without operator lic := t.parseLicense() if lic != nil { t.err = errors.New("licenses or expressions are not separated by an operator") return nil } // cannot determine what syntax error occurred t.err = errors.New("syntax error") return nil } // all is well return node } // Return true if there is another token to process; otherwise, return false. func (t *tokenStream) hasMore() bool { return t.index < len(t.tokens) } // Return the value of the next token without advancing the index. func (t *tokenStream) peek() *token { if t.hasMore() { token := t.tokens[t.index] return &token } return nil } // Advance the index to the next token. func (t *tokenStream) next() { if !t.hasMore() { t.err = errors.New("read past end of tokens") return } t.index++ } func (t *tokenStream) parseParenthesizedExpression() *node { openParen := t.parseOperator("(") if openParen == nil { // paren not found return nil } expr := t.parseExpression() if t.err != nil { return nil } if !t.hasMore() { // no more tokens, so missing closing paren t.err = errors.New("open parenthesis does not have a matching close parenthesis") return nil } closeParen := t.parseOperator(")") if closeParen == nil { t.err = errors.New("open parenthesis does not have a matching close parenthesis") return nil } return expr } func (t *tokenStream) parseAtom() *node { parenNode := t.parseParenthesizedExpression() if t.err != nil { return nil } if parenNode != nil { return parenNode } refNode := t.parseLicenseRef() if t.err != nil { return nil } if refNode != nil { return refNode } licenseNode := t.parseLicense() if t.err != nil { return nil } if licenseNode != nil { return licenseNode } // no atom found - try to determine the cause if t.hasMore() { // check for operators operator := t.parseOperator(")") if operator != nil { if t.index == 1 { t.err = errors.New("expression starts with close parenthesis") } else { t.err = errors.New("expected license or expression, but found close parenthesis") } return nil } operator = t.parseOperator("OR") if operator != nil { if t.index == 1 { t.err = errors.New("expression starts with OR") } else { t.err = errors.New("expected license or expression, but found OR") } return nil } operator = t.parseOperator("AND") if operator != nil { if t.index == 1 { t.err = errors.New("expression starts with AND") } else { t.err = errors.New("expected license or expression, but found AND") } return nil } // cannot determine what syntax error occurred t.err = errors.New("syntax error") return nil } t.err = errors.New("expected node, but found none") return nil } func (t *tokenStream) parseExpression() *node { left := t.parseAnd() if t.err != nil { return nil } if left == nil { return nil } if !t.hasMore() { // expression found and no more tokens to process return left } operator := t.parseOperator("OR") if operator == nil { return left } op := strings.ToLower(*operator) if !t.hasMore() { // expression found and no more tokens to process t.err = errors.New("expected expression following OR, but found none") return nil } right := t.parseExpression() if t.err != nil { return nil } if right == nil { t.err = errors.New("expected expression following OR, but found none") return nil } return &(node{ role: expressionNode, exp: &(expressionNodePartial{ left: left, conjunction: op, right: right, }), }) } // Return a node representation of an atomic value or an AND expression. If a malformed // atomic value or expression is found, an error is returned. Advances the index if a // valid atomic value or a valid expression is found. func (t *tokenStream) parseAnd() *node { left := t.parseAtom() if t.err != nil { return nil } if left == nil { return nil } if !t.hasMore() { // atomic token found and no more tokens to process return left } operator := t.parseOperator("AND") if operator == nil { return left } if !t.hasMore() { // expression found and no more tokens to process t.err = errors.New("expected expression following AND, but found none") return nil } right := t.parseAnd() if t.err != nil { return nil } if right == nil { t.err = errors.New("expected expression following AND, but found none") return nil } exp := expressionNodePartial{left: left, conjunction: "and", right: right} return &(node{ role: expressionNode, exp: &exp, }) } // Return a node representation of a License Reference. If a malformed license reference is // found, an error is returned. Advances the index if a valid license reference is found. func (t *tokenStream) parseLicenseRef() *node { ref := referenceNodePartial{documentRef: "", hasDocumentRef: false, licenseRef: ""} token := t.peek() if token.role == documentRefToken { ref.documentRef = token.value ref.hasDocumentRef = true t.next() operator := t.parseOperator(":") if operator == nil { t.err = errors.New("expected ':' after 'DocumentRef-...'") return nil } } token = t.peek() if token.role != licenseRefToken && ref.hasDocumentRef { t.err = errors.New("expected 'LicenseRef-...' after 'DocumentRef-...'") return nil } else if token.role != licenseRefToken { // not found is not an error as long as DocumentRef and : weren't the previous tokens return nil } ref.licenseRef = token.value t.next() return &(node{ role: licenseRefNode, ref: &ref, }) } // Return a node representation of a License. If a malformed license is found, // an error is returned. Advances the index if a valid license is found. func (t *tokenStream) parseLicense() *node { token := t.peek() if token.role != licenseToken { return nil } t.next() lic := licenseNodePartial{ license: token.value, hasPlus: false, hasException: false, exception: ""} // for licenses that specifically support -or-later, a `+` operator token isn't expected to be present if strings.HasSuffix(token.value, "-or-later") { lic.hasPlus = true } if t.hasMore() { // use new var idx to avoid creating a new var index operator := t.parseOperator("+") if operator != nil { lic.hasPlus = true } if t.hasMore() { exception := t.parseWith() if t.err != nil { return nil } if exception != nil { lic.hasException = true lic.exception = *exception t.next() } } } return &(node{ role: licenseNode, lic: &lic, }) } // Return the operator's value (e.g. AND, OR, WITH) if the current token is an OPERATOR. // Advances the index if the operator is found. func (t *tokenStream) parseOperator(operator string) *string { token := t.peek() if token.role == operatorToken && token.value == operator { t.next() return &(token.value) } // requested operator not found return nil } // Get the exception license when the WITH operator is found. // Return without advancing the index if the current token is not the WITH operator. // Raise an error if the WITH operator is not followed by and EXCEPTION license. func (t *tokenStream) parseWith() *string { operator := t.parseOperator("WITH") if operator == nil { // WITH not found is not an error return nil } token := t.peek() if token == nil || token.role != exceptionToken { t.err = errors.New("expected exception after 'WITH'") return nil } return &(token.value) } // Returns a human readable representation of the node tree. func (n *node) string() string { switch n.role { case expressionNode: return expressionString(*n.exp) case licenseNode: return licenseString(*n.lic) case licenseRefNode: return referenceString(*n.ref) } return "" } func expressionString(exp expressionNodePartial) string { s := "{ LEFT: " + exp.left.string() + " " s += exp.conjunction s += " RIGHT: " + exp.right.string() + " }" return s } func licenseString(lic licenseNodePartial) string { s := lic.license if lic.hasPlus { s += "+" } if lic.hasException { s += " with " + lic.exception } return s } func referenceString(ref referenceNodePartial) string { s := "" if ref.hasDocumentRef { s = "DocumentRef-" + ref.documentRef + ":" } s += "LicenseRef-" + ref.licenseRef return s } go-spdx-2.6.0/spdxexp/parse_test.go000066400000000000000000001151011517223150200172700ustar00rootroot00000000000000package spdxexp import ( "errors" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParse(t *testing.T) { tests := []struct { name string expression string node *node nodestr string err error }{ {"single license", "MIT", &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, "MIT", nil}, {"single license - diff case", "mit", &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, "MIT", nil}, {"empty expression", "", nil, "", errors.New("parse error - cannot parse empty string")}, {"invalid license", "NON-EXISTENT-LICENSE", nil, "", errors.New("unknown license 'NON-EXISTENT-LICENSE' at offset 0")}, {"OR Expression", "MIT OR Apache-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: Apache-2.0 }", nil}, {"AND Expression", "MIT AND Apache-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT and RIGHT: Apache-2.0 }", nil}, {"OR-AND Expression", "MIT OR Apache-2.0 AND GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: { LEFT: Apache-2.0 and RIGHT: GPL-2.0 } }", nil}, {"OR(AND) Expression", "MIT OR (Apache-2.0 AND GPL-2.0)", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: { LEFT: Apache-2.0 and RIGHT: GPL-2.0 } }", nil}, {"AND-OR Expression", "MIT AND Apache-2.0 OR GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: { LEFT: MIT and RIGHT: Apache-2.0 } or RIGHT: GPL-2.0 }", nil}, {"AND(OR) Expression", "MIT AND (Apache-2.0 OR GPL-2.0)", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT and RIGHT: { LEFT: Apache-2.0 or RIGHT: GPL-2.0 } }", nil}, {"OR-AND-OR Expression", "MIT OR ISC AND Apache-2.0 OR GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: { LEFT: { LEFT: ISC and RIGHT: Apache-2.0 } or RIGHT: GPL-2.0 } }", nil}, {"(OR)AND(OR) Expression", "(MIT OR ISC) AND (Apache-2.0 OR GPL-2.0)", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "and", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: { LEFT: MIT or RIGHT: ISC } and RIGHT: { LEFT: Apache-2.0 or RIGHT: GPL-2.0 } }", nil}, {"OR(AND)OR Expression", "MIT OR (ISC AND Apache-2.0) OR GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: { LEFT: { LEFT: ISC and RIGHT: Apache-2.0 } or RIGHT: GPL-2.0 } }", nil}, {"OR-OR-OR Expression", "MIT OR ISC OR Apache-2.0 OR GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: { LEFT: ISC or RIGHT: { LEFT: Apache-2.0 or RIGHT: GPL-2.0 } } }", nil}, {"AND-OR-AND Expression", "MIT AND ISC OR Apache-2.0 AND GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: { LEFT: MIT and RIGHT: ISC } or RIGHT: { LEFT: Apache-2.0 and RIGHT: GPL-2.0 } }", nil}, {"(AND)OR(AND) Expression", "(MIT AND ISC) OR (Apache-2.0 AND GPL-2.0)", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: { LEFT: MIT and RIGHT: ISC } or RIGHT: { LEFT: Apache-2.0 and RIGHT: GPL-2.0 } }", nil}, {"AND(OR)AND Expression", "MIT AND (ISC OR Apache-2.0) AND GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT and RIGHT: { LEFT: { LEFT: ISC or RIGHT: Apache-2.0 } and RIGHT: GPL-2.0 } }", nil}, {"AND-AND-AND Expression", "MIT AND ISC AND Apache-2.0 AND GPL-2.0", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT and RIGHT: { LEFT: ISC and RIGHT: { LEFT: Apache-2.0 and RIGHT: GPL-2.0 } } }", nil}, {"kitchen sink", " (MIT AND Apache-1.0+) OR DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2 OR (GPL-2.0 WITH Bison-exception-2.2)", &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-1.0", hasPlus: true, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseRefNode, exp: nil, lic: nil, ref: &referenceNodePartial{ hasDocumentRef: true, documentRef: "spdx-tool-1.2", licenseRef: "MIT-Style-2", }, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: true, exception: "Bison-exception-2.2", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: { LEFT: MIT and RIGHT: Apache-1.0+ } or RIGHT: { LEFT: DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2 or RIGHT: GPL-2.0 with Bison-exception-2.2 } }", nil, }, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { startNode, err := parse(test.expression) require.Equal(t, test.err, err) if test.err != nil { // when error, check that returned node is nil var nilNode *node assert.Equal(t, nilNode, startNode, "Expected nil node when error occurs.") return } // ref found, check token values are as expected assert.Equal(t, test.node, startNode) assert.Equal(t, test.nodestr, startNode.string()) }) } } func TestParseTokens(t *testing.T) { tests := []struct { name string tokens *tokenStream node *node nodestr string err error }{ {"single license", getLicenseTokens(0), &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, "MIT", nil}, {"two licenses using AND", getAndClauseTokens(0), &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT and RIGHT: Apache-2.0 }", nil}, {"two licenses using OR", getOrClauseTokens(0), &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: MIT or RIGHT: Apache-2.0 }", nil}, {"kitchen sink", getKitchSinkTokens(0), &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-1.0", hasPlus: true, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseRefNode, exp: nil, lic: nil, ref: &referenceNodePartial{ hasDocumentRef: true, documentRef: "spdx-tool-1.2", licenseRef: "MIT-Style-2", }, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: true, exception: "Bison-exception-2.2", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, "{ LEFT: { LEFT: MIT and RIGHT: Apache-1.0+ } or RIGHT: { LEFT: DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2 or RIGHT: GPL-2.0 with Bison-exception-2.2 } }", nil, }, {"operator error - missing close parenthesis", getMissingEndParenTokens(0), &node{}, "", errors.New("open parenthesis does not have a matching close parenthesis"), }, {"operator error - missing open parenthesis", getMissingStartParenTokens(0), &node{}, "", errors.New("close parenthesis does not have a matching open parenthesis"), }, {"operator error - missing operator", getMissingOperatorTokens(0), &node{}, "", errors.New("licenses or expressions are not separated by an operator"), }, {"operator error - starts with close parenthesis", getStartsWithCloseParenTokens(0), &node{}, "", errors.New("expression starts with close parenthesis"), }, {"operator error - starts with OR", getStartsWithORTokens(0), &node{}, "", errors.New("expression starts with OR"), }, {"operator error - starts with AND", getStartsWithANDTokens(0), &node{}, "", errors.New("expression starts with AND"), }, {"operator error - ends with OR", getEndsWithORTokens(0), &node{}, "", errors.New("expected expression following OR, but found none"), }, {"operator error - ends with AND", getEndsWithANDTokens(0), &node{}, "", errors.New("expected expression following AND, but found none"), }, {"operator error - OR immediately after operator", getDoubleORTokens(0), &node{}, "", errors.New("expected license or expression, but found OR"), }, {"operator error - AND immediately after operator", getDoubleANDTokens(0), &node{}, "", errors.New("expected license or expression, but found AND"), }, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { startNode := test.tokens.parseTokens() require.Equal(t, test.err, test.tokens.err) if test.err != nil { // when error, check that returned node is nil var nilNode *node assert.Equal(t, nilNode, startNode, "Expected nil node when error occurs.") return } // ref found, check token values are as expected assert.Equal(t, test.node, startNode) assert.Equal(t, test.nodestr, startNode.string()) }) } } func TestHasMoreTokens(t *testing.T) { tests := []struct { name string tokens *tokenStream result bool }{ {"at start", getAndClauseTokens(0), true}, {"at middle", getAndClauseTokens(1), true}, {"at end", getAndClauseTokens(2), true}, {"past end", getAndClauseTokens(3), false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, test.tokens.hasMore()) }) } } func TestPeek(t *testing.T) { tests := []struct { name string tokens *tokenStream token *token }{ {"at start", getAndClauseTokens(0), &(token{role: licenseToken, value: "MIT"})}, {"at middle", getAndClauseTokens(1), &(token{role: operatorToken, value: "AND"})}, {"at end", getAndClauseTokens(2), &(token{role: licenseToken, value: "Apache-2.0"})}, {"past end", getAndClauseTokens(3), nil}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.token, test.tokens.peek()) }) } } func TestNext(t *testing.T) { tests := []struct { name string tokens *tokenStream newIndex int err error }{ {"at start", getAndClauseTokens(0), 1, nil}, {"at middle", getAndClauseTokens(1), 2, nil}, {"at end", getAndClauseTokens(2), 3, nil}, {"past end", getAndClauseTokens(3), 3, errors.New("read past end of tokens")}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { test.tokens.next() assert.Equal(t, test.newIndex, test.tokens.index) require.Equal(t, test.err, test.tokens.err) }) } } // // TODO: func parseParenthesizedExpression(tokens *[]token, index int) (*node, int, error) { // // TODO: func parseAtom(tokens *[]token, index int) (*node, int, error) { // // TODO: func parseExpression(tokens *[]token, index int) (*node, int, error) { // // TODO: func parseAnd(tokens *[]token, index int) (*node, int, error) { // // TODO: func parseLicenseRef(tokens *[]token, index int) (*node, int, error) { // // TODO: func parseLicense(tokens *[]token, index int) (*node, int, error) { func TestParseOperator(t *testing.T) { tests := []struct { name string tokens *tokenStream operator string expectNil bool newIndex int }{ {"looking for WITH operator", getWithClauseTokens(1), "WITH", false, 2}, {"looking for AND operator", getAndClauseTokens(1), "AND", false, 2}, {"looking for OR operator", getOrClauseTokens(1), "OR", false, 2}, {"looking for ( operator", getOrAndClauseTokens(2), "(", false, 3}, {"looking for ) operator", getOrAndClauseTokens(6), ")", false, 7}, {"looking for : operator", getColonClauseTokens(1), ":", false, 2}, {"looking for + operator", getPlusClauseTokens(1), "+", false, 2}, {"looking for OR operator, but got AND", getAndClauseTokens(1), "OR", true, 1}, {"looking for OR operator, but got LICENSE", getOrClauseTokens(0), "OR", true, 0}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { token := test.tokens.parseOperator(test.operator) require.Equal(t, test.newIndex, test.tokens.index) if test.expectNil { // returned token is nil if it isn't an operator or it is a different operator var nilToken *string assert.Equal(t, nilToken, token) } else { // index advances when token is the expected operator assert.Equal(t, test.operator, *token) } }) } } // func parseWith(tokens *[]token, index int) (*string, int, error) { func TestParseWith(t *testing.T) { tests := []struct { name string tokens *tokenStream exception string expectNil bool newIndex int err error }{ {"WITH followed by EXCEPTION", getWithClauseTokens(1), "Bison-exception-2.2", false, 2, nil}, {"WITH not followed by EXCEPTION", getInvalidWithClauseTokens(1), "", true, 2, errors.New("expected exception after 'WITH'")}, {"not with", getOrClauseTokens(1), "", true, 1, nil}, {"WITH not followed by any tokens", getMalformedWithClauseTokens(1), "", true, 2, errors.New("expected exception after 'WITH'")}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { exceptionLicense := test.tokens.parseWith() assert.Equal(t, test.newIndex, test.tokens.index) require.Equal(t, test.err, test.tokens.err) if test.expectNil { // exception license is nil when error occurs or WITH operator is not found var nilString *string assert.Equal(t, nilString, exceptionLicense) return } // WITH found, check exceptionLicense value assert.Equal(t, test.exception, *exceptionLicense) }) } } // TODO: func (n *node) String() string { func getLicenseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) return getTokenStream(tokens, index) } func getWithClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "WITH"}) tokens = append(tokens, token{role: exceptionToken, value: "Bison-exception-2.2"}) return getTokenStream(tokens, index) } func getInvalidWithClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "WITH"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) return getTokenStream(tokens, index) } func getMalformedWithClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) tokens = append(tokens, token{role: operatorToken, value: "WITH"}) return getTokenStream(tokens, index) } func getAndClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "AND"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) return getTokenStream(tokens, index) } func getOrClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) return getTokenStream(tokens, index) } func getOrAndClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: operatorToken, value: "("}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "AND"}) tokens = append(tokens, token{role: licenseToken, value: "Apache 2.0"}) tokens = append(tokens, token{role: operatorToken, value: ")"}) return getTokenStream(tokens, index) } func getColonClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: documentRefToken, value: "spdx-tool-1.2"}) tokens = append(tokens, token{role: operatorToken, value: ":"}) tokens = append(tokens, token{role: licenseRefToken, value: "MIT-Style-2"}) return getTokenStream(tokens, index) } func getPlusClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "Apache-1.0"}) tokens = append(tokens, token{role: operatorToken, value: "+"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) return getTokenStream(tokens, index) } func getKitchSinkTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: operatorToken, value: "("}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "AND"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-1.0"}) tokens = append(tokens, token{role: operatorToken, value: "+"}) tokens = append(tokens, token{role: operatorToken, value: ")"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: documentRefToken, value: "spdx-tool-1.2"}) tokens = append(tokens, token{role: operatorToken, value: ":"}) tokens = append(tokens, token{role: licenseRefToken, value: "MIT-Style-2"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: operatorToken, value: "("}) tokens = append(tokens, token{role: licenseToken, value: "GPL-2.0"}) tokens = append(tokens, token{role: operatorToken, value: "WITH"}) tokens = append(tokens, token{role: exceptionToken, value: "Bison-exception-2.2"}) tokens = append(tokens, token{role: operatorToken, value: ")"}) return getTokenStream(tokens, index) } func getMissingOperatorTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) return getTokenStream(tokens, index) } func getStartsWithCloseParenTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: operatorToken, value: ")"}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) return getTokenStream(tokens, index) } func getStartsWithORTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) return getTokenStream(tokens, index) } func getStartsWithANDTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: operatorToken, value: "AND"}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) return getTokenStream(tokens, index) } func getEndsWithORTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) return getTokenStream(tokens, index) } func getEndsWithANDTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "AND"}) return getTokenStream(tokens, index) } func getDoubleORTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: operatorToken, value: "OR"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) return getTokenStream(tokens, index) } func getDoubleANDTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: "AND"}) tokens = append(tokens, token{role: operatorToken, value: "AND"}) tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) return getTokenStream(tokens, index) } func getMissingStartParenTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"}) tokens = append(tokens, token{role: operatorToken, value: ")"}) return getTokenStream(tokens, index) } func getMissingEndParenTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: operatorToken, value: "("}) tokens = append(tokens, token{role: licenseToken, value: "MIT"}) return getTokenStream(tokens, index) } func getTokenStream(tokens []token, index int) *tokenStream { return &tokenStream{ tokens: tokens, index: index, err: nil, } } go-spdx-2.6.0/spdxexp/satisfies.go000066400000000000000000000407351517223150200171230ustar00rootroot00000000000000package spdxexp import ( "errors" "sort" "strings" ) // ValidateLicenses checks if given licenses are valid according to spdx. // Returns true if all licenses are valid; otherwise, false. // Returns all the invalid licenses contained in the `licenses` argument. func ValidateLicenses(licenses []string) (bool, []string) { return ValidateLicensesWithOptions(licenses, ValidateLicensesOptions{}) } // ValidateLicensesOptions controls how ValidateLicensesWithOptions validates input. type ValidateLicensesOptions struct { // FailComplexExpressions rejects SPDX license expressions (e.g. "MIT AND Apache-2.0"). // Single license identifiers (including those with a WITH exception) are still allowed. FailComplexExpressions bool // FailDeprecatedLicenses rejects deprecated SPDX license identifiers (e.g. "eCos-2.0"). FailDeprecatedLicenses bool // FailAllLicenseRefs rejects all SPDX license references (e.g. "LicenseRef-MyLicense"). FailAllLicenseRefs bool // FailAllDocumentRefs rejects all SPDX document references (e.g. "DocumentRef-MyDocument"). FailAllDocumentRefs bool } // ValidateLicensesWithOptions checks if given licenses are valid according to SPDX. // Returns true if all licenses are valid; otherwise, false. // Returns all the invalid licenses contained in the `licenses` argument. func ValidateLicensesWithOptions(licenses []string, options ValidateLicensesOptions) (bool, []string) { // handle all other cases with parsing, which will cover both single and multiple licenses and expressions valid := true invalidLicenses := []string{} for _, license := range licenses { // MIT is the most common license, so check for it first before doing any processing to optimize for this case. // By putting the isMIT check here, we can avoid the overhead of parsing for the most common case of MIT. // Having it before trimming means that licenses with leading/trailing whitespace will not be validated // as MIT by isMIT, but will still be correctly identified using activeLicense. As this is uncommon, it // is an acceptable tradeoff to avoid the overhead of trimming for the more common case. if isMIT(license) { continue } license = strings.TrimSpace(license) isAtomic := isAtomicLicense(license) if isAtomic { if ok, _ := activeLicense(license); ok { continue } if ok, _ := deprecatedLicense(license); ok { if options.FailDeprecatedLicenses { valid = false invalidLicenses = append(invalidLicenses, license) continue } // if FailDeprecatedLicenses is false, then consider the deprecated license valid and continue continue } if options.FailAllLicenseRefs { if strings.HasPrefix(license, "LicenseRef-") { valid = false invalidLicenses = append(invalidLicenses, license) continue } } if options.FailAllDocumentRefs { if strings.HasPrefix(license, "DocumentRef-") { valid = false invalidLicenses = append(invalidLicenses, license) continue } } // need to let this pass through to allow parsing LicenseRef and DocumentRef if either are allowed types } if !isAtomic { if hasException, licensePart, exceptionPart := isLicenseWithException(license); hasException { // matches pattern "licensePart WITH exceptionPart", so validate both parts separately if ok, _ := exceptionLicense(exceptionPart); ok { if ok, _ := activeLicense(licensePart); ok { continue } if !options.FailDeprecatedLicenses { if ok, _ := deprecatedLicense(licensePart); ok { continue } } } valid = false invalidLicenses = append(invalidLicenses, license) continue } } // all other non-atomic expressions are complex expressions with conjunctions (e.g. "MIT AND Apache-2.0"), // so fail if complex expressions are not allowed if options.FailComplexExpressions && !isAtomic { valid = false invalidLicenses = append(invalidLicenses, license) continue } // need to parse if allowing any of LicenseRef, DocumentRef, or complex expressions to be able to determine // whether the license expression is valid if _, err := parse(license); err != nil { valid = false invalidLicenses = append(invalidLicenses, license) } } return valid, invalidLicenses } // Satisfies determines if the allowed list of licenses satisfies the test license expression. // Returns true if allowed list satisfies test license expression; otherwise, false. // Returns error if error occurs during processing. func Satisfies(testExpression string, allowedList []string) (bool, error) { if len(allowedList) == 0 { return false, errors.New("allowedList requires at least one element, but is empty") } // MIT is the most common license, so check for it first before doing any processing to optimize for this case. // By putting the isMIT check here, we can avoid the overhead of parsing for the most common case of MIT. // Having it before trimming means that licenses with leading/trailing whitespace will not be validated // as MIT by isMIT, but will still be correctly identified using activeLicense. As this is uncommon, it // is an acceptable tradeoff to avoid the overhead of trimming for the more common case. if isMIT(testExpression) { for _, allowed := range allowedList { if strings.EqualFold(allowed, "MIT") { return true, nil } } return false, nil } testExpression = strings.TrimSpace(testExpression) if isAtomicLicense(testExpression) { // if only one license in the test expression, check for active license to avoid the overhead of parsing if ok, _ := activeLicense(testExpression); ok { for _, allowed := range allowedList { if strings.EqualFold(allowed, testExpression) { return true, nil } } } // if only one license in the test expression, check for deprecated license to avoid the overhead of parsing if ok, _ := deprecatedLicense(testExpression); ok { for _, allowed := range allowedList { if strings.EqualFold(allowed, testExpression) { return true, nil } } } } // if test expression is a single license with exception, check it now to avoid the overhead of parsing if hasException, licensePart, exceptionPart := isLicenseWithException(testExpression); hasException { // matches pattern "licensePart WITH exceptionPart", so validate both parts separately if ok, _ := activeLicense(licensePart); ok { if ok, _ := exceptionLicense(exceptionPart); ok { for _, allowed := range allowedList { if strings.EqualFold(allowed, testExpression) { return true, nil } } } } } // handle all other cases with parsing, which will cover both single and multiple licenses and expressions expressionNode, err := parse(testExpression) if err != nil { return false, err } allowedNodes, err := stringsToNodes(allowedList) if err != nil { return false, err } sortAndDedup(allowedNodes) expandedExpression := expressionNode.expand(true) for _, expressionPart := range expandedExpression { if isCompatible(expressionPart, allowedNodes) { // return once any expressionPart is compatible with the allow list // * each part is an array of licenses that are ANDed, meaning all have to be on the allowedList // * the parts are ORed, meaning only one of the parts need to be compatible return true, nil } } return false, nil } // stringsToNodes converts an array of single license strings to to an array of license nodes. func stringsToNodes(licenseStrings []string) ([]*node, error) { nodes := make([]*node, len(licenseStrings)) for i, s := range licenseStrings { node, err := parse(s) if err != nil { return nil, err } if node.isExpression() { return nil, errors.New("expressions are not supported in the allowedList") } nodes[i] = node } return nodes, nil } // isMIT checks if the test expression is MIT, ignoring case. // NOTE: Caller should trim the test expression before calling this function to avoid false // negatives (e.g. " MIT " would not match "MIT"). func isMIT(testExpression string) bool { return strings.EqualFold(testExpression, "MIT") } // isAtomicLicense checks if the test expression is a single license identifier (e.g. "MIT"). // NOTE: Caller should trim the test expression before calling this function to avoid false // negatives (e.g. " MIT " would not be considered a single license). func isAtomicLicense(testExpression string) bool { return !strings.Contains(testExpression, " ") } // isException checks if the test expression contains two licenses separated by WITH // (e.g. "GPL-2.0-or-later WITH Bison-exception-2.2"). // NOTE: Caller should trim the test expression before calling this function to avoid false // negatives (e.g. " MIT " would not be considered a single license). func isLicenseWithException(testExpression string) (bool, string, string) { // split by " " and check if there are exactly 3 parts and the middle part is "WITH" parts := strings.Fields(testExpression) if len(parts) == 3 && strings.EqualFold(parts[1], "WITH") { return true, parts[0], parts[2] } return false, "", "" } // isCompatible checks if expressionPart is compatible with allowed list. // Expression part is an array of licenses that are ANDed together. // Allowed is an array of licenses that can fulfill the expression. func isCompatible(expressionPart, allowed []*node) bool { for _, expLicense := range expressionPart { compatible := false for _, allowedLicense := range allowed { nodes := &nodePair{firstNode: expLicense, secondNode: allowedLicense} if nodes.licensesAreCompatible() || nodes.licenseRefsAreCompatible() { compatible = true break } } if !compatible { // no compatible license found for one of the required licenses return false } } // found a compatible license in test for each required license return true } // expand will expand the given expression into an equivalent array representing ANDed licenses // grouped in an array and ORed licenses each in a separate array. // // Example: // // License node: "MIT" becomes [["MIT"]] // OR Expression: "MIT OR Apache-2.0" becomes [["MIT"], ["Apache-2.0"]] // AND Expression: "MIT AND Apache-2.0" becomes [["MIT", "Apache-2.0"]] // OR-AND Expression: "MIT OR Apache-2.0 AND GPL-2.0" becomes [["MIT"], ["Apache-2.0", "GPL-2.0"]] // OR(AND) Expression: "MIT OR (Apache-2.0 AND GPL-2.0)" becomes [["MIT"], ["Apache-2.0", "GPL-2.0"]] // AND-OR Expression: "MIT AND Apache-2.0 OR GPL-2.0" becomes [["Apache-2.0", "MIT], ["GPL-2.0"]] // AND(OR) Expression: "MIT AND (Apache-2.0 OR GPL-2.0)" becomes [["Apache-2.0", "MIT], ["GPL-2.0", "MIT"]] // OR-AND-OR Expression: "MIT OR ISC AND Apache-2.0 OR GPL-2.0" becomes // [["MIT"], ["Apache-2.0", "ISC"], ["GPL-2.0"]] // (OR)AND(OR) Expression: "(MIT OR ISC) AND (Apache-2.0 OR GPL-2.0)" becomes // [["Apache-2.0", "MIT"], ["GPL-2.0", "MIT"], ["Apache-2.0", "ISC"], ["GPL-2.0", "ISC"]] // OR(AND)OR Expression: "MIT OR (ISC AND Apache-2.0) OR GPL-2.0" becomes // [["MIT"], ["Apache-2.0", "ISC"], ["GPL-2.0"]] // AND-OR-AND Expression: "MIT AND ISC OR Apache-2.0 AND GPL-2.0" becomes // [["ISC", "MIT"], ["Apache-2.0", "GPL-2.0"]] // (AND)OR(AND) Expression: "(MIT AND ISC) OR (Apache-2.0 AND GPL-2.0)" becomes // [["ISC", "MIT"], ["Apache-2.0", "GPL-2.0"]] // AND(OR)AND Expression: "MIT AND (ISC OR Apache-2.0) AND GPL-2.0" becomes // [["GPL-2.0", "ISC", "MIT"], ["Apache-2.0", "GPL-2.0", "MIT"]] func (n *node) expand(withDeepSort bool) [][]*node { if n.isLicense() || n.isLicenseRef() { return [][]*node{{n}} } var expanded [][]*node if n.isOrExpression() { expanded = n.expandOr() } else { expanded = n.expandAnd() } if withDeepSort { expanded = deepSort(expanded) } return expanded } // expandOr expands the given expression into an equivalent array representing ORed licenses each in a separate array. // // Example: // // OR Expression: "MIT OR Apache-2.0" becomes [["MIT"], ["Apache-2.0"]] func (n *node) expandOr() [][]*node { var result [][]*node result = expandOrTerm(n.left(), result) result = expandOrTerm(n.right(), result) return result } // expandOrTerm expands the terms of an OR expression. func expandOrTerm(term *node, result [][]*node) [][]*node { if term.isLicense() { result = append(result, []*node{term}) } else if term.isExpression() { if term.isOrExpression() { left := term.expandOr() result = append(result, left...) } else if term.isAndExpression() { left := term.expandAnd()[0] result = append(result, left) } } return result } // expandAnd expands the given expression into an equivalent array representing ANDed licenses // grouped in an array. When an ORed expression is combined with AND, the ORed // expressions are combined with the ANDed expressions. // // Example: // // AND Expression: "MIT AND Apache-2.0" becomes [["MIT", "Apache-2.0"]] // AND(OR) Expression: "MIT AND (Apache-2.0 OR GPL-2.0)" becomes [["Apache-2.0", "MIT], ["GPL-2.0", "MIT"]] // // See more examples under func expand. func (n *node) expandAnd() [][]*node { left := expandAndTerm(n.left()) right := expandAndTerm(n.right()) if len(left) > 1 || len(right) > 1 { // an OR expression has been processed // somewhere on the left and/or right node path return appendTerms(left, right) } // only AND expressions have been processed return mergeTerms(left, right) } // expandAndTerm expands the terms of an AND expression. func expandAndTerm(term *node) [][]*node { var result [][]*node if term.isLicense() || term.isLicenseRef() { result = append(result, []*node{term}) } else if term.isExpression() { if term.isAndExpression() { result = term.expandAnd() } else if term.isOrExpression() { result = term.expandOr() } } return result } // appendTerms appends results from expanding the right expression into the results // from expanding the left expression. When at least one of the left/right // nodes includes an OR expression, the values are spread across at times // producing more results than exists in the left or right results. // // Example: // // left: {{"MIT"}} right: {{"ISC"}, {"Apache-2.0"}} becomes // {{"MIT", "ISC"}, {"MIT", "Apache-2.0"}} func appendTerms(left, right [][]*node) [][]*node { var result [][]*node for _, r := range right { for _, l := range left { tmp := l tmp = append(tmp, r...) result = append(result, tmp) } } return result } // mergeTerms merges results from expanding left and right expressions. // When neither left/right nodes includes an OR expression, the values // are merged left and right results. // // Example: // // left: {{"MIT"}} right: {{"ISC", "Apache-2.0"}} becomes // {{"MIT", "ISC", "Apache-2.0"}} func mergeTerms(left, right [][]*node) [][]*node { results := left for _, r := range right { for j, l := range results { results[j] = append(l, r...) } } return results } // sortAndDedup sorts an array of license nodes and then removes duplicates. func sortAndDedup(nodes []*node) []*node { if len(nodes) <= 1 { return nodes } sortLicenses(nodes) prev := 1 for curr := 1; curr < len(nodes); curr++ { if *nodes[curr-1].reconstructedLicenseString() != *nodes[curr].reconstructedLicenseString() { nodes[prev] = nodes[curr] prev++ } } return nodes[:prev] } // deepSort sorts a two-dimensional array of license nodes. Internal arrays are sorted first. // Then each array of nodes are sorted relative to the other arrays. // // Example: // // BEFORE {{"MIT", "GPL-2.0"}, {"ISC", "Apache-2.0"}} // AFTER {{"Apache-2.0", "ISC"}, {"GPL-2.0", "MIT"}} func deepSort(nodes2d [][]*node) [][]*node { if len(nodes2d) == 0 || len(nodes2d) == 1 && len(nodes2d[0]) <= 1 { return nodes2d } // sort each array internally // Example: // BEFORE {{"MIT", "GPL-2.0"}, {"ISC", "Apache-2.0"}} // AFTER {{"GPL-2.0", "MIT"}, {"Apache-2.0", "ISC"}} for _, nodes := range nodes2d { if len(nodes) > 1 { sortLicenses(nodes) } } // sort arrays relative to each other // Example: // BEFORE {{"GPL-2.0", "MIT"}, {"Apache-2.0", "ISC"}} // AFTER {{"Apache-2.0", "ISC"}, {"GPL-2.0", "MIT"}} sort.Slice(nodes2d, func(i, j int) bool { // TODO: Consider refactor to map nodes to licenseString before processing. for k := range nodes2d[j] { if k >= len(nodes2d[i]) { // if the first k elements are equal and the second array is // longer than the first, the first is considered less than return true } iLicense := *nodes2d[i][k].reconstructedLicenseString() jLicense := *nodes2d[j][k].reconstructedLicenseString() if iLicense != jLicense { // when elements are not equal, return true if first is less than return iLicense < jLicense } } // all elements are equal, return false to avoid a swap return false }) return nodes2d } go-spdx-2.6.0/spdxexp/satisfies_test.go000066400000000000000000002130201517223150200201470ustar00rootroot00000000000000package spdxexp import ( "errors" "fmt" "testing" "github.com/stretchr/testify/assert" ) func TestValidateLicenses(t *testing.T) { tests := []struct { name string inputLicenses []string allValid bool invalidLicenses []string }{ {"MIT shortcut test", []string{"MIT"}, true, []string{}}, {"mit shortcut test", []string{"mit"}, true, []string{}}, {"Apache-2.0 active shortcut test", []string{"Apache-2.0"}, true, []string{}}, {"All invalid", []string{"MTI", "Apche-2.0", "0xDEADBEEF", ""}, false, []string{"MTI", "Apche-2.0", "0xDEADBEEF", ""}}, {"All valid", []string{"MIT", "Apache-2.0", "GPL-2.0"}, true, []string{}}, {"Some invalid", []string{"MTI", "Apche-2.0", "GPL-2.0"}, false, []string{"MTI", "Apche-2.0"}}, {"GPL-2.0", []string{"GPL-2.0"}, true, []string{}}, {"GPL-2.0-only", []string{"GPL-2.0-only"}, true, []string{}}, {"SPDX Expressions are valid", []string{ "MIT AND APACHE-2.0", "MIT AND APCHE-2.0", "LGPL-2.1-only OR MIT OR BSD-3-Clause", "GPL-2.0-or-later WITH Bison-exception-2.2", }, false, []string{"MIT AND APCHE-2.0"}}, {"Empty string is invalid", []string{""}, false, []string{""}}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { valid, invalidLicenses := ValidateLicenses(test.inputLicenses) assert.EqualValues(t, test.invalidLicenses, invalidLicenses) assert.Equal(t, test.allValid, valid) }) } } func TestValidateLicensesWithOptions_FailComplexExpressions(t *testing.T) { tests := []struct { name string inputLicenses []string options ValidateLicensesOptions allValid bool invalidLicenses []string }{ { name: "Expressions rejected", inputLicenses: []string{"MIT AND Apache-2.0"}, options: ValidateLicensesOptions{FailComplexExpressions: true}, allValid: false, invalidLicenses: []string{ "MIT AND Apache-2.0", }, }, { name: "Mixed list rejects only expressions", inputLicenses: []string{"MIT", "Apache-2.0", "LGPL-2.1-only OR MIT"}, options: ValidateLicensesOptions{FailComplexExpressions: true}, allValid: false, invalidLicenses: []string{ "LGPL-2.1-only OR MIT", }, }, { name: "WITH exception is not treated as complex expression", inputLicenses: []string{"GPL-2.0-or-later WITH Bison-exception-2.2"}, options: ValidateLicensesOptions{FailComplexExpressions: true}, allValid: true, invalidLicenses: []string{}, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { valid, invalidLicenses := ValidateLicensesWithOptions(test.inputLicenses, test.options) assert.EqualValues(t, test.invalidLicenses, invalidLicenses) assert.Equal(t, test.allValid, valid) }) } } func TestValidateLicensesWithOptions_FailDeprecatedLicenses(t *testing.T) { // eCos-2.0 is a known deprecated SPDX license ID (see TestDeprecatedLicense). deprecatedLicense := "eCos-2.0" tests := []struct { name string inputLicenses []string options ValidateLicensesOptions allValid bool invalidLicenses []string }{ { name: "Deprecated license rejected", inputLicenses: []string{deprecatedLicense}, options: ValidateLicensesOptions{FailDeprecatedLicenses: true}, allValid: false, invalidLicenses: []string{ deprecatedLicense, }, }, { name: "Mixed list rejects only deprecated licenses", inputLicenses: []string{"MIT", "Apache-2.0", deprecatedLicense}, options: ValidateLicensesOptions{FailDeprecatedLicenses: true}, allValid: false, invalidLicenses: []string{ deprecatedLicense, }, }, { name: "WITH exception rejects deprecated license if FailDeprecatedLicenses is true", inputLicenses: []string{deprecatedLicense + " WITH Bison-exception-2.2"}, options: ValidateLicensesOptions{FailDeprecatedLicenses: true}, allValid: false, invalidLicenses: []string{ deprecatedLicense + " WITH Bison-exception-2.2", }, }, { name: "WITH exception allows deprecated license if FailDeprecatedLicenses is false", inputLicenses: []string{deprecatedLicense + " WITH Bison-exception-2.2"}, options: ValidateLicensesOptions{FailDeprecatedLicenses: false}, allValid: true, invalidLicenses: []string{}, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { valid, invalidLicenses := ValidateLicensesWithOptions(test.inputLicenses, test.options) assert.EqualValues(t, test.invalidLicenses, invalidLicenses) assert.Equal(t, test.allValid, valid) }) } } func TestValidateLicensesWithOptions_AllOptions(t *testing.T) { documentRef := "DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2" licenseRef := "LicenseRef-MIT-Style-1" deprecated := "eCos-2.0" expression := "MIT AND Apache-2.0" licenseWithException := "GPL-2.0-or-later WITH Bison-exception-2.2" tests := []struct { name string licenses []string options ValidateLicensesOptions valid bool invalidLicenses []string }{ { name: "Defaults allow deprecated, refs, and expressions", licenses: []string{" MIT ", deprecated, licenseRef, documentRef, expression, licenseWithException}, options: ValidateLicensesOptions{}, valid: true, invalidLicenses: []string{}, }, { name: "FailDeprecatedLicenses rejects deprecated IDs", licenses: []string{deprecated, "Apache-2.0"}, options: ValidateLicensesOptions{FailDeprecatedLicenses: true}, valid: false, invalidLicenses: []string{deprecated}, }, { name: "FailComplexExpressions rejects conjunction expressions", licenses: []string{expression, licenseWithException}, options: ValidateLicensesOptions{FailComplexExpressions: true}, valid: false, invalidLicenses: []string{expression}, }, { name: "FailComplexExpressions does not duplicate invalid entries", licenses: []string{"MIT AND APCHE-2.0"}, options: ValidateLicensesOptions{FailComplexExpressions: true}, valid: false, invalidLicenses: []string{"MIT AND APCHE-2.0"}, }, { name: "FailAllLicenseRefs rejects LicenseRef but allows DocumentRef", licenses: []string{licenseRef, documentRef}, options: ValidateLicensesOptions{FailAllLicenseRefs: true}, valid: false, invalidLicenses: []string{licenseRef}, }, { name: "FailAllDocumentRefs rejects DocumentRef but allows LicenseRef", licenses: []string{documentRef, licenseRef}, options: ValidateLicensesOptions{FailAllDocumentRefs: true}, valid: false, invalidLicenses: []string{documentRef}, }, { name: "FailAllLicenseRefs and FailAllDocumentRefs rejects any non-active atomic ref", licenses: []string{licenseRef, documentRef, "CustomRef-foo"}, options: ValidateLicensesOptions{FailAllLicenseRefs: true, FailAllDocumentRefs: true}, valid: false, invalidLicenses: []string{licenseRef, documentRef, "CustomRef-foo"}, }, { name: "All flags together", licenses: []string{deprecated, licenseRef, documentRef, expression, licenseWithException, "Apache-2.0"}, options: ValidateLicensesOptions{ FailComplexExpressions: true, FailDeprecatedLicenses: true, FailAllLicenseRefs: true, FailAllDocumentRefs: true, }, valid: false, invalidLicenses: []string{deprecated, licenseRef, documentRef, expression}, }, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { valid, invalidLicenses := ValidateLicensesWithOptions(test.licenses, test.options) assert.Equal(t, test.valid, valid) assert.EqualValues(t, test.invalidLicenses, invalidLicenses) }) } } // TestSatisfiesSingle lets you quickly test a single call to Satisfies with a specific license expression and allowed list of licenses. // To test a different expression, change the expression, allowed licenses, and expected result in the function body. // TO RUN: go test ./expression -run TestSatisfiesSingle func TestSatisfiesSingle(t *testing.T) { // Update these to test a different expression. expression := "BSD-3-Clause AND GPL-2.0" allowedList := []string{"BSD-3-Clause", "GPL-2.0"} expectedResult := true // Run the test. actualResult, err := Satisfies(expression, allowedList) assert.NoError(t, err) assert.Equal(t, expectedResult, actualResult) } func TestSatisfies_FastPathValidation(t *testing.T) { tests := []struct { name string repoExpression string allowedList []string satisfied bool expectErr bool expectedErr string }{ { name: "MIT trims whitespace", repoExpression: " MIT \t", allowedList: []string{"MIT"}, satisfied: true, }, { name: "Atomic deprecated license matches allowed list", repoExpression: " eCos-2.0 ", allowedList: []string{"ECOS-2.0"}, satisfied: true, }, { name: "Atomic deprecated license not in allowed list", repoExpression: "eCos-2.0", allowedList: []string{"MIT"}, satisfied: false, }, { name: "Single license WITH exception exact match", repoExpression: "GPL-2.0-or-later WITH Bison-exception-2.2", allowedList: []string{"GPL-2.0-or-later WITH Bison-exception-2.2"}, satisfied: true, }, { name: "Single license WITH exception not in allowed list", repoExpression: "GPL-2.0-or-later WITH Bison-exception-2.2", allowedList: []string{"MIT"}, satisfied: false, }, { name: "Single license WITH exception matches allow list ignoring case", repoExpression: "gpl-2.0-or-later with bison-exception-2.2", allowedList: []string{"GPL-2.0-or-later WITH Bison-exception-2.2"}, satisfied: true, }, { name: "Single license WITH invalid exception returns error", repoExpression: "GPL-2.0-or-later WITH NOT-A-REAL-EXCEPTION", allowedList: []string{"GPL-2.0-or-later WITH NOT-A-REAL-EXCEPTION"}, expectErr: true, expectedErr: "unknown license 'NOT-A-REAL-EXCEPTION' at offset 22", }, { name: "Single license WITH invalid license part returns error", repoExpression: "NOT-A-REAL-LICENSE WITH Bison-exception-2.2", allowedList: []string{"NOT-A-REAL-LICENSE WITH Bison-exception-2.2"}, expectErr: true, expectedErr: "unknown license 'NOT-A-REAL-LICENSE' at offset 0", }, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { actualResult, err := Satisfies(test.repoExpression, test.allowedList) if test.expectErr { assert.EqualError(t, err, test.expectedErr) return } assert.NoError(t, err) assert.Equal(t, test.satisfied, actualResult) }) } } func TestSatisfies(t *testing.T) { tests := []struct { name string repoExpression string allowedList []string satisfied bool err error }{ // TODO: Test error conditions (e.g. GPL is an invalid license, Apachie + has invalid + operator) // regression tests from spdx-satisfies.js - comments for satisfies function {"MIT satisfies [MIT]", "MIT", []string{"MIT"}, true, nil}, {"miT satisfies [MIT]", "miT", []string{"MIT"}, true, nil}, {"MIT satisfies [mit]", "MIT", []string{"mit"}, true, nil}, {"! MIT satisfies [Apache-2.0]", "MIT", []string{"Apache-2.0"}, false, nil}, {"err - satisfies MIT", "", []string{"MIT"}, false, errors.New("parse error - cannot parse empty string")}, {"err - MIT satisfies ", "MIT", []string{}, false, errors.New("allowedList requires at least one element, but is empty")}, {"err - invalid license", "NON-EXISTENT-LICENSE", []string{"MIT", "Apache-2.0"}, false, errors.New("unknown license 'NON-EXISTENT-LICENSE' at offset 0")}, {"err - invalid license in allowed list", "Apache-1.0", []string{"NON-EXISTENT-LICENSE", "Apache-2.0"}, false, errors.New("unknown license 'NON-EXISTENT-LICENSE' at offset 0")}, {"MIT satisfies [MIT, Apache-2.0]", "MIT", []string{"MIT", "Apache-2.0"}, true, nil}, {"MIT OR Apache-2.0 satisfies [MIT]", "MIT OR Apache-2.0", []string{"MIT"}, true, nil}, {"! GPL-2.0 satisfies [MIT, Apache-2.0]", "GPL-2.0", []string{"MIT", "Apache-2.0"}, false, nil}, {"! MIT OR Apache-2.0 satisfies [GPL-2.0]", "MIT OR Apache-2.0", []string{"GPL-2.0"}, false, nil}, {"Apache-2.0 AND MIT satisfies [MIT, APACHE-2.0]", "Apache-2.0 AND MIT", []string{"MIT", "APACHE-2.0"}, true, nil}, {"apache-2.0 AND mit satisfies [MIT, APACHE-2.0]", "apache-2.0 AND mit", []string{"MIT", "APACHE-2.0"}, true, nil}, {"Apache-2.0 AND MIT satisfies [MIT, Apache-2.0]", "Apache-2.0 AND MIT", []string{"MIT", "Apache-2.0"}, true, nil}, {"MIT AND Apache-2.0 satisfies [MIT, Apache-2.0]", "MIT AND Apache-2.0", []string{"MIT", "Apache-2.0"}, true, nil}, {"! MIT AND Apache-2.0 satisfies [MIT]", "MIT AND Apache-2.0", []string{"MIT"}, false, nil}, {"! GPL-2.0 satisfies [MIT, Apache-2.0]", "GPL-2.0", []string{"MIT", "Apache-2.0"}, false, nil}, {"MIT AND Apache-2.0 satisfies [MIT, Apache-1.0, Apache-2.0]", "MIT AND Apache-2.0", []string{"MIT", "Apache-1.0", "Apache-2.0"}, true, nil}, {"Apache-1.0+ satisfies [Apache-2.0]", "Apache-1.0+", []string{"Apache-2.0"}, true, nil}, {"Apache-1.0+ satisfies [Apache-2.0+]", "Apache-1.0+", []string{"Apache-2.0+"}, true, nil}, // TODO: Fails here but passes js {"! Apache-1.0 satisfies [Apache-2.0+]", "Apache-1.0", []string{"Apache-2.0+"}, false, nil}, {"Apache-2.0 satisfies [Apache-2.0+]", "Apache-2.0", []string{"Apache-2.0+"}, true, nil}, {"! Apache-3.0 satisfies [Apache-2.0+]", "Apache-3.0", []string{"Apache-2.0+"}, false, errors.New("unknown license 'Apache-3.0' at offset 0")}, {"! Apache-1.0 satisfies [Apache-2.0-or-later]", "Apache-1.0", []string{"Apache-2.0-or-later"}, false, nil}, {"Apache-2.0 satisfies [Apache-2.0-or-later]", "Apache-2.0", []string{"Apache-2.0-or-later"}, true, nil}, {"! Apache-3.0 satisfies [Apache-2.0-or-later]", "Apache-3.0", []string{"Apache-2.0-or-later"}, false, errors.New("unknown license 'Apache-3.0' at offset 0")}, {"! Apache-1.0 satisfies [Apache-2.0-only]", "Apache-1.0", []string{"Apache-2.0-only"}, false, nil}, {"Apache-2.0 satisfies [Apache-2.0-only]", "Apache-2.0", []string{"Apache-2.0-only"}, true, nil}, {"! Apache-3.0 satisfies [Apache-2.0-only]", "Apache-3.0", []string{"Apache-2.0-only"}, false, errors.New("unknown license 'Apache-3.0' at offset 0")}, // regression tests from spdx-satisfies.js - assert statements in README {"MIT satisfies [MIT]", "MIT", []string{"MIT"}, true, nil}, {"MIT satisfies [ISC, MIT]", "MIT", []string{"ISC", "MIT"}, true, nil}, {"Zlib satisfies [ISC, MIT, Zlib]", "Zlib", []string{"ISC", "MIT", "Zlib"}, true, nil}, {"! GPL-3.0 satisfies [ISC, MIT]", "GPL-3.0", []string{"ISC", "MIT"}, false, nil}, {"GPL-2.0 satisfies [GPL-2.0+]", "GPL-2.0", []string{"GPL-2.0+"}, true, nil}, // TODO: Fails here but passes js {"GPL-2.0 satisfies [GPL-2.0-or-later]", "GPL-2.0", []string{"GPL-2.0-or-later"}, true, nil}, // TODO: Fails here and js {"GPL-3.0 satisfies [GPL-2.0+]", "GPL-3.0", []string{"GPL-2.0+"}, true, nil}, {"GPL-1.0-or-later satisfies [GPL-2.0-or-later]", "GPL-1.0-or-later", []string{"GPL-2.0-or-later"}, true, nil}, {"GPL-1.0+ satisfies [GPL-2.0+]", "GPL-1.0+", []string{"GPL-2.0+"}, true, nil}, {"! GPL-1.0 satisfies [GPL-2.0+]", "GPL-1.0", []string{"GPL-2.0+"}, false, nil}, {"GPL-2.0-only satisfies [GPL-2.0-only]", "GPL-2.0-only", []string{"GPL-2.0-only"}, true, nil}, {"GPL-2.0 satisfies [GPL-2.0-only]", "GPL-2.0", []string{"GPL-2.0-only"}, true, nil}, {"GPL-2.0 AND GPL-2.0-only satisfies [GPL-2.0-only]", "GPL-2.0 AND GPL-2.0-only", []string{"GPL-2.0-only"}, true, nil}, {"GPL-3.0-only satisfies [GPL-2.0+]", "GPL-3.0-only", []string{"GPL-2.0+"}, true, nil}, {"! GPL-2.0 satisfies [GPL-2.0+ WITH Bison-exception-2.2]", "GPL-2.0", []string{"GPL-2.0+ WITH Bison-exception-2.2"}, false, nil}, {"GPL-3.0 WITH Bison-exception-2.2 satisfies [GPL-2.0+ WITH Bison-exception-2.2]", "GPL-3.0 WITH Bison-exception-2.2", []string{"GPL-2.0+ WITH Bison-exception-2.2"}, true, nil}, {"(MIT OR GPL-2.0) satisfies [ISC, MIT]", "(MIT OR GPL-2.0)", []string{"ISC", "MIT"}, true, nil}, {"(MIT AND GPL-2.0) satisfies [MIT, GPL-2.0]", "(MIT AND GPL-2.0)", []string{"MIT", "GPL-2.0"}, true, nil}, {"MIT AND GPL-2.0 AND ISC satisfies [MIT, GPL-2.0, ISC]", "MIT AND GPL-2.0 AND ISC", []string{"MIT", "GPL-2.0", "ISC"}, true, nil}, {"MIT AND GPL-2.0 AND ISC satisfies [ISC, GPL-2.0, MIT]", "MIT AND GPL-2.0 AND ISC", []string{"ISC", "GPL-2.0", "MIT"}, true, nil}, {"(MIT OR GPL-2.0) AND ISC satisfies [MIT, ISC]", "(MIT OR GPL-2.0) AND ISC", []string{"MIT", "ISC"}, true, nil}, {"MIT AND ISC satisfies [MIT, GPL-2.0, ISC]", "MIT AND ISC", []string{"MIT", "GPL-2.0", "ISC"}, true, nil}, {"(MIT OR Apache-2.0) AND (ISC OR GPL-2.0) satisfies [Apache-2.0, ISC]", "(MIT OR Apache-2.0) AND (ISC OR GPL-2.0)", []string{"Apache-2.0", "ISC"}, true, nil}, {"(MIT AND GPL-2.0) satisfies [MIT, GPL-2.0]", "(MIT AND GPL-2.0)", []string{"MIT", "GPL-2.0"}, true, nil}, {"(MIT AND GPL-2.0) satisfies [GPL-2.0, MIT]", "(MIT AND GPL-2.0)", []string{"GPL-2.0", "MIT"}, true, nil}, {"MIT satisfies [GPL-2.0, MIT, MIT, ISC]", "MIT", []string{"GPL-2.0", "MIT", "MIT", "ISC"}, true, nil}, {"MIT AND ICU satisfies [MIT, GPL-2.0, ISC, Apache-2.0, ICU]", "MIT AND ICU", []string{"MIT", "GPL-2.0", "ISC", "Apache-2.0", "ICU"}, true, nil}, // TODO: This says true and the js version returns true, but it shouldn't. {"! (MIT AND GPL-2.0) satisfies [ISC, GPL-2.0]", "(MIT AND GPL-2.0)", []string{"ISC", "GPL-2.0"}, false, nil}, {"! MIT AND (GPL-2.0 OR ISC) satisfies [MIT]", "MIT AND (GPL-2.0 OR ISC)", []string{"MIT"}, false, nil}, {"! (MIT OR Apache-2.0) AND (ISC OR GPL-2.0) satisfies [MIT]", "(MIT OR Apache-2.0) AND (ISC OR GPL-2.0)", []string{"MIT"}, false, nil}, {"licenseRef is expression", "LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0", "LicenseRef-X-BSD-3-Clause-Golang"}, true, nil}, {"licenseRef in expression", "MIT AND LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0", "LicenseRef-X-BSD-3-Clause-Golang"}, true, nil}, {"licenseRef not in expression", "MIT AND Apache-2.0", []string{"MIT", "Apache-2.0", "LicenseRef-X-BSD-3-Clause-Golang"}, true, nil}, {"licenseRef not allowed", "MIT AND LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0"}, false, nil}, {"licenseRef allowed, but OTHER is not allowed", "(BSD-3-Clause AND OTHER) OR (BSD-3-Clause AND LicenseRef-X-BSD-3-Clause-Golang)", []string{"MIT", "Apache-2.0", "LicenseRef-X-BSD-3-Clause-Golang"}, false, errors.New("unknown license 'OTHER' at offset 18")}, {"licenseRef with documentRef is expression", "DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0", "DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang"}, true, nil}, {"licenseRef with documentRef in expression", "MIT AND DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0", "DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang"}, true, nil}, {"licenseRef with documentRef not in expression", "MIT AND Apache-2.0", []string{"MIT", "Apache-2.0", "DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang"}, true, nil}, {"licenseRef with documentRef not allowed", "MIT AND DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0"}, false, nil}, {"licenseRef allowed, but documentRef not allowed", "MIT AND DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0", "LicenseRef-X-BSD-3-Clause-Golang"}, false, nil}, {"licenseRef alone not allowed, but with documentRef allowed", "MIT AND LicenseRef-X-BSD-3-Clause-Golang", []string{"MIT", "Apache-2.0", "DocumentRef-spdx-tool-1.2:LicenseRef-X-BSD-3-Clause-Golang"}, false, nil}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { satisfied, err := Satisfies(test.repoExpression, test.allowedList) assert.Equal(t, test.err, err) assert.Equal(t, test.satisfied, satisfied) }) } } func TestExpand(t *testing.T) { // TODO: Add tests for licenses that include plus and/or exception. // TODO: Add tests for license ref and document ref. tests := []struct { name string node *node result [][]*node }{ {singleLicense().name, singleLicense().node, singleLicense().sorted}, {orExpression().name, orExpression().node, orExpression().sorted}, {orAndExpression().name, orAndExpression().node, orAndExpression().sorted}, {orOPAndCPExpression().name, orOPAndCPExpression().node, orOPAndCPExpression().sorted}, {andOrExpression().name, andOrExpression().node, andOrExpression().sorted}, {orAndOrExpression().name, orAndOrExpression().node, orAndOrExpression().sorted}, {orOPAndCPOrExpression().name, orOPAndCPOrExpression().node, orOPAndCPOrExpression().sorted}, {orOrOrExpression().name, orOrOrExpression().node, orOrOrExpression().sorted}, {andOrAndExpression().name, andOrAndExpression().node, andOrAndExpression().sorted}, {oPAndCPOrOPAndCPExpression().name, oPAndCPOrOPAndCPExpression().node, oPAndCPOrOPAndCPExpression().sorted}, {andExpression().name, andExpression().node, andExpression().sorted}, {andOPOrCPExpression().name, andOPOrCPExpression().node, andOPOrCPExpression().sorted}, {oPOrCPAndOPOrCPExpression().name, oPOrCPAndOPOrCPExpression().node, oPOrCPAndOPOrCPExpression().sorted}, {andOPOrCPAndExpression().name, andOPOrCPAndExpression().node, andOPOrCPAndExpression().sorted}, {andAndAndExpression().name, andAndAndExpression().node, andAndAndExpression().sorted}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { expandResult := test.node.expand(true) assert.Equal(t, test.result, expandResult) }) } } func TestExpandOr(t *testing.T) { tests := []struct { name string node *node expanded [][]*node }{ {orExpression().name, orExpression().node, orExpression().expanded}, {orAndExpression().name, orAndExpression().node, orAndExpression().expanded}, {orOPAndCPExpression().name, orOPAndCPExpression().node, orOPAndCPExpression().expanded}, {andOrExpression().name, andOrExpression().node, andOrExpression().expanded}, {orAndOrExpression().name, orAndOrExpression().node, orAndOrExpression().expanded}, {orOPAndCPOrExpression().name, orOPAndCPOrExpression().node, orOPAndCPOrExpression().expanded}, {orOrOrExpression().name, orOrOrExpression().node, orOrOrExpression().expanded}, {andOrAndExpression().name, andOrAndExpression().node, andOrAndExpression().expanded}, {oPAndCPOrOPAndCPExpression().name, oPAndCPOrOPAndCPExpression().node, oPAndCPOrOPAndCPExpression().expanded}, // TODO: Uncomment kitchen sink test when license plus, exception, license ref, and document ref are supported. // {"kitchen sink", // // " (MIT AND Apache-1.0+) OR DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2 OR (GPL-2.0 WITH Bison-exception-2.2)", // &node{ // role: expressionNode, // exp: &expressionNodePartial{ // left: &node{ // role: expressionNode, // exp: &expressionNodePartial{ // left: &node{ // role: licenseNode, // exp: nil, // lic: &licenseNodePartial{ // license: "MIT", // hasPlus: false, // hasException: false, // exception: "", // }, // ref: nil, // }, // conjunction: "and", // right: &node{ // role: licenseNode, // exp: nil, // lic: &licenseNodePartial{ // license: "Apache-1.0", // hasPlus: true, // hasException: false, // exception: "", // }, // ref: nil, // }, // }, // lic: nil, // ref: nil, // }, // conjunction: "or", // right: &node{ // role: expressionNode, // exp: &expressionNodePartial{ // left: &node{ // role: licenseRefNode, // exp: nil, // lic: nil, // ref: &referenceNodePartial{ // hasDocumentRef: true, // documentRef: "spdx-tool-1.2", // licenseRef: "MIT-Style-2", // }, // }, // conjunction: "or", // right: &node{ // role: licenseNode, // exp: nil, // lic: &licenseNodePartial{ // license: "GPL-2.0", // hasPlus: false, // hasException: true, // exception: "Bison-exception-2.2", // }, // ref: nil, // }, // }, // lic: nil, // ref: nil, // }, // }, // lic: nil, // ref: nil, // }, // // [][]string{{"MIT", "Apache-1.0+"}, {"DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2"}, {"GPL-2.0 with Bison-exception-2.2"}}}, // [][]*node{ // { // { // role: licenseNode, // exp: nil, // lic: &licenseNodePartial{ // license: "MIT", hasPlus: false, // hasException: false, exception: ""}, // ref: nil, // }, // { // role: licenseNode, // exp: nil, // lic: &licenseNodePartial{ // license: "Apache-1.0", hasPlus: true, // hasException: false, exception: ""}, // ref: nil, // }, // }, // { // { // role: licenseRefNode, // exp: nil, // lic: nil, // ref: &referenceNodePartial{ // hasDocumentRef: true, // documentRef: "spdx-tool-1.2", // licenseRef: "MIT-Style-2", // }, // }, // { // role: licenseNode, // exp: nil, // lic: &licenseNodePartial{ // license: "GPL-2.0", // hasPlus: false, // hasException: true, // exception: "Bison-exception-2.2", // }, // ref: nil, // }, // }, // }, // }, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { expanded := test.node.expandOr() assert.Equal(t, test.expanded, expanded) }) } } func TestExpandAnd(t *testing.T) { tests := []struct { name string node *node expanded [][]*node }{ {andExpression().name, andExpression().node, andExpression().expanded}, {andOPOrCPExpression().name, andOPOrCPExpression().node, andOPOrCPExpression().expanded}, {oPOrCPAndOPOrCPExpression().name, oPOrCPAndOPOrCPExpression().node, oPOrCPAndOPOrCPExpression().expanded}, {andOPOrCPAndExpression().name, andOPOrCPAndExpression().node, andOPOrCPAndExpression().expanded}, {andAndAndExpression().name, andAndAndExpression().node, andAndAndExpression().expanded}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { expandAndResult := test.node.expandAnd() assert.Equal(t, test.expanded, expandAndResult) }) } } type testCaseData struct { name string expression string node *node expanded [][]*node sorted [][]*node } func singleLicense() testCaseData { return testCaseData{ name: "Single License", expression: "MIT", node: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func orExpression() testCaseData { return testCaseData{ name: "OR Expression", expression: "MIT OR Apache-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func orAndExpression() testCaseData { return testCaseData{ name: "OR-AND Expression", expression: "MIT OR Apache-2.0 AND GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func orOPAndCPExpression() testCaseData { return testCaseData{ name: "OR(AND) Expression", expression: "MIT OR (Apache-2.0 AND GPL-2.0)", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func andOrExpression() testCaseData { return testCaseData{ name: "AND-OR Expression", expression: "MIT AND Apache-2.0 OR GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func orAndOrExpression() testCaseData { return testCaseData{ name: "OR-AND-OR Expression", expression: "MIT OR ISC AND Apache-2.0 OR GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func orOPAndCPOrExpression() testCaseData { return testCaseData{ name: "OR(AND)OR Expression", expression: "MIT OR (ISC AND Apache-2.0) OR GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func orOrOrExpression() testCaseData { return testCaseData{ name: "OR-OR-OR Expression", expression: "MIT OR ISC OR Apache-2.0 OR GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func andOrAndExpression() testCaseData { return testCaseData{ name: "AND-OR-AND Expression", expression: "MIT AND ISC OR Apache-2.0 AND GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func oPAndCPOrOPAndCPExpression() testCaseData { return testCaseData{ name: "(AND)OR(AND) Expression", expression: "(MIT AND ISC) OR (Apache-2.0 AND GPL-2.0)", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "or", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func andExpression() testCaseData { return testCaseData{ name: "AND Expression", expression: "MIT AND Apache-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func andOPOrCPExpression() testCaseData { return testCaseData{ name: "AND(OR) Expression", expression: "MIT AND (Apache-2.0 OR GPL-2.0)", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func oPOrCPAndOPOrCPExpression() testCaseData { return testCaseData{ name: "(OR)AND(OR) Expression", expression: "(MIT OR ISC) AND (Apache-2.0 OR GPL-2.0)", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "and", right: &node{ exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func andOPOrCPAndExpression() testCaseData { return testCaseData{ name: "AND(OR)AND Expression", expression: "MIT AND (ISC OR Apache-2.0) AND GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "or", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func andAndAndExpression() testCaseData { return testCaseData{ name: "AND-AND-AND Expression", expression: "MIT AND ISC AND Apache-2.0 AND GPL-2.0", node: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: expressionNode, exp: &expressionNodePartial{ left: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, conjunction: "and", right: &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: "", }, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, }, lic: nil, ref: nil, }, expanded: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, sorted: [][]*node{ { { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "Apache-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "GPL-2.0", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "ISC", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, { role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: "MIT", hasPlus: false, hasException: false, exception: ""}, ref: nil, }, }, }, } } func ExampleSatisfies_singleLicense() { fmt.Println(Satisfies("MIT", []string{"MIT"})) // Output: true } func ExampleSatisfies_or() { fmt.Println(Satisfies("MIT OR Apache-2.0", []string{"MIT"})) // Output: true } func ExampleSatisfies_orNotFound() { fmt.Println(Satisfies("MIT OR Apache-2.0", []string{"GPL-2.0"})) // Output: false } func ExampleSatisfies_and() { fmt.Println(Satisfies("Apache-2.0 AND MIT", []string{"MIT", "Apache-2.0"})) // Output: true } func ExampleSatisfies_andNotFound() { fmt.Println(Satisfies("MIT AND Apache-2.0", []string{"MIT"})) // Output: false } func ExampleSatisfies_plus() { fmt.Println(Satisfies("Apache-2.0", []string{"Apache-1.0+"})) // Output: true } func ExampleSatisfies_plusNotFound() { fmt.Println(Satisfies("Apache-1.0", []string{"Apache-2.0+"})) // Output: false } func ExampleSatisfies_orLater() { fmt.Println(Satisfies("Apache-2.0", []string{"Apache-1.0-or-later"})) // Output: true } func ExampleSatisfies_orLaterNotFound() { fmt.Println(Satisfies("Apache-1.0", []string{"Apache-2.0-or-later"})) // Output: false } func ExampleSatisfies_only() { fmt.Println(Satisfies("Apache-1.0", []string{"Apache-1.0-only"})) // Output: true } func ExampleSatisfies_onlyNotFound() { fmt.Println(Satisfies("Apache-2.0", []string{"Apache-1.0-only"})) // Output: false } func ExampleSatisfies_extraAllowedLicense() { fmt.Println(Satisfies("MIT AND Apache-2.0", []string{"MIT", "Apache-1.0", "Apache-2.0"})) // Output: true } func ExampleSatisfies_errorUnknownLicense() { fmt.Println(Satisfies("GPL", []string{"GPL"})) // Output: false unknown license 'GPL' at offset 0 } func ExampleValidateLicenses_allGood() { fmt.Println(ValidateLicenses([]string{"MIT", "Apache-2.0", "GPL-2.0"})) // Output: true [] } func ExampleValidateLicenses_oneBad() { fmt.Println(ValidateLicenses([]string{"MIT", "Apache-2.0", "GPL"})) // Output: false [GPL] } func ExampleValidateLicenses_allBad() { fmt.Println(ValidateLicenses([]string{"MTI", "Apache--2.0", "GPL"})) // Output: false [MTI Apache--2.0 GPL] } // TestValidateLicenses_BenchmarkExamples is a safety check to ensure benchmark improvements are not due // to changes in behavior of the ValidateLicenses function. func TestValidateLicenses_BenchmarkExamples(t *testing.T) { // This test is used to verify that the test expressions used in the benchmarks return expected results. // If any of the test expressions are invalid, then there is likely an issue with the benchmark results and investigation would be needed. for _, test := range validateLicensesBenchmarkScenarios { t.Run(test.name, func(t *testing.T) { valid, invalidLicenses := ValidateLicenses(test.testLicenses) assert.True(t, valid, "Expected licenses to be valid for scenario: %s", test.name) assert.Empty(t, invalidLicenses, "Expected no invalid licenses for scenario: %s", test.name) }) } } go-spdx-2.6.0/spdxexp/scan.go000066400000000000000000000176521517223150200160570ustar00rootroot00000000000000package spdxexp /* Translation to Go from javascript code: https://github.com/clearlydefined/spdx-expression-parse.js/blob/master/scan.js */ import ( "errors" "fmt" "regexp" "strings" ) type expressionStream struct { expression string index int err error } type token struct { role tokenrole value string } type tokenrole uint8 const ( operatorToken tokenrole = iota documentRefToken licenseRefToken licenseToken exceptionToken ) // Scan scans a string expression gathering valid SPDX expression tokens. Returns error if any tokens are invalid. func scan(expression string) ([]token, error) { var tokens []token var token *token exp := &expressionStream{expression: expression, index: 0, err: nil} for exp.hasMore() { exp.skipWhitespace() if !exp.hasMore() { break } token = exp.parseToken() if exp.err != nil { // stop processing at first error and return return nil, exp.err } if token == nil { // TODO: shouldn't happen ??? return nil, errors.New("got nil token when expecting more") } tokens = append(tokens, *token) } return tokens, nil } // Determine if expression has more to process. func (exp *expressionStream) hasMore() bool { return exp.index < len(exp.expression) } // Try to read the next token starting at index. Returns error if no token is recognized. func (exp *expressionStream) parseToken() *token { // Ordering matters op := exp.readOperator() if exp.err != nil { return nil } if op != nil { return op } dref := exp.readDocumentRef() if exp.err != nil { return nil } if dref != nil { return dref } lref := exp.readLicenseRef() if exp.err != nil { return nil } if lref != nil { return lref } identifier := exp.readLicense() if exp.err != nil { return nil } if identifier != nil { return identifier } errmsg := fmt.Sprintf("unexpected '%c' at offset %d", exp.expression[exp.index], exp.index) exp.err = errors.New(errmsg) return nil } // Read more from expression if the next substring starting at index matches the regex pattern. func (exp *expressionStream) readRegex(pattern string) string { expressionSlice := exp.expression[exp.index:] r, _ := regexp.Compile(pattern) i := r.FindStringIndex(expressionSlice) if i != nil && i[1] > 0 && i[0] == 0 { // match found in expression at index exp.index += i[1] return expressionSlice[0:i[1]] } return "" } // Read more from expression if the substring starting at index is the next expected string. func (exp *expressionStream) read(next string) string { expressionSlice := exp.expression[exp.index:] if strings.HasPrefix(expressionSlice, next) { // next found in expression at index exp.index += len(next) return next } return "" } // Skip whitespace in expression starting at index func (exp *expressionStream) skipWhitespace() { exp.readRegex("[ ]*") } // Read operator in expression starting at index if it exists func (exp *expressionStream) readOperator() *token { possibilities := []string{"WITH", "AND", "OR", "(", ")", ":", "+"} var op string for _, p := range possibilities { op = exp.read(p) if len(op) > 0 { break } } if len(op) == 0 { // not an error if an operator isn't found return nil } if op == "+" && exp.index > 1 && exp.expression[exp.index-2:exp.index-1] == " " { exp.err = errors.New("unexpected space before +") exp.index-- return nil } return &token{role: operatorToken, value: op} } // Get id from expression starting at index. Raise error if id not found. func (exp *expressionStream) readID() string { id := exp.readRegex("[A-Za-z0-9-.]+") if len(id) == 0 { errmsg := fmt.Sprintf("expected id at offset %d", exp.index) exp.err = errors.New(errmsg) return "" } return id } // Read DocumentRef in expression starting at index if it exists. Raise error if found and id doesn't follow. func (exp *expressionStream) readDocumentRef() *token { ref := exp.read("DocumentRef-") if len(ref) == 0 { // not an error if a DocumentRef isn't found return nil } id := exp.readID() if exp.err != nil { return nil } return &token{role: documentRefToken, value: id} } // Read LicenseRef in expression starting at index if it exists. Raise error if found and id doesn't follow. func (exp *expressionStream) readLicenseRef() *token { ref := exp.read("LicenseRef-") if len(ref) == 0 { // not an error if a LicenseRef isn't found return nil } id := exp.readID() if exp.err != nil { return nil } return &token{role: licenseRefToken, value: id} } // Read a LICENSE/EXCEPTION in expression starting at index if it exists. Raise error if found and id doesn't follow. func (exp *expressionStream) readLicense() *token { // because readID matches broadly, save the index so it can be reset if an actual license is not found index := exp.index license := exp.readID() if exp.err != nil { return nil } if token := exp.normalizeLicense(license); token != nil { return token } // license not found in indices, need to reset index since readID advanced it exp.index = index errmsg := fmt.Sprintf("unknown license '%s' at offset %d", license, exp.index) exp.err = errors.New(errmsg) return nil } // Generate a token using the normalized form of the license name. // // License name can be in the form: // - a_license-2.0, a_license, a_license-ab - there is variability in the form of the base license. a_license-2.0 is used for these // examples, but any base license form can have the suffixes described. // - a_license-2.0-only - normalizes to a_license-2.0 if the -only form is not specifically in the set of licenses // - a_license-2.0-or-later - normalizes to a_license-2.0+ if the -or-later form is not specifically in the set of licenses // - a_license-2.0+ - normalizes to a_license-2.0-or-later if the -or-later form is specifically in the set of licenses func (exp *expressionStream) normalizeLicense(license string) *token { if token := licenseLookup(license); token != nil { // checks active and exception license lists // deprecated list is checked at the end to avoid a deprecated license being used for + // (example: GPL-1.0 is on the deprecated list, but GPL-1.0+ should become GPL-1.0-or-later) return token } lenLicense := len(license) if strings.HasSuffix(license, "-only") { adjustedLicense := license[0 : lenLicense-5] if token := licenseLookup(adjustedLicense); token != nil { // no need to remove the -only from the expression stream; it is ignored return token } } if exp.hasMore() && exp.expression[exp.index:exp.index+1] == "+" { adjustedLicense := license[0:lenLicense] + "-or-later" if token := licenseLookup(adjustedLicense); token != nil { // need to consume the + to avoid a + operator token being added exp.index++ return token } } if strings.HasSuffix(license, "-or-later") { adjustedLicense := license[0 : lenLicense-9] if token := licenseLookup(adjustedLicense); token != nil { // replace `-or-later` with `+` newExpression := exp.expression[0:exp.index-len("-or-later")] + "+" if exp.hasMore() { newExpression += exp.expression[exp.index+1:] } exp.expression = newExpression // update index to remove `-or-later`; now pointing at the `+` operator exp.index -= len("-or-later") return token } } return deprecatedLicenseLookup(license) } // Lookup license identifier in active and exception lists to determine if it is a supported SPDX id func licenseLookup(license string) *token { active, preferredLicense := activeLicense(license) if active { return &token{role: licenseToken, value: preferredLicense} } exception, preferredLicense := exceptionLicense(license) if exception { return &token{role: exceptionToken, value: preferredLicense} } return nil } // Lookup license identifier in deprecated list to determine if it is a supported SPDX id func deprecatedLicenseLookup(license string) *token { deprecated, preferredLicense := deprecatedLicense(license) if deprecated { return &token{role: licenseToken, value: preferredLicense} } return nil } go-spdx-2.6.0/spdxexp/scan_test.go000066400000000000000000000330151517223150200171050ustar00rootroot00000000000000package spdxexp import ( "errors" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestScan(t *testing.T) { tests := []struct { name string expression string tokens []token err error }{ {"single license", "MIT", []token{ {role: licenseToken, value: "MIT"}, }, nil}, {"single license - diff case", "mit", []token{ {role: licenseToken, value: "MIT"}, }, nil}, {"empty expression", "", []token(nil), nil}, {"invalid license", "NON-EXISTENT-LICENSE", []token(nil), errors.New("unknown license 'NON-EXISTENT-LICENSE' at offset 0")}, {"two licenses using AND", "MIT AND Apache-2.0", []token{ {role: licenseToken, value: "MIT"}, {role: operatorToken, value: "AND"}, {role: licenseToken, value: "Apache-2.0"}, }, nil}, {"two licenses using OR inside paren", "(MIT OR Apache-2.0)", []token{ {role: operatorToken, value: "("}, {role: licenseToken, value: "MIT"}, {role: operatorToken, value: "OR"}, {role: licenseToken, value: "Apache-2.0"}, {role: operatorToken, value: ")"}, }, nil}, {"kitchen sink", " (MIT AND Apache-1.0+) OR DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2 OR (GPL-2.0 WITH Bison-exception-2.2)", []token{ {role: operatorToken, value: "("}, {role: licenseToken, value: "MIT"}, {role: operatorToken, value: "AND"}, {role: licenseToken, value: "Apache-1.0"}, {role: operatorToken, value: "+"}, {role: operatorToken, value: ")"}, {role: operatorToken, value: "OR"}, {role: documentRefToken, value: "spdx-tool-1.2"}, {role: operatorToken, value: ":"}, {role: licenseRefToken, value: "MIT-Style-2"}, {role: operatorToken, value: "OR"}, {role: operatorToken, value: "("}, {role: licenseToken, value: "GPL-2.0"}, {role: operatorToken, value: "WITH"}, {role: exceptionToken, value: "Bison-exception-2.2"}, {role: operatorToken, value: ")"}, }, nil}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { tokens, err := scan(test.expression) require.Equal(t, test.err, err) assert.Equal(t, test.tokens, tokens) }) } } func TestHasMoreSource(t *testing.T) { tests := []struct { name string exp *expressionStream result bool }{ {"at start", getExpressionStream("MIT OR Apache-2.0", 0), true}, {"at middle", getExpressionStream("MIT OR Apache-2.0", 3), true}, {"at end", getExpressionStream("MIT OR Apache-2.0", len("MIT OR Apache-2.0")), false}, {"past end", getExpressionStream("MIT OR Apache-2.0", 50), false}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.result, test.exp.hasMore()) }) } } func TestParseToken(t *testing.T) { tests := []struct { name string exp *expressionStream token *token newIndex int err error }{ {"operator found", getExpressionStream("MIT AND Apache-2.0", 4), &token{role: operatorToken, value: "AND"}, 7, nil}, {"operator error", getExpressionStream("Apache-1.0 + OR MIT", 11), nil, 11, errors.New("unexpected space before +")}, {"document ref found", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 0), &token{role: documentRefToken, value: "spdx-tool-1.2"}, 25, nil}, {"document ref error", getExpressionStream("DocumentRef-!23", 0), nil, 12, errors.New("expected id at offset 12")}, {"license ref found", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 26), &token{role: licenseRefToken, value: "MIT-Style-2"}, 48, nil}, {"license ref error", getExpressionStream("LicenseRef-!23", 0), nil, 11, errors.New("expected id at offset 11")}, {"identifier found", getExpressionStream("MIT AND Apache-2.0", 8), &token{role: licenseToken, value: "Apache-2.0"}, 18, nil}, {"identifier error", getExpressionStream("NON-EXISTENT-LICENSE", 0), nil, 0, errors.New("unknown license 'NON-EXISTENT-LICENSE' at offset 0")}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { tokn := test.exp.parseToken() assert.Equal(t, test.newIndex, test.exp.index) require.Equal(t, test.err, test.exp.err) if test.err != nil { // token is nil when error occurs or token is not recognized var nilToken *token assert.Equal(t, nilToken, tokn) return } // token recognized, check token value assert.Equal(t, test.token, tokn) }) } } func TestReadRegex(t *testing.T) { tests := []struct { name string exp *expressionStream pattern string match string newIndex int }{ {"regex to skip leading blank in middle", getExpressionStream("MIT OR Apache-2.0", 3), "[ ]*", " ", 4}, {"regex for id", getExpressionStream("LicenseRef-MIT-Style-1", 11), "[A-Za-z0-9-.]+", "MIT-Style-1", 22}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { match := test.exp.readRegex(test.pattern) assert.Equal(t, test.match, match) assert.Equal(t, test.newIndex, test.exp.index) }) } } func TestRead(t *testing.T) { tests := []struct { name string exp *expressionStream next string match string newIndex int }{ {"at first - match word", getExpressionStream("MIT OR Apache-2.0", 0), "MIT", "MIT", 3}, {"at middle - match operator", getExpressionStream("MIT OR Apache-2.0", 4), "OR", "OR", 6}, {"at middle - match last word", getExpressionStream("MIT OR Apache-2.0", 7), "Apache-2.0", "Apache-2.0", 17}, {"at first - no match", getExpressionStream("MIT OR Apache-2.0", 0), "GPL", "", 0}, {"at middle - no match for operator", getExpressionStream("MIT OR Apache-2.0", 4), "AND", "", 4}, {"at middle - no match last word", getExpressionStream("MIT OR Apache-2.0", 7), "GPL", "", 7}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { match := test.exp.read(test.next) assert.Equal(t, test.match, match) assert.Equal(t, test.newIndex, test.exp.index) }) } } func TestSkipWhitespace(t *testing.T) { tests := []struct { name string exp *expressionStream newIndex int }{ {"at first - no blanks", getExpressionStream("MIT OR Apache-2.0", 0), 0}, {"at first - with blanks", getExpressionStream(" MIT OR Apache-2 .0", 0), 2}, {"at middle - no blanks", getExpressionStream("MIT OR Apache-2.0", 4), 4}, {"at middle - with blanks", getExpressionStream("MIT OR Apache-2.0", 3), 4}, {"at end - no blanks", getExpressionStream("MIT OR GPL", 10), 10}, {"at end - with blanks", getExpressionStream("MIT OR GPL ", 10), 12}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { test.exp.skipWhitespace() assert.Equal(t, test.newIndex, test.exp.index) }) } } func TestReadOperator(t *testing.T) { tests := []struct { name string exp *expressionStream operator *token newIndex int err error }{ {"WITH operator", getExpressionStream("MIT WITH Bison-exception-2.2", 4), &token{role: operatorToken, value: "WITH"}, 8, nil}, {"AND operator", getExpressionStream("MIT AND Apache-2.0", 4), &token{role: operatorToken, value: "AND"}, 7, nil}, {"OR operator", getExpressionStream("MIT OR Apache-2.0", 4), &token{role: operatorToken, value: "OR"}, 6, nil}, {"( operator", getExpressionStream("(MIT OR Apache-2.0)", 0), &token{role: operatorToken, value: "("}, 1, nil}, {") operator", getExpressionStream("(MIT OR Apache-2.0)", 18), &token{role: operatorToken, value: ")"}, 19, nil}, {": operator", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 25), &token{role: operatorToken, value: ":"}, 26, nil}, {"plus operator - correctly used", getExpressionStream("Apache-1.0+ OR MIT", 10), &token{role: operatorToken, value: "+"}, 11, nil}, {"plus operator - with preceding space", getExpressionStream("Apache-1.0 + OR MIT", 11), nil, 11, errors.New("unexpected space before +")}, {"operator not found", getExpressionStream("MIT AND Apache-2.0", 8), nil, 8, nil}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { operator := test.exp.readOperator() assert.Equal(t, test.newIndex, test.exp.index) require.Equal(t, test.err, test.exp.err) assert.Equal(t, test.operator, operator) }) } } func TestReadId(t *testing.T) { tests := []struct { name string exp *expressionStream id string newIndex int }{ {"valid numeric id", getExpressionStream("LicenseRef-23", 11), "23", 13}, {"valid id with dashes", getExpressionStream("LicenseRef-MIT-Style-1", 11), "MIT-Style-1", 22}, {"valid id with period", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 12), "spdx-tool-1.2", 25}, {"invalid starts with non-supported character", getExpressionStream("LicenseRef-!23", 11), "", 11}, {"invalid non-supported character in middle", getExpressionStream("LicenseRef-2!3", 11), "2", 12}, {"invalid ends with non-supported character", getExpressionStream("LicenseRef-23!", 11), "23", 13}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { id := test.exp.readID() // check values if there isn't an error assert.Equal(t, test.id, id) assert.Equal(t, test.newIndex, test.exp.index) }) } } func TestReadDocumentRef(t *testing.T) { tests := []struct { name string exp *expressionStream ref *token newIndex int err error }{ {"valid document ref with id", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 0), &token{role: documentRefToken, value: "spdx-tool-1.2"}, 25, nil}, {"document ref not found", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 26), nil, 26, nil}, {"invalid document ref with bad id", getExpressionStream("DocumentRef-!23", 0), nil, 12, errors.New("expected id at offset 12")}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { ref := test.exp.readDocumentRef() assert.Equal(t, test.newIndex, test.exp.index) require.Equal(t, test.err, test.exp.err) if test.err != nil { // ref should be nil when error occurs or a ref is not found var nilToken *token assert.Equal(t, nilToken, ref, "Expected nil token when error occurs.") return } // ref found, check ref value assert.Equal(t, test.ref, ref) }) } } func TestReadLicenseRef(t *testing.T) { tests := []struct { name string exp *expressionStream ref *token newIndex int err error }{ {"valid license ref with id", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 26), &token{role: licenseRefToken, value: "MIT-Style-2"}, 48, nil}, {"license ref not found", getExpressionStream("DocumentRef-spdx-tool-1.2:LicenseRef-MIT-Style-2", 0), nil, 0, nil}, {"invalid license ref with bad id", getExpressionStream("LicenseRef-!23", 0), nil, 11, errors.New("expected id at offset 11")}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { ref := test.exp.readLicenseRef() assert.Equal(t, test.newIndex, test.exp.index) require.Equal(t, test.err, test.exp.err) if test.err != nil { // ref should be nil when error occurs or a ref is not found var nilToken *token assert.Equal(t, nilToken, ref) return } // ref found, check ref value assert.Equal(t, test.ref, ref) }) } } func TestReadLicense(t *testing.T) { tests := []struct { name string exp *expressionStream license *token newExpression string newIndex int err error }{ {"active license", getExpressionStream("MIT", 0), &token{role: licenseToken, value: "MIT"}, "MIT", 3, nil}, {"active -or-later", getExpressionStream("AGPL-1.0-or-later", 0), &token{role: licenseToken, value: "AGPL-1.0-or-later"}, "AGPL-1.0-or-later", 17, nil}, {"active -or-later using +", getExpressionStream("AGPL-1.0+", 0), &token{role: licenseToken, value: "AGPL-1.0-or-later"}, "AGPL-1.0+", 9, nil}, // no valid example for this; all that include -or-later have the base as a deprecated license {"active -or-later not in list", getExpressionStream("Apache-1.0-or-later", 0), &token{role: licenseToken, value: "Apache-1.0"}, "Apache-1.0+", 10, nil}, {"active -only", getExpressionStream("GPL-2.0-only", 0), &token{role: licenseToken, value: "GPL-2.0-only"}, "GPL-2.0-only", 12, nil}, {"active -only not in list", getExpressionStream("ECL-1.0-only", 0), &token{role: licenseToken, value: "ECL-1.0"}, "ECL-1.0-only", 12, nil}, {"deprecated license", getExpressionStream("LGPL-2.1", 0), &token{role: licenseToken, value: "LGPL-2.1"}, "LGPL-2.1", 8, nil}, {"exception license", getExpressionStream("GPL-CC-1.0", 0), &token{role: exceptionToken, value: "GPL-CC-1.0"}, "GPL-CC-1.0", 10, nil}, {"invalid license", getExpressionStream("NON-EXISTENT-LICENSE", 0), nil, "NON-EXISTENT-LICENSE", 0, errors.New("unknown license 'NON-EXISTENT-LICENSE' at offset 0")}, } for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { license := test.exp.readLicense() assert.Equal(t, test.newIndex, test.exp.index) require.Equal(t, test.err, test.exp.err) if test.err != nil { // license should be nil when error occurs or a license is not found var nilToken *token assert.Equal(t, nilToken, license) return } // license found, check license value assert.Equal(t, test.license, license) assert.Equal(t, test.newExpression, test.exp.expression) }) } } func getExpressionStream(expression string, index int) *expressionStream { return &expressionStream{ expression: expression, index: index, err: nil, } } go-spdx-2.6.0/spdxexp/spdxlicenses/000077500000000000000000000000001517223150200172755ustar00rootroot00000000000000go-spdx-2.6.0/spdxexp/spdxlicenses/doc.go000066400000000000000000000007701517223150200203750ustar00rootroot00000000000000/* Package spdxlicenses provides functions to get licenses, deprecated licenses, and exceptions. These are auto-generated and should not be modified directly. Licenses are generated from the [SPDX official machine readable license list]. In addition, this package includes a function to return license ranges for sequential licenses and ranges including modifiers (i.e. -only, -or-later). [SPDX official machine readable license list]: https://github.com/spdx/license-list-data */ package spdxlicenses go-spdx-2.6.0/spdxexp/spdxlicenses/get_deprecated.go000066400000000000000000000063721517223150200225730ustar00rootroot00000000000000package spdxlicenses // Code generated by go-spdx cmd/license.go. DO NOT EDIT. // Source: https://github.com/spdx/license-list-data specifies official SPDX license list. import "strings" // IsDeprecatedLicense does a case-insensitive lookup for the license id in the deprecated licenses map. // It returns true and the case-sensitive ID if found, otherwise false and the original id. func IsDeprecatedLicense(id string) (bool, string) { foundID, ok := deprecatedMap[strings.ToUpper(id)] if ok { return true, foundID } return false, id } // GetDeprecatedMap returns a map of deprecated license IDs keyed by uppercase ID. func GetDeprecatedMap() map[string]string { copied := make(map[string]string, len(deprecatedMap)) for k, v := range deprecatedMap { copied[k] = v } return copied } // GetDeprecated returns a slice of deprecated license IDs. func GetDeprecated() []string { return []string{ "AGPL-1.0", "AGPL-3.0", "BSD-2-Clause-FreeBSD", "BSD-2-Clause-NetBSD", "bzip2-1.0.5", "eCos-2.0", "GFDL-1.1", "GFDL-1.2", "GFDL-1.3", "GPL-1.0", "GPL-1.0+", "GPL-2.0", "GPL-2.0+", "GPL-2.0-with-autoconf-exception", "GPL-2.0-with-bison-exception", "GPL-2.0-with-classpath-exception", "GPL-2.0-with-font-exception", "GPL-2.0-with-GCC-exception", "GPL-3.0", "GPL-3.0+", "GPL-3.0-with-autoconf-exception", "GPL-3.0-with-GCC-exception", "LGPL-2.0", "LGPL-2.0+", "LGPL-2.1", "LGPL-2.1+", "LGPL-3.0", "LGPL-3.0+", "Net-SNMP", "Nunit", "StandardML-NJ", "wxWindows", } } var deprecatedMap = map[string]string{ "AGPL-1.0": "AGPL-1.0", "AGPL-3.0": "AGPL-3.0", "BSD-2-CLAUSE-FREEBSD": "BSD-2-Clause-FreeBSD", "BSD-2-CLAUSE-NETBSD": "BSD-2-Clause-NetBSD", "BZIP2-1.0.5": "bzip2-1.0.5", "ECOS-2.0": "eCos-2.0", "GFDL-1.1": "GFDL-1.1", "GFDL-1.2": "GFDL-1.2", "GFDL-1.3": "GFDL-1.3", "GPL-1.0": "GPL-1.0", "GPL-1.0+": "GPL-1.0+", "GPL-2.0": "GPL-2.0", "GPL-2.0+": "GPL-2.0+", "GPL-2.0-WITH-AUTOCONF-EXCEPTION": "GPL-2.0-with-autoconf-exception", "GPL-2.0-WITH-BISON-EXCEPTION": "GPL-2.0-with-bison-exception", "GPL-2.0-WITH-CLASSPATH-EXCEPTION": "GPL-2.0-with-classpath-exception", "GPL-2.0-WITH-FONT-EXCEPTION": "GPL-2.0-with-font-exception", "GPL-2.0-WITH-GCC-EXCEPTION": "GPL-2.0-with-GCC-exception", "GPL-3.0": "GPL-3.0", "GPL-3.0+": "GPL-3.0+", "GPL-3.0-WITH-AUTOCONF-EXCEPTION": "GPL-3.0-with-autoconf-exception", "GPL-3.0-WITH-GCC-EXCEPTION": "GPL-3.0-with-GCC-exception", "LGPL-2.0": "LGPL-2.0", "LGPL-2.0+": "LGPL-2.0+", "LGPL-2.1": "LGPL-2.1", "LGPL-2.1+": "LGPL-2.1+", "LGPL-3.0": "LGPL-3.0", "LGPL-3.0+": "LGPL-3.0+", "NET-SNMP": "Net-SNMP", "NUNIT": "Nunit", "STANDARDML-NJ": "StandardML-NJ", "WXWINDOWS": "wxWindows", } go-spdx-2.6.0/spdxexp/spdxlicenses/get_exceptions.go000066400000000000000000000207231517223150200226500ustar00rootroot00000000000000package spdxlicenses // Code generated by go-spdx cmd/exceptions.go. DO NOT EDIT. // Source: https://github.com/spdx/license-list-data specifies official SPDX license list. import "strings" // IsException does a case-insensitive lookup for the exception id in the exceptions map. // It returns true and the case-sensitive ID if found, otherwise false and the original id. func IsException(id string) (bool, string) { foundID, ok := exceptionsMap[strings.ToUpper(id)] if ok { return true, foundID } return false, id } // GetExceptionsMap returns a map of exception license IDs keyed by uppercase ID. func GetExceptionsMap() map[string]string { copied := make(map[string]string, len(exceptionsMap)) for k, v := range exceptionsMap { copied[k] = v } return copied } // GetExceptions returns a slice of exception license IDs. func GetExceptions() []string { return []string{ "389-exception", "Asterisk-exception", "Asterisk-linking-protocols-exception", "Autoconf-exception-2.0", "Autoconf-exception-3.0", "Autoconf-exception-generic", "Autoconf-exception-generic-3.0", "Autoconf-exception-macro", "Bison-exception-1.24", "Bison-exception-2.2", "Bootloader-exception", "CGAL-linking-exception", "Classpath-exception-2.0", "Classpath-exception-2.0-short", "CLISP-exception-2.0", "cryptsetup-OpenSSL-exception", "Digia-Qt-LGPL-exception-1.1", "DigiRule-FOSS-exception", "eCos-exception-2.0", "erlang-otp-linking-exception", "Fawkes-Runtime-exception", "FLTK-exception", "fmt-exception", "Font-exception-2.0", "freertos-exception-2.0", "GCC-exception-2.0", "GCC-exception-2.0-note", "GCC-exception-3.1", "Gmsh-exception", "GNAT-exception", "GNOME-examples-exception", "GNU-compiler-exception", "gnu-javamail-exception", "GPL-3.0-389-ds-base-exception", "GPL-3.0-interface-exception", "GPL-3.0-linking-exception", "GPL-3.0-linking-source-exception", "GPL-CC-1.0", "GStreamer-exception-2005", "GStreamer-exception-2008", "harbour-exception", "i2p-gpl-java-exception", "Independent-modules-exception", "KiCad-libraries-exception", "kvirc-openssl-exception", "LGPL-3.0-linking-exception", "libpri-OpenH323-exception", "Libtool-exception", "Linux-syscall-note", "LLGPL", "LLVM-exception", "LZMA-exception", "mif-exception", "mxml-exception", "OCaml-LGPL-linking-exception", "OCCT-exception-1.0", "OpenJDK-assembly-exception-1.0", "openvpn-openssl-exception", "PCRE2-exception", "polyparse-exception", "PS-or-PDF-font-exception-20170817", "QPL-1.0-INRIA-2004-exception", "Qt-GPL-exception-1.0", "Qt-LGPL-exception-1.1", "Qwt-exception-1.0", "romic-exception", "RRDtool-FLOSS-exception-2.0", "rsync-linking-exception", "SANE-exception", "SHL-2.0", "SHL-2.1", "Simple-Library-Usage-exception", "sqlitestudio-OpenSSL-exception", "stunnel-exception", "SWI-exception", "Swift-exception", "Texinfo-exception", "u-boot-exception-2.0", "UBDL-exception", "Universal-FOSS-exception-1.0", "vsftpd-openssl-exception", "WxWindows-exception-3.1", "x11vnc-openssl-exception", } } var exceptionsMap = map[string]string{ "389-EXCEPTION": "389-exception", "ASTERISK-EXCEPTION": "Asterisk-exception", "ASTERISK-LINKING-PROTOCOLS-EXCEPTION": "Asterisk-linking-protocols-exception", "AUTOCONF-EXCEPTION-2.0": "Autoconf-exception-2.0", "AUTOCONF-EXCEPTION-3.0": "Autoconf-exception-3.0", "AUTOCONF-EXCEPTION-GENERIC": "Autoconf-exception-generic", "AUTOCONF-EXCEPTION-GENERIC-3.0": "Autoconf-exception-generic-3.0", "AUTOCONF-EXCEPTION-MACRO": "Autoconf-exception-macro", "BISON-EXCEPTION-1.24": "Bison-exception-1.24", "BISON-EXCEPTION-2.2": "Bison-exception-2.2", "BOOTLOADER-EXCEPTION": "Bootloader-exception", "CGAL-LINKING-EXCEPTION": "CGAL-linking-exception", "CLASSPATH-EXCEPTION-2.0": "Classpath-exception-2.0", "CLASSPATH-EXCEPTION-2.0-SHORT": "Classpath-exception-2.0-short", "CLISP-EXCEPTION-2.0": "CLISP-exception-2.0", "CRYPTSETUP-OPENSSL-EXCEPTION": "cryptsetup-OpenSSL-exception", "DIGIA-QT-LGPL-EXCEPTION-1.1": "Digia-Qt-LGPL-exception-1.1", "DIGIRULE-FOSS-EXCEPTION": "DigiRule-FOSS-exception", "ECOS-EXCEPTION-2.0": "eCos-exception-2.0", "ERLANG-OTP-LINKING-EXCEPTION": "erlang-otp-linking-exception", "FAWKES-RUNTIME-EXCEPTION": "Fawkes-Runtime-exception", "FLTK-EXCEPTION": "FLTK-exception", "FMT-EXCEPTION": "fmt-exception", "FONT-EXCEPTION-2.0": "Font-exception-2.0", "FREERTOS-EXCEPTION-2.0": "freertos-exception-2.0", "GCC-EXCEPTION-2.0": "GCC-exception-2.0", "GCC-EXCEPTION-2.0-NOTE": "GCC-exception-2.0-note", "GCC-EXCEPTION-3.1": "GCC-exception-3.1", "GMSH-EXCEPTION": "Gmsh-exception", "GNAT-EXCEPTION": "GNAT-exception", "GNOME-EXAMPLES-EXCEPTION": "GNOME-examples-exception", "GNU-COMPILER-EXCEPTION": "GNU-compiler-exception", "GNU-JAVAMAIL-EXCEPTION": "gnu-javamail-exception", "GPL-3.0-389-DS-BASE-EXCEPTION": "GPL-3.0-389-ds-base-exception", "GPL-3.0-INTERFACE-EXCEPTION": "GPL-3.0-interface-exception", "GPL-3.0-LINKING-EXCEPTION": "GPL-3.0-linking-exception", "GPL-3.0-LINKING-SOURCE-EXCEPTION": "GPL-3.0-linking-source-exception", "GPL-CC-1.0": "GPL-CC-1.0", "GSTREAMER-EXCEPTION-2005": "GStreamer-exception-2005", "GSTREAMER-EXCEPTION-2008": "GStreamer-exception-2008", "HARBOUR-EXCEPTION": "harbour-exception", "I2P-GPL-JAVA-EXCEPTION": "i2p-gpl-java-exception", "INDEPENDENT-MODULES-EXCEPTION": "Independent-modules-exception", "KICAD-LIBRARIES-EXCEPTION": "KiCad-libraries-exception", "KVIRC-OPENSSL-EXCEPTION": "kvirc-openssl-exception", "LGPL-3.0-LINKING-EXCEPTION": "LGPL-3.0-linking-exception", "LIBPRI-OPENH323-EXCEPTION": "libpri-OpenH323-exception", "LIBTOOL-EXCEPTION": "Libtool-exception", "LINUX-SYSCALL-NOTE": "Linux-syscall-note", "LLGPL": "LLGPL", "LLVM-EXCEPTION": "LLVM-exception", "LZMA-EXCEPTION": "LZMA-exception", "MIF-EXCEPTION": "mif-exception", "MXML-EXCEPTION": "mxml-exception", "OCAML-LGPL-LINKING-EXCEPTION": "OCaml-LGPL-linking-exception", "OCCT-EXCEPTION-1.0": "OCCT-exception-1.0", "OPENJDK-ASSEMBLY-EXCEPTION-1.0": "OpenJDK-assembly-exception-1.0", "OPENVPN-OPENSSL-EXCEPTION": "openvpn-openssl-exception", "PCRE2-EXCEPTION": "PCRE2-exception", "POLYPARSE-EXCEPTION": "polyparse-exception", "PS-OR-PDF-FONT-EXCEPTION-20170817": "PS-or-PDF-font-exception-20170817", "QPL-1.0-INRIA-2004-EXCEPTION": "QPL-1.0-INRIA-2004-exception", "QT-GPL-EXCEPTION-1.0": "Qt-GPL-exception-1.0", "QT-LGPL-EXCEPTION-1.1": "Qt-LGPL-exception-1.1", "QWT-EXCEPTION-1.0": "Qwt-exception-1.0", "ROMIC-EXCEPTION": "romic-exception", "RRDTOOL-FLOSS-EXCEPTION-2.0": "RRDtool-FLOSS-exception-2.0", "RSYNC-LINKING-EXCEPTION": "rsync-linking-exception", "SANE-EXCEPTION": "SANE-exception", "SHL-2.0": "SHL-2.0", "SHL-2.1": "SHL-2.1", "SIMPLE-LIBRARY-USAGE-EXCEPTION": "Simple-Library-Usage-exception", "SQLITESTUDIO-OPENSSL-EXCEPTION": "sqlitestudio-OpenSSL-exception", "STUNNEL-EXCEPTION": "stunnel-exception", "SWI-EXCEPTION": "SWI-exception", "SWIFT-EXCEPTION": "Swift-exception", "TEXINFO-EXCEPTION": "Texinfo-exception", "U-BOOT-EXCEPTION-2.0": "u-boot-exception-2.0", "UBDL-EXCEPTION": "UBDL-exception", "UNIVERSAL-FOSS-EXCEPTION-1.0": "Universal-FOSS-exception-1.0", "VSFTPD-OPENSSL-EXCEPTION": "vsftpd-openssl-exception", "WXWINDOWS-EXCEPTION-3.1": "WxWindows-exception-3.1", "X11VNC-OPENSSL-EXCEPTION": "x11vnc-openssl-exception", } go-spdx-2.6.0/spdxexp/spdxlicenses/get_licenses.go000066400000000000000000001454111517223150200222760ustar00rootroot00000000000000package spdxlicenses // Code generated by go-spdx cmd/license.go. DO NOT EDIT. // Source: https://github.com/spdx/license-list-data specifies official SPDX license list. import "strings" // IsActiveLicense does a case-insensitive lookup for the license id in the active licenses map. // It returns true and the case-sensitive ID if found, otherwise false and the original id. func IsActiveLicense(id string) (bool, string) { foundID, ok := licensesMap[strings.ToUpper(id)] if ok { return true, foundID } return false, id } // GetLicensesMap returns a map of active license IDs keyed by uppercase ID. func GetLicensesMap() map[string]string { copied := make(map[string]string, len(licensesMap)) for k, v := range licensesMap { copied[k] = v } return copied } // GetLicenses returns a slice of active license IDs. func GetLicenses() []string { return []string{ "0BSD", "3D-Slicer-1.0", "AAL", "Abstyles", "AdaCore-doc", "Adobe-2006", "Adobe-Display-PostScript", "Adobe-Glyph", "Adobe-Utopia", "ADSL", "Advanced-Cryptics-Dictionary", "AFL-1.1", "AFL-1.2", "AFL-2.0", "AFL-2.1", "AFL-3.0", "Afmparse", "AGPL-1.0-only", "AGPL-1.0-or-later", "AGPL-3.0-only", "AGPL-3.0-or-later", "Aladdin", "ALGLIB-Documentation", "AMD-newlib", "AMDPLPA", "AML", "AML-glslang", "AMPAS", "ANTLR-PD", "ANTLR-PD-fallback", "any-OSI", "any-OSI-perl-modules", "Apache-1.0", "Apache-1.1", "Apache-2.0", "APAFML", "APL-1.0", "App-s2p", "APSL-1.0", "APSL-1.1", "APSL-1.2", "APSL-2.0", "Arphic-1999", "Artistic-1.0", "Artistic-1.0-cl8", "Artistic-1.0-Perl", "Artistic-2.0", "Artistic-dist", "Aspell-RU", "ASWF-Digital-Assets-1.0", "ASWF-Digital-Assets-1.1", "Baekmuk", "Bahyph", "Barr", "bcrypt-Solar-Designer", "Beerware", "Bitstream-Charter", "Bitstream-Vera", "BitTorrent-1.0", "BitTorrent-1.1", "blessing", "BlueOak-1.0.0", "Boehm-GC", "Boehm-GC-without-fee", "BOLA-1.1", "Borceux", "Brian-Gladman-2-Clause", "Brian-Gladman-3-Clause", "BSD-1-Clause", "BSD-2-Clause", "BSD-2-Clause-Darwin", "BSD-2-Clause-first-lines", "BSD-2-Clause-Patent", "BSD-2-Clause-pkgconf-disclaimer", "BSD-2-Clause-Views", "BSD-3-Clause", "BSD-3-Clause-acpica", "BSD-3-Clause-Attribution", "BSD-3-Clause-Clear", "BSD-3-Clause-flex", "BSD-3-Clause-HP", "BSD-3-Clause-LBNL", "BSD-3-Clause-Modification", "BSD-3-Clause-No-Military-License", "BSD-3-Clause-No-Nuclear-License", "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-Clause-No-Nuclear-Warranty", "BSD-3-Clause-Open-MPI", "BSD-3-Clause-Sun", "BSD-3-Clause-Tso", "BSD-4-Clause", "BSD-4-Clause-Shortened", "BSD-4-Clause-UC", "BSD-4.3RENO", "BSD-4.3TAHOE", "BSD-Advertising-Acknowledgement", "BSD-Attribution-HPND-disclaimer", "BSD-Inferno-Nettverk", "BSD-Mark-Modifications", "BSD-Protection", "BSD-Source-beginning-file", "BSD-Source-Code", "BSD-Systemics", "BSD-Systemics-W3Works", "BSL-1.0", "Buddy", "BUSL-1.1", "bzip2-1.0.6", "C-UDA-1.0", "CAL-1.0", "CAL-1.0-Combined-Work-Exception", "Caldera", "Caldera-no-preamble", "CAPEC-tou", "Catharon", "CATOSL-1.1", "CC-BY-1.0", "CC-BY-2.0", "CC-BY-2.5", "CC-BY-2.5-AU", "CC-BY-3.0", "CC-BY-3.0-AT", "CC-BY-3.0-AU", "CC-BY-3.0-DE", "CC-BY-3.0-IGO", "CC-BY-3.0-NL", "CC-BY-3.0-US", "CC-BY-4.0", "CC-BY-NC-1.0", "CC-BY-NC-2.0", "CC-BY-NC-2.5", "CC-BY-NC-3.0", "CC-BY-NC-3.0-DE", "CC-BY-NC-4.0", "CC-BY-NC-ND-1.0", "CC-BY-NC-ND-2.0", "CC-BY-NC-ND-2.5", "CC-BY-NC-ND-3.0", "CC-BY-NC-ND-3.0-DE", "CC-BY-NC-ND-3.0-IGO", "CC-BY-NC-ND-4.0", "CC-BY-NC-SA-1.0", "CC-BY-NC-SA-2.0", "CC-BY-NC-SA-2.0-DE", "CC-BY-NC-SA-2.0-FR", "CC-BY-NC-SA-2.0-UK", "CC-BY-NC-SA-2.5", "CC-BY-NC-SA-3.0", "CC-BY-NC-SA-3.0-DE", "CC-BY-NC-SA-3.0-IGO", "CC-BY-NC-SA-4.0", "CC-BY-ND-1.0", "CC-BY-ND-2.0", "CC-BY-ND-2.5", "CC-BY-ND-3.0", "CC-BY-ND-3.0-DE", "CC-BY-ND-4.0", "CC-BY-SA-1.0", "CC-BY-SA-2.0", "CC-BY-SA-2.0-UK", "CC-BY-SA-2.1-JP", "CC-BY-SA-2.5", "CC-BY-SA-3.0", "CC-BY-SA-3.0-AT", "CC-BY-SA-3.0-DE", "CC-BY-SA-3.0-IGO", "CC-BY-SA-4.0", "CC-PDDC", "CC-PDM-1.0", "CC-SA-1.0", "CC0-1.0", "CDDL-1.0", "CDDL-1.1", "CDL-1.0", "CDLA-Permissive-1.0", "CDLA-Permissive-2.0", "CDLA-Sharing-1.0", "CECILL-1.0", "CECILL-1.1", "CECILL-2.0", "CECILL-2.1", "CECILL-B", "CECILL-C", "CERN-OHL-1.1", "CERN-OHL-1.2", "CERN-OHL-P-2.0", "CERN-OHL-S-2.0", "CERN-OHL-W-2.0", "CFITSIO", "check-cvs", "checkmk", "ClArtistic", "Clips", "CMU-Mach", "CMU-Mach-nodoc", "CNRI-Jython", "CNRI-Python", "CNRI-Python-GPL-Compatible", "COIL-1.0", "Community-Spec-1.0", "Condor-1.1", "copyleft-next-0.3.0", "copyleft-next-0.3.1", "Cornell-Lossless-JPEG", "CPAL-1.0", "CPL-1.0", "CPOL-1.02", "Cronyx", "Crossword", "CryptoSwift", "CrystalStacker", "CUA-OPL-1.0", "Cube", "curl", "cve-tou", "D-FSL-1.0", "DEC-3-Clause", "diffmark", "DL-DE-BY-2.0", "DL-DE-ZERO-2.0", "DOC", "DocBook-DTD", "DocBook-Schema", "DocBook-Stylesheet", "DocBook-XML", "Dotseqn", "DRL-1.0", "DRL-1.1", "DSDP", "dtoa", "dvipdfm", "ECL-1.0", "ECL-2.0", "EFL-1.0", "EFL-2.0", "eGenix", "Elastic-2.0", "Entessa", "EPICS", "EPL-1.0", "EPL-2.0", "ErlPL-1.1", "ESA-PL-permissive-2.4", "ESA-PL-strong-copyleft-2.4", "ESA-PL-weak-copyleft-2.4", "etalab-2.0", "EUDatagrid", "EUPL-1.0", "EUPL-1.1", "EUPL-1.2", "Eurosym", "Fair", "FBM", "FDK-AAC", "Ferguson-Twofish", "Frameworx-1.0", "FreeBSD-DOC", "FreeImage", "FSFAP", "FSFAP-no-warranty-disclaimer", "FSFUL", "FSFULLR", "FSFULLRSD", "FSFULLRWD", "FSL-1.1-ALv2", "FSL-1.1-MIT", "FTL", "Furuseth", "fwlw", "Game-Programming-Gems", "GCR-docs", "GD", "generic-xts", "GFDL-1.1-invariants-only", "GFDL-1.1-invariants-or-later", "GFDL-1.1-no-invariants-only", "GFDL-1.1-no-invariants-or-later", "GFDL-1.1-only", "GFDL-1.1-or-later", "GFDL-1.2-invariants-only", "GFDL-1.2-invariants-or-later", "GFDL-1.2-no-invariants-only", "GFDL-1.2-no-invariants-or-later", "GFDL-1.2-only", "GFDL-1.2-or-later", "GFDL-1.3-invariants-only", "GFDL-1.3-invariants-or-later", "GFDL-1.3-no-invariants-only", "GFDL-1.3-no-invariants-or-later", "GFDL-1.3-only", "GFDL-1.3-or-later", "Giftware", "GL2PS", "Glide", "Glulxe", "GLWTPL", "gnuplot", "GPL-1.0-only", "GPL-1.0-or-later", "GPL-2.0-only", "GPL-2.0-or-later", "GPL-3.0-only", "GPL-3.0-or-later", "Graphics-Gems", "gSOAP-1.3b", "gtkbook", "Gutmann", "HaskellReport", "HDF5", "hdparm", "HIDAPI", "Hippocratic-2.1", "HP-1986", "HP-1989", "HPND", "HPND-DEC", "HPND-doc", "HPND-doc-sell", "HPND-export-US", "HPND-export-US-acknowledgement", "HPND-export-US-modify", "HPND-export2-US", "HPND-Fenneberg-Livingston", "HPND-INRIA-IMAG", "HPND-Intel", "HPND-Kevlin-Henney", "HPND-Markus-Kuhn", "HPND-merchantability-variant", "HPND-MIT-disclaimer", "HPND-Netrek", "HPND-Pbmplus", "HPND-sell-MIT-disclaimer-xserver", "HPND-sell-regexpr", "HPND-sell-variant", "HPND-sell-variant-critical-systems", "HPND-sell-variant-MIT-disclaimer", "HPND-sell-variant-MIT-disclaimer-rev", "HPND-SMC", "HPND-UC", "HPND-UC-export-US", "HTMLTIDY", "hyphen-bulgarian", "IBM-pibs", "ICU", "IEC-Code-Components-EULA", "IJG", "IJG-short", "ImageMagick", "iMatix", "Imlib2", "Info-ZIP", "Inner-Net-2.0", "InnoSetup", "Intel", "Intel-ACPI", "Interbase-1.0", "IPA", "IPL-1.0", "ISC", "ISC-Veillard", "ISO-permission", "Jam", "JasPer-2.0", "jove", "JPL-image", "JPNIC", "JSON", "Kastrup", "Kazlib", "Knuth-CTAN", "LAL-1.2", "LAL-1.3", "Latex2e", "Latex2e-translated-notice", "Leptonica", "LGPL-2.0-only", "LGPL-2.0-or-later", "LGPL-2.1-only", "LGPL-2.1-or-later", "LGPL-3.0-only", "LGPL-3.0-or-later", "LGPLLR", "Libpng", "libpng-1.6.35", "libpng-2.0", "libselinux-1.0", "libtiff", "libutil-David-Nugent", "LiLiQ-P-1.1", "LiLiQ-R-1.1", "LiLiQ-Rplus-1.1", "Linux-man-pages-1-para", "Linux-man-pages-copyleft", "Linux-man-pages-copyleft-2-para", "Linux-man-pages-copyleft-var", "Linux-OpenIB", "LOOP", "LPD-document", "LPL-1.0", "LPL-1.02", "LPPL-1.0", "LPPL-1.1", "LPPL-1.2", "LPPL-1.3a", "LPPL-1.3c", "lsof", "Lucida-Bitmap-Fonts", "LZMA-SDK-9.11-to-9.20", "LZMA-SDK-9.22", "Mackerras-3-Clause", "Mackerras-3-Clause-acknowledgment", "magaz", "mailprio", "MakeIndex", "man2html", "Martin-Birgmeier", "McPhee-slideshow", "metamail", "Minpack", "MIPS", "MirOS", "MIT", "MIT-0", "MIT-advertising", "MIT-Click", "MIT-CMU", "MIT-enna", "MIT-feh", "MIT-Festival", "MIT-Khronos-old", "MIT-Modern-Variant", "MIT-open-group", "MIT-STK", "MIT-testregex", "MIT-Wu", "MITNFA", "MMIXware", "MMPL-1.0.1", "Motosoto", "MPEG-SSG", "mpi-permissive", "mpich2", "MPL-1.0", "MPL-1.1", "MPL-2.0", "MPL-2.0-no-copyleft-exception", "mplus", "MS-LPL", "MS-PL", "MS-RL", "MTLL", "MulanPSL-1.0", "MulanPSL-2.0", "Multics", "Mup", "NAIST-2003", "NASA-1.3", "Naumen", "NBPL-1.0", "NCBI-PD", "NCGL-UK-2.0", "NCL", "NCSA", "NetCDF", "Newsletr", "NGPL", "ngrep", "NICTA-1.0", "NIST-PD", "NIST-PD-fallback", "NIST-PD-TNT", "NIST-Software", "NLOD-1.0", "NLOD-2.0", "NLPL", "Nokia", "NOSL", "Noweb", "NPL-1.0", "NPL-1.1", "NPOSL-3.0", "NRL", "NTIA-PD", "NTP", "NTP-0", "O-UDA-1.0", "OAR", "OCCT-PL", "OCLC-2.0", "ODbL-1.0", "ODC-By-1.0", "OFFIS", "OFL-1.0", "OFL-1.0-no-RFN", "OFL-1.0-RFN", "OFL-1.1", "OFL-1.1-no-RFN", "OFL-1.1-RFN", "OGC-1.0", "OGDL-Taiwan-1.0", "OGL-Canada-2.0", "OGL-UK-1.0", "OGL-UK-2.0", "OGL-UK-3.0", "OGTSL", "OLDAP-1.1", "OLDAP-1.2", "OLDAP-1.3", "OLDAP-1.4", "OLDAP-2.0", "OLDAP-2.0.1", "OLDAP-2.1", "OLDAP-2.2", "OLDAP-2.2.1", "OLDAP-2.2.2", "OLDAP-2.3", "OLDAP-2.4", "OLDAP-2.5", "OLDAP-2.6", "OLDAP-2.7", "OLDAP-2.8", "OLFL-1.3", "OML", "OpenMDW-1.0", "OpenPBS-2.3", "OpenSSL", "OpenSSL-standalone", "OpenVision", "OPL-1.0", "OPL-UK-3.0", "OPUBL-1.0", "OSC-1.0", "OSET-PL-2.1", "OSL-1.0", "OSL-1.1", "OSL-2.0", "OSL-2.1", "OSL-3.0", "OSSP", "PADL", "ParaType-Free-Font-1.3", "Parity-6.0.0", "Parity-7.0.0", "PDDL-1.0", "PHP-3.0", "PHP-3.01", "Pixar", "pkgconf", "Plexus", "pnmstitch", "PolyForm-Noncommercial-1.0.0", "PolyForm-Small-Business-1.0.0", "PostgreSQL", "PPL", "PSF-2.0", "psfrag", "psutils", "Python-2.0", "Python-2.0.1", "python-ldap", "Qhull", "QPL-1.0", "QPL-1.0-INRIA-2004", "radvd", "Rdisc", "RHeCos-1.1", "RPL-1.1", "RPL-1.5", "RPSL-1.0", "RSA-MD", "RSCPL", "Ruby", "Ruby-pty", "SAX-PD", "SAX-PD-2.0", "Saxpath", "SCEA", "SchemeReport", "Sendmail", "Sendmail-8.23", "Sendmail-Open-Source-1.1", "SGI-B-1.0", "SGI-B-1.1", "SGI-B-2.0", "SGI-OpenGL", "SGMLUG-PM", "SGP4", "SHL-0.5", "SHL-0.51", "SimPL-2.0", "SISSL", "SISSL-1.2", "SL", "Sleepycat", "SMAIL-GPL", "SMLNJ", "SMPPL", "SNIA", "snprintf", "SOFA", "softSurfer", "Soundex", "Spencer-86", "Spencer-94", "Spencer-99", "SPL-1.0", "ssh-keyscan", "SSH-OpenSSH", "SSH-short", "SSLeay-standalone", "SSPL-1.0", "SugarCRM-1.1.3", "SUL-1.0", "Sun-PPP", "Sun-PPP-2000", "SunPro", "SWL", "swrule", "Symlinks", "TAPR-OHL-1.0", "TCL", "TCP-wrappers", "TekHVC", "TermReadKey", "TGPPL-1.0", "ThirdEye", "threeparttable", "TMate", "TORQUE-1.1", "TOSL", "TPDL", "TPL-1.0", "TrustedQSL", "TTWL", "TTYP0", "TU-Berlin-1.0", "TU-Berlin-2.0", "Ubuntu-font-1.0", "UCAR", "UCL-1.0", "ulem", "UMich-Merit", "Unicode-3.0", "Unicode-DFS-2015", "Unicode-DFS-2016", "Unicode-TOU", "UnixCrypt", "Unlicense", "Unlicense-libtelnet", "Unlicense-libwhirlpool", "UnRAR", "UPL-1.0", "URT-RLE", "Vim", "Vixie-Cron", "VOSTROM", "VSL-1.0", "W3C", "W3C-19980720", "W3C-20150513", "w3m", "Watcom-1.0", "Widget-Workshop", "WordNet", "Wsuipa", "WTFNMFPL", "WTFPL", "wwl", "X11", "X11-distribute-modifications-variant", "X11-no-permit-persons", "X11-swapped", "Xdebug-1.03", "Xerox", "Xfig", "XFree86-1.1", "xinetd", "xkeyboard-config-Zinoviev", "xlock", "Xnet", "xpp", "XSkat", "xzoom", "YPL-1.0", "YPL-1.1", "Zed", "Zeeff", "Zend-2.0", "Zimbra-1.3", "Zimbra-1.4", "Zlib", "zlib-acknowledgement", "ZPL-1.1", "ZPL-2.0", "ZPL-2.1", } } var licensesMap = map[string]string{ "0BSD": "0BSD", "3D-SLICER-1.0": "3D-Slicer-1.0", "AAL": "AAL", "ABSTYLES": "Abstyles", "ADACORE-DOC": "AdaCore-doc", "ADOBE-2006": "Adobe-2006", "ADOBE-DISPLAY-POSTSCRIPT": "Adobe-Display-PostScript", "ADOBE-GLYPH": "Adobe-Glyph", "ADOBE-UTOPIA": "Adobe-Utopia", "ADSL": "ADSL", "ADVANCED-CRYPTICS-DICTIONARY": "Advanced-Cryptics-Dictionary", "AFL-1.1": "AFL-1.1", "AFL-1.2": "AFL-1.2", "AFL-2.0": "AFL-2.0", "AFL-2.1": "AFL-2.1", "AFL-3.0": "AFL-3.0", "AFMPARSE": "Afmparse", "AGPL-1.0-ONLY": "AGPL-1.0-only", "AGPL-1.0-OR-LATER": "AGPL-1.0-or-later", "AGPL-3.0-ONLY": "AGPL-3.0-only", "AGPL-3.0-OR-LATER": "AGPL-3.0-or-later", "ALADDIN": "Aladdin", "ALGLIB-DOCUMENTATION": "ALGLIB-Documentation", "AMD-NEWLIB": "AMD-newlib", "AMDPLPA": "AMDPLPA", "AML": "AML", "AML-GLSLANG": "AML-glslang", "AMPAS": "AMPAS", "ANTLR-PD": "ANTLR-PD", "ANTLR-PD-FALLBACK": "ANTLR-PD-fallback", "ANY-OSI": "any-OSI", "ANY-OSI-PERL-MODULES": "any-OSI-perl-modules", "APACHE-1.0": "Apache-1.0", "APACHE-1.1": "Apache-1.1", "APACHE-2.0": "Apache-2.0", "APAFML": "APAFML", "APL-1.0": "APL-1.0", "APP-S2P": "App-s2p", "APSL-1.0": "APSL-1.0", "APSL-1.1": "APSL-1.1", "APSL-1.2": "APSL-1.2", "APSL-2.0": "APSL-2.0", "ARPHIC-1999": "Arphic-1999", "ARTISTIC-1.0": "Artistic-1.0", "ARTISTIC-1.0-CL8": "Artistic-1.0-cl8", "ARTISTIC-1.0-PERL": "Artistic-1.0-Perl", "ARTISTIC-2.0": "Artistic-2.0", "ARTISTIC-DIST": "Artistic-dist", "ASPELL-RU": "Aspell-RU", "ASWF-DIGITAL-ASSETS-1.0": "ASWF-Digital-Assets-1.0", "ASWF-DIGITAL-ASSETS-1.1": "ASWF-Digital-Assets-1.1", "BAEKMUK": "Baekmuk", "BAHYPH": "Bahyph", "BARR": "Barr", "BCRYPT-SOLAR-DESIGNER": "bcrypt-Solar-Designer", "BEERWARE": "Beerware", "BITSTREAM-CHARTER": "Bitstream-Charter", "BITSTREAM-VERA": "Bitstream-Vera", "BITTORRENT-1.0": "BitTorrent-1.0", "BITTORRENT-1.1": "BitTorrent-1.1", "BLESSING": "blessing", "BLUEOAK-1.0.0": "BlueOak-1.0.0", "BOEHM-GC": "Boehm-GC", "BOEHM-GC-WITHOUT-FEE": "Boehm-GC-without-fee", "BOLA-1.1": "BOLA-1.1", "BORCEUX": "Borceux", "BRIAN-GLADMAN-2-CLAUSE": "Brian-Gladman-2-Clause", "BRIAN-GLADMAN-3-CLAUSE": "Brian-Gladman-3-Clause", "BSD-1-CLAUSE": "BSD-1-Clause", "BSD-2-CLAUSE": "BSD-2-Clause", "BSD-2-CLAUSE-DARWIN": "BSD-2-Clause-Darwin", "BSD-2-CLAUSE-FIRST-LINES": "BSD-2-Clause-first-lines", "BSD-2-CLAUSE-PATENT": "BSD-2-Clause-Patent", "BSD-2-CLAUSE-PKGCONF-DISCLAIMER": "BSD-2-Clause-pkgconf-disclaimer", "BSD-2-CLAUSE-VIEWS": "BSD-2-Clause-Views", "BSD-3-CLAUSE": "BSD-3-Clause", "BSD-3-CLAUSE-ACPICA": "BSD-3-Clause-acpica", "BSD-3-CLAUSE-ATTRIBUTION": "BSD-3-Clause-Attribution", "BSD-3-CLAUSE-CLEAR": "BSD-3-Clause-Clear", "BSD-3-CLAUSE-FLEX": "BSD-3-Clause-flex", "BSD-3-CLAUSE-HP": "BSD-3-Clause-HP", "BSD-3-CLAUSE-LBNL": "BSD-3-Clause-LBNL", "BSD-3-CLAUSE-MODIFICATION": "BSD-3-Clause-Modification", "BSD-3-CLAUSE-NO-MILITARY-LICENSE": "BSD-3-Clause-No-Military-License", "BSD-3-CLAUSE-NO-NUCLEAR-LICENSE": "BSD-3-Clause-No-Nuclear-License", "BSD-3-CLAUSE-NO-NUCLEAR-LICENSE-2014": "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-CLAUSE-NO-NUCLEAR-WARRANTY": "BSD-3-Clause-No-Nuclear-Warranty", "BSD-3-CLAUSE-OPEN-MPI": "BSD-3-Clause-Open-MPI", "BSD-3-CLAUSE-SUN": "BSD-3-Clause-Sun", "BSD-3-CLAUSE-TSO": "BSD-3-Clause-Tso", "BSD-4-CLAUSE": "BSD-4-Clause", "BSD-4-CLAUSE-SHORTENED": "BSD-4-Clause-Shortened", "BSD-4-CLAUSE-UC": "BSD-4-Clause-UC", "BSD-4.3RENO": "BSD-4.3RENO", "BSD-4.3TAHOE": "BSD-4.3TAHOE", "BSD-ADVERTISING-ACKNOWLEDGEMENT": "BSD-Advertising-Acknowledgement", "BSD-ATTRIBUTION-HPND-DISCLAIMER": "BSD-Attribution-HPND-disclaimer", "BSD-INFERNO-NETTVERK": "BSD-Inferno-Nettverk", "BSD-MARK-MODIFICATIONS": "BSD-Mark-Modifications", "BSD-PROTECTION": "BSD-Protection", "BSD-SOURCE-BEGINNING-FILE": "BSD-Source-beginning-file", "BSD-SOURCE-CODE": "BSD-Source-Code", "BSD-SYSTEMICS": "BSD-Systemics", "BSD-SYSTEMICS-W3WORKS": "BSD-Systemics-W3Works", "BSL-1.0": "BSL-1.0", "BUDDY": "Buddy", "BUSL-1.1": "BUSL-1.1", "BZIP2-1.0.6": "bzip2-1.0.6", "C-UDA-1.0": "C-UDA-1.0", "CAL-1.0": "CAL-1.0", "CAL-1.0-COMBINED-WORK-EXCEPTION": "CAL-1.0-Combined-Work-Exception", "CALDERA": "Caldera", "CALDERA-NO-PREAMBLE": "Caldera-no-preamble", "CAPEC-TOU": "CAPEC-tou", "CATHARON": "Catharon", "CATOSL-1.1": "CATOSL-1.1", "CC-BY-1.0": "CC-BY-1.0", "CC-BY-2.0": "CC-BY-2.0", "CC-BY-2.5": "CC-BY-2.5", "CC-BY-2.5-AU": "CC-BY-2.5-AU", "CC-BY-3.0": "CC-BY-3.0", "CC-BY-3.0-AT": "CC-BY-3.0-AT", "CC-BY-3.0-AU": "CC-BY-3.0-AU", "CC-BY-3.0-DE": "CC-BY-3.0-DE", "CC-BY-3.0-IGO": "CC-BY-3.0-IGO", "CC-BY-3.0-NL": "CC-BY-3.0-NL", "CC-BY-3.0-US": "CC-BY-3.0-US", "CC-BY-4.0": "CC-BY-4.0", "CC-BY-NC-1.0": "CC-BY-NC-1.0", "CC-BY-NC-2.0": "CC-BY-NC-2.0", "CC-BY-NC-2.5": "CC-BY-NC-2.5", "CC-BY-NC-3.0": "CC-BY-NC-3.0", "CC-BY-NC-3.0-DE": "CC-BY-NC-3.0-DE", "CC-BY-NC-4.0": "CC-BY-NC-4.0", "CC-BY-NC-ND-1.0": "CC-BY-NC-ND-1.0", "CC-BY-NC-ND-2.0": "CC-BY-NC-ND-2.0", "CC-BY-NC-ND-2.5": "CC-BY-NC-ND-2.5", "CC-BY-NC-ND-3.0": "CC-BY-NC-ND-3.0", "CC-BY-NC-ND-3.0-DE": "CC-BY-NC-ND-3.0-DE", "CC-BY-NC-ND-3.0-IGO": "CC-BY-NC-ND-3.0-IGO", "CC-BY-NC-ND-4.0": "CC-BY-NC-ND-4.0", "CC-BY-NC-SA-1.0": "CC-BY-NC-SA-1.0", "CC-BY-NC-SA-2.0": "CC-BY-NC-SA-2.0", "CC-BY-NC-SA-2.0-DE": "CC-BY-NC-SA-2.0-DE", "CC-BY-NC-SA-2.0-FR": "CC-BY-NC-SA-2.0-FR", "CC-BY-NC-SA-2.0-UK": "CC-BY-NC-SA-2.0-UK", "CC-BY-NC-SA-2.5": "CC-BY-NC-SA-2.5", "CC-BY-NC-SA-3.0": "CC-BY-NC-SA-3.0", "CC-BY-NC-SA-3.0-DE": "CC-BY-NC-SA-3.0-DE", "CC-BY-NC-SA-3.0-IGO": "CC-BY-NC-SA-3.0-IGO", "CC-BY-NC-SA-4.0": "CC-BY-NC-SA-4.0", "CC-BY-ND-1.0": "CC-BY-ND-1.0", "CC-BY-ND-2.0": "CC-BY-ND-2.0", "CC-BY-ND-2.5": "CC-BY-ND-2.5", "CC-BY-ND-3.0": "CC-BY-ND-3.0", "CC-BY-ND-3.0-DE": "CC-BY-ND-3.0-DE", "CC-BY-ND-4.0": "CC-BY-ND-4.0", "CC-BY-SA-1.0": "CC-BY-SA-1.0", "CC-BY-SA-2.0": "CC-BY-SA-2.0", "CC-BY-SA-2.0-UK": "CC-BY-SA-2.0-UK", "CC-BY-SA-2.1-JP": "CC-BY-SA-2.1-JP", "CC-BY-SA-2.5": "CC-BY-SA-2.5", "CC-BY-SA-3.0": "CC-BY-SA-3.0", "CC-BY-SA-3.0-AT": "CC-BY-SA-3.0-AT", "CC-BY-SA-3.0-DE": "CC-BY-SA-3.0-DE", "CC-BY-SA-3.0-IGO": "CC-BY-SA-3.0-IGO", "CC-BY-SA-4.0": "CC-BY-SA-4.0", "CC-PDDC": "CC-PDDC", "CC-PDM-1.0": "CC-PDM-1.0", "CC-SA-1.0": "CC-SA-1.0", "CC0-1.0": "CC0-1.0", "CDDL-1.0": "CDDL-1.0", "CDDL-1.1": "CDDL-1.1", "CDL-1.0": "CDL-1.0", "CDLA-PERMISSIVE-1.0": "CDLA-Permissive-1.0", "CDLA-PERMISSIVE-2.0": "CDLA-Permissive-2.0", "CDLA-SHARING-1.0": "CDLA-Sharing-1.0", "CECILL-1.0": "CECILL-1.0", "CECILL-1.1": "CECILL-1.1", "CECILL-2.0": "CECILL-2.0", "CECILL-2.1": "CECILL-2.1", "CECILL-B": "CECILL-B", "CECILL-C": "CECILL-C", "CERN-OHL-1.1": "CERN-OHL-1.1", "CERN-OHL-1.2": "CERN-OHL-1.2", "CERN-OHL-P-2.0": "CERN-OHL-P-2.0", "CERN-OHL-S-2.0": "CERN-OHL-S-2.0", "CERN-OHL-W-2.0": "CERN-OHL-W-2.0", "CFITSIO": "CFITSIO", "CHECK-CVS": "check-cvs", "CHECKMK": "checkmk", "CLARTISTIC": "ClArtistic", "CLIPS": "Clips", "CMU-MACH": "CMU-Mach", "CMU-MACH-NODOC": "CMU-Mach-nodoc", "CNRI-JYTHON": "CNRI-Jython", "CNRI-PYTHON": "CNRI-Python", "CNRI-PYTHON-GPL-COMPATIBLE": "CNRI-Python-GPL-Compatible", "COIL-1.0": "COIL-1.0", "COMMUNITY-SPEC-1.0": "Community-Spec-1.0", "CONDOR-1.1": "Condor-1.1", "COPYLEFT-NEXT-0.3.0": "copyleft-next-0.3.0", "COPYLEFT-NEXT-0.3.1": "copyleft-next-0.3.1", "CORNELL-LOSSLESS-JPEG": "Cornell-Lossless-JPEG", "CPAL-1.0": "CPAL-1.0", "CPL-1.0": "CPL-1.0", "CPOL-1.02": "CPOL-1.02", "CRONYX": "Cronyx", "CROSSWORD": "Crossword", "CRYPTOSWIFT": "CryptoSwift", "CRYSTALSTACKER": "CrystalStacker", "CUA-OPL-1.0": "CUA-OPL-1.0", "CUBE": "Cube", "CURL": "curl", "CVE-TOU": "cve-tou", "D-FSL-1.0": "D-FSL-1.0", "DEC-3-CLAUSE": "DEC-3-Clause", "DIFFMARK": "diffmark", "DL-DE-BY-2.0": "DL-DE-BY-2.0", "DL-DE-ZERO-2.0": "DL-DE-ZERO-2.0", "DOC": "DOC", "DOCBOOK-DTD": "DocBook-DTD", "DOCBOOK-SCHEMA": "DocBook-Schema", "DOCBOOK-STYLESHEET": "DocBook-Stylesheet", "DOCBOOK-XML": "DocBook-XML", "DOTSEQN": "Dotseqn", "DRL-1.0": "DRL-1.0", "DRL-1.1": "DRL-1.1", "DSDP": "DSDP", "DTOA": "dtoa", "DVIPDFM": "dvipdfm", "ECL-1.0": "ECL-1.0", "ECL-2.0": "ECL-2.0", "EFL-1.0": "EFL-1.0", "EFL-2.0": "EFL-2.0", "EGENIX": "eGenix", "ELASTIC-2.0": "Elastic-2.0", "ENTESSA": "Entessa", "EPICS": "EPICS", "EPL-1.0": "EPL-1.0", "EPL-2.0": "EPL-2.0", "ERLPL-1.1": "ErlPL-1.1", "ESA-PL-PERMISSIVE-2.4": "ESA-PL-permissive-2.4", "ESA-PL-STRONG-COPYLEFT-2.4": "ESA-PL-strong-copyleft-2.4", "ESA-PL-WEAK-COPYLEFT-2.4": "ESA-PL-weak-copyleft-2.4", "ETALAB-2.0": "etalab-2.0", "EUDATAGRID": "EUDatagrid", "EUPL-1.0": "EUPL-1.0", "EUPL-1.1": "EUPL-1.1", "EUPL-1.2": "EUPL-1.2", "EUROSYM": "Eurosym", "FAIR": "Fair", "FBM": "FBM", "FDK-AAC": "FDK-AAC", "FERGUSON-TWOFISH": "Ferguson-Twofish", "FRAMEWORX-1.0": "Frameworx-1.0", "FREEBSD-DOC": "FreeBSD-DOC", "FREEIMAGE": "FreeImage", "FSFAP": "FSFAP", "FSFAP-NO-WARRANTY-DISCLAIMER": "FSFAP-no-warranty-disclaimer", "FSFUL": "FSFUL", "FSFULLR": "FSFULLR", "FSFULLRSD": "FSFULLRSD", "FSFULLRWD": "FSFULLRWD", "FSL-1.1-ALV2": "FSL-1.1-ALv2", "FSL-1.1-MIT": "FSL-1.1-MIT", "FTL": "FTL", "FURUSETH": "Furuseth", "FWLW": "fwlw", "GAME-PROGRAMMING-GEMS": "Game-Programming-Gems", "GCR-DOCS": "GCR-docs", "GD": "GD", "GENERIC-XTS": "generic-xts", "GFDL-1.1-INVARIANTS-ONLY": "GFDL-1.1-invariants-only", "GFDL-1.1-INVARIANTS-OR-LATER": "GFDL-1.1-invariants-or-later", "GFDL-1.1-NO-INVARIANTS-ONLY": "GFDL-1.1-no-invariants-only", "GFDL-1.1-NO-INVARIANTS-OR-LATER": "GFDL-1.1-no-invariants-or-later", "GFDL-1.1-ONLY": "GFDL-1.1-only", "GFDL-1.1-OR-LATER": "GFDL-1.1-or-later", "GFDL-1.2-INVARIANTS-ONLY": "GFDL-1.2-invariants-only", "GFDL-1.2-INVARIANTS-OR-LATER": "GFDL-1.2-invariants-or-later", "GFDL-1.2-NO-INVARIANTS-ONLY": "GFDL-1.2-no-invariants-only", "GFDL-1.2-NO-INVARIANTS-OR-LATER": "GFDL-1.2-no-invariants-or-later", "GFDL-1.2-ONLY": "GFDL-1.2-only", "GFDL-1.2-OR-LATER": "GFDL-1.2-or-later", "GFDL-1.3-INVARIANTS-ONLY": "GFDL-1.3-invariants-only", "GFDL-1.3-INVARIANTS-OR-LATER": "GFDL-1.3-invariants-or-later", "GFDL-1.3-NO-INVARIANTS-ONLY": "GFDL-1.3-no-invariants-only", "GFDL-1.3-NO-INVARIANTS-OR-LATER": "GFDL-1.3-no-invariants-or-later", "GFDL-1.3-ONLY": "GFDL-1.3-only", "GFDL-1.3-OR-LATER": "GFDL-1.3-or-later", "GIFTWARE": "Giftware", "GL2PS": "GL2PS", "GLIDE": "Glide", "GLULXE": "Glulxe", "GLWTPL": "GLWTPL", "GNUPLOT": "gnuplot", "GPL-1.0-ONLY": "GPL-1.0-only", "GPL-1.0-OR-LATER": "GPL-1.0-or-later", "GPL-2.0-ONLY": "GPL-2.0-only", "GPL-2.0-OR-LATER": "GPL-2.0-or-later", "GPL-3.0-ONLY": "GPL-3.0-only", "GPL-3.0-OR-LATER": "GPL-3.0-or-later", "GRAPHICS-GEMS": "Graphics-Gems", "GSOAP-1.3B": "gSOAP-1.3b", "GTKBOOK": "gtkbook", "GUTMANN": "Gutmann", "HASKELLREPORT": "HaskellReport", "HDF5": "HDF5", "HDPARM": "hdparm", "HIDAPI": "HIDAPI", "HIPPOCRATIC-2.1": "Hippocratic-2.1", "HP-1986": "HP-1986", "HP-1989": "HP-1989", "HPND": "HPND", "HPND-DEC": "HPND-DEC", "HPND-DOC": "HPND-doc", "HPND-DOC-SELL": "HPND-doc-sell", "HPND-EXPORT-US": "HPND-export-US", "HPND-EXPORT-US-ACKNOWLEDGEMENT": "HPND-export-US-acknowledgement", "HPND-EXPORT-US-MODIFY": "HPND-export-US-modify", "HPND-EXPORT2-US": "HPND-export2-US", "HPND-FENNEBERG-LIVINGSTON": "HPND-Fenneberg-Livingston", "HPND-INRIA-IMAG": "HPND-INRIA-IMAG", "HPND-INTEL": "HPND-Intel", "HPND-KEVLIN-HENNEY": "HPND-Kevlin-Henney", "HPND-MARKUS-KUHN": "HPND-Markus-Kuhn", "HPND-MERCHANTABILITY-VARIANT": "HPND-merchantability-variant", "HPND-MIT-DISCLAIMER": "HPND-MIT-disclaimer", "HPND-NETREK": "HPND-Netrek", "HPND-PBMPLUS": "HPND-Pbmplus", "HPND-SELL-MIT-DISCLAIMER-XSERVER": "HPND-sell-MIT-disclaimer-xserver", "HPND-SELL-REGEXPR": "HPND-sell-regexpr", "HPND-SELL-VARIANT": "HPND-sell-variant", "HPND-SELL-VARIANT-CRITICAL-SYSTEMS": "HPND-sell-variant-critical-systems", "HPND-SELL-VARIANT-MIT-DISCLAIMER": "HPND-sell-variant-MIT-disclaimer", "HPND-SELL-VARIANT-MIT-DISCLAIMER-REV": "HPND-sell-variant-MIT-disclaimer-rev", "HPND-SMC": "HPND-SMC", "HPND-UC": "HPND-UC", "HPND-UC-EXPORT-US": "HPND-UC-export-US", "HTMLTIDY": "HTMLTIDY", "HYPHEN-BULGARIAN": "hyphen-bulgarian", "IBM-PIBS": "IBM-pibs", "ICU": "ICU", "IEC-CODE-COMPONENTS-EULA": "IEC-Code-Components-EULA", "IJG": "IJG", "IJG-SHORT": "IJG-short", "IMAGEMAGICK": "ImageMagick", "IMATIX": "iMatix", "IMLIB2": "Imlib2", "INFO-ZIP": "Info-ZIP", "INNER-NET-2.0": "Inner-Net-2.0", "INNOSETUP": "InnoSetup", "INTEL": "Intel", "INTEL-ACPI": "Intel-ACPI", "INTERBASE-1.0": "Interbase-1.0", "IPA": "IPA", "IPL-1.0": "IPL-1.0", "ISC": "ISC", "ISC-VEILLARD": "ISC-Veillard", "ISO-PERMISSION": "ISO-permission", "JAM": "Jam", "JASPER-2.0": "JasPer-2.0", "JOVE": "jove", "JPL-IMAGE": "JPL-image", "JPNIC": "JPNIC", "JSON": "JSON", "KASTRUP": "Kastrup", "KAZLIB": "Kazlib", "KNUTH-CTAN": "Knuth-CTAN", "LAL-1.2": "LAL-1.2", "LAL-1.3": "LAL-1.3", "LATEX2E": "Latex2e", "LATEX2E-TRANSLATED-NOTICE": "Latex2e-translated-notice", "LEPTONICA": "Leptonica", "LGPL-2.0-ONLY": "LGPL-2.0-only", "LGPL-2.0-OR-LATER": "LGPL-2.0-or-later", "LGPL-2.1-ONLY": "LGPL-2.1-only", "LGPL-2.1-OR-LATER": "LGPL-2.1-or-later", "LGPL-3.0-ONLY": "LGPL-3.0-only", "LGPL-3.0-OR-LATER": "LGPL-3.0-or-later", "LGPLLR": "LGPLLR", "LIBPNG": "Libpng", "LIBPNG-1.6.35": "libpng-1.6.35", "LIBPNG-2.0": "libpng-2.0", "LIBSELINUX-1.0": "libselinux-1.0", "LIBTIFF": "libtiff", "LIBUTIL-DAVID-NUGENT": "libutil-David-Nugent", "LILIQ-P-1.1": "LiLiQ-P-1.1", "LILIQ-R-1.1": "LiLiQ-R-1.1", "LILIQ-RPLUS-1.1": "LiLiQ-Rplus-1.1", "LINUX-MAN-PAGES-1-PARA": "Linux-man-pages-1-para", "LINUX-MAN-PAGES-COPYLEFT": "Linux-man-pages-copyleft", "LINUX-MAN-PAGES-COPYLEFT-2-PARA": "Linux-man-pages-copyleft-2-para", "LINUX-MAN-PAGES-COPYLEFT-VAR": "Linux-man-pages-copyleft-var", "LINUX-OPENIB": "Linux-OpenIB", "LOOP": "LOOP", "LPD-DOCUMENT": "LPD-document", "LPL-1.0": "LPL-1.0", "LPL-1.02": "LPL-1.02", "LPPL-1.0": "LPPL-1.0", "LPPL-1.1": "LPPL-1.1", "LPPL-1.2": "LPPL-1.2", "LPPL-1.3A": "LPPL-1.3a", "LPPL-1.3C": "LPPL-1.3c", "LSOF": "lsof", "LUCIDA-BITMAP-FONTS": "Lucida-Bitmap-Fonts", "LZMA-SDK-9.11-TO-9.20": "LZMA-SDK-9.11-to-9.20", "LZMA-SDK-9.22": "LZMA-SDK-9.22", "MACKERRAS-3-CLAUSE": "Mackerras-3-Clause", "MACKERRAS-3-CLAUSE-ACKNOWLEDGMENT": "Mackerras-3-Clause-acknowledgment", "MAGAZ": "magaz", "MAILPRIO": "mailprio", "MAKEINDEX": "MakeIndex", "MAN2HTML": "man2html", "MARTIN-BIRGMEIER": "Martin-Birgmeier", "MCPHEE-SLIDESHOW": "McPhee-slideshow", "METAMAIL": "metamail", "MINPACK": "Minpack", "MIPS": "MIPS", "MIROS": "MirOS", "MIT": "MIT", "MIT-0": "MIT-0", "MIT-ADVERTISING": "MIT-advertising", "MIT-CLICK": "MIT-Click", "MIT-CMU": "MIT-CMU", "MIT-ENNA": "MIT-enna", "MIT-FEH": "MIT-feh", "MIT-FESTIVAL": "MIT-Festival", "MIT-KHRONOS-OLD": "MIT-Khronos-old", "MIT-MODERN-VARIANT": "MIT-Modern-Variant", "MIT-OPEN-GROUP": "MIT-open-group", "MIT-STK": "MIT-STK", "MIT-TESTREGEX": "MIT-testregex", "MIT-WU": "MIT-Wu", "MITNFA": "MITNFA", "MMIXWARE": "MMIXware", "MMPL-1.0.1": "MMPL-1.0.1", "MOTOSOTO": "Motosoto", "MPEG-SSG": "MPEG-SSG", "MPI-PERMISSIVE": "mpi-permissive", "MPICH2": "mpich2", "MPL-1.0": "MPL-1.0", "MPL-1.1": "MPL-1.1", "MPL-2.0": "MPL-2.0", "MPL-2.0-NO-COPYLEFT-EXCEPTION": "MPL-2.0-no-copyleft-exception", "MPLUS": "mplus", "MS-LPL": "MS-LPL", "MS-PL": "MS-PL", "MS-RL": "MS-RL", "MTLL": "MTLL", "MULANPSL-1.0": "MulanPSL-1.0", "MULANPSL-2.0": "MulanPSL-2.0", "MULTICS": "Multics", "MUP": "Mup", "NAIST-2003": "NAIST-2003", "NASA-1.3": "NASA-1.3", "NAUMEN": "Naumen", "NBPL-1.0": "NBPL-1.0", "NCBI-PD": "NCBI-PD", "NCGL-UK-2.0": "NCGL-UK-2.0", "NCL": "NCL", "NCSA": "NCSA", "NETCDF": "NetCDF", "NEWSLETR": "Newsletr", "NGPL": "NGPL", "NGREP": "ngrep", "NICTA-1.0": "NICTA-1.0", "NIST-PD": "NIST-PD", "NIST-PD-FALLBACK": "NIST-PD-fallback", "NIST-PD-TNT": "NIST-PD-TNT", "NIST-SOFTWARE": "NIST-Software", "NLOD-1.0": "NLOD-1.0", "NLOD-2.0": "NLOD-2.0", "NLPL": "NLPL", "NOKIA": "Nokia", "NOSL": "NOSL", "NOWEB": "Noweb", "NPL-1.0": "NPL-1.0", "NPL-1.1": "NPL-1.1", "NPOSL-3.0": "NPOSL-3.0", "NRL": "NRL", "NTIA-PD": "NTIA-PD", "NTP": "NTP", "NTP-0": "NTP-0", "O-UDA-1.0": "O-UDA-1.0", "OAR": "OAR", "OCCT-PL": "OCCT-PL", "OCLC-2.0": "OCLC-2.0", "ODBL-1.0": "ODbL-1.0", "ODC-BY-1.0": "ODC-By-1.0", "OFFIS": "OFFIS", "OFL-1.0": "OFL-1.0", "OFL-1.0-NO-RFN": "OFL-1.0-no-RFN", "OFL-1.0-RFN": "OFL-1.0-RFN", "OFL-1.1": "OFL-1.1", "OFL-1.1-NO-RFN": "OFL-1.1-no-RFN", "OFL-1.1-RFN": "OFL-1.1-RFN", "OGC-1.0": "OGC-1.0", "OGDL-TAIWAN-1.0": "OGDL-Taiwan-1.0", "OGL-CANADA-2.0": "OGL-Canada-2.0", "OGL-UK-1.0": "OGL-UK-1.0", "OGL-UK-2.0": "OGL-UK-2.0", "OGL-UK-3.0": "OGL-UK-3.0", "OGTSL": "OGTSL", "OLDAP-1.1": "OLDAP-1.1", "OLDAP-1.2": "OLDAP-1.2", "OLDAP-1.3": "OLDAP-1.3", "OLDAP-1.4": "OLDAP-1.4", "OLDAP-2.0": "OLDAP-2.0", "OLDAP-2.0.1": "OLDAP-2.0.1", "OLDAP-2.1": "OLDAP-2.1", "OLDAP-2.2": "OLDAP-2.2", "OLDAP-2.2.1": "OLDAP-2.2.1", "OLDAP-2.2.2": "OLDAP-2.2.2", "OLDAP-2.3": "OLDAP-2.3", "OLDAP-2.4": "OLDAP-2.4", "OLDAP-2.5": "OLDAP-2.5", "OLDAP-2.6": "OLDAP-2.6", "OLDAP-2.7": "OLDAP-2.7", "OLDAP-2.8": "OLDAP-2.8", "OLFL-1.3": "OLFL-1.3", "OML": "OML", "OPENMDW-1.0": "OpenMDW-1.0", "OPENPBS-2.3": "OpenPBS-2.3", "OPENSSL": "OpenSSL", "OPENSSL-STANDALONE": "OpenSSL-standalone", "OPENVISION": "OpenVision", "OPL-1.0": "OPL-1.0", "OPL-UK-3.0": "OPL-UK-3.0", "OPUBL-1.0": "OPUBL-1.0", "OSC-1.0": "OSC-1.0", "OSET-PL-2.1": "OSET-PL-2.1", "OSL-1.0": "OSL-1.0", "OSL-1.1": "OSL-1.1", "OSL-2.0": "OSL-2.0", "OSL-2.1": "OSL-2.1", "OSL-3.0": "OSL-3.0", "OSSP": "OSSP", "PADL": "PADL", "PARATYPE-FREE-FONT-1.3": "ParaType-Free-Font-1.3", "PARITY-6.0.0": "Parity-6.0.0", "PARITY-7.0.0": "Parity-7.0.0", "PDDL-1.0": "PDDL-1.0", "PHP-3.0": "PHP-3.0", "PHP-3.01": "PHP-3.01", "PIXAR": "Pixar", "PKGCONF": "pkgconf", "PLEXUS": "Plexus", "PNMSTITCH": "pnmstitch", "POLYFORM-NONCOMMERCIAL-1.0.0": "PolyForm-Noncommercial-1.0.0", "POLYFORM-SMALL-BUSINESS-1.0.0": "PolyForm-Small-Business-1.0.0", "POSTGRESQL": "PostgreSQL", "PPL": "PPL", "PSF-2.0": "PSF-2.0", "PSFRAG": "psfrag", "PSUTILS": "psutils", "PYTHON-2.0": "Python-2.0", "PYTHON-2.0.1": "Python-2.0.1", "PYTHON-LDAP": "python-ldap", "QHULL": "Qhull", "QPL-1.0": "QPL-1.0", "QPL-1.0-INRIA-2004": "QPL-1.0-INRIA-2004", "RADVD": "radvd", "RDISC": "Rdisc", "RHECOS-1.1": "RHeCos-1.1", "RPL-1.1": "RPL-1.1", "RPL-1.5": "RPL-1.5", "RPSL-1.0": "RPSL-1.0", "RSA-MD": "RSA-MD", "RSCPL": "RSCPL", "RUBY": "Ruby", "RUBY-PTY": "Ruby-pty", "SAX-PD": "SAX-PD", "SAX-PD-2.0": "SAX-PD-2.0", "SAXPATH": "Saxpath", "SCEA": "SCEA", "SCHEMEREPORT": "SchemeReport", "SENDMAIL": "Sendmail", "SENDMAIL-8.23": "Sendmail-8.23", "SENDMAIL-OPEN-SOURCE-1.1": "Sendmail-Open-Source-1.1", "SGI-B-1.0": "SGI-B-1.0", "SGI-B-1.1": "SGI-B-1.1", "SGI-B-2.0": "SGI-B-2.0", "SGI-OPENGL": "SGI-OpenGL", "SGMLUG-PM": "SGMLUG-PM", "SGP4": "SGP4", "SHL-0.5": "SHL-0.5", "SHL-0.51": "SHL-0.51", "SIMPL-2.0": "SimPL-2.0", "SISSL": "SISSL", "SISSL-1.2": "SISSL-1.2", "SL": "SL", "SLEEPYCAT": "Sleepycat", "SMAIL-GPL": "SMAIL-GPL", "SMLNJ": "SMLNJ", "SMPPL": "SMPPL", "SNIA": "SNIA", "SNPRINTF": "snprintf", "SOFA": "SOFA", "SOFTSURFER": "softSurfer", "SOUNDEX": "Soundex", "SPENCER-86": "Spencer-86", "SPENCER-94": "Spencer-94", "SPENCER-99": "Spencer-99", "SPL-1.0": "SPL-1.0", "SSH-KEYSCAN": "ssh-keyscan", "SSH-OPENSSH": "SSH-OpenSSH", "SSH-SHORT": "SSH-short", "SSLEAY-STANDALONE": "SSLeay-standalone", "SSPL-1.0": "SSPL-1.0", "SUGARCRM-1.1.3": "SugarCRM-1.1.3", "SUL-1.0": "SUL-1.0", "SUN-PPP": "Sun-PPP", "SUN-PPP-2000": "Sun-PPP-2000", "SUNPRO": "SunPro", "SWL": "SWL", "SWRULE": "swrule", "SYMLINKS": "Symlinks", "TAPR-OHL-1.0": "TAPR-OHL-1.0", "TCL": "TCL", "TCP-WRAPPERS": "TCP-wrappers", "TEKHVC": "TekHVC", "TERMREADKEY": "TermReadKey", "TGPPL-1.0": "TGPPL-1.0", "THIRDEYE": "ThirdEye", "THREEPARTTABLE": "threeparttable", "TMATE": "TMate", "TORQUE-1.1": "TORQUE-1.1", "TOSL": "TOSL", "TPDL": "TPDL", "TPL-1.0": "TPL-1.0", "TRUSTEDQSL": "TrustedQSL", "TTWL": "TTWL", "TTYP0": "TTYP0", "TU-BERLIN-1.0": "TU-Berlin-1.0", "TU-BERLIN-2.0": "TU-Berlin-2.0", "UBUNTU-FONT-1.0": "Ubuntu-font-1.0", "UCAR": "UCAR", "UCL-1.0": "UCL-1.0", "ULEM": "ulem", "UMICH-MERIT": "UMich-Merit", "UNICODE-3.0": "Unicode-3.0", "UNICODE-DFS-2015": "Unicode-DFS-2015", "UNICODE-DFS-2016": "Unicode-DFS-2016", "UNICODE-TOU": "Unicode-TOU", "UNIXCRYPT": "UnixCrypt", "UNLICENSE": "Unlicense", "UNLICENSE-LIBTELNET": "Unlicense-libtelnet", "UNLICENSE-LIBWHIRLPOOL": "Unlicense-libwhirlpool", "UNRAR": "UnRAR", "UPL-1.0": "UPL-1.0", "URT-RLE": "URT-RLE", "VIM": "Vim", "VIXIE-CRON": "Vixie-Cron", "VOSTROM": "VOSTROM", "VSL-1.0": "VSL-1.0", "W3C": "W3C", "W3C-19980720": "W3C-19980720", "W3C-20150513": "W3C-20150513", "W3M": "w3m", "WATCOM-1.0": "Watcom-1.0", "WIDGET-WORKSHOP": "Widget-Workshop", "WORDNET": "WordNet", "WSUIPA": "Wsuipa", "WTFNMFPL": "WTFNMFPL", "WTFPL": "WTFPL", "WWL": "wwl", "X11": "X11", "X11-DISTRIBUTE-MODIFICATIONS-VARIANT": "X11-distribute-modifications-variant", "X11-NO-PERMIT-PERSONS": "X11-no-permit-persons", "X11-SWAPPED": "X11-swapped", "XDEBUG-1.03": "Xdebug-1.03", "XEROX": "Xerox", "XFIG": "Xfig", "XFREE86-1.1": "XFree86-1.1", "XINETD": "xinetd", "XKEYBOARD-CONFIG-ZINOVIEV": "xkeyboard-config-Zinoviev", "XLOCK": "xlock", "XNET": "Xnet", "XPP": "xpp", "XSKAT": "XSkat", "XZOOM": "xzoom", "YPL-1.0": "YPL-1.0", "YPL-1.1": "YPL-1.1", "ZED": "Zed", "ZEEFF": "Zeeff", "ZEND-2.0": "Zend-2.0", "ZIMBRA-1.3": "Zimbra-1.3", "ZIMBRA-1.4": "Zimbra-1.4", "ZLIB": "Zlib", "ZLIB-ACKNOWLEDGEMENT": "zlib-acknowledgement", "ZPL-1.1": "ZPL-1.1", "ZPL-2.0": "ZPL-2.0", "ZPL-2.1": "ZPL-2.1", } go-spdx-2.6.0/spdxexp/spdxlicenses/license_ranges.go000066400000000000000000000122061517223150200226060ustar00rootroot00000000000000package spdxlicenses // LicenseRanges returns a list of license ranges. // // Ranges are organized into groups (referred to as license groups) of the same base license (e.g. GPL). // Groups have sub-groups of license versions (referred to as the range) where each member is considered // to be the same version (e.g. {GPL-2.0, GPL-2.0-only}). The sub-groups are in ascending order within // the license group, such that the first sub-group is considered to be less than the second sub-group, // and so on. (e.g. {{GPL-1.0}, {GPL-2.0, GPL-2.0-only}} implies {GPL-1.0} < {GPL-2.0, GPL-2.0-only}). func LicenseRanges() [][][]string { return [][][]string{ { { "AFL-1.1", }, { "AFL-1.2", }, { "AFL-2.0", }, { "AFL-2.1", }, { "AFL-3.0", }, }, { { "AGPL-1.0", }, { "AGPL-3.0", "AGPL-3.0-only", }, }, { { "Apache-1.0", }, { "Apache-1.1", }, { "Apache-2.0", }, }, { { "APSL-1.0", }, { "APSL-1.1", }, { "APSL-1.2", }, { "APSL-2.0", }, }, { { "Artistic-1.0", }, { "Artistic-2.0", }, }, { { "ASWF-Digital-Assets-1.0", }, { "ASWF-Digital-Assets-1.1", }, }, { { "BitTorrent-1.0", }, { "BitTorrent-1.1", }, }, { { "Brian-Gladman-2-Clause", }, { "Brian-Gladman-3-Clause", }, }, { { "CC-BY-1.0", }, { "CC-BY-2.0", }, { "CC-BY-2.5", }, { "CC-BY-3.0", }, { "CC-BY-4.0", }, }, { { "CC-BY-NC-1.0", }, { "CC-BY-NC-2.0", }, { "CC-BY-NC-2.5", }, { "CC-BY-NC-3.0", }, { "CC-BY-NC-4.0", }, }, { { "CC-BY-NC-ND-1.0", }, { "CC-BY-NC-ND-2.0", }, { "CC-BY-NC-ND-2.5", }, { "CC-BY-NC-ND-3.0", }, { "CC-BY-NC-ND-4.0", }, }, { { "CC-BY-NC-SA-1.0", }, { "CC-BY-NC-SA-2.0", }, { "CC-BY-NC-SA-2.5", }, { "CC-BY-NC-SA-3.0", }, { "CC-BY-NC-SA-4.0", }, }, { { "CC-BY-ND-1.0", }, { "CC-BY-ND-2.0", }, { "CC-BY-ND-2.5", }, { "CC-BY-ND-3.0", }, { "CC-BY-ND-4.0", }, }, { { "CC-BY-SA-1.0", }, { "CC-BY-SA-2.0", }, { "CC-BY-SA-2.5", }, { "CC-BY-SA-3.0", }, { "CC-BY-SA-4.0", }, }, { { "CDDL-1.0", }, { "CDDL-1.1", }, }, { { "CECILL-1.0", }, { "CECILL-1.1", }, { "CECILL-2.0", }, }, { { "DRL-1.0", }, { "DRL-1.1", }, }, { { "ECL-1.0", }, { "ECL-2.0", }, }, { { "EFL-1.0", }, { "EFL-2.0", }, }, { { "EPL-1.0", }, { "EPL-2.0", }, }, { { "EUPL-1.0", }, { "EUPL-1.1", }, }, { { "GFDL-1.1", "GFDL-1.1-only", }, { "GFDL-1.2", "GFDL-1.2-only", }, { "GFDL-1.1-or-later", "GFDL-1.2-or-later", "GFDL-1.3", "GFDL-1.3-only", "GFDL-1.3-or-later", }, }, { { "GPL-1.0", "GPL-1.0-only", }, { "GPL-2.0", "GPL-2.0-only", }, { "GPL-1.0-or-later", "GPL-2.0-or-later", "GPL-3.0", "GPL-3.0-only", "GPL-3.0-or-later", }, }, { { "HP-1986", }, { "HP-1989", }, }, { { "LGPL-2.0", "LGPL-2.0-only", }, { "LGPL-2.1", "LGPL-2.1-only", }, { "LGPL-2.0-or-later", "LGPL-2.1-or-later", "LGPL-3.0", "LGPL-3.0-only", "LGPL-3.0-or-later", }, }, { { "LPL-1.0", }, { "LPL-1.02", }, }, { { "LPPL-1.0", }, { "LPPL-1.1", }, { "LPPL-1.2", }, { "LPPL-1.3a", }, { "LPPL-1.3c", }, }, { { "MPL-1.0", }, { "MPL-1.1", }, { "MPL-2.0", }, }, { { "MPL-1.0", }, { "MPL-1.1", }, { "MPL-2.0-no-copyleft-exception", }, }, { { "NPL-1.0", }, { "NPL-1.1", }, }, { { "OFL-1.0", }, { "OFL-1.1", }, }, { { "OLDAP-1.1", }, { "OLDAP-1.2", }, { "OLDAP-1.3", }, { "OLDAP-1.4", }, { "OLDAP-2.0", }, { "OLDAP-2.0.1", }, { "OLDAP-2.1", }, { "OLDAP-2.2", }, { "OLDAP-2.2.1", }, { "OLDAP-2.2.2", }, { "OLDAP-2.3", }, { "OLDAP-2.4", }, { "OLDAP-2.5", }, { "OLDAP-2.6", }, { "OLDAP-2.7", }, { "OLDAP-2.8", }, }, { { "OSL-1.0", }, { "OSL-1.1", }, { "OSL-2.0", }, { "OSL-2.1", }, { "OSL-3.0", }, }, { { "PHP-3.0", }, { "PHP-3.01", }, }, { { "RPL-1.1", }, { "RPL-1.5", }, }, { { "SGI-B-1.0", }, { "SGI-B-1.1", }, { "SGI-B-2.0", }, }, { { "YPL-1.0", }, { "YPL-1.1", }, }, { { "ZPL-1.1", }, { "ZPL-2.0", }, { "ZPL-2.1", }, }, { { "Zimbra-1.3", }, { "Zimbra-1.4", }, }, { { "bzip2-1.0.5", }, { "bzip2-1.0.6", }, }, } } go-spdx-2.6.0/spdxexp/test_helper.go000066400000000000000000000014471517223150200174440ustar00rootroot00000000000000package spdxexp // getLicenseNode is a test helper method that is expected to create a valid // license node. Use this function when the test data is known to be a valid // license that would parse successfully. func getLicenseNode(license string, hasPlus bool) *node { return &node{ role: licenseNode, exp: nil, lic: &licenseNodePartial{ license: license, hasPlus: hasPlus, hasException: false, exception: "", }, ref: nil, } } // getParsedNode is a test helper method that is expected to create a valid node // and swallow errors. This allows test structures to use parsed node data. // Use this function when the test data is expected to parse successfully. func getParsedNode(expression string) *node { // swallows errors n, _ := parse(expression) return n }