Affero GPLv3: Why It Exists & Who It’s For?

Bradley M. Kuhn

Saturday 23 February 2013

A Brief History of Affero GPL

Was this a loophole?

The Catalyst

Public Performance?

Affero Idea: Inspiration

Affero Idea: Inspiration

GPLv2§2(c):

If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

Merging the Two

Affero GPL v1 is Born

AGPLv1§2(d)

If the Program as you received it is intended to interact with users through a computer network and if, in the version you received, any user interacting with the Program was given the opportunity to request transmission to that user of the Program’s complete source code, you must not remove that facility from your modified version of the Program or work based on the Program, and must offer an equivalent opportunity for all users interacting with your Program through a computer network to request immediate transmission by HTTP of the complete source code of your modified version or other derivative work.

The Great Stallman Stalling, 2002–2006

Wait, What?!?!

Affero Clause: Current

AGPLv3§13

Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.

The Affero Clause

There’s an old saying that victory has a hundred fathers and defeat is an orphan.

— John F. Kennedy

What happened in the meantime?

Talk about Obfuscated!

try{function e(b){throw b;}var i=void 0,k=null;
function aa(){return function(b){return b}}
function m(){return function(){}}
function ba(b){return function(a){this[b]=a}}
function o(b){ return function(){return this[b]}}
function p(b){return function(){return b}}var q;
function da(b,a,c){b=b.split(".");c=c||ea;
!(b[0]in c)&&c.execScript&&c.execScript("var "+b[0]);
for(var d;b.length&&(d=b.shift());)
!b.length&&s(a)?c[d]=a:c=c[d]?c[d]:c[d]={}}
function fa(b,a){for(var c=b.split("."),d=a||ea,f;f=c.shift();)
if(t(d[f]))d=d[f];else return k;return d}function u(){}
function ga(b){b.va=function $(){return b.xY||(b.xY=new b)}}
function ia(b){var a=typeof b;if(a=="object")if(b){
if(b instanceof Array)return"array";else if(b instanceof Object)return a;
var c=Object.prototype.toString.call(b);if(c=="[object Window]")
return"object";if(c=="[object Array]"||typeof b.length=="number"&&
typeof b.splice!="undefined"&&typeof b.propertyIsEnumerable!="undefined"
&&!b.propertyIsEnumerable("splice"))return"array";
if(c=="[object Function]"||typeof b.call!="undefined"&&
typeof b.propertyIsEnumerable!="undefined"&&!b.propertyIsEnumerable("call"))
return"function"}else return"null";
else if(a=="function"&&typeof b.call=="undefined")return"object";return a}function s(b){return b!==i}function ja(b){return b===k}function t(b){return b!=k}function ka(b){return ia(b)=="array"}function la(b){var a=ia(b);return a=="array"||a=="object"&&typeof b.length=="number"}function ma(b){return typeof b=="string"}function na(b){return typeof b=="boolean"}function oa(b){return typeof b=="number"}function pa(b){return ia(b)=="function"}

The Client Proprietary (aka Javascript Trap)


JavaScript is an assembly language. JavaScript + HTML is like a .NET assembly. The browser can execute it, but no human should care what’s there.

— Erik Meijer of Microsoft, on 5 July 2011.

The Application

Dark Ages? Really?

Dark Ages? Really?

Dark Ages? Really?

Generational Change

Hindsight

The Great Abuse

Community Development

The Great Marketing Challenge

More Info / Talk License

Presentation and slides are: Copyright © 2008, 2009, 2010, 2011, 2012, 2013 Bradley M. Kuhn, and are licensed under the Creative Commons Attribution-Share Alike (CC-By-SA) 3.0 United States License.

Some images included herein are ©’ed by others. I believe my use of those images is fair use under USA © law. However, I suggest you remove such images if you redistribute these slides under CC-By-SA-USA 3.0.