Elisp: จะแยกข้อมูลที่ละเอียดอ่อนออกจากไฟล์ init อย่างไร (เช่นข้อมูลรับรองการเข้าสู่ระบบ)


11

ฉันต้องการกำหนดฟังก์ชั่นเข้าสู่ระบบในสคริปต์ init ของฉัน แต่ฉันไม่ต้องการ hardcode หนังสือรับรองการเข้าสู่ระบบของฉัน ฉันคิดว่าวิธีแก้ปัญหาที่ดีคือการให้สคริปต์ 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โมดูลที่นี่ ฉันกำลังปรับเปลี่ยนรหัส autogenerated ที่เกิดจากการกำหนดค่า Emacs ในและM-x customize-group RET znc RETM-x customize-variable RET tls-program RET

ปัญหาของฉันกับรหัสข้างต้นคือตัวแปรไม่โหลดภายในcustom-set-variablesฟังก์ชั่นของฉันข้างต้น การโหลดค่าที่เหมาะสมจากไฟล์ดูเหมือนว่าจะทำงานได้ดี แต่ฉันไม่สามารถใช้มันเป็นข้อโต้แย้งได้ ฉันเชื่อว่าสิ่งนี้เกี่ยวข้องกับquoteฟังก์ชันซึ่งป้องกันการประเมินเนื้อหา ฉันพยายาม 'backquote' ( ,) เพื่อบังคับให้ประเมินผล แต่ก็ไม่ทำงานเช่นกัน ข้อเสนอแนะใด ๆ เพื่อแก้ไขข้อผิดพลาดนี้หรือเสนอแนวทางอื่นจะมีประโยชน์มาก

คำตอบ:


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 สักแห่ง!

หากคุณมีพวงกุญแจของการเรียงลำดับบางอย่างคุณอาจได้รับข้อมูลประจำตัวจากที่นั่นโดยใช้ Secret Service 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"))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.