| 35 | |
| 36 | |
| 37 | class 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) |
no outgoing calls