Elisp: Як виключити конфіденційну інформацію з файлу init? (тобто облікові дані для входу)


11

Я хочу визначити функцію входу в моєму скрипті init, але я не хочу жорстко кодувати свої вхідні дані. Я думаю, що вдалим способом є те, щоб мій скрипт init був прочитаний у моїх облікових даних для входу з локального файлу та зберігав ці значення як змінні. Таким чином, я можу виключити файл із мого індексу git, який зберігає мої облікові дані для входу.

Чи є якісь пропозиції щодо такого підходу чи способи встановлення аргументу значення, яке визначене у файлі?

Наприклад, я хотів би використати наступне у своєму init.el:

;; Set up our login variables here:
(setq file-location "~/.emacs.d/.login")
(setq erc-username "default-name")
(setq erc-password "default-password")
(setq erc-url "default-url")
(setq erc-port "default-port")
(defun read-lines (filePath)
  "Return a list of lines of a file at filePath."
  (with-temp-buffer
    (insert-file-contents filePath)
    (split-string (buffer-string) "\n" t)))
(if (file-exists-p file-location)
    (progn (setq login-credentials (read-lines file-location))
           (setq erc-username (nth 0 login-credentials))
           (setq erc-password (nth 1 login-credentials))
           (setq erc-url (nth 2 login-credentials))
           (setq erc-port (nth 3 login-credentials)))
    (message "No ERC login credentials provided. Please add login credentials as '<username>\n<password>\n<url>\n<port>' in ~/.emacs.d/.login to activate ERC mode."))

;; These message the values from my file correctly.
;; Everything up to this point works as expected
(message erc-username) 
(message erc-password)
(message erc-url)
(message erc-port)

;; Use our login variables here 
;; This doesn't work because the 'quote' function prevents evaluation of my variables, and a 'backquote' did not resolve it either
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(markdown-command "/usr/bin/pandoc")
 '(tls-program (quote ("openssl s_client -connect %h:%p -no_ssl2 -ign_eof -CAfile ~/.ssl/spi_ca.pem -cert ~/.ssl/znc.pem")))
 '(znc-servers (quote ((,erc-url ,erc-port t ((irc\.freenode\.net ,erc-username ,erc-password)))))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

Зверніть увагу , що мій приклад використовує znc.elмодуль тут . Я змінюю автогенерований код, що виникає в результаті конфігурацій Emacs в M-x customize-group RET znc RETі M-x customize-variable RET tls-program RET.

Моя проблема з вищевказаним кодом полягає в тому, що змінні не завантажуються всередині моєї custom-set-variablesфункції вище. Завантаження належних значень з файлу, здається, працює добре, але я не можу використовувати їх як аргумент. Я вважаю, що це пов'язано з quoteфункцією, яка перешкоджає оцінці її змісту. Я спробував «зворотну цитату» ( ,), щоб примусити оцінку, але вона також не працює. Будь-які пропозиції виправити цю помилку чи запропонувати інший підхід були б дуже корисними.

Відповіді:


11

Emacs поставляється разом auth-source.el. Я б не намагався розгорнути свою власну версію.

auth-sourceполегшує читання з ~/.authinfo.gpg. Хороші програми вже підтримуватимуть authinfo. Швидкий пошук говорить про те, що ERC може використовуватиauthinfo .

Для вашого випадкового виключення шельфових програм MELPA ви можете легко використовувати authinfo , щоб отримати пароль від ~/.authinfo.gpgтак

(with-eval-after-load 'random-mode
  (require 'auth-source)
  (let ((auth (nth 0 (auth-source-search :host "secrets.com"
                                         :requires '(user secret)))))
    (setq random-psk (funcall (plist-get auth :secret))
          random-user (plist-get auth :user))))

де ~/.authinfo.gpgміститься наступний рядок:

## Used by random-mode.el
machine secrets.com login rasmus password my-secret-password

Звичайно почуття безпеки - брехня. Ваш пароль зараз зберігається в простому тексті в змінній:

random-psk => "my-secret-password"

Але принаймні це десь не в якомусь git-repo або dropbox!

Якщо у вас є якийсь брелок, ви можете отримати звідти облікові дані за допомогою API секретної служби (див. (info "(auth) Secret Service API")).


6

custom-set-variablesце дивно - я не на 100% впевнений, що може вирішувати подібні випадки. Ви можете спробувати (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), але це вражає мене, як брудне хакерство.

Просто помістіть додаткову інформацію у файл із gpgрозширенням, збережіть його, введіть пароль та завантажте файл. Вам потрібно буде ввести пароль для файлу, коли ви завантажуєте його.

Наприклад, створіть файл sensitive.el.gpgіз вмістом:

(message "Hello, there!")

Збережіть файл, натисніть (або [OK]перейдіть на вкладку до) та введіть свій пароль. Не хвилюйтесь - перед збереженням він попросить підтвердження. Потім у своєму файлі init дайте

(load "sensitive.el.gpg")

Це завантажить файл при запуску, вимагаючи ввести свій пароль, щоб Emacs змог розшифрувати файл.

Якщо ви не хочете вводити свій пароль при запуску, я б дав ім'я функції виконувати вручну:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.