日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CKFinder3.5.1整合springboot修复bug免费

發(fā)布時(shí)間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CKFinder3.5.1整合springboot修复bug免费 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CKFinder3.5.1整合springboot修復(fù)bug免費(fèi)

    • 前言
    • 項(xiàng)目本身bug修復(fù)
      • ■ 流異常
      • ■ 整合springboot相關(guān)bug
    • 免費(fèi)過(guò)程
      • ■ 代碼可讀化
        • ① 初步整理
        • ② 大致過(guò)濾
        • ③ 大致翻譯
        • ④ 將翻譯片替換原文
      • ■ 免費(fèi)限制內(nèi)容
        • ① 大致看下翻譯后的js文件
        • ② 免費(fèi)禁用刪除
        • ③ 免費(fèi)上傳只能10個(gè)文件限制
        • ④ 免費(fèi)每隔幾分鐘就會(huì)彈窗
        • ⑤ 免費(fèi)板木又文字
    • 原文js對(duì)應(yīng)的地方
        • ① 直接放出對(duì)應(yīng)位置
        • ② 免費(fèi)禁用刪除
        • ③ 免費(fèi)上傳只能10個(gè)文件限制
        • ④ 免費(fèi)每隔幾分鐘就會(huì)彈窗
        • ⑤ 免費(fèi)板木又文字
    • 最后

前言

僅供學(xué)習(xí)交流。

項(xiàng)目本身bug修復(fù)

■ 流異常

報(bào)錯(cuò):com.cksource.ckfinder.exception.AccessDeniedException
現(xiàn)象:在Linux后臺(tái)表現(xiàn)為大量文件未關(guān)閉,在win下表現(xiàn)為一旦圖片進(jìn)行了操作,刪除就會(huì)異常。
原因:異常為拒絕訪問(wèn),根據(jù)異常找了半天,這個(gè)異常沒(méi)有價(jià)值。實(shí)際上是流沒(méi)有關(guān)閉,又調(diào)用了刪除,留下了一個(gè)不能訪問(wèn)的空殼,后續(xù)寫(xiě)入一樣名字的文件無(wú)法覆蓋就會(huì)報(bào)錯(cuò)。
修復(fù)
① com.cksource.ckfinder.image.Image
反編譯源碼50行處插入

inputStream.close();

public Image(InputStream inputStream) {if (inputStream == null) {throw new NullPointerException("Image input stream cannot be null");} else {try {BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);this.mimeType = URLConnection.guessContentTypeFromStream(bufferedInputStream);this.bufferedImage = ImageIO.read(bufferedInputStream);inputStream.close();} catch (IOException var3) {throw new CKFinderException("Couldn't create image from stream", var3);}if (this.bufferedImage == null) {throw new CKFinderException("Couldn't process image stream - data in stream is not a valid image");}}}

② com.cksource.ckfinder.cache.BackendCache
反編譯源碼53行處修改

public void set(String key, InputStream in) {this.backend.writeFile(this.buildPath(key), in);try {if (in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}}

還有bug的話基本上都是流的問(wèn)題,無(wú)腦關(guān)就對(duì)了,然后將重新編譯后的class替換jar里的內(nèi)容,保持項(xiàng)目的干凈。

■ 整合springboot相關(guān)bug

報(bào)錯(cuò):Consider defining a bean of type 'com.cksource.ckfinder.config.Config' in your configuration.
現(xiàn)象:idea里可運(yùn)行,打成jar包后,啟動(dòng)報(bào)錯(cuò)。
原因:找不到配置文件,官方demo的讀取配置文件方式有誤。
修復(fù)
ckfinder.yml移到resource下。
然后文件讀取改為讀取流。
example.ckfinder.config.CustomConfigLoader

public Config loadConfig() throws Exception {ObjectMapper mapper = new ObjectMapper(new YAMLFactory());return mapper.readValue(CustomConfigLoader.class.getResourceAsStream("/ckfinder.yml"), CustomConfig.class);}

免費(fèi)過(guò)程

看下官網(wǎng),打擾了,一年254美刀,且依賴于父項(xiàng)目也就是說(shuō)需要708美刀,國(guó)外的知識(shí)付費(fèi)真高,足夠增購(gòu)一臺(tái)云服務(wù)器。
ckfinder3-3.5.1\static\ckfinder\ckfinder.js,找到這個(gè)文件。

■ 代碼可讀化

① 初步整理

找一個(gè)格式化js的工具,將長(zhǎng)長(zhǎng)的一行美化,就會(huì)發(fā)現(xiàn)S()方法出鏡率很高,統(tǒng)計(jì)一下

沒(méi)錯(cuò)了,就是它。
搜索

function S(

就會(huì)看到這個(gè)方法

function S(e) {for (var t = "", n = e.charCodeAt(0), i = 1; i < e.length; ++i) t += String.fromCharCode(e.charCodeAt(i) ^ i + n & 127);return t}

網(wǎng)上有個(gè)逆向算法,得出了加密算法,不過(guò)沒(méi)有意義,因?yàn)榧用芙Y(jié)果隨機(jī)。所以根據(jù)提示加密,再?gòu)奈募胁檎腋娲怠?/p>

② 大致過(guò)濾

既然無(wú)法逆向,那么只能順著它的方法通篇調(diào)用一遍,實(shí)在太多了,沒(méi)法手動(dòng)調(diào)用,遍寫(xiě)個(gè)正則撈出來(lái)。
1、撈一份原文放入a.txt、一份帶分隔符的原文。
一段丑陋的代碼,cv拼拼接接沒(méi)有好好寫(xiě)。
S(’’)或者S("")里存在斜桿實(shí)在煩,意味著引號(hào)雙引號(hào)括號(hào)都有可能屬于參數(shù)中的一員,導(dǎo)致正則很難編寫(xiě),水平有限,又不想花時(shí)間研究,只能大概搞搞,過(guò)濾出大致的內(nèi)容。

@Test public void test(){// js內(nèi)容File file = new File("...\\ck.txt");BufferedReader reader = null;StringBuffer sbf = new StringBuffer();try {reader = new BufferedReader(new FileReader(file));String tempStr;while ((tempStr = reader.readLine()) != null) {sbf.append(tempStr);}reader.close();sbf = new StringBuffer(sbf.toString().replace("\\\\\\\"","[dyinghao1]"));sbf = new StringBuffer(sbf.toString().replace("\\\\\\\'","[dyinghao2]"));sbf = new StringBuffer(sbf.toString().replace("\\\\\"","[unchange1]"));sbf = new StringBuffer(sbf.toString().replace("\\\\\'","[unchange2]"));sbf = new StringBuffer(sbf.toString().replace("\\\"","[gyinghao1]"));sbf = new StringBuffer(sbf.toString().replace("\\\'","[gyinghao2]"));sbf = new StringBuffer(sbf.toString().replace("[unchange1]","\\\\\""));sbf = new StringBuffer(sbf.toString().replace("[unchange2]","\\\\\'"));String tableComment = "S\\(\"[^\"]+\"\\)|S\\('[^']+'\\)" ;Pattern pattern = Pattern.compile(tableComment) ;Matcher matcher = pattern.matcher(sbf.toString());while(matcher.find()) {int count = matcher.groupCount();for (int i = 0; i <= count; i++) {String ret = matcher.group(i);ret = ret.replace("[dyinghao1]","\\\\\\\"").replace("[dyinghao2]","\\\\\\\'").replace("[gyinghao1]","\\\"").replace("[gyinghao2]","\\\'");System.err.println(ret);//System.err.println(ret +"+'@@@@@\\n'+");}}} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {e1.printStackTrace();}}}}

③ 大致翻譯

過(guò)濾完了,就是翻譯,由于翻譯出來(lái)的內(nèi)容存在換行,用帶分隔符的那一份,便于分割。
選取一份ckfinder.js文件作修改

var CKFinder = function() {console.log(②中帶分隔符的字符串粘貼過(guò)來(lái))function __internalInit(e) {。。。

通過(guò)瀏覽器打開(kāi)js文件,再打開(kāi)控制臺(tái)輸入——

var script = document.createElement('script'); script.src = "file:///E:/code/.../ckfinder.js"; document.getElementsByTagName('head')[0].appendChild(script);

會(huì)有報(bào)錯(cuò),原因是正則沒(méi)有完整切割好S()里的內(nèi)容,留下一些引號(hào)斜桿導(dǎo)致js文件不正確,一一剔除,或者好好寫(xiě)寫(xiě)正則。
便可看到翻譯結(jié)果,該結(jié)果從console復(fù)制到b.txt。

④ 將翻譯片替換原文

。。。又是一段丑陋的代碼,總之能好好替換就行。

Test public void test4(){File file = new File("E:\\code\\。。。\\b.txt");File file2 = new File("E:\\code\\。。。\\a.txt");File file3 = new File("E:\\code\\。。。\\ck.txt");BufferedReader reader = null;BufferedReader reader2 = null;BufferedReader reader3 = null;StringBuffer sbf = new StringBuffer();StringBuffer sbf3 = new StringBuffer();String[] sbf2 = new String[5935];int j=0;try {reader = new BufferedReader(new FileReader(file));reader2 = new BufferedReader(new FileReader(file2));reader3 = new BufferedReader(new FileReader(file3));String tempStr;String tempStr2;String tempStr3;while ((tempStr = reader.readLine()) != null) {sbf.append(tempStr);}while ((tempStr3 = reader3.readLine()) != null) {sbf3.append(tempStr3+"\n");}while ((tempStr2 = reader2.readLine()) != null) {sbf2[j++] = tempStr2;}reader.close();reader2.close();reader3.close();String s[] = sbf.toString().split("@@@@@");String str = sbf3.toString();for (int n=0; n < s.length; n++) {if(s[n].contains("\"")) {str = str.replace(sbf2[n], "'" + s[n] + "'");} else if(s[n].contains("'")) {str = str.replace(sbf2[n], '"' + s[n] + '"');} else {str = str.replace(sbf2[n], "'" + s[n] + "'");}}sbf3 = new StringBuffer(str);System.err.println(sbf3.toString());} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {e1.printStackTrace();}}}}

替換后的js通過(guò)③的方法測(cè)試一下,發(fā)現(xiàn)仍有十幾來(lái)個(gè)報(bào)錯(cuò),這個(gè)是因?yàn)橐?hào)嵌套異常。這幾個(gè)沒(méi)有有價(jià)值的信息,一一替換回原文即可(一般不再報(bào)錯(cuò)行而是往報(bào)錯(cuò)的上面幾行找)。
然后就能得到正確的版本,接著查找限制內(nèi)容。

■ 免費(fèi)限制內(nèi)容

① 大致看下翻譯后的js文件

代碼被混淆的很難閱讀,并且仍然存在不少密文,對(duì)于一個(gè)前端渣渣來(lái)說(shuō),極度難受。

第一頁(yè)就有這段話

This is a demo version of CKFinder 3 Hello fellow cracker! We are
really sad that you are trying to crack our application - we put lots
of effort to create it. + Would you like to get a free CKFinder
license? Feel free to submit your translation!

百度翻譯一下

這是CKFinder 3的演示版
你好,伙計(jì)們!我們真的很難過(guò),你試圖石皮解我們的應(yīng)用程序-我們付出了很多努力來(lái)創(chuàng)建它。
+您想獲得免費(fèi)的CKFinder許可證嗎?請(qǐng)隨時(shí)提交您的翻譯!

呃。。。些許尷尬,慚愧,摸摸頭,繼續(xù)。。。

② 免費(fèi)禁用刪除


被禁用了刪除功能,并且未曾調(diào)用任何的刪除接口,說(shuō)明是前端限制。
全文查找,不存在這行字,說(shuō)明不在前面翻譯的譯文里,又或者被二次加密了,只能通過(guò)查看刪除的elements,大致定位彈窗的代碼。

<button data-ckf-name="DeleteFiles" title="刪除" tabindex="-1" class="ckf-toolbar-item ckf-toolbar-button ckf-toolbar-item-focusable ui-btn ui-icon-ckf-file-delete ui-btn-icon-notext ui-corner-all">刪除</button>

獲取到關(guān)鍵字段DeleteFiles,統(tǒng)計(jì)一下,只有6個(gè),方法一一查看,。。。方法雖少,但是代碼艱澀難懂,最后定位到兩個(gè)方法,一個(gè)n是真正的刪除方法,一個(gè)i是動(dòng)態(tài)追加刪除方法。
去除里面的action內(nèi)容,最后發(fā)現(xiàn)n去除了這個(gè)刪除沒(méi)反應(yīng)了。

function n(e) {e.finder.request('folder:getActive').get('acl').fileDelete && e.data.toolbar.push({type: 'button',name: 'DeleteFiles',priority: 10,icon: 'ckf-file-delete',label: e.finder.lang.common.delete,action: function() {e.finder.request('files:delete', {files: e.finder.request('files:getSelected').toArray()})}}) }

接著瀏覽器打斷點(diǎn)看走向什么時(shí)候彈窗,浪費(fèi)了一段時(shí)間無(wú)功而返。
接著搜索files:delete,只有7個(gè)
一一查看

setTimeout,好家伙,就是它了。刪!!!

③ 免費(fèi)上傳只能10個(gè)文件限制

The number of files per folder after the upload cannot exceed 10 in demo mode.

一回生兩回熟,直接搜索’msg’,只有幾個(gè),一一查看。

一樣,msg后面的內(nèi)容二次加密,再加上這段代碼里面有10,就該敏感的認(rèn)為它就是限制,方法內(nèi)的內(nèi)容,刪!!!。

④ 免費(fèi)每隔幾分鐘就會(huì)彈窗

舉一反三,剛才搜索’msg’ 的時(shí)候其實(shí)已經(jīng)看見(jiàn)了,刪!!!。

⑤ 免費(fèi)板木又文字


查看elements

<h2 style="margin:-1px auto 0;" class="ui-title" role="heading" aria-level="1">This is a demo version of CKFinder 3</h2>

顯式style,直接搜margin:-1px auto 0,輕松找到

<%= message %> 修改, 隨便定義一個(gè)名字。

完成。

原文js對(duì)應(yīng)的地方

① 直接放出對(duì)應(yīng)位置

省去翻譯,直接放出原文js對(duì)應(yīng)的位置

② 免費(fèi)禁用刪除

刪!!!

setTimeout(function () {e.$el.toolbar(e.toolbarOptions), e.$el.toolbar(S(" TRGEQCwINO{MIJF^V")), t.mobile.resetActivePageHeight(), e.$el.attr(S('4QWCY\x14YPZ\x10JP/- "6'), e.name), e.finder.fire(S("&SGFFIM_\x14LBTSGQ"), {name: e.name,page: e.page}, e.finder)}, 0)

③ 免費(fèi)上傳只能10個(gè)文件限制

刪!!!

var n = o.request(S(";ZTRZ3{%&0\x0635:,$?")).where({"view:isFolder": !1}).length,c = {};c[S(";QNY")] = [S("E\0<9"), S("\x17d\x7fclox"), S("\x17el"), S("7LCBKY"), S("(K\\M"), S("&STQ[XI"), S('A16$5"'), S("9\\@M"), S(">X#9847"), S("\x14ddmc`y"), S(";KVIO32"), S("B`g"), S(",VS"), S("-XYIK"), S("\rqs`a*")][S(":V]M")](function (e) {for (var t = "", n = 0; n < e.length; ++n) t += String.fromCharCode(e.charCodeAt(n) ^ n + 18 & 255);return t})[S(".E_X\\")](" "), n + s.length > S("5\x07\x07") && o.request(S("1VZUYYP\x02PT]S"), c);var d = -(n - S("<\f\x0e"));d < 0 && (d = 0), s.splice(d, s.length)

④ 免費(fèi)每隔幾分鐘就會(huì)彈窗

刪!!!

window[S("\x11av`\\xc}klzp")](function () {var e = {};e[S("*F_J")] = [S(">l !;"), S("1\\H"), "f", S("0R_WQ"), S("<LSD9#! "), S("!JM"), S("!f`kFCO@U"), "4"][S("\x1fM@R")](n)[S("\x19ptus")](" "), t.request(S("@%+\"(*!}!',$"), e)}, S("\x18**+,-.")), O = !0

⑤ 免費(fèi)板木又文字

改!!!

template: t._.template(S("\x17$q(;oigsE\x1c\0NEWANF\x13\x07\x1a\\U\x0eNEE]\x13\x04\x0e\x14\t\x04\x1c\x07\x1bQXML!&'ca{zh {t"))

改為

template: t._.template('<h2 style="margin:-1px auto 0;"><%= 到此一游 %></h2>')

最后

這樣,即免費(fèi)完成。

總結(jié)

以上是生活随笔為你收集整理的CKFinder3.5.1整合springboot修复bug免费的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。