alvarotrigo / fullPage.js

fullPage plugin by Alvaro Trigo. Create full screen pages fast and simple
http://alvarotrigo.com/fullPage/
GNU General Public License v3.0
35.24k stars 7.31k forks source link

GPLv3 license inconsistencies and violations #3978

Open pieterhijma opened 4 years ago

pieterhijma commented 4 years ago

Dear copyright holders,

I believe there are issues with the way fullPages.js is licensed. I specifically address all copyright holders since this project has taken contributions from others, which means that Alvaro Trigo is not the only copyright holder any longer, unless all contributors have waived their copyright with a form or so, something that could still happen by the way.

Please do not regard this as criticism on the choices made or an attack on the business model, I merely want to point out that I believe the licensing terms violate GPLv3 whereas GPLv3 itself is an option to the licensing. By the way, great library! I would like to use it, non-commercially, but also not open source in the way fullPage.js suggests. However, I came across several licensing restrictions and violations that I cannot resolve.

I will first go over smaller issues that I recognize and will increasingly discuss more severe issues leading up to violations of GPLv3, sometimes exemplified with use cases. I'm not sure how to resolve it, but I do make some suggestions.

Missing headers in the files

The files do not contain the notices that are suggested for use of GPLv3. Instead there is a header with a restriction that in my opinion violates GPLv3. This is not apparent now but I will make my point clear below.

Dubious terminology

The website https://alvarotrigo.com/fullPage/pricing/ uses dubious terminology when GPLv3 is concerned: I interpret the sentence 'Free for Open Source' as 'Gratis for Free [software]' where the latter means software that respects users' freedom. Whether software is open source is not the point of GPLv3, the point is whether the software is 'free' and respects the users' freedoms, see https://www.gnu.org/licenses/quick-guide-gplv3. In addition, price is also not the point: free software may be gratis or not.

Distinction commercial / open source

The licensing plan suggests multiple, orthogonal options: that you can either use it for commercial or non-commercial projects or that you can use it for open-source or non-open-source projects (fullPage.js terminology). This suggests that commercial projects can never be open source projects.

Conditional choice

If you want to use fullPage.js you have to make a choice for open sourcing your project (website or application) or to keep you project proprietary, depending on whether your website is commercial or not. First of all, this assumes that GPLv3 also covers websites or applications, which is dubious, see the next point. Second, this does not allow something that GPLv3 allows, namely using the software in an internal project that is never released to the public. Since the licensing scheme does not allow this, you could consider it a violation of freedom 0: the freedom to use the software for any purpose https://www.gnu.org/philosophy/free-sw.html. This is also valid for the previous point, the licensing scheme seems to suggest that you cannot use fullPage.js licensed under GPLv3 if you use the project commercially.

Does extend fullPage.js GPLv3 to the rest of a website?

The viewpoint of fullPage.js is that it does. The licensing scheme of the project tries to enforce with GPLv3 that if you use fullPage.js on website A then website A should have the GPLv3 license too, covering the content of the whole website, so CSS, HTML, and JavaScript. This is highly dubious. I could perhaps agree on the JavaScript of the website, however, it is completely conceivable that JavaScript libraries exist that operate completely independently of fullPage.js.

From my point of view, a JavaScript library such as fullPage.js takes as input HTML and CSS specified in HTML and CSS files and transforms that as data to different HTML and CSS, similar to how a compiler such as GCC takes as input a (possibly proprietary) program and transforms it to output. This would mean that GPLv3 does not cover the HTML and CSS.

As a use-case, the FSF releases its content under license CC BY-ND because they express opinions. This license prohibits to make a derivative of the opinions and redistribute them attributing the modified opinions to the original copyright holder (that would make no sense). However, suppose they would want to use the GPLv3 licensed fullPage.js library for this, they would need to release their opinion under GPLv3? That would make no sense. This means that fullPage.js cannot be used for their purpose, restricting them to use the software for any purpose, violating freedom 0 (https://www.gnu.org/philosophy/free-sw.html). Hence, either fullPage.js is not GPLv3, or the terms of fullPage.js are incorrect.

For web applications, fully written in JavaScript based on fullPage.js I agree that the web application should be released under GPLv3 as well.

More freedom 0 violations

The software requires each user to have a license key (see line 95 and line 3419). This is also true for users that want to choose GPLv3. However, to obtain such a key, users must fill in a form, requiring users to tell one of the copyright holders

  1. the license of the project,
  2. the public repository,
  3. what the project is about, and
  4. an email address.

In addition, it seems to have the requirement that you be open about how the repository is promoted, assuming that a license can be denied if you are not actively promoting the website.

All this violates freedom 0 of GPLv3: "The freedom to run the program means the freedom for any kind of person or organization to use it on any kind of computer system, for any kind of overall job and purpose, without being required to communicate about it with the developer or any other specific entity."

Hence, either fullPage.js is not GPLv3 or the terms of fullPage.js are incorrect.

As a use-case, since fullPage.js is GPLv3 licensed, I could make a derivative removing the restrictions above and re-release it under GPLv3. Please note that GPLv3 explicitly states that it is allowed to remove additional restrictions, see section 7 of the license.

Freedom 2 and 3 violations

By requiring licensing keys, freedom 2 and 3 are restricted. It seems to suggest that only one copyright holder has the power to distribute the software and charge for it. However, GPLv3 states that anyone should be able to redistribute the software.

Suggestions

Please, again, do not consider this as criticism and I am sympathetic to the goal that is pursued: charging for the library if the software is used commercially. However, in my opinion, the GPLv3 license is misused for this purpose and I would advise to find a different means to achieving this goal.

It seems to be the case that the goal is to enforce websites to be public and open source if there is no charge for fullPage.js. The assumption is that a commercial website would never want to be in this situation, so they will choose a commercial license. So, if this is true, the copyleft clause is used as an economic tool rather than a tool that helps respecting freedom. On the other hand, being an open source project, it accepts modifications and improvements from a community.

I do not believe this holds up. As stated earlier, in my opinion, users, also large commercial organizations could just use fullPage.js in their websites based on the GPLv3 license. They could simply remove the further restrictions. However, if users build upon fullPage.js with extensions, other JavaScript libraries that are dependent on fullPage.js, then these extensions should also be released under GPLv3. I do not believe the copyleft clause of GPLv3 extends to the rest of a website given the use of fullPage.js under GPLv3.

Given this situation, I'm not sure how to proceed in a correct way but let me suggest two options with their benefits and drawbacks:

Remove restrictions and apply dual licensing

This would be the easiest option and closest to the original intention. Release the software under GPLv3 without any violation of it and release it under a commercial (better, non-free) license where users are allowed to choose the license themselves. This requires no permission from all copyright holders, because you could assume that all copyright holders agreed on the licensing anyway, probably unaware of the inconsistencies and violations it contained. Large organizations will probably choose the non-free license anyway since you could argue that the GPLv3 does extend to the website's CSS and HTML. (I argue against it but large organizations will probably not take the risk given the current pricing.)

Remove GPLv3 and apply a custom license

Since the above arguments show that GPLv3 is violated, perhaps it would be best to remove GPLv3 altogether and apply a custom license. In some way this has already been attempted by adding additional restrictions that violate GPLv3. However, this would require permission from all copyright holders which may be difficult to acquire. It may be the case that all contributors already waived the copyright and it solely belongs to Alvaro Trigo, then this would be easy to do. However, it is may be possible that fullPage.js is then forked based on the GPLv3 license removing the current restrictions.

Let me finish by reiterating that there is no judgement from my side, I think I understand the reasons and the goal, but I do believe that GPLv3 is misused for the goal.

alvarotrigo commented 4 years ago

That was a big post! 😮😮😮

Thanks for the info @pieterhijma ! 👍

I'm definitely no expert on licenses and I took this approach based on other popular commercial JS componentes such as Isotope and Flickity from Desandro. I contacted him back in the day and he suggested me to use his same approach.

It's a complex issue, and usually a big percentage developers doesn't even care about the license. In fact, there are probably thousands of pages using fullpage.js (and other libraries) in non GPLv3 projects. That's one of the reasons that led me to implement a way to try to enforce the correct use of fullPage.js. Perhaps not the best attempt? :)

I've been following other JS libraries out there such as the Handsontable and read about their license change and justifications of it, and maybe I should make the same move.

Other well known libraries like HighChart.js seem to be using the same "non-commercial" custom license approach.

I guess this way more people will be forced to pay for a license and products currently using GPLv3 license for commercial products won't be able to do it anymore, but perhaps this is the right way. It will definitely simplify things for people who doesn't know much about licensing. Everybody kind of understands what is a commercial and a non-commercial product and questions about license compatibilities will banish once and for all.

I appreciate your great explanation! 👍 I will probably change the licensing terms for the next release! I assume I can redact the license as i want to or is there any specific way of doing so?

I was thinking of taking Handsontable's license as a base for mine, as we will operate exactly the same way except for the license key request part. Which I will still maintain as a way to enforce the correct use of it.

pieterhijma commented 4 years ago

Thanks, you're welcome. I'm no expert either but I understand that GPLv3 tries to protect the freedom of the users. It does not protect developers for a way to charge users or to enforce anything upon them. In fact, applying GPLv3 is usually communicating the intention of the developer that the software respects the users' freedom. Indeed, a complex topic, so unfortunately, again, a long answer...

Isotope and Flickity take the same approach with a slight difference: these projects do not have a conditional choice for the license to pick and do not violate freedom 0 in the sense that a user has to contact the developers. The choice is unconditional, the user may choose. This is considered parallel licensing.

However, these two projects also make a distinction between commercial and open source, something that is orthogonal in my opinion (otherwise it violates freedom 0). Any commercial company could also just use these two projects on the terms of GPLv3 and in my opinion GPLv3 would not apply to the web page, but again, given reasonable pricing that is lower than the price of a lawyer, I don't think any company would bother to take the risk and just buy the commercial license.

In addition, since Flickity and Isotope are GPLv3, in principle, anyone could just start distributing it as well and charge for it, based on freedom 2 and 3.

In summary, these projects have the same approach, but a bit better implementation: unconditional choice of license, a suggestion that the whole webpage needs to be GPLv3 if you use them (which in my opinion doesn't hold), and the assumption (and perhaps hope) that no one else will start distributing the software.

I've read the motivation of Handsontable and I completely understand the reasoning, although I would have preferred it to remain open source. However, the situation of Handsontable is a bit different from fullPage.js. Before the license change, Handsontable had a permissive license. Since a permissive license is, well permissive, it is always unclear what license a contribution has. They installed the file Contributing.md which contains a form that most likely requests a contributor to waive the copyright and to agree that the contribution has the same license. For GPLv3 projects this is usually not necessary since the copyleft clause already enforces the contribution to have the same license. This is a large benefit of copyleft licenses. So, usually there is no need to have contributors waiving copyright. However, it is still the case that each contribution has its own copyright by the contributor. For example, the FSF also requests copyright transfers.

So, Handsontable most likely enforced all contributors to transfer copyright to them and in this situation, they were able to change the license. I don't know whether you did the same and you have all the copyright of all contributions, but if not, you would require permission from all contributors to change the license to something similar to Handsontable. I've also come across requests to waive my rights as a contributor for permissive projects.

The other option is to remove all contributions from external contributors such that you have full copyright and then you can just change the license. Usually, applying the GPLv3 license is an intent of the developer to the users to let the program always be 'free' and respect the freedom of the users, where users are also contributors. So, contributors may have contributed in the knowledge that the program was licensed under GPLv3 which would ensure that their contributions would always remain valid. As I said before, changing the license may result in a fork of your project with the GPLv3 license.

HighChart.js has a CC-BY-NC license. This might work for fullPage.js as well but I'm not familiar with CC licenses for software. However, again, to change the license would require permission from all copyright holders.

Given the information you provided these are the options in my opinion, but again, I'm also no expert.

alvarotrigo commented 4 years ago

Regarding the enforcement of GPLv3, the FAQs says:

Who has the power to enforce the GPL? (#WhoHasThePower) Since the GPL is a copyright license, the copyright holders of the software are the ones who have the power to enforce the GPL. If you see a violation of the GPL, you should inform the developers of the GPL-covered software involved. They either are the copyright holders, or are connected with the copyright holders. Learn more about reporting GPL violations.

Wouldn't that justify me trying to enforce it by asking for info?

In any case, this licensing thing seems a bit confusing to me. Since GPLv3 version was adopted in fullPage.js it had 14 contributors to the code (not counting documentation ones). However, those contributions were usually very small. One word, adding a semicolon, adding an if condition etc.

How can someone remove those contributions and then do it in any different way that won't be exactly the same as the one provided by the contributor?

I mean, instead of return true we can do return 1 == 1 or return 'a' == 'a', but is there really any need to do this just to avoid this GPLv3 restriction? I can literally rewrite those 14 small contributions, but it sounds a bit weird to me that such a small changes can even be considered as licensed by other person? Or that I can just rewrite them in a less elegant way just to get away with removing their GPLv3 license.

Can something like return true be considered GPLv3 licensed by someone? Where's the limit?

What if the user removes a line? How can I "undo their contribution"? By adding the line again, releasing a new version with it, then deleting it again, and releasing a new version?

Something that I haven't mention yet but that might make things more interesting yet is that fullpage.js comes with an extensions file that is not licensed under GPLv3.

In fact, the non minified version of the file was never made public. It has no contributors and a custom license.

This file was released at exactly the same time fullPage.js become GPLv3, so it clearly was not a product of the GPLv3 version. And it's content is almost exactly the same as the code in fullPage.js but with a few extra blocks of code.

I guess I could also say the next version of fullPage.js with a new non GPLv3 license is derived from this file instead of from the GPLv3 version of fullpage.js. All I would need to do is remove a few lines here and there.

I guess that would make things easier :)

pieterhijma commented 4 years ago

Indeed, the copyright holders have the power to enforce GPL. However, you have to understand what GPL actually tries to achieve. Since a computer is a universal machine that can execute arbitrary programs, developers of software have power over the users of their software. For example, I remember a presentation shown with a Windows laptop and every so many minutes, Windows would ask to reboot to install updates. The presenter, the user, was unable to prevent Windows to reboot during the presentation and had to switch laptops because the updates took forever. This is a perhaps innocent example of where developers of the software were in control over the computer owned by the user, but of course, less innocent examples also exist. The GPL aims to rebalance this relation between users and developers and defines several freedoms to which I referred. I advise you to watch this TED talk to understand the goals of GPL.

So, if anything, GPL tries to reduce the power of the developers in the benefit of their users. One of the freedoms of the users is that they can use the software in any way they like, so also commercially and without the permission of the developers (copyright holders). The users can inspect, contribute, fork, adapt the software but are required to release it under the same license. So, once a piece of software respects the freedoms of the users, these freedoms cannot be taken away any longer, different from a permissive license where anyone can adapt it and use it in any way they like, empowering the developers again.

Of course, copyright holders have the right to enforce GPL but it does not mean developers have the right to do this in any way they seem fit. In particular, they don't have the right to do it in the way that does not respect the freedom of the users. In addition, a violation is perhaps different from what you mean. For example, suppose there is a commercial company that uses fullPage.js, but they only use it on their intranet. They would not be in violation of GPL. Suppose, they would use it on their external website, they would not be in violation of GPL. Suppose they would adapt the software to suit their needs and they use it on their internal website. They would still not be in violation of GPL. Suppose, they would adapt the software to suit their needs and they use it on their external website, then this could be considered it as distributing the software to the public, meaning that they have to release their adaptations under GPL. If they don't, that would be a violation of GPL. Note that in this example, I have the viewpoint that the website is not covered under GPL because of using fullPage.js, a viewpoint that I support but that may be debatable.

About the copyright of fullPage.js: The copyright is not about when the GPLv3 license was adopted, but over all of its lifetime. I don't know what the license before that was, but I assume you had full copyright then since you were able to change the license. I saw that fullPage.js had lots of contributors so I thought it was more of a community project. However, the examples that you give are not enough for anyone to claim that they have copyright, they are all trivial changes in my opinion. For example, it would be different if someone adds 500 lines of code to support touch devices or something. I'm sure your judgment is as good as mine.

So, I guess this means you have full copyright, which means that you can just change the license in any way you like, even easier...

As a proponent of free software, I was very happy to see this GPL licensed library and I hope you keep the library free, but again, totally no judgment from my side and I respect any decision you make.

alvarotrigo commented 4 years ago

Before GPLv3 it was MIT in version 2. The biggest pull request were on the early days when code was much smaller and there was some missing features.

Modifications of the GPLv3 fullPage.js version are only 14 and quite small all of them.

As a proponent of free software, I was very happy to see this GPL licensed library and I hope you keep the library free, but again, totally no judgment from my side and I respect any decision you make.

The easiest solution to me seems to provide the "free for non commercial" license and keep the code open sourced. That should be just fine and will save people a lot of headache. Many are not even aware of different licenses compatibilities or even of their implications when using them together.

pieterhijma commented 4 years ago

With free, I meant libre, so the GPL license. For me, the 'gratis for non commercial open source' license would not be an option, so I would prefer to use the current version under the GPL terms. Indeed, unfortunately, many are not aware of licensing but I think it is a very important topic and the choice for license can have quite some impact as you see.

If ok with you, I could also fork the current version, remove the in my view non-free parts, for example, the license check and adding extensions (there are no GPL extensions if I'm right, so any extension would be incompatible). You could still contribute to the GPL version with updates, but if a community picks up development, it is not possible to merge these parts into your closed version since your version should be GPL as well then. I specifically say a community because, although I'm an experienced programmer, the total number of lines of JavaScript I wrote equals to about 30, and I don't have access to other browsers than GNU Icecat, Iceweasel, and if I have to Firefox and Chromium, so I'm the worst choice for maintaining it.

I have also no economic interest at all and wouldn't mind to refer to the official version that has all of your support and would be more up-to-date. I could also request donations to you by users of the GPL version, if you accept them. This would allow me to use fullPage.js with a GPL license on my website, something I would value, and I could try to keep it working for future versions of the (libre) browsers that I care about.

JoeySGith commented 2 years ago

I feel really bad necroing this issue, but since it's open, I feel less bad now. I have never posted on GitHub before, literally just created this account so please bear with me. Please imagine me as a cheap dirtbug who is trying to abuse the licence as much as possible.

Hi there, I was looking into the using fullpage.js for a WordPress Project and stumbled across this post. I completely agree with pieterhijima on how user rights are misrepresented.

https://www.gnu.org/licenses/gpl-faq.en.html#WMS As a special exception to the GPL, any HTML file which merely makes function calls to this code, and for that purpose includes it by reference shall be deemed a separate work for copyright law purposes. In addition, the copyright holders of this code give you permission to combine this code with free software libraries that are released under the GNU LGPL. You may copy and distribute such a system following the terms of the GNU GPL for this code and the LGPL for the libraries. If you modify this code, you may extend this exception to your version of the code, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.

This can be intrepreted by many as "as long as the JS files are not modified (to suit the needs), they are considered a separate work". This also shows the part of the GPL where the use of the product is not limited since using a JS library means calling its functions from website files.

The MIT licence does not limit any rights for anyone who obtained a copy of the files as long as they accept the product is provided "as is".

Since the GPL is a copyright license, the copyright holders of the software are the ones who have the power to enforce the GPL.

This merely means the copyright holders have the power to enforce the GPL. As long as it's open source ( and you provide access to the source code at no charge), you can do whatever you want while providing it.

Does the GPL allow me to charge a fee for downloading the program from my distribution site? (#DoesTheGPLAllowDownloadFee) Yes. You can charge any fee you wish for distributing a copy of the program. Under GPLv2, if you distribute binaries by download, you must provide “equivalent access” to download the source—therefore, the fee to download source may not be greater than the fee to download the binary. If the binaries being distributed are licensed under the GPLv3, then you must offer equivalent access to the source code in the same way through the same place at no further charge.

This is also demonstrated by the DRM condition.

Does GPLv3 prohibit DRM? (#DRMProhibited) It does not; you can use code released under GPLv3 to develop any kind of DRM technology you like. However, if you do this, section 3 says that the system will not count as an effective technological “protection” measure, which means that if someone breaks the DRM, she will be free to distribute her software too, unhindered by the DMCA and similar laws. As usual, the GNU GPL does not restrict what people do in software, it just stops them from restricting others.

I don't think there is any need for undoing any contribution as the method of doing something (using "if" or "return true") is almost never protected. You can go straight to limit all use of your version of fullPage.js with a different licence since there is no way to prove that you did not own another unpublished version of the code which you maintained yourself with similar changes to other contributors have made to the open project. What you can't do, is stopping anyone from publishing any versions of fullPage.js that were ever released under MIT or GPL licence and keep contributing to it. For example, I can download the whole project and set up my own fullPage-2.js as long as it's open source.

I don't thtink it's proper to limit how you make money on a good project, as that's how I earn my bread. However, that is where the situation stands today and your main way of income from an open-source project is subscription/donation. What many js/plugin authors are doing is charging subscription for auto-update or even update notifications and customizing support, meaning they will help with issues that arised from code/plugin conflicts with other environment.

I will probably still buy the licence since it's only $36 for one client, but I think everyone should know what they can do under the GPL licence.

Please correct me if I'm wrong about anything. Otherwise, I think everyone will appreciate an updated wording on the licencing.

alvarotrigo commented 2 years ago

For the new release version 4, I opted to keep GPLv3 after some consideration. I wanted to keep it open-source and using a "free for noncommercial" was against that principle.

I ended up getting rid of the way I had to enforce the GPLv3 license and opted for an easier solution like the one used by handsnotable.

Now, all you have to do is pass the string gplv3-license on the license option for fullPage.js. The docs have been updated accordingly. (Although I still need to update the pricing page).

alvarotrigo commented 2 years ago

@JoeySGith thanks for your comment!! 👍 I appreciate seeing another point of view on the topic.

I'm definitely no expert on licensing and this has always been a field where I felt like a total foreigner.

Hopefully these new changes can suppose an improvement :)