]> git.eshelyaron.com Git - emacs.git/commitdiff
SQL mode supports sending passwords in process
authorMichael R. Mauger <michael@mauger.com>
Tue, 19 Oct 2021 04:18:17 +0000 (00:18 -0400)
committerMichael R. Mauger <michael@mauger.com>
Tue, 19 Oct 2021 04:18:17 +0000 (00:18 -0400)
etc/NEWS
lisp/progmodes/sql.el
test/lisp/progmodes/sql-tests.el

index 80d4ca9bb24dcff063b125f71bb74e330571d59f..68168b4bbead1fa60bebbbf33bf7ce69a3232abc 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -246,6 +246,12 @@ This function allows defining a number of keystrokes with one form.
 ** New macro 'defvar-keymap'.
 This macro allows defining keymap variables more conveniently.
 
+---
+**** sql now supports sending of passwords in-process.
+To improve security, if a sql product has ':password-in-comint' set to
+true, a password supplied via the minibuffer will be sent in-process,
+as opposed to via the command-line.
+
 ---
 ** 'kbd' can now be used in built-in, preloaded libraries.
 It no longer depends on edmacro.el and cl-lib.el.
index 0789c95e87af9f52d8edfb8c9a756759ed931111..f5888a0ce7ac5f73cad1641c78c29a05a7ad7949 100644 (file)
@@ -4659,6 +4659,14 @@ the call to \\[sql-product-interactive] with
               (get-buffer new-sqli-buffer)))))
     (user-error "No default SQL product defined: set `sql-product'")))
 
+(defun sql-comint-automatic-password (_)
+  "Intercept password prompts when we know the password.
+This must also do the job of detecting password prompts."
+  (when (and
+         sql-password
+         (not (string= "" sql-password)))
+    sql-password))
+
 (defun sql-comint (product params &optional buf-name)
   "Set up a comint buffer to run the SQL processor.
 
@@ -4683,6 +4691,13 @@ buffer.  If nil, a name is chosen for it."
       (setq buf-name (sql-generate-unique-sqli-buffer-name product nil)))
     (set-text-properties 0 (length buf-name) nil buf-name)
 
+    ;; Create the buffer first, because we want to set it up before
+    ;; comint starts to run.
+    (set-buffer (get-buffer-create buf-name))
+    ;; Set up the automatic population of passwords, if supported.
+    (when (sql-get-product-feature product :password-in-comint)
+      (setq comint-password-function #'sql-comint-automatic-password))
+
     ;; Start the command interpreter in the buffer
     ;;   PROC-NAME is BUF-NAME without enclosing asterisks
     (let ((proc-name (replace-regexp-in-string "\\`[*]\\(.*\\)[*]\\'" "\\1" buf-name)))
index 99b79b61d65a28b7e4c64ac248b1ac3b42e832a2..aed82b18825e94b5620376e499c64471e500eb0a 100644 (file)
@@ -416,6 +416,16 @@ The ACTION will be tested after set-up of PRODUCT."
 
     (kill-buffer "*SQL: exist*")))
 
+(ert-deftest sql-tests-comint-automatic-password ()
+  (let ((sql-password nil))
+    (should-not (sql-comint-automatic-password "Password: ")))
+  (let ((sql-password ""))
+    (should-not (sql-comint-automatic-password "Password: ")))
+  (let ((sql-password "password"))
+    (should (equal "password" (sql-comint-automatic-password "Password: "))))
+  ;; Also, we shouldn't care what the password is - we rely on comint for that.
+  (let ((sql-password "password"))
+    (should (equal "password" (sql-comint-automatic-password "")))))
 
 (provide 'sql-tests)
 ;;; sql-tests.el ends here