MCPcopy Create free account
hub / github.com/bugy/script-server / IpBasedIdentification

Class IpBasedIdentification

src/auth/identification.py:37–122  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

35
36
37class IpBasedIdentification(Identification):
38 EXPIRES_DAYS = 14
39 COOKIE_KEY = 'client_id_token'
40 EMPTY_TOKEN = (None, None)
41
42 def __init__(self, ip_validator: TrustedIpValidator, user_header_name) -> None:
43 self._ip_validator = ip_validator
44 self._user_header_name = user_header_name
45
46 def identify(self, request_handler):
47 remote_ip = request_handler.request.remote_ip
48 new_trusted = self._ip_validator.is_trusted(remote_ip)
49
50 if new_trusted:
51 if request_handler.get_cookie(self.COOKIE_KEY):
52 request_handler.clear_cookie(self.COOKIE_KEY)
53 if self._user_header_name:
54 user_header = request_handler.request.headers.get(self._user_header_name, None)
55 if user_header:
56 return user_header
57 return self._resolve_ip(request_handler)
58
59 (client_id, days_remaining) = self._read_client_token(request_handler)
60 if client_id:
61 if days_remaining < (self.EXPIRES_DAYS - 2):
62 if self._can_write(request_handler):
63 self._write_client_token(client_id, request_handler)
64
65 return client_id
66
67 if not self._can_write(request_handler):
68 raise Exception('Cannot generate ID, because request_handler is not writable')
69
70 ip = self._resolve_ip(request_handler)
71 new_id = ip + '-' + uuid.uuid4().hex[:16]
72
73 LOGGER.info('Assigned user_id=%s to %s' % (new_id, str(audit_utils.get_all_audit_names(request_handler))))
74 self._write_client_token(new_id, request_handler)
75
76 return new_id
77
78 def identify_for_audit(self, request_handler):
79 remote_ip = request_handler.request.remote_ip
80 if self._ip_validator.is_trusted(remote_ip) and (self._user_header_name):
81 return request_handler.request.headers.get(self._user_header_name, None)
82 return None
83
84 def _resolve_ip(self, request_handler):
85 proxied_ip = tornado_utils.get_proxied_ip(request_handler)
86 if proxied_ip:
87 ip = proxied_ip
88 else:
89 ip = request_handler.request.remote_ip
90
91 return ip
92
93 def _read_client_token(self, request_handler):
94 client_id_token = tornado_utils.get_secure_cookie(request_handler, self.COOKIE_KEY)

Calls

no outgoing calls