summaryrefslogtreecommitdiff
path: root/lib/rubygems/util/licenses.rb
blob: f3c720163914e7647765911481e676aa9d919f90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
# frozen_string_literal: true

# This is generated by generate_spdx_license_list.rb, any edits to this
# file will be discarded.

require_relative "../text"

class Gem::Licenses
  extend Gem::Text

  NONSTANDARD = "Nonstandard"
  LICENSE_REF = "LicenseRef-.+"

  # Software Package Data Exchange (SPDX) standard open-source software
  # license identifiers
  LICENSE_IDENTIFIERS = %w[
    0BSD
    AAL
    ADSL
    AFL-1.1
    AFL-1.2
    AFL-2.0
    AFL-2.1
    AFL-3.0
    AGPL-1.0-only
    AGPL-1.0-or-later
    AGPL-3.0-only
    AGPL-3.0-or-later
    AMDPLPA
    AML
    AML-glslang
    AMPAS
    ANTLR-PD
    ANTLR-PD-fallback
    APAFML
    APL-1.0
    APSL-1.0
    APSL-1.1
    APSL-1.2
    APSL-2.0
    ASWF-Digital-Assets-1.0
    ASWF-Digital-Assets-1.1
    Abstyles
    AdaCore-doc
    Adobe-2006
    Adobe-Display-PostScript
    Adobe-Glyph
    Adobe-Utopia
    Afmparse
    Aladdin
    Apache-1.0
    Apache-1.1
    Apache-2.0
    App-s2p
    Arphic-1999
    Artistic-1.0
    Artistic-1.0-Perl
    Artistic-1.0-cl8
    Artistic-2.0
    BSD-1-Clause
    BSD-2-Clause
    BSD-2-Clause-Darwin
    BSD-2-Clause-Patent
    BSD-2-Clause-Views
    BSD-3-Clause
    BSD-3-Clause-Attribution
    BSD-3-Clause-Clear
    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-acpica
    BSD-3-Clause-flex
    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-Protection
    BSD-Source-Code
    BSD-Source-beginning-file
    BSD-Systemics
    BSD-Systemics-W3Works
    BSL-1.0
    BUSL-1.1
    Baekmuk
    Bahyph
    Barr
    Beerware
    BitTorrent-1.0
    BitTorrent-1.1
    Bitstream-Charter
    Bitstream-Vera
    BlueOak-1.0.0
    Boehm-GC
    Borceux
    Brian-Gladman-2-Clause
    Brian-Gladman-3-Clause
    C-UDA-1.0
    CAL-1.0
    CAL-1.0-Combined-Work-Exception
    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
    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
    CMU-Mach
    CMU-Mach-nodoc
    CNRI-Jython
    CNRI-Python
    CNRI-Python-GPL-Compatible
    COIL-1.0
    CPAL-1.0
    CPL-1.0
    CPOL-1.02
    CUA-OPL-1.0
    Caldera
    Caldera-no-preamble
    ClArtistic
    Clips
    Community-Spec-1.0
    Condor-1.1
    Cornell-Lossless-JPEG
    Cronyx
    Crossword
    CrystalStacker
    Cube
    D-FSL-1.0
    DEC-3-Clause
    DL-DE-BY-2.0
    DL-DE-ZERO-2.0
    DOC
    DRL-1.0
    DRL-1.1
    DSDP
    Dotseqn
    ECL-1.0
    ECL-2.0
    EFL-1.0
    EFL-2.0
    EPICS
    EPL-1.0
    EPL-2.0
    EUDatagrid
    EUPL-1.0
    EUPL-1.1
    EUPL-1.2
    Elastic-2.0
    Entessa
    ErlPL-1.1
    Eurosym
    FBM
    FDK-AAC
    FSFAP
    FSFAP-no-warranty-disclaimer
    FSFUL
    FSFULLR
    FSFULLRWD
    FTL
    Fair
    Ferguson-Twofish
    Frameworx-1.0
    FreeBSD-DOC
    FreeImage
    Furuseth
    GCR-docs
    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
    GL2PS
    GLWTPL
    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
    Giftware
    Glide
    Glulxe
    Graphics-Gems
    HP-1986
    HP-1989
    HPND
    HPND-DEC
    HPND-Fenneberg-Livingston
    HPND-INRIA-IMAG
    HPND-Kevlin-Henney
    HPND-MIT-disclaimer
    HPND-Markus-Kuhn
    HPND-Pbmplus
    HPND-UC
    HPND-doc
    HPND-doc-sell
    HPND-export-US
    HPND-export-US-modify
    HPND-sell-MIT-disclaimer-xserver
    HPND-sell-regexpr
    HPND-sell-variant
    HPND-sell-variant-MIT-disclaimer
    HTMLTIDY
    HaskellReport
    Hippocratic-2.1
    IBM-pibs
    ICU
    IEC-Code-Components-EULA
    IJG
    IJG-short
    IPA
    IPL-1.0
    ISC
    ISC-Veillard
    ImageMagick
    Imlib2
    Info-ZIP
    Inner-Net-2.0
    Intel
    Intel-ACPI
    Interbase-1.0
    JPL-image
    JPNIC
    JSON
    Jam
    JasPer-2.0
    Kastrup
    Kazlib
    Knuth-CTAN
    LAL-1.2
    LAL-1.3
    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
    LOOP
    LPD-document
    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
    Latex2e
    Latex2e-translated-notice
    Leptonica
    LiLiQ-P-1.1
    LiLiQ-R-1.1
    LiLiQ-Rplus-1.1
    Libpng
    Linux-OpenIB
    Linux-man-pages-1-para
    Linux-man-pages-copyleft
    Linux-man-pages-copyleft-2-para
    Linux-man-pages-copyleft-var
    Lucida-Bitmap-Fonts
    MIT
    MIT-0
    MIT-CMU
    MIT-Festival
    MIT-Modern-Variant
    MIT-Wu
    MIT-advertising
    MIT-enna
    MIT-feh
    MIT-open-group
    MIT-testregex
    MITNFA
    MMIXware
    MPEG-SSG
    MPL-1.0
    MPL-1.1
    MPL-2.0
    MPL-2.0-no-copyleft-exception
    MS-LPL
    MS-PL
    MS-RL
    MTLL
    Mackerras-3-Clause
    Mackerras-3-Clause-acknowledgment
    MakeIndex
    Martin-Birgmeier
    McPhee-slideshow
    Minpack
    MirOS
    Motosoto
    MulanPSL-1.0
    MulanPSL-2.0
    Multics
    Mup
    NAIST-2003
    NASA-1.3
    NBPL-1.0
    NCGL-UK-2.0
    NCSA
    NGPL
    NICTA-1.0
    NIST-PD
    NIST-PD-fallback
    NIST-Software
    NLOD-1.0
    NLOD-2.0
    NLPL
    NOSL
    NPL-1.0
    NPL-1.1
    NPOSL-3.0
    NRL
    NTP
    NTP-0
    Naumen
    Net-SNMP
    NetCDF
    Newsletr
    Nokia
    Noweb
    O-UDA-1.0
    OCCT-PL
    OCLC-2.0
    ODC-By-1.0
    ODbL-1.0
    OFFIS
    OFL-1.0
    OFL-1.0-RFN
    OFL-1.0-no-RFN
    OFL-1.1
    OFL-1.1-RFN
    OFL-1.1-no-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
    OPL-1.0
    OPL-UK-3.0
    OPUBL-1.0
    OSET-PL-2.1
    OSL-1.0
    OSL-1.1
    OSL-2.0
    OSL-2.1
    OSL-3.0
    OpenPBS-2.3
    OpenSSL
    OpenSSL-standalone
    OpenVision
    PADL
    PDDL-1.0
    PHP-3.0
    PHP-3.01
    PSF-2.0
    Parity-6.0.0
    Parity-7.0.0
    Pixar
    Plexus
    PolyForm-Noncommercial-1.0.0
    PolyForm-Small-Business-1.0.0
    PostgreSQL
    Python-2.0
    Python-2.0.1
    QPL-1.0
    QPL-1.0-INRIA-2004
    Qhull
    RHeCos-1.1
    RPL-1.1
    RPL-1.5
    RPSL-1.0
    RSA-MD
    RSCPL
    Rdisc
    Ruby
    SAX-PD
    SAX-PD-2.0
    SCEA
    SGI-B-1.0
    SGI-B-1.1
    SGI-B-2.0
    SGI-OpenGL
    SGP4
    SHL-0.5
    SHL-0.51
    SISSL
    SISSL-1.2
    SL
    SMLNJ
    SMPPL
    SNIA
    SPL-1.0
    SSH-OpenSSH
    SSH-short
    SSLeay-standalone
    SSPL-1.0
    SWL
    Saxpath
    SchemeReport
    Sendmail
    Sendmail-8.23
    SimPL-2.0
    Sleepycat
    Soundex
    Spencer-86
    Spencer-94
    Spencer-99
    SugarCRM-1.1.3
    Sun-PPP
    SunPro
    Symlinks
    TAPR-OHL-1.0
    TCL
    TCP-wrappers
    TGPPL-1.0
    TMate
    TORQUE-1.1
    TOSL
    TPDL
    TPL-1.0
    TTWL
    TTYP0
    TU-Berlin-1.0
    TU-Berlin-2.0
    TermReadKey
    UCAR
    UCL-1.0
    UMich-Merit
    UPL-1.0
    URT-RLE
    Unicode-3.0
    Unicode-DFS-2015
    Unicode-DFS-2016
    Unicode-TOU
    UnixCrypt
    Unlicense
    VOSTROM
    VSL-1.0
    Vim
    W3C
    W3C-19980720
    W3C-20150513
    WTFPL
    Watcom-1.0
    Widget-Workshop
    Wsuipa
    X11
    X11-distribute-modifications-variant
    XFree86-1.1
    XSkat
    Xdebug-1.03
    Xerox
    Xfig
    Xnet
    YPL-1.0
    YPL-1.1
    ZPL-1.1
    ZPL-2.0
    ZPL-2.1
    Zed
    Zeeff
    Zend-2.0
    Zimbra-1.3
    Zimbra-1.4
    Zlib
    bcrypt-Solar-Designer
    blessing
    bzip2-1.0.6
    check-cvs
    checkmk
    copyleft-next-0.3.0
    copyleft-next-0.3.1
    curl
    diffmark
    dtoa
    dvipdfm
    eGenix
    etalab-2.0
    fwlw
    gSOAP-1.3b
    gnuplot
    gtkbook
    hdparm
    iMatix
    libpng-2.0
    libselinux-1.0
    libtiff
    libutil-David-Nugent
    lsof
    magaz
    mailprio
    metamail
    mpi-permissive
    mpich2
    mplus
    pnmstitch
    psfrag
    psutils
    python-ldap
    radvd
    snprintf
    softSurfer
    ssh-keyscan
    swrule
    ulem
    w3m
    xinetd
    xkeyboard-config-Zinoviev
    xlock
    xpp
    zlib-acknowledgement
  ].freeze

  DEPRECATED_LICENSE_IDENTIFIERS = %w[
    AGPL-1.0
    AGPL-3.0
    BSD-2-Clause-FreeBSD
    BSD-2-Clause-NetBSD
    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-GCC-exception
    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-3.0
    GPL-3.0+
    GPL-3.0-with-GCC-exception
    GPL-3.0-with-autoconf-exception
    LGPL-2.0
    LGPL-2.0+
    LGPL-2.1
    LGPL-2.1+
    LGPL-3.0
    LGPL-3.0+
    Nunit
    StandardML-NJ
    bzip2-1.0.5
    eCos-2.0
    wxWindows
  ].freeze

  # exception identifiers
  EXCEPTION_IDENTIFIERS = %w[
    389-exception
    Asterisk-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
    CLISP-exception-2.0
    Classpath-exception-2.0
    DigiRule-FOSS-exception
    FLTK-exception
    Fawkes-Runtime-exception
    Font-exception-2.0
    GCC-exception-2.0
    GCC-exception-2.0-note
    GCC-exception-3.1
    GNAT-exception
    GNOME-examples-exception
    GNU-compiler-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
    Gmsh-exception
    KiCad-libraries-exception
    LGPL-3.0-linking-exception
    LLGPL
    LLVM-exception
    LZMA-exception
    Libtool-exception
    Linux-syscall-note
    OCCT-exception-1.0
    OCaml-LGPL-linking-exception
    OpenJDK-assembly-exception-1.0
    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
    SANE-exception
    SHL-2.0
    SHL-2.1
    SWI-exception
    Swift-exception
    Texinfo-exception
    UBDL-exception
    Universal-FOSS-exception-1.0
    WxWindows-exception-3.1
    cryptsetup-OpenSSL-exception
    eCos-exception-2.0
    fmt-exception
    freertos-exception-2.0
    gnu-javamail-exception
    i2p-gpl-java-exception
    libpri-OpenH323-exception
    mif-exception
    openvpn-openssl-exception
    stunnel-exception
    u-boot-exception-2.0
    vsftpd-openssl-exception
    x11vnc-openssl-exception
  ].freeze

  DEPRECATED_EXCEPTION_IDENTIFIERS = %w[
    Nokia-Qt-exception-1.1
  ].freeze

  VALID_REGEXP = /
    \A
    (?:
      #{Regexp.union(LICENSE_IDENTIFIERS)}
      \+?
      (?:\s WITH \s #{Regexp.union(EXCEPTION_IDENTIFIERS)})?
      | #{NONSTANDARD}
      | #{LICENSE_REF}
    )
    \Z
  /ox

  DEPRECATED_LICENSE_REGEXP = /
    \A
    #{Regexp.union(DEPRECATED_LICENSE_IDENTIFIERS)}
    \+?
    (?:\s WITH \s .+?)?
    \Z
  /ox

  DEPRECATED_EXCEPTION_REGEXP = /
    \A
    .+?
    \+?
    (?:\s WITH \s #{Regexp.union(DEPRECATED_EXCEPTION_IDENTIFIERS)})
    \Z
  /ox

  def self.match?(license)
    VALID_REGEXP.match?(license)
  end

  def self.deprecated_license_id?(license)
    DEPRECATED_LICENSE_REGEXP.match?(license)
  end

  def self.deprecated_exception_id?(license)
    DEPRECATED_EXCEPTION_REGEXP.match?(license)
  end

  def self.suggestions(license)
    by_distance = LICENSE_IDENTIFIERS.group_by do |identifier|
      levenshtein_distance(identifier, license)
    end
    lowest = by_distance.keys.min
    return unless lowest < license.size
    by_distance[lowest]
  end
end