소스 검색

feat: Implement the front end

Li4n0 6 년 전
부모
커밋
4f7f207d22
3개의 변경된 파일55개의 추가작업 그리고 20개의 파일을 삭제
  1. 1 1
      .gitignore
  2. 10 13
      hugo-encryptor.py
  3. 44 6
      shortcodes/hugo-encryptor.html

+ 1 - 1
.gitignore

@@ -1,3 +1,3 @@
 node_modules/
 .DS_Store
-
+test.py

+ 10 - 13
hugo-encryptor.py

@@ -6,36 +6,33 @@ from bs4 import BeautifulSoup
 from Crypto.Cipher import AES
 
 
-class DESCrypt(object):
+class AESCrypt(object):
     LEN = 16
     def __init__(self, key: str):
-        if len(key) > DESCrypt.LEN:
+        if len(key) > AESCrypt.LEN:
             raise ValueError('password too long')
 
-        self.key = key.encode().ljust(DESCrypt.LEN, b'\x00')
+        self.key = key.encode().ljust(AESCrypt.LEN, b'\x00')
         self.mode = AES.MODE_CBC
 
     def encrypt(self, text: bytes):
         cryptor = AES.new(self.key, self.mode, self.key)
-        padlen = DESCrypt.LEN - len(text) % DESCrypt.LEN
-
-        padlen = padlen if padlen != 0 else DESCrypt.LEN
-
-        for i in range(padlen):
-            text += chr(i+1).encode()
+        padlen = AESCrypt.LEN - len(text) % AESCrypt.LEN
+        padlen = padlen if padlen != 0 else AESCrypt.LEN
+        text += chr(padlen)*padlen
 
         return cryptor.encrypt(text)
 
 
 if __name__ == '__main__':
-    for dirpath, dirnames, filenames in os.walk('.'):
+    for dirpath, dirnames, filenames in os.walk('./public/post'):
         for filename in filenames:
             if not filename.lower().endswith('.html'):
                 continue
 
             fullpath = os.path.join(dirpath, filename)
 
-            soup = BeautifulSoup(open(fullpath), features="html5lib")
+            soup = BeautifulSoup(open(fullpath))
             block = soup.find('div', {'id': 'hugo-encryptor'})
 
             if block is None:
@@ -44,8 +41,8 @@ if __name__ == '__main__':
             else:
                 print(fullpath)
 
-                cryptor = DESCrypt(block['data-password'])
-                text = ''.join(map(str, block.contents)).encode()
+                cryptor = AESCrypt(block['data-password'])
+                text = ''.join(map(str, block.contents))
                 written = base64.b64encode(cryptor.encrypt(text))
 
                 del block['data-password']

+ 44 - 6
shortcodes/hugo-encryptor.html

@@ -1,11 +1,49 @@
-该文章已被加密,请输入密码以查看。
+{{/*
+    ## Hugo Encrypt
+    ### Params:
+    - `password`:
 
-<!-- 以上内容出现在首页等可能出现 summary 的地方 -->
+        require param
+    - Simple
 
-<!--more-->
+        {{% hugo-encryptor "your password" %}}
+your content
+{{% /hugo-encryptor %}}
 
-<!-- 解密用的代码在这,正文里出现 -->
+*/}}
+{{/* DEFAULTS */}}
 
-<div id="hugo-encryptor" data-password="{{ .Get 0 }}">
-{{ .Inner }}
+<p>文章被密码保护</p>
+<input id="hugo-encryptor-password" placeholder="请输入密码" />
+<button
+  onclick="hugoDecrypt(document.getElementById('hugo-encryptor-password').value)"
+>
+  提交
+</button>
+
+<div id="hugo-encryptor" data-password="{{ .Get 0 }}" style="display:none;">
+  <p style="display:none;">The quick brown fox jumps over the lazy dog</p>
+  {{ .Inner }}
 </div>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
+<script>
+    <!--
+  let encryptor = document.getElementById("hugo-encryptor");
+  const hugoDecrypt = function(password) {
+    let cipher_text = encryptor.innerText;
+    password = password.padEnd(16, "\0");
+    let key = CryptoJS.enc.Utf8.parse(password);
+    let decryptedData = CryptoJS.AES.decrypt(cipher_text, key, {
+      iv: key,
+      mode: CryptoJS.mode.CBC,
+      padding: CryptoJS.pad.Pkcs7
+    });
+    let decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
+    if (decryptedStr.includes("The quick brown fox jumps over the lazy dog")) {
+      encryptor.parentElement.innerHTML = decryptedStr;
+    } else {
+      alert("密码错误!");
+    }
+  };
+  -->
+</script>