何東杰 宋 昊 王 琪 匡翔宇 劉為懷 蔣丹妮(中國(guó)銀聯(lián)電子支付研究院電子商務(wù)與電子支付國(guó)家工程實(shí)驗(yàn)室 上海 00)(復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院 上海 00433)
隨著開(kāi)源軟件的不斷發(fā)展和完善,其地位也日益重要,很多中小型公司都使用開(kāi)源軟件,并將其產(chǎn)品提供到開(kāi)源社區(qū),以求從其他貢獻(xiàn)者中獲益,從而加速產(chǎn)品的完善、接受和普及。開(kāi)源許可證伴隨著開(kāi)源軟件而產(chǎn)生,開(kāi)源許可證提供了軟件的原作者對(duì)于開(kāi)源軟件使用的許可授權(quán),從而使得任何人都能夠自由地使用開(kāi)源軟件。
但是,開(kāi)源許可證的組織也強(qiáng)調(diào)對(duì)于有開(kāi)源許可證的軟件要謹(jǐn)慎使用,避免產(chǎn)生法律問(wèn)題。然而一些中小型的公司或者經(jīng)驗(yàn)不足的工程師往往忽略了這些開(kāi)源許可證的重要性,對(duì)開(kāi)源軟件進(jìn)行簡(jiǎn)單包裝后便進(jìn)行商業(yè)化使用或銷售[1],違反了開(kāi)源許可證中的條款,為企業(yè)帶來(lái)了法律上的問(wèn)題。
因此,對(duì)現(xiàn)今主流的許可證條款進(jìn)行研究,然后基于研究結(jié)果,給予軟件開(kāi)發(fā)者開(kāi)源許可證中存在的法律風(fēng)險(xiǎn)及限制和許可證兼容性的提示,讓開(kāi)發(fā)者在軟件開(kāi)發(fā)之前將上述問(wèn)題解決,具有重要的應(yīng)用價(jià)值。但是,現(xiàn)今主流的檢測(cè)工具僅僅只能檢測(cè)開(kāi)源軟件中的許可證名稱、數(shù)量等,并不能基于許可證的條款給出許可證的兼容性和法律風(fēng)險(xiǎn)的分析結(jié)果[5]。
針對(duì)上述問(wèn)題,本文對(duì)現(xiàn)今主流的許可證的條款和許可證的法律效益進(jìn)行了研究,將不同類型的法律風(fēng)險(xiǎn)和許可證的兼容性問(wèn)題進(jìn)行分類分析,基于研究設(shè)計(jì)并開(kāi)發(fā)了開(kāi)源軟件許可證的檢測(cè)工具FINDLICENSE。
FINDLICENSE能夠從許可證兼容、開(kāi)源發(fā)布軟件、商業(yè)化發(fā)布軟件、商業(yè)化服務(wù)提供等不同使用角度能夠給出開(kāi)源軟件使用的風(fēng)險(xiǎn)提示,為開(kāi)源軟件的合法使用提供了重要的參考依據(jù),使得企業(yè)在使用開(kāi)源軟件之前就能避免法律風(fēng)險(xiǎn)。
軟件許可證是一種具有法律性質(zhì)的合同或指導(dǎo),目的在規(guī)范受著作權(quán)保護(hù)的軟件的使用或散布行為。通常的授權(quán)方式會(huì)允許用戶來(lái)使用單一或多份該軟件的副本,因?yàn)槿魺o(wú)授權(quán)而徑自使用該軟件,將違反著作權(quán)法給予該軟件開(kāi)發(fā)者的專屬保護(hù)。效用上來(lái)說(shuō),軟件授權(quán)是軟件開(kāi)發(fā)者與其用戶之間的一份合約,用來(lái)保證在匹配授權(quán)范圍的情況下,用戶將不會(huì)受到控告。
開(kāi)源許可證是軟件許可證的一種特殊形式,其授權(quán)一般是針對(duì)軟件的開(kāi)放源代碼,而不同于商業(yè)軟件的運(yùn)行文件,其允許用戶在承認(rèn)軟件原作的著作權(quán)的基礎(chǔ)上對(duì)軟件源代碼的使用、修改、私用等權(quán)益,以保證開(kāi)源軟件能夠合法地被廣大軟件開(kāi)發(fā)者自由使用和共享。
開(kāi)源許可證的一般格式如圖1所示。
XXXLicenseCopyright(c)[year][fullname]PermissionisherebyxxxTheabovecopyrightnoticeandthispermissionnoticeshallbeincludedinxxxxxx.………
圖1 開(kāi)源許可證的一般格式
開(kāi)源軟件的許可證的種類比較繁多和復(fù)雜,常用的有六個(gè):AGPL、GPL、LGPL、BSD、Apache、MIT,表1列出了GITHUB上排名前十的許可證的使用比例。
表1 許可證使用情況排名表
在法律上,一般采用知識(shí)產(chǎn)權(quán)法對(duì)軟件進(jìn)行保護(hù),與軟件相關(guān)的知識(shí)產(chǎn)權(quán)包括著作權(quán)、專利權(quán)、商標(biāo)權(quán)、商業(yè)秘密權(quán)、反不正當(dāng)競(jìng)爭(zhēng)權(quán)。開(kāi)源軟件許可證的在法律上通常被認(rèn)為是合同,一般都遵照《合同法》進(jìn)行判別,即遵照合同本身聲明的權(quán)益進(jìn)行判別。
在現(xiàn)今主流的開(kāi)源許可證中,聲明的條款涉及軟件權(quán)益的主要包括商業(yè)用途、分發(fā)、修改、專利授權(quán)、私用、公開(kāi)源碼、放置許可協(xié)議與版權(quán)信息、使用網(wǎng)絡(luò)分發(fā)、使用相同協(xié)議、聲明變更、承擔(dān)責(zé)任、使用商標(biāo)等12項(xiàng)。
若要在項(xiàng)目中使用某種開(kāi)源許可證,一般有三種使用方法:在“LICENSE”文件使用、在源代碼注釋中使用、在readme文件中使用。
使用“LICENSE”文件,需要在項(xiàng)目的根目錄下創(chuàng)建一個(gè)“LICENSE”的文件,表明整個(gè)項(xiàng)目置于此許可證的聲明下;使用注釋的形式聲明在源代碼中,表明僅此代碼文件置于此許可證的聲明下;在readme文件中放置許可證的全文條款,表明readme文件中聲明的整個(gè)軟件置于此許可證的聲明下。
因此,若要檢測(cè)開(kāi)源許可證,可以根據(jù)“LICENSE”文件、源代碼注釋中、readme文件中等查看軟件許可證,但是這種方法過(guò)于浪費(fèi)人力,而現(xiàn)在網(wǎng)絡(luò)上有提供許多自動(dòng)化工具來(lái)檢測(cè)許可證。The Binary Analysis Tool可用于審計(jì)開(kāi)源軟件的內(nèi)容,其中包括了許可證的內(nèi)容;FOSSology可以用于許可證和版權(quán)檢測(cè);The Open Source License Checker可以用于檢查和分析來(lái)自開(kāi)源包的許可證信息;Spago4Q是一款免費(fèi)開(kāi)源軟件質(zhì)量平臺(tái),可以檢測(cè)出項(xiàng)目中的許可證;Apache Rat是一個(gè)發(fā)布的審計(jì)工具,專注于軟件許可證,告知你使用準(zhǔn)確性,以提升許可證使用的效率。
但是,一般的許可證檢測(cè)工具的結(jié)果都是羅列出項(xiàng)目中許可證的種類、數(shù)量以及許可證所在的目錄信息,并不能檢測(cè)出許可證之間的兼容性問(wèn)題和法律風(fēng)險(xiǎn)問(wèn)題。
主流開(kāi)源許可證中,聲明的條款主要包括商業(yè)用途、分發(fā)、修改、專利授權(quán)、私用、公開(kāi)源碼、放置許可協(xié)議與版權(quán)信息、使用網(wǎng)絡(luò)分發(fā)、使用相同協(xié)議、聲明變更、承擔(dān)責(zé)任、使用商標(biāo)等12項(xiàng)。
根據(jù)開(kāi)源許可證的法律依據(jù)和效用,參考不同開(kāi)源許可證的條款,在使用開(kāi)源軟件時(shí),為避免產(chǎn)生法律問(wèn)題,主要需要考慮以下幾方面的問(wèn)題:
? 開(kāi)源要求
? 修改聲明
? 專利允許
? 許可證兼容
? 商標(biāo)使用
? 網(wǎng)絡(luò)分發(fā)
根據(jù)以上六方面的問(wèn)題分析,我們將開(kāi)源許可證的法律風(fēng)險(xiǎn)分為六個(gè)方面:商業(yè)化風(fēng)險(xiǎn)、許可證兼容風(fēng)險(xiǎn)、專利侵權(quán)風(fēng)險(xiǎn)、產(chǎn)權(quán)歸屬風(fēng)險(xiǎn)、商標(biāo)使用風(fēng)險(xiǎn)、服務(wù)提供風(fēng)險(xiǎn)。
商業(yè)化風(fēng)險(xiǎn),是指開(kāi)源許可證要求開(kāi)源軟件的任何衍生作品都要開(kāi)源發(fā)布,因此使用此類許可證下的軟件進(jìn)行商業(yè)版本發(fā)布都必須開(kāi)源,這與商業(yè)化的利益要求不符,會(huì)導(dǎo)致商業(yè)化風(fēng)險(xiǎn)。
不同許可證的要求大致分為三類:不強(qiáng)制開(kāi)源;作為庫(kù)引用不強(qiáng)制開(kāi)源;強(qiáng)制開(kāi)源。表2中開(kāi)源一列列出了常見(jiàn)許可證的分類。其中,強(qiáng)制開(kāi)源的許可證多是一些較為嚴(yán)格的許可證。如GPL、LGPL、EPL和MPL等,發(fā)布軟件時(shí)必須提供源代碼;作為庫(kù)引用不強(qiáng)制開(kāi)源的許可證,僅僅只有LGPL的不同版本,在商業(yè)化上有實(shí)際價(jià)值,但只能作為庫(kù)來(lái)引用,不能直接使用任何源代碼;不強(qiáng)制開(kāi)源的許可證,包含了BSD、Apache、MIT等常見(jiàn)許可證。這類許可證是比較寬松的許可證,在其他方面往往也限制較少,對(duì)商業(yè)使用來(lái)說(shuō),這些許可證是比較友好的。
表2 常見(jiàn)開(kāi)源許可證條款聲明情況表
續(xù)表2
對(duì)于強(qiáng)制開(kāi)源的許可證,使用時(shí)要慎重,因?yàn)檫`反開(kāi)源許可證被起訴已經(jīng)有許多成功的判例。如2007年2月,Skype被起訴違反了GPLv2許可協(xié)議,自由軟件基金會(huì)(FSF)稱,Skype是基于Linux的WSKP100 WiFi VoIP電話,而 Skype并未基于GPL協(xié)議提供其Linux產(chǎn)品的源代碼。德國(guó)一審法庭調(diào)查后認(rèn)定事實(shí)確鑿,宣判Skype違反了協(xié)議規(guī)定。
許可證兼容風(fēng)險(xiǎn),是指開(kāi)源軟件引用了其他多個(gè)開(kāi)源軟件,而這些引用的開(kāi)源軟件可能是不同的許可證,此時(shí)開(kāi)源軟件本身的許可證和引用的開(kāi)源軟件的許可證可能會(huì)存在兼容性問(wèn)題。這其中包含了兩方面的問(wèn)題:第一,開(kāi)源軟件本身的許可證與引用的開(kāi)源軟件的許可證相同權(quán)益的條款是否有沖突以及最終的許可證應(yīng)該如何放置;第二,開(kāi)源軟件本身的許可證是否允許引用使用了其他許可證下軟件。
開(kāi)源軟件協(xié)議從使用限制強(qiáng)弱上來(lái)看,可以分為三大類:放任型、弱保護(hù)型、強(qiáng)保護(hù)型。一般來(lái)說(shuō),強(qiáng)限制協(xié)議可以向下兼容弱限制協(xié)議,這意味著軟件最終許可證取決于強(qiáng)限制協(xié)議。但限制條件完全對(duì)立的兩個(gè)協(xié)議則無(wú)法兼容。圖2說(shuō)明了常見(jiàn)開(kāi)源軟件協(xié)議之間的條款兼容性情況。
圖2 常見(jiàn)開(kāi)源軟件協(xié)議條款兼容性指示圖
箭頭從A框到B框代表,A框和B框中的協(xié)議是兼容的,即兩種開(kāi)源軟件可以組合使用,且最終License取決于B框中協(xié)議。而如果兩個(gè)框之間沒(méi)有單向的箭頭貫通,即意味著兩個(gè)框中的協(xié)議不兼容,即兩種開(kāi)源軟件不可以組合使用。
舉例說(shuō)明,如MIT->BSD->Apache->LGPLv3->GPLv3.0是單向通路,通路上的任意兩個(gè)及以上的開(kāi)源軟件都可組合使用,軟件最終License取決于通路上箭頭最末端GPLv3.0協(xié)議。MPL<-BSD->Apache是一個(gè)雙向鏈路,鏈路兩端的MPL和Apache協(xié)議是不兼容的,無(wú)法組合使用。
對(duì)于開(kāi)源軟件本身的許可證是否允許引用其他許可證下的軟件可以由表2中使用相同協(xié)議條款判別。其中,有相同許可證要求的許可證在分發(fā)軟件時(shí),必須使用相同的許可證發(fā)布。無(wú)相同許可證要求且不強(qiáng)制開(kāi)源的許可證,可以設(shè)置任何類型的許可證,且不會(huì)存在法律問(wèn)題。
專利侵權(quán)風(fēng)險(xiǎn),是指開(kāi)源軟件的衍生作品申請(qǐng)了專利,而許可證條款不承認(rèn)衍生作品申請(qǐng)專利或者衍生作品申請(qǐng)的專利歸原作者所有,這種情況也將產(chǎn)生嚴(yán)重的法律問(wèn)題。
常見(jiàn)的開(kāi)源許可證對(duì)于專利的要求如表2中的專利一列所示。由表2可知,許可證的專利授權(quán)有三種情況:明確專利授權(quán),許可證允許貢獻(xiàn)者進(jìn)行專利申請(qǐng);不提供專利授權(quán),許可中明確聲明它不授予貢獻(xiàn)者專利授權(quán);未明確,許可證中沒(méi)有提到專利許可。
明確授予專利許可權(quán)的許可證包括表2專利一列中列出的12 種許可證,這些許可證可以申請(qǐng)專利,并且在專利法保護(hù)之下。但是,有一部分許可證同樣要求開(kāi)源,這部分許可證申請(qǐng)專利也無(wú)太大作用。四個(gè)許可證明確表示不提供專利授權(quán),對(duì)于不承認(rèn)專利的許可證不可申請(qǐng)衍生作品的專利,不然會(huì)產(chǎn)生侵權(quán)問(wèn)題,所以應(yīng)盡量避免選擇此類許可證;未明確專利授予問(wèn)題的許可證,包括GPL2.0、LGPL2.1和MIT許可證等,在合同法范圍內(nèi)未聲明權(quán)益,可以認(rèn)為承認(rèn)衍生作品的專利權(quán),所以可以對(duì)衍生作品申請(qǐng)專利。值得注意的是,對(duì)于衍生作品專利的申請(qǐng),只能針對(duì)自己修改的部分,不能包含原作品部分。另外,部分開(kāi)源許可證要求衍生作品中對(duì)原作品的任何修改或添加都要進(jìn)行聲明,否則不承認(rèn)衍生作品的專利權(quán)。
著名的Robert一案可以看出這一條款的重要性。Robert Jacobsen研發(fā)出了名為“解碼博”的軟件,放置在SourceForge供其他人無(wú)償下載。KAM開(kāi)發(fā)了名為“解碼指揮官”的軟件。在開(kāi)發(fā)過(guò)程中,下載了Robert的軟件套件,并將其中的定義文檔和其他部分程序納入到了“解碼指揮官”的軟件之中,向美國(guó)政府申請(qǐng)了一項(xiàng)專利。之后由于糾紛,Robert一紙?jiān)V狀將KAM送上了法庭。最終,上訴到美國(guó)聯(lián)邦法院,判決KAM侵犯版權(quán),理由是“開(kāi)源協(xié)議”是一種著作權(quán)協(xié)議,違反協(xié)議就是侵權(quán)行為。
版權(quán)歸屬風(fēng)險(xiǎn),是指開(kāi)源許可證明確聲明了基于原作品的衍生作品的修改部分必須進(jìn)行明確聲明,才能承認(rèn)其具有對(duì)修改部分的版權(quán),而如果未對(duì)此部分進(jìn)行聲明便進(jìn)行了商業(yè)使用,會(huì)產(chǎn)生版權(quán)歸屬不明的情況,由此可能會(huì)產(chǎn)生法律問(wèn)題。
表2修改聲明一列列出了常見(jiàn)許可證的修改聲明要求。為防止產(chǎn)生法律問(wèn)題,對(duì)于使用了明確要求聲明修改的開(kāi)源許可證的軟件,在進(jìn)行商業(yè)化時(shí),必須對(duì)修改部分進(jìn)行聲明,以明確版權(quán)歸屬。
“綠壩- 花季護(hù)航”用于不良圖像過(guò)濾的主要文件cximage.dll、CImage.dll、xcore.dll和 Xcv.dll均來(lái)自O(shè)penCV。OpenCV采用的是BSD許可證,當(dāng)商業(yè)軟件使用BSD許可證的開(kāi)源程序時(shí),需要在軟件版權(quán)信息中加上BSD許可證聲明,以及自己變更部分的聲明,綠壩并未在其軟件中加入這一聲明。2010年初,美國(guó)加州Cybersitter軟件公司向當(dāng)?shù)胤ㄔ禾崞鹪V訟,稱“綠壩- 花季護(hù)航”軟件抄襲了該公司的近三千行代碼,要求索賠22億美元。
商標(biāo)使用風(fēng)險(xiǎn),是指如果開(kāi)源軟件的衍生作品使用并申請(qǐng)了商標(biāo)權(quán),但原開(kāi)源軟件的許可證條款聲明了不承認(rèn)商標(biāo)權(quán),這將會(huì)導(dǎo)致衍生產(chǎn)品的商標(biāo)不合法,不具有法律擔(dān)保性。
常見(jiàn)的開(kāi)源許可證對(duì)于商標(biāo)的使用條款有兩種:一種是明確不承認(rèn)使用商標(biāo),另一種是沒(méi)有條款針對(duì)商標(biāo)進(jìn)行聲明。常見(jiàn)許可證對(duì)于商標(biāo)使用的聲明情況如表2商標(biāo)一列所示。
其中,明確不提供商標(biāo)使用的許可證有11種。但是,值得注意的是,這些不承認(rèn)商標(biāo)權(quán)的許可證,有6種是不要求使用相同許可證的。因此,只要在衍生作品中不使用原來(lái)的許可證,就可以使用商標(biāo),其他的不承認(rèn)商標(biāo)權(quán)的許可證則不能使用商標(biāo)。對(duì)于許可證條款中沒(méi)有明確商標(biāo)使用的,有16種,這些許可證下的衍生作品則可以使用商標(biāo)。
由于云計(jì)算的興起,使得軟件可以不通過(guò)傳統(tǒng)的互聯(lián)網(wǎng)或光盤(pán)release分發(fā),而以“不分發(fā)軟件,為客戶在云上提供網(wǎng)絡(luò)服務(wù)”的模式使用軟件,這種服務(wù)模式雖不受強(qiáng)制開(kāi)源的要求,但是受網(wǎng)絡(luò)分發(fā)條款限制。
服務(wù)提供風(fēng)險(xiǎn),是指軟件在云上提供網(wǎng)絡(luò)服務(wù)的軟件是某些開(kāi)源許可證下的軟件的衍生或者原生作品,但是這些開(kāi)源許可證不允許衍生作品閉源進(jìn)行云服務(wù)的提供,因此,此種使用方式會(huì)產(chǎn)生法律上的風(fēng)險(xiǎn)。
常見(jiàn)的開(kāi)源許可證對(duì)于網(wǎng)絡(luò)分發(fā)的條款有兩種:一種是明確聲明網(wǎng)絡(luò)分發(fā)必須開(kāi)源,另一種是沒(méi)有條款針對(duì)網(wǎng)絡(luò)分發(fā)進(jìn)行聲明。常見(jiàn)許可證對(duì)于網(wǎng)絡(luò)分發(fā)的聲明情況如表2網(wǎng)絡(luò)分發(fā)開(kāi)源一列所示。其中,明確聲明網(wǎng)絡(luò)分發(fā)必須開(kāi)源的只有三種,這三種許可證即使在商業(yè)中以服務(wù)形式也無(wú)法使用,而沒(méi)有聲明網(wǎng)絡(luò)分發(fā)的許可證,可以閉源并以云服務(wù)的形式供商業(yè)客戶使用。
因此,對(duì)于有開(kāi)源許可證的軟件,首先閱讀許可協(xié)議與版權(quán)信息條款,按照許可證要求將開(kāi)源許可證放置于軟件之中;然后,參照表2和圖1,分別從開(kāi)源要求、修改聲明、許可證兼容、專利允許、商標(biāo)使用、網(wǎng)絡(luò)分發(fā)六個(gè)方面分別去衡量商業(yè)化風(fēng)險(xiǎn)、許可證兼容風(fēng)險(xiǎn)、專利侵權(quán)風(fēng)險(xiǎn)、產(chǎn)權(quán)歸屬風(fēng)險(xiǎn)、商標(biāo)使用風(fēng)險(xiǎn)、服務(wù)提供風(fēng)險(xiǎn),在符合許可證條款的條件下,使衍生作品避免法律糾紛和許可證兼容問(wèn)題。
基于上述分析結(jié)果,我們的工具FINDLICENSE能夠提供以下功能:查找開(kāi)源軟件中包含的所有許可證和權(quán)益信息、指出開(kāi)源軟件中包含的不同許可證兼容問(wèn)題、給出開(kāi)源發(fā)布軟件的風(fēng)險(xiǎn)提示、給出商業(yè)化發(fā)布軟件風(fēng)險(xiǎn)提示、給出作為服務(wù)提供使用軟件風(fēng)險(xiǎn)提示、給出其他權(quán)益風(fēng)險(xiǎn)提示、自定義開(kāi)源許可證添加、自定義許可證風(fēng)險(xiǎn)添加等。
圖3展示了FINDLICENSE工具的整體架構(gòu)。它使用python語(yǔ)言實(shí)現(xiàn),使用FLASK作為后端,HTML作為前臺(tái),用戶只需將待檢測(cè)軟件的源代碼壓縮包,在WEB界面上傳至后臺(tái)或者傳入源代碼托管倉(cāng)庫(kù)地址進(jìn)行掃描,因此是與平臺(tái)無(wú)關(guān)的。它包含了一個(gè)輸入:待檢測(cè)的開(kāi)源軟件源代碼壓縮包文件或者開(kāi)源軟件源代碼所在的倉(cāng)庫(kù)地址。包含一項(xiàng)輸出:開(kāi)源軟件許可證的分析報(bào)告,分析報(bào)告現(xiàn)在以網(wǎng)頁(yè)HTML的形式給出,報(bào)告包含了開(kāi)源軟件許可證兼容問(wèn)題、開(kāi)源發(fā)布軟件風(fēng)險(xiǎn)、商業(yè)化發(fā)布軟件風(fēng)險(xiǎn)、作為服務(wù)提供使用軟件風(fēng)險(xiǎn)、其他權(quán)益風(fēng)險(xiǎn)以及文件中包含的許可證詳細(xì)的官方信息。
圖3 FINDLICENSE工具架構(gòu)圖
我們的FINDLICENSE遵循模塊化設(shè)計(jì)的思路,工具包含了三個(gè)主要模塊:文件構(gòu)建組件、掃描檢測(cè)組件、報(bào)告生成組件。文件構(gòu)建組件負(fù)責(zé)將上傳的源代碼壓縮包解壓到指定位置或者根據(jù)倉(cāng)庫(kù)地址將其下載到指定位置,然后分析文件結(jié)構(gòu)和文件信息,構(gòu)建文件掃描的樹(shù)狀圖。掃描檢測(cè)組件負(fù)責(zé)根據(jù)庫(kù)中許可證構(gòu)建掃描的語(yǔ)義表,然后根據(jù)語(yǔ)義表進(jìn)行按照文件構(gòu)建組件給出的結(jié)構(gòu)圖進(jìn)行掃描,匹配許可證和版權(quán)信息,再根據(jù)定義的許可證沖突和風(fēng)險(xiǎn),對(duì)掃描結(jié)果進(jìn)行匹配。報(bào)告生成器根據(jù)掃描檢測(cè)組件掃描檢測(cè)的結(jié)果,結(jié)合庫(kù)中許可證的信息,以HTML格式的文件將掃描結(jié)果輸出,并返回給用戶。
許可證的規(guī)范使用方法是在“LICENSE”文件使用、在源代碼注釋中使用、在readme文件中使用,但是考慮到不規(guī)范使用的情況,F(xiàn)INDLICENSE是進(jìn)行全文本掃描,可以掃描出開(kāi)源軟件源代碼中多類型應(yīng)用許可證。
文件構(gòu)建組件。包含文件解壓縮器、倉(cāng)庫(kù)文件下載器、文件目錄構(gòu)建器。其中,文件解壓縮器實(shí)現(xiàn)對(duì)ZIP、RAR、GZ、BZ2等格式的文件進(jìn)行解壓縮。倉(cāng)庫(kù)文件下載器實(shí)現(xiàn)從遠(yuǎn)程倉(cāng)庫(kù)到本地的復(fù)制,目前僅支持GIT的倉(cāng)庫(kù)。文件目錄構(gòu)建器對(duì)于整個(gè)文件夾進(jìn)行遍歷,然后構(gòu)建文件夾的樹(shù)形結(jié)構(gòu),以JSON數(shù)據(jù)形式保存。
掃描檢測(cè)組件。包含了掃描調(diào)度器、文件掃描器、許可證語(yǔ)義構(gòu)建器、沖突及風(fēng)險(xiǎn)檢測(cè)器。文件掃描器根據(jù)許可證語(yǔ)義構(gòu)建器提供的關(guān)鍵字,對(duì)掃描調(diào)度器指定的文件進(jìn)行語(yǔ)義匹配,匹配到對(duì)應(yīng)的關(guān)鍵字之后,將關(guān)鍵字的位置及許可證或者版權(quán)的標(biāo)示保存到結(jié)果中。實(shí)際掃描中,我們的問(wèn)題相當(dāng)于給定的長(zhǎng)度為n的文本,和模式集合P{p1,p2,…,pm},找到文本中的所有匹配模式的位置,而AC算法可以在O(n)時(shí)間復(fù)雜度內(nèi)找到文本中的所有目標(biāo)模式,而與模式集合的規(guī)模m無(wú)關(guān),因此我們使用AC算法進(jìn)行實(shí)際的文件掃描。
AC算法的算法思想如下:對(duì)于模式集合P{he,she,his,hers},模式s(he)的非前綴子串he,實(shí)際上卻是模式(he),(he)rs的前綴。如果目標(biāo)串target[i…i+2]與模式she匹配,同時(shí)也意味著target[i+1…i+2]與he、hers這兩個(gè)模式的頭兩個(gè)字符匹配,所以此時(shí)對(duì)于target[i+3],我們不需要從target[i]進(jìn)行比較,而直接將target[i+3]與he、hers兩個(gè)模式的第3個(gè)字符比較,然后直接向后繼續(xù)執(zhí)行匹配操作。
根據(jù)上述的AC算法,我們文件掃描器對(duì)每個(gè)文件中提供的關(guān)鍵字進(jìn)行語(yǔ)義匹配,匹配到對(duì)應(yīng)的關(guān)鍵字之后,將關(guān)鍵字的位置及許可證或者版權(quán)的標(biāo)示保存到結(jié)果中,然后繼續(xù)掃描,直到整個(gè)文件掃描結(jié)束,最后將掃描的結(jié)果返回給給掃描調(diào)度器。
掃描調(diào)度器根據(jù)文件目錄構(gòu)建器給出的文件結(jié)構(gòu),按照深度優(yōu)先的策略,調(diào)度文件掃描器進(jìn)行掃描,并將文件名稱和掃描的結(jié)果以字典的形式保存在字典中,供沖突及風(fēng)險(xiǎn)檢測(cè)器使用。在實(shí)際調(diào)用中,單線程的調(diào)度掃描速度過(guò)慢,因此,為加快掃描速度,我們借鑒了分布式系統(tǒng)中MapReduce的思路,將掃描階段進(jìn)行了分解,具體執(zhí)行流程如圖4所示。
圖4 文件掃描調(diào)度執(zhí)行流程圖
掃描開(kāi)始時(shí),我們掃描調(diào)度器會(huì)啟動(dòng)多個(gè)文件掃描器的進(jìn)程,按照?qǐng)D4中由最底層葉子節(jié)點(diǎn)開(kāi)始,向上分別對(duì)不同的文件進(jìn)行掃描,待所有文件掃描器的進(jìn)程將所有文件掃描結(jié)束后,產(chǎn)生中間結(jié)果;爾后,掃描調(diào)度器會(huì)啟動(dòng)多個(gè)結(jié)果合并器的進(jìn)程,以文件路徑作為鍵,掃描結(jié)果作為值,將掃描結(jié)果進(jìn)行合并,得到輸出。
許可證語(yǔ)義構(gòu)建器,首先在許可證目錄中將所有許可證逐個(gè)按照內(nèi)容進(jìn)行切分。切分完成后,將許可證名稱和對(duì)應(yīng)的切分內(nèi)容按照鍵和內(nèi)容的形式構(gòu)建字典,待所有許可證都切分并且構(gòu)建完畢之后,將字典返回給文件掃描器供實(shí)際掃描過(guò)程中使用。
沖突及風(fēng)險(xiǎn)檢測(cè)器。首先根據(jù)我們的研究結(jié)果構(gòu)建了許可證風(fēng)險(xiǎn)庫(kù)和不兼容庫(kù),實(shí)際使用中,用戶可以對(duì)這個(gè)庫(kù)進(jìn)行自定義的添加、修改、刪除等操作。風(fēng)險(xiǎn)庫(kù)包含了商業(yè)化風(fēng)險(xiǎn)、專利侵權(quán)風(fēng)險(xiǎn)、產(chǎn)權(quán)歸屬風(fēng)險(xiǎn)、商標(biāo)使用風(fēng)險(xiǎn)、服務(wù)提供風(fēng)險(xiǎn),風(fēng)險(xiǎn)庫(kù)中包含了此種風(fēng)險(xiǎn)的名稱和其對(duì)應(yīng)的許可證的鍵。兼容庫(kù)中包含了所有強(qiáng)許可證(即衍生作品必須使用本許可證并且要求開(kāi)源)的鍵和兼容風(fēng)險(xiǎn)名稱。沖突及風(fēng)險(xiǎn)檢測(cè)器根據(jù)掃描調(diào)度器提供的字典,在庫(kù)中對(duì)風(fēng)險(xiǎn)和兼容性規(guī)則進(jìn)行匹配,匹配到風(fēng)險(xiǎn)或者兼容性問(wèn)題后便將許可證的鍵和風(fēng)險(xiǎn)類型保存在字典中,待所有掃描調(diào)度器提供的字典掃描完畢后,將結(jié)果的返回給報(bào)告生成器。
報(bào)告生成組件僅包含報(bào)告生成器一個(gè)組件,報(bào)告生成器使用了FLASK,將掃描的結(jié)果填充到HTML模板的指定位置,并將最終生成的報(bào)告以HTML的形式返回給客戶。
我們對(duì)于github前20的項(xiàng)目進(jìn)行了測(cè)試。測(cè)試分別使用FOSSology[6]、The Open Source License Checker、Spago4Q、 Apache Rat以及我們自主開(kāi)發(fā)的FINDLICENSE,我們從三方面對(duì)我們的工具進(jìn)行評(píng)估:第一,掃描涵蓋結(jié)果的全面性,即許可證的檢測(cè)工具為用戶提供的結(jié)果涵蓋許可證版權(quán)信息、許可證詳細(xì)信息、許可證兼容問(wèn)題、許可證法律風(fēng)險(xiǎn)四個(gè)方面的程度。第二,對(duì)于整個(gè)開(kāi)源軟件許可證掃描的準(zhǔn)確性,即許可證檢測(cè)工具是否能夠?qū)⑺械脑S可證都檢測(cè)出來(lái),比率如何。第三,掃描的時(shí)間,即對(duì)于同一軟件,許可證掃描工具從用戶提交數(shù)據(jù)到生成結(jié)果所需要的時(shí)間。測(cè)試中,我們使用的系統(tǒng)環(huán)境及軟件版本如表3所示。
表3 測(cè)試系統(tǒng)環(huán)境表
我們從許可證版權(quán)信息、許可證詳細(xì)信息、許可證兼容問(wèn)題、許可證法律風(fēng)險(xiǎn)四個(gè)方面去衡量許可證涵蓋結(jié)果的全面性,每個(gè)方面各占25%,不同軟件許可證檢測(cè)工具結(jié)果涵蓋程度如圖5所示。
圖5 不同軟件許可證檢測(cè)工具結(jié)果涵蓋程度
圖5中,F(xiàn)OSSology和The Open Source License Checker(OSLC)只能夠檢測(cè)許可證版權(quán)信息和許可證詳細(xì)信息,沒(méi)有許可證兼容問(wèn)題和許可證法律風(fēng)險(xiǎn)這兩個(gè)方面,所以只有50%;Spago4Q僅能夠提供許可證版權(quán)信息,所以只有25%;Apache Rat能夠提供許可證版權(quán)信息和許可證詳細(xì)信息,但對(duì)于許可證兼容問(wèn)題,只能提供強(qiáng)許可證使用正確性提醒,所以總值75%;而我們的FINDLICENSE工具包含了許可證版權(quán)信息、許可證詳細(xì)信息、許可證兼容問(wèn)題、許可證法律風(fēng)險(xiǎn)四個(gè)方面,所以涵蓋程度為100%,也是五個(gè)工具中功能和涵蓋程度最強(qiáng)大的。
許可證掃描的準(zhǔn)確性,我們對(duì)于gitbub上排名前20的項(xiàng)目源代碼分別使用FOSSology、The Open Source License Checker、Spago4Q、 Apache Rat以及我們自主開(kāi)發(fā)的FINDLICENSE進(jìn)行掃描,掃描結(jié)果的準(zhǔn)確性如圖6所示。
圖6 不同軟件許可證檢測(cè)工具檢測(cè)準(zhǔn)確率
檢測(cè)中,我們都沒(méi)有自定義用戶庫(kù),都是使用軟件默認(rèn)庫(kù)進(jìn)行掃描。從圖3可以看出,Apache Rat以及我們自主開(kāi)發(fā)的FINDLICENSE掃描的準(zhǔn)確率最高,能夠達(dá)到100%,F(xiàn)OSSology和The Open Source License Checker能夠達(dá)到99%以上,Spago4Q能夠達(dá)到98%以上。分析其數(shù)據(jù)差異的原因,由于我們自主研發(fā)的FINDLICENSE和Apache Rat都不僅針對(duì)庫(kù)中的許可證進(jìn)行掃描,并且匹配LICENSE、COPYLEFT、COPYRIGHT等敏感字信息,所以掃描的準(zhǔn)確率很高。而FOSSology和The Open Source License Checker的默認(rèn)庫(kù)涵蓋程度很高,所以掃描的準(zhǔn)確率也能夠達(dá)到99%以上,但是對(duì)于最新的小眾的許可證掃描就不盡理想。Spago4Q的默認(rèn)庫(kù)相對(duì)來(lái)說(shuō)涵蓋程度略低,達(dá)到98%左右,同樣對(duì)于最新的小眾的許可證掃描不盡理想。
許可證掃描的時(shí)間,我們分別使用了三種不同大小的開(kāi)源軟件:大型軟件、中型軟件、小型軟件。大型軟件我們使用了如MYSQL代碼在GB級(jí)的,中型軟件我們使用如bootstrap在MB級(jí)別的,小型軟件我們使用如jquery在KB級(jí)別的分別進(jìn)行檢測(cè),檢測(cè)結(jié)果如圖7所示。
圖7 不同軟件許可證檢測(cè)工具掃描時(shí)間圖
從圖7我們可以看出,針對(duì)小型軟件的掃描速度來(lái)看,五種軟件相差不大,最快的是Spago4Q,最慢的是OSLC,所有軟件平均時(shí)間在3 s左右。中型軟件掃描最快的是OSLC,最慢的是Spago4Q和FOSSology,Apache Rat、FINDLICENSE基本相同,居于中間位置,所有軟件平均時(shí)間是23 s左右。而對(duì)于大型軟件來(lái)說(shuō),差別相對(duì)較大,最快的OSLC,時(shí)間大約在2 min,而最慢的是FOSSology,時(shí)間大約在30 min,所有軟件平均時(shí)間在27 min左右。
分析其原因,我們總計(jì)的掃描時(shí)間=軟件啟動(dòng)時(shí)間+解壓縮時(shí)間+實(shí)際掃描時(shí)間。對(duì)于小型軟件來(lái)說(shuō),OSLC因?yàn)槭莏ava語(yǔ)言開(kāi)發(fā)的,程序啟動(dòng)相對(duì)較慢,所以軟件啟動(dòng)時(shí)間很長(zhǎng),而小型軟件的掃描時(shí)間本來(lái)就短,所以O(shè)SLC最慢,而Spago4Q最快。對(duì)于中型軟件來(lái)說(shuō),因?yàn)閽呙杵骄鶗r(shí)間在23 s左右,此時(shí)軟件啟動(dòng)時(shí)間所占比例就很小,主要是解壓縮時(shí)間和實(shí)際掃描時(shí)間。而中型軟件文件數(shù)量不大,所以解壓縮時(shí)間也相對(duì)較短,軟件的總掃描時(shí)間取決于實(shí)際掃描時(shí)間大小,而OSLC、Apache Rat、FINDLICENSE的軟件許可證庫(kù)是從文件中直接讀取,而Spago4Q和FOSSology是從第三方數(shù)據(jù)庫(kù)工具中讀取,所以相對(duì)來(lái)說(shuō),OSLC、Apache Rat、FINDLICENSE快于Spago4Q和FOSSology。對(duì)于大型軟件來(lái)說(shuō),有三點(diǎn)原因:第一,因?yàn)镺SLC要用戶手動(dòng)將文件先解壓才能掃描,而大型軟件文件數(shù)量很龐大,解壓縮耗費(fèi)時(shí)間巨大,而OSLC省去了解壓縮時(shí)間,所以最快。第二,掃描要基于許可證的庫(kù)進(jìn)行匹配,而FOSSology和我們自己的工具FINDLICENSE庫(kù)相對(duì)較全,但是掃描起來(lái)也相對(duì)耗時(shí),而OSLC、Spago4Q、Apache Rat三者庫(kù)較少,所以掃描速度相對(duì)較快。第三,我們的工具FINDLICENSE、Spago4Q、FOSSology為方便用戶使用,都是以B/S的形式為用戶提供服務(wù),所以掃描時(shí)需要調(diào)用工具,相對(duì)直接掃描的工具,也會(huì)相對(duì)耗時(shí)。
綜合上述分析,我們的工具FINDLICENSE在掃描涵蓋結(jié)果的全面性、許可證掃描的準(zhǔn)確性方面都居于第一位,雖然掃描的速度居于中間位置,但許可證的檢測(cè)對(duì)于實(shí)時(shí)性要求不高,所以也處于可以接受的程度,未來(lái)可以做進(jìn)一步優(yōu)化。同時(shí),我們的工具可以以服務(wù)的形式部署在云服務(wù)器上,方便用戶使用。
本文對(duì)開(kāi)源許可證進(jìn)行了廣泛的研究,并針對(duì)許可證的兼容問(wèn)題和法律風(fēng)險(xiǎn),提出了商業(yè)化風(fēng)險(xiǎn)、許可證兼容風(fēng)險(xiǎn)、專利侵權(quán)風(fēng)險(xiǎn)、產(chǎn)權(quán)歸屬風(fēng)險(xiǎn)、商標(biāo)使用風(fēng)險(xiǎn)、服務(wù)提供風(fēng)險(xiǎn)等方面的風(fēng)險(xiǎn),為開(kāi)源許可證風(fēng)險(xiǎn)檢測(cè)提供了重要的理論依據(jù)。然后,根據(jù)這個(gè)理論,設(shè)計(jì)并實(shí)現(xiàn)了開(kāi)源許可證兼容性和合法性檢測(cè)工具FINDLICENSE。該工具能夠從許可證版權(quán)信息、許可證詳細(xì)信息、許可證兼容問(wèn)題、許可證法律風(fēng)險(xiǎn)四個(gè)方面給出風(fēng)險(xiǎn)分析,使得軟件開(kāi)發(fā)者在開(kāi)發(fā)軟件之前就能知曉開(kāi)源許可證中存在的法律風(fēng)險(xiǎn)及限制和許可證兼容性的問(wèn)題,填補(bǔ)了開(kāi)源許可證檢測(cè)工具在此方面的空白,具有重要的應(yīng)用價(jià)值。之后,我們從掃描涵蓋結(jié)果的全面性、許可證掃描的準(zhǔn)確性、掃描的速度三方面對(duì)我們開(kāi)發(fā)的工具和其他開(kāi)源許可證檢測(cè)工具進(jìn)行了評(píng)估,測(cè)試并證明了我們的工具FINDLICENSE在掃描涵蓋結(jié)果的全面性、許可證掃描的準(zhǔn)確性方面都居于第一位,掃描速度居于中間位置,繼而證明了我們的工具的實(shí)用價(jià)值。
隨著開(kāi)源軟件的不斷發(fā)展,其地位必將超越商業(yè)軟件發(fā)揮越來(lái)越重要的價(jià)值和作用,對(duì)計(jì)算機(jī)發(fā)展也將會(huì)產(chǎn)生深遠(yuǎn)的影響,希望我們的研究和工具能夠?yàn)橹袊?guó)開(kāi)源軟件的發(fā)展盡綿薄之力。
[1] Kapitsaki G M,Charalambous G.Find your Open Source License Now![C]//2016 23rd Asia-Pacific Software Engineering Conference (APSEC),New Zealand,2016.
[2] Engelfriet A.Choosing an Open Source License[J].IEEE Software,2009,27(1):48- 49.
[3] Singh P V,Phelps C.Networks,Social Influence,and the Choice Among Competing Innovations:Insights from Open Source Software Licenses[J].Social Science Electronic Publishing,2009,24(3):539- 560.
[4] Shani G,Gunawardana A.Evaluating Recommendation Systems[M]//Recommender Systems Handbook.2011:257- 297.
[5] Yin R K.Case study research:Design and methods[M].New York:Sage publications,2013.
[6] Gobeille R.The FOSSology project[C]//Proceedings of the 2008 International Working Conference on Mining Software Repositories,MSR 2008(Co-located with ICSE),Leipzig,Germany,May 10- 11,2008.
[7] German D M,Manabe Y,Inoue K.Proceedings of the IEEE/ACM international conference on Automated software engineering,2010[C].Antwerp,2010.
[8] Kapitsaki G M,Kramer F.Open Source License Violation Check for SPDX Files[C]//International Conference on Software Reuse.Software Reuse for Dynamic Systems in the Cloud and Beyond.Springer,Cham,2015:90- 105.
[9] Obrenovic Z,Gasevic D.Open source software:all you do is put it together[J].IEEE Software,2007,24(5):86- 95.
[10] Wu Y,Manabe Y,Kanda T,et al. A Method to Detect License Inconsistencies in Large-Scale Open Source Projects[C]//Proceedings of the 12th Working Conference on Mining Software Repositories,MSR’15.2015:324- 333.
[11] Hammouda I,Mikkonen T,Oksanen V,et al.Open source legality patterns:architectural design decisions motivated by legal concerns[C]//International Academic Mindtrek Conference:Envisioning Future Media Environments.ACM,2010:207- 214.
[12] Bhattacharya J,Suman S.Analysis of popular open source licenses and their applicability to e-governance[C]//International Conference on Theory and Practice of Electronic Governance,Icegov 2007,Macao,China,December.DBLP,2007:254- 257.
[13] Marti D.Reviews:Open source licensing:software freedom and intellectual property law[J].Linux Journal,2005,129:19.