Hi,
I’ve been struggling to use nginx as reverse proxy for SSL and authentication 
with mercurial.
Problem was — mercurial does not accept REMOTE_USER which nginx passes after 
authentication.

My nginx config is:

        location / {
            auth_basic             "HG";
            auth_basic_user_file   htpasswd;
            proxy_pass             http://127.0.0.1:8000;
            proxy_redirect         off;
            proxy_buffering        off;
            proxy_set_header       Host $host;
            proxy_set_header       X-Real-IP $remote_addr;
            proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header       X-Forwarded-Ssl on;
            proxy_set_header       Remote_User $remote_user;   #### THIS is for 
Remote_User which mercurial should check
            proxy_set_header       X-Forwarded-User $remote_user;
        }

then I debug and see that mercurial do not accept it that from http header, and 
I applied 
patch “env['REMOTE_USER'] = self.headers.getheader('REMOTE_USER’)" to 
mercurial\hgweb\server.py [line:125] as follows

        env['REMOTE_HOST'] = self.client_address[0]
        env['REMOTE_ADDR'] = self.client_address[0]
        env['REMOTE_USER'] = self.headers.getheader('REMOTE_USER')
        if query:
            env['QUERY_STRING'] = query

After that patch I can serve multiple repositories listed in hgweb.conf and 
have authorization based on user which nginx passes as proxy.

Please comment if that could be accepted as permanent patch, or advise if 
better solution is available.

Also, in mercurial\hgweb\server.py [line:142] I have:
 
        for header in [h for h in self.headers.keys()
                       if h not in ('content-type', 'content-length')]:
            hkey = 'HTTP_' + header.replace('-', '_').upper()
            hval = self.headers.getheader(header)
            hval = hval.replace('\n', '').strip()
            if hval:
                env[hkey] = hval

Not sure why all keys in the header go with prefix HTTP_, I think keys like 
‘REMOTE_USER’ should go as is.

Best,
~Dmitriy
_______________________________________________
Mercurial mailing list
[email protected]
https://www.mercurial-scm.org/mailman/listinfo/mercurial

Reply via email to