Explorar el Código

Merge branch 'master' into authenticate-comment-parents

El RIDO hace 1 semana
padre
commit
6e9c1bb3d7
Se han modificado 6 ficheros con 170 adiciones y 70 borrados
  1. 1 0
      CHANGELOG.md
  2. 57 67
      js/package-lock.json
  3. 1 1
      js/package.json
  4. 3 2
      js/privatebin.js
  5. 89 0
      js/test/Controller.js
  6. 19 0
      js/test/TestHelperFunctions.js

+ 1 - 0
CHANGELOG.md

@@ -8,6 +8,7 @@
 * FIXED: Creating a document failed with a JavaScript error when the `discussion`, `password`, e-mail or QR code option is disabled, as the top navigation accessed the omitted elements
 * FIXED: Slovenian plural forms were stored in the wrong order, i.e. "1 uri" instead of "1 ura" for one hour (#1951)
 * FIXED: Lithuanian plural formula selected the "few" form for numbers ending in 0 above 10, i.e. "20 sekundės" instead of "20 sekundžių" (#1956)
+* FIXED: new paste button resets it to default formatter/style instead of hardcoding 'plaintext' (#2026)
 * FIXED: Comments must now be unique in cipher text within a document, not reuse existing cipher texts (#2100)
 
 ## 2.1.0 (2026-10-18)

+ 57 - 67
js/package-lock.json

@@ -10,7 +10,7 @@
       "license": "zlib-acknowledgement",
       "devDependencies": {
         "@eslint/js": "^10.0.1",
-        "@peculiar/webcrypto": "^1.5.0",
+        "@peculiar/webcrypto": "^2.0.0",
         "eslint": "^10.13.0",
         "fast-check": "^4.10.2",
         "globals": "^17.13.0",
@@ -930,51 +930,59 @@
       "license": "MIT"
     },
     "node_modules/@peculiar/asn1-schema": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz",
-      "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-3.0.0.tgz",
+      "integrity": "sha512-VQgBSyf3teIp7219Y0rHFruJUVY/teYkKvvvObuwtwx6+jOt1f1+jvZoTBRua370H0a8eYpnUWoe0G6GqV0yaA==",
       "dev": true,
+      "license": "MIT",
+      "peer": true,
       "dependencies": {
-        "@peculiar/utils": "^2.0.2",
-        "asn1js": "^3.0.6",
-        "tslib": "^2.8.1"
+        "@peculiar/utils": "^4.1.0"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "peerDependencies": {
+        "asn1js": "^4.0.0"
       }
     },
     "node_modules/@peculiar/json-schema": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz",
-      "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-3.0.0.tgz",
+      "integrity": "sha512-G9dN0s7Znz2Uy1sGvTsiHYKoTYcoZyqUYj635F7R5pDh3uwunDBBH3Cf7+xZQYMRYrZJeBVuaZmf+Evkf0Zcuw==",
       "dev": true,
-      "dependencies": {
-        "tslib": "^2.0.0"
-      },
+      "license": "MIT",
+      "peer": true,
       "engines": {
-        "node": ">=8.0.0"
+        "node": "^20.19.0 || >=22.12.0"
       }
     },
     "node_modules/@peculiar/utils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz",
-      "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-4.1.0.tgz",
+      "integrity": "sha512-y2oDqAwp+VPZMUYFGFFMYlXM8xinwb7ehb69+2EhbEL+n7KsykCQX5F0u3/B+BFHxCkwTyft3T1id0ugyzNHVQ==",
       "dev": true,
-      "dependencies": {
-        "tslib": "^2.8.1"
+      "license": "MIT",
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
       }
     },
     "node_modules/@peculiar/webcrypto": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz",
-      "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-2.0.0.tgz",
+      "integrity": "sha512-JvQXHq92+jj5Db3REr5cO/chYsaTOQdaBNXiUtfUreDibZ5iHpQDB6U5PZqJVSdSoOcjm0SOu84kmJlA+MyIBw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@peculiar/asn1-schema": "^2.7.0",
-        "@peculiar/json-schema": "^1.1.12",
-        "@peculiar/utils": "^2.0.2",
-        "tslib": "^2.8.1",
-        "webcrypto-core": "^1.9.2"
+        "@peculiar/utils": "^4.1.0"
       },
       "engines": {
-        "node": ">=14.18.0"
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "peerDependencies": {
+        "@peculiar/asn1-schema": "^3.0.0",
+        "@peculiar/json-schema": "^3.0.0",
+        "webcrypto-core": "^2.0.0"
       }
     },
     "node_modules/@types/esrecurse": {
@@ -1092,17 +1100,17 @@
       "dev": true
     },
     "node_modules/asn1js": {
-      "version": "3.0.10",
-      "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz",
-      "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-4.0.0.tgz",
+      "integrity": "sha512-81NlooYbXCbBWL2+p1/ivGyT4AR2+bnfKYlPq/3rCoIPJSuLbdS8G70XYt561wOJnbaYfBS2HQDMENaX5hM2vA==",
       "dev": true,
+      "license": "BSD-3-Clause",
+      "peer": true,
       "dependencies": {
-        "pvtsutils": "^1.3.6",
-        "pvutils": "^1.1.5",
-        "tslib": "^2.8.1"
+        "@peculiar/utils": "^4.1.0"
       },
       "engines": {
-        "node": ">=12.0.0"
+        "node": "^20.19.0 || >=22.12.0"
       }
     },
     "node_modules/balanced-match": {
@@ -3358,24 +3366,6 @@
       ],
       "license": "MIT"
     },
-    "node_modules/pvtsutils": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
-      "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^2.8.1"
-      }
-    },
-    "node_modules/pvutils": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
-      "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==",
-      "dev": true,
-      "engines": {
-        "node": ">=16.0.0"
-      }
-    },
     "node_modules/qified": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz",
@@ -3761,12 +3751,6 @@
       "integrity": "sha512-93WeyHNuRggPEsfCe+yHxCgM2s6H3Q8Wmlt6b6ObJL8qc7eZlRaFjQxwTrB+zbvGtlDRnAkMoYYo3+2uH/fEwA==",
       "dev": true
     },
-    "node_modules/tslib": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "dev": true
-    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -3871,16 +3855,22 @@
       }
     },
     "node_modules/webcrypto-core": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz",
-      "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-2.0.0.tgz",
+      "integrity": "sha512-dQv+gpwrrDy5nCmy/qvlUU3/Sx6CMISXkku1dSF9vjkhCMUcw7pA7A/qnwe/nKjriN6la534i+cYH58gTxyhXg==",
       "dev": true,
+      "license": "MIT",
+      "peer": true,
       "dependencies": {
-        "@peculiar/asn1-schema": "^2.7.0",
-        "@peculiar/json-schema": "^1.1.12",
-        "@peculiar/utils": "^2.0.2",
-        "asn1js": "^3.0.10",
-        "tslib": "^2.8.1"
+        "@peculiar/utils": "^4.1.0"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "peerDependencies": {
+        "@peculiar/asn1-schema": "^3.0.0",
+        "@peculiar/json-schema": "^3.0.0",
+        "asn1js": "^4.0.0"
       }
     },
     "node_modules/webidl-conversions": {

+ 1 - 1
js/package.json

@@ -8,7 +8,7 @@
   },
   "devDependencies": {
     "@eslint/js": "^10.0.1",
-    "@peculiar/webcrypto": "^1.5.0",
+    "@peculiar/webcrypto": "^2.0.0",
     "eslint": "^10.13.0",
     "fast-check": "^4.10.2",
     "globals": "^17.13.0",

+ 3 - 2
js/privatebin.js

@@ -5943,8 +5943,9 @@ window.PrivateBin = (function () {
             TopNav.resetInput();
 
             // reset format
-            PasteViewer.setFormat('plaintext');
-            TopNav.setFormat('plaintext');
+            const defaultFormat = Model.getFormatDefault() || 'plaintext';
+            PasteViewer.setFormat(defaultFormat);
+            TopNav.setFormat(defaultFormat);
 
             TopNav.showCreateButtons();
 

+ 89 - 0
js/test/Controller.js

@@ -0,0 +1,89 @@
+'use strict';
+
+const { loadTemplateFragment } = require('./TestHelperFunctions');
+
+require('../common');
+
+describe('Controller', function () {
+    describe('newPaste', function () {
+        after(function () {
+            cleanup();
+        });
+
+        it(
+            'resets the formatter to the configured default',
+            function () {
+                const clean = cleanup('', {url: 'https://example.com/'});
+                document.body.innerHTML = `
+                    <div id="errormessage" class="hidden"></div>
+                    <div id="loadingindicator" class="hidden"></div>
+                    <div id="status" class="hidden"></div>
+                    <div id="remainingtime" class="hidden"></div>
+                    <div id="pastesuccess" class="hidden"></div>
+                    <button id="shortenbutton"></button>
+                    <ul id="editorTabs">
+                        <li id="messagetab"><a></a></li>
+                        <li id="previewtab"><a></a></li>
+                    </ul>
+                    <textarea id="message"></textarea>
+                    <div id="preview" class="hidden"></div>
+                    <div id="placeholder" class="hidden"></div>
+                    <div id="prettymessage" class="hidden"><pre id="prettyprint"></pre></div>
+                    <div id="plaintext" class="hidden"></div>
+                    <div id="attachment" class="hidden"></div>
+                    <div id="attachmentPreview" class="hidden"></div>
+                    <div id="discussion" class="hidden"><div id="commentcontainer"></div></div>
+                    <div id="templates">
+                        <div id="commenttemplate"><div></div></div>
+                        <div id="commenttailtemplate"><button></button></div>
+                        <div id="replytemplate"><div></div></div>
+                    </div>
+                    <div id="attach" class="hidden"></div>
+                    ${loadTemplateFragment('burnafterreadingoption')}
+                    <button id="clonebutton"></button>
+                    <div id="customattachment" class="hidden"></div>
+                    <div id="expiration" class="hidden"></div>
+                    <button id="fileremovebutton"></button>
+                    <div id="filewrap"></div>
+                    <div id="formatter" class="hidden">
+                        <select id="pasteFormatter">
+                            <option value="plaintext">Plain Text</option>
+                            <option value="markdown" selected="selected">Markdown</option>
+                        </select>
+                    </div>
+                    <button id="newbutton" class="hidden"></button>
+                    ${loadTemplateFragment('opendiscussionoption')}
+                    <div id="password" class="hidden"></div>
+                    <input id="passwordinput">
+                    <button id="rawtextbutton"></button>
+                    <button id="downloadtextbutton"></button>
+                    <button id="retrybutton"></button>
+                    <button id="sendbutton" class="hidden"></button>
+                    <button id="qrcodelink"></button>
+                    <a id="emaillink"></a>
+                    <select id="pasteExpiration">
+                        <option value="1week" selected="selected">1 week</option>
+                    </select>
+                    <span id="pasteExpirationDisplay"></span>
+                `;
+
+                PrivateBin.Alert.init();
+                PrivateBin.Model.init();
+                PrivateBin.AttachmentViewer.init();
+                PrivateBin.DiscussionViewer.init();
+                PrivateBin.Editor.init();
+                PrivateBin.PasteStatus.init();
+                PrivateBin.PasteViewer.init();
+                PrivateBin.TopNav.init();
+
+                PrivateBin.PasteViewer.setFormat('syntaxhighlighting');
+                PrivateBin.Controller.newPaste();
+
+                assert.strictEqual(PrivateBin.PasteViewer.getFormat(), 'markdown');
+                assert.strictEqual(document.getElementById('pasteFormatter').value, 'markdown');
+
+                clean();
+            }
+        );
+    });
+});

+ 19 - 0
js/test/TestHelperFunctions.js

@@ -0,0 +1,19 @@
+'use strict';
+const fs = require('node:fs');
+const path = require('node:path');
+
+function loadTemplateFragment(id) {
+    const template = fs.readFileSync(path.resolve(__dirname, '../../tpl/bootstrap5.php'), 'utf8');
+    const match = template.match(new RegExp(`<div id="${id}"[^>]*>[\\s\\S]*?<\\/div>`));
+
+    if (!match) {
+        throw new Error(`Template fragment #${id} not found`);
+    }
+
+    return match[0]
+        .replace(/<\?php[\s\S]*?\?>/g, '')
+        .replace(/<\?=[\s\S]*?\?>/g, '')
+        .replace(/>\s+</g, '><')
+        .trim();
+}
+exports.loadTemplateFragment = loadTemplateFragment;