Compare commits
	
		
			1 Commits
		
	
	
		
			master
			...
			e9c64d6deb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					e9c64d6deb | 
							
								
								
									
										7
									
								
								cic_auth_helper/error.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								cic_auth_helper/error.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					class NotFoundError(FileNotFoundError):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, code, msg, headers):
 | 
				
			||||||
 | 
					        super(NotFoundError, self).__init__(msg)
 | 
				
			||||||
 | 
					        self.code = code
 | 
				
			||||||
 | 
					        self.msg = msg
 | 
				
			||||||
 | 
					        self.headers = headers
 | 
				
			||||||
@ -4,6 +4,9 @@ import urllib.request
 | 
				
			|||||||
import os
 | 
					import os
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# local imports
 | 
				
			||||||
 | 
					from cic_auth_helper.error import NotFoundError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logg = logging.getLogger(__name__)
 | 
					logg = logging.getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -15,6 +18,12 @@ def add_x_headers(env, header_f):
 | 
				
			|||||||
            header_orig = m[1].replace('_', '-')
 | 
					            header_orig = m[1].replace('_', '-')
 | 
				
			||||||
            header_f(header_orig, env[x])
 | 
					            header_f(header_orig, env[x])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ReverseProxyHandler(urllib.request.BaseHandler):
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def http_error_404(self, request, response, code, msg, hdrs):
 | 
				
			||||||
 | 
					        raise NotFoundError(code, msg, response.getheaders())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
class ReverseProxy:
 | 
					class ReverseProxy:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,6 +34,7 @@ class ReverseProxy:
 | 
				
			|||||||
        self.ignore_proxy_headers = []
 | 
					        self.ignore_proxy_headers = []
 | 
				
			||||||
        for h in ignore_proxy_headers:
 | 
					        for h in ignore_proxy_headers:
 | 
				
			||||||
            self.ignore_proxy_headers.append(h.lower())
 | 
					            self.ignore_proxy_headers.append(h.lower())
 | 
				
			||||||
 | 
					        self.opener = urllib.request.build_opener(ReverseProxyHandler())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def proxy_pass(self, env, headers=[]):
 | 
					    def proxy_pass(self, env, headers=[]):
 | 
				
			||||||
@ -34,7 +44,7 @@ class ReverseProxy:
 | 
				
			|||||||
        add_x_headers(env, req.add_header)
 | 
					        add_x_headers(env, req.add_header)
 | 
				
			||||||
        req.add_header('Content-Type', env.get('CONTENT_TYPE', 'application/octet-stream'))
 | 
					        req.add_header('Content-Type', env.get('CONTENT_TYPE', 'application/octet-stream'))
 | 
				
			||||||
        req.data = env.get('wsgi.input')
 | 
					        req.data = env.get('wsgi.input')
 | 
				
			||||||
        res = urllib.request.urlopen(req)
 | 
					        res = self.opener.open(req)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        logg.debug('headers before reverse proxy {}'.format(headers))
 | 
					        logg.debug('headers before reverse proxy {}'.format(headers))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,9 @@ from usumbufu.retrieve.file import FileFetcher
 | 
				
			|||||||
from usumbufu.adapters.uwsgi import UWSGIHTTPAuthorization
 | 
					from usumbufu.adapters.uwsgi import UWSGIHTTPAuthorization
 | 
				
			||||||
from usumbufu.adapters.uwsgi import UWSGIAdapter
 | 
					from usumbufu.adapters.uwsgi import UWSGIAdapter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# local imports
 | 
				
			||||||
 | 
					from cic_auth_helper.error import NotFoundError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logging.basicConfig(level=logging.WARNING)
 | 
					logging.basicConfig(level=logging.WARNING)
 | 
				
			||||||
logg = logging.getLogger()
 | 
					logg = logging.getLogger()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -135,6 +138,7 @@ def application(env, start_response):
 | 
				
			|||||||
        #    return [b'']
 | 
					        #    return [b'']
 | 
				
			||||||
        (challenge, expire) = challenger.request(env['REMOTE_ADDR'])
 | 
					        (challenge, expire) = challenger.request(env['REMOTE_ADDR'])
 | 
				
			||||||
        headers.append(('WWW-Authenticate', hoba_auth_request_string(challenge, expire.timestamp(), realm=config.get('HTTP_AUTH_REALM'))),)
 | 
					        headers.append(('WWW-Authenticate', hoba_auth_request_string(challenge, expire.timestamp(), realm=config.get('HTTP_AUTH_REALM'))),)
 | 
				
			||||||
 | 
					        logg.debug('headers {}'.format(headers))
 | 
				
			||||||
        start_response('401 authenticate or I will SCREAM_SNAKE_CASE at you', headers)
 | 
					        start_response('401 authenticate or I will SCREAM_SNAKE_CASE at you', headers)
 | 
				
			||||||
        return [b'']
 | 
					        return [b'']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -156,9 +160,14 @@ def application(env, start_response):
 | 
				
			|||||||
    response_status = '200 OK'
 | 
					    response_status = '200 OK'
 | 
				
			||||||
    content = b''
 | 
					    content = b''
 | 
				
			||||||
    if reverse_proxy != None:
 | 
					    if reverse_proxy != None:
 | 
				
			||||||
        (response_status, headers, content) = reverse_proxy.proxy_pass(env, headers)
 | 
					        try:
 | 
				
			||||||
 | 
					            (response_status, headers, content) = reverse_proxy.proxy_pass(env, headers)
 | 
				
			||||||
 | 
					        except NotFoundError as e:
 | 
				
			||||||
 | 
					            response_status = '404 ' + e.msg
 | 
				
			||||||
 | 
					            headers = e.headers
 | 
				
			||||||
 | 
					            content = b''
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        content = str(auth_resource).encode('utf-8')
 | 
					        content = str(auth_resource).encode('utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    start_response('200 OK', headers)
 | 
					    start_response(response_status, headers)
 | 
				
			||||||
    return [content]
 | 
					    return [content]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user