Thursday, July 8, 2021

cmsimde 修改

過去使用 CMSimpleCMSimple XH 當作網際內容管理系統好長一段時間, 主要看重的是它不需要資料庫系統, 只利用 H1, H2 與 H3 等三個 html 標註進行分頁, 架構非常簡單. 之後用 Python 與 CherryPy 改寫後, 又用了一陣子, 直到框架換成 Flask, 並且納入 [Pelican] Blog 與 Reveal.js 後, 改為目前的 cmsimde.

與 bug 共存

cmsimde 中採用 Tinymce 4.X 作為網際編輯器, 目前雖然已經修改為能夠與 IPv6 網際環境相容, 但是其中的 plugin 已經與最新的 Tinymce 5.X 不相容, 亦即, 假如這些 Javascript 套件發生問題, 就必須自己動手修改. 已經沒有官方原始碼或 cdn 可以引用. 但由於當年所使用的 Javascript, 有些是 minimized 過的版本, 所以某些情況下, 無法進入修正的部分, 就必須設法與 bug 共存.

cmsimde 是在 2013 年 Fall, 一行一行從無到有刻出來的, 照理說每一個程式功能都可以任意修改, 但在今天想要讓三個倉儲的動態網頁同時利用不同的埠號開啟, 卻吃了閉門羹. 該不會這裡又存在另外一個 bug.

確實沒有完全弄清楚

經常掛在嘴邊的是: 對技術越熟的所謂專家, 其實大多都是非常謙虛的. 因為每天幾乎都碰到許多暫時無解的問題. 何況現在科技日新月異, 真相撲朔迷離, 而且網路上的垃圾比有用的資料多上許多, 因此各行業所謂專家的有效期都非常短. 不管上不上台唱歌, 稍有不慎, 就會從神壇跌落.

好了, cmsimde 在今天改版之前, 只要同時在一個瀏覽器上啟動兩個以上的動態網頁, 其中一個網站的登入狀態, 會因為另外一個不同埠號的 cmsimde 登入而退出. 追查原因, 是瀏覽器中名稱為 session 的 cookie 值改變, 讓其先前已經登入的 cmsimde 因近端的登入 cookie 值改變而自動 logout.

第一個想到的是, 在近端與遠端同一端的情況下, 會不會只要將登入後對應 session 的 key 附加一個隨機字串, 或可達到多 cmsimde 同時登入編輯模式的目標. 但是, 卻行不通. 無論如何更改 key 的值, 仍然第二套動態 cmsimde 登入, 該 session 值就會變更, 導致同時只能一套 cmsimde 保持在登入狀態.

session 與 cookie 的實況

為了設法達到上述多個 cmsimde 可以同時保持登入狀態的功能, 只能重新讀了 re-introduction to HTTP-cookie 以及 Flask 原始碼. 想要找到這個名稱為 session 的 cookie 到底從何而來.

終於在 Leo Editor recursive importer 的協助下, 找到 Flask app.py 第 335 行 中確實有個名稱為 session 的 cookie. 接下來則是要找看看, 到底這個 cookie 是如何設定.

Leo Editor 中的 recursive importer 是這樣寫的:

'''Recursively import all python files in a directory and clean the result.'''

c.recursiveImport(
    dir_ = r'./',
    kind = '@clean', # The new best practice.
    safe_at_file = True,
    theTypes = ['.py']
)

搜尋 Flask 程式碼, 也可以發現 Flask session.py 第 98 行 明確寫著, 假如沒有設定 secret_key, 網際系統的 session 就無法產生. 從 Flask session.py 第 353 行 也可以發現 session 的值來自 get_signing_serializer(app), 而 Flask session.py 第 335 行 則清楚標示, 原來 cookie key 為 session 的 value 取決於 secret_key.

經過上述的搜尋, 只要將 cmsimde 的 secret_key 在近端需要同時開啟多個動態網頁時, 給予定值, 就可以達到目的. 但是若在遠端執行時, 則仍必須回復動態值如下, 以保障伺服器與客戶端資料傳輸的安全性.

secret_key = os.urandom(24).hex()
app.secret_key = secret_key

No comments:

Post a Comment