LoginSignup
8
7

More than 5 years have passed since last update.

Emacsで認証付きProxy越しにパッケージ管理する

Last updated at Posted at 2017-01-11

HTTP_PROXY環境変数だけでなんとかしたい。

背景

認証付きのProxyサーバー越しに、MelpaなどのPackage Repositoryにアクセスする場合、下記のリンクのような方法をとるのがよく見られるような気がする。

しかし、他の多くのソフトウェア(例えば、gitやyumなど)は、環境変数HTTP_PROXYを参照して、アクセスしてくれるのに、なんとなくemacsだけこのような方法を取るのが、気になってきた。

因みに、認証なしの場合は、HTTP_PROXYの設定だけでアクセスが可能である。
正確には、認証付きの場合でも、認証情報を含めないURLをHTTP_PROXYに設定しておいて(username:passwordの部分を含めないで)おけば都度(起動ごと?)にユーザーIDとパスワードを聞かれるので入力すれば可能である。

やったこと

というわけで、やったこととしては、起動時にHTTP_PROXYの設定の有無を確認して、URLをパースして設定するようにしました。

init.el
;; Proxy setting
(cond ((getenv "HTTP_PROXY")
       (let* ((url_ (url-generic-parse-url (getenv "HTTP_PROXY")))
              (auth_ (if (and (url-user url_) (url-password url_) )
                         (base64-encode-string
                          (format "%s:%s" (url-user url_) (url-password url_)))
                       nil))
              (host_ (format "%s:%s" (url-host url_) (url-portspec url_))))

         (defvar url-proxy-services
               (list (cons "no_proxy"  "^\\(localhost\\|10.*\\)")
                     (cons "http" host_)))
         (if auth_
             (defvar url-http-proxy-basic-auth-storage
               (list (list host_ (cons "Proxy" auth_)))))
         )))

一応これで、動いているっぽい。

書いていて、迷ったというか妥協したところ。

  • 認証なしのURLがHTTP_PROXYがに設定されている場合、ちゃんと動くかわからないが、手元にそういう環境がないため、気にしないことにする
  • 参考リンクだと、url-proxy-servicesへの設定はsetqでおこなっているのだが、flycheckを使っていると"assignment to free variable url-proxy-services'"というWarningがでる。そういう場合はdefvar`にしろと書いてあったので、そうしたが、正しい対処法だろうか?
    • もしかして: setq-default

別解答

CNTLMなどを使って、ローカルに認証を回避するProxyサーバーを立てるという解も考えられるかと思います。前述の通り、認証がなければもともとHTTP_PROXYだけで行けるはずなので。

環境変数設定だけでできる方がポータブルかな?と思ったのですが、URLにパスワードの平文を埋め込む方式だと.zshrcなどに記述すると、社外のリポジトリなどに置くのがためらわれるという難点もあるため、この方法も良さそう。

8
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7