def test_ip_address_header_not_set(): req = Mock() req.remote_addr = '1.2.3.4' req.headers = {} with h.push_config(config, **{'ip_address_header': 'X_FORWARDED_FOR'}): assert_equal(utils.ip_address(req), '1.2.3.4')
def track_login(self, req): user_ip = utils.ip_address(req) user_agent = req.headers.get('User-Agent') self.last_access['login_date'] = datetime.utcnow() self.last_access['login_ip'] = user_ip self.last_access['login_ua'] = user_agent session(self).flush(self)
def get_data(self, text, artifact=None, user=None, content_type='comment', request=None, **kw): kw['comment_content'] = text kw['comment_type'] = content_type if artifact: try: # if its a comment, get wiki, ticket, etc URL url = artifact.main_url() except: url = artifact.url() kw['permalink'] = url user = user or c.user if user: kw['comment_author'] = user.display_name or user.username kw['comment_author_email'] = user.email_addresses[ 0] if user.email_addresses else '' if request: kw['user_ip'] = utils.ip_address(request) kw['user_agent'] = request.headers.get('USER_AGENT') kw['referrer'] = request.headers.get('REFERER') # kw will be urlencoded, need to utf8-encode for k, v in kw.items(): kw[k] = h.really_unicode(v).encode('utf8') return kw
def check(self, text, artifact=None, user=None, content_type='comment', **kw): """Basic content spam check via Mollom. For more options see http://mollom.com/api#api-content """ log_msg = text kw['postBody'] = text if artifact: try: # if its a comment, get wiki, ticket, etc URL url = artifact.main_url() except: url = artifact.url() # Should be able to send url, but can't right now due to a bug in # the PyMollom lib # kw['url'] = url log_msg = url user = user or c.user if user: kw['authorName'] = user.display_name or user.username kw['authorMail'] = user.email_addresses[ 0] if user.email_addresses else '' kw['authorIP'] = utils.ip_address(request) # kw will be urlencoded, need to utf8-encode for k, v in kw.items(): kw[k] = h.really_unicode(v).encode('utf8') cc = self.service.checkContent(**kw) res = cc['spam'] == 2 artifact.spam_check_id = cc.get('session_id', '') log.info("spam=%s (mollom): %s" % (str(res), log_msg)) return res
def _make_extra(self, result=None): '''Create a dict of extra items to be added to a log record ''' extra = self._extra_proto.copy() # Save the client IP address extra.update(client_ip=utils.ip_address(request)) # Save the user info user = getattr(request, 'user', None) if user: extra.update(user=user.username, user_id=user.id) # Save the project info if (result and isinstance(result, dict) and 'p' in result and result['p'] is not None): extra.update( source=result['p']['source'], project_name=result['p']['shortname'], group_id=result['p'].get('sf_id')) # Log the referer cookie if it exists referer_link = request.cookies.get('referer_link') if referer_link: referer_link = unquote(referer_link) try: referer_link = json.loads(referer_link) except ValueError: pass extra['referer_link'] = referer_link return extra
def _make_extra(self, result=None): '''Create a dict of extra items to be added to a log record ''' extra = self._extra_proto.copy() # Save the client IP address extra.update(client_ip=utils.ip_address(request)) # Save the user info user = getattr(request, 'user', None) if user: extra.update(user=user.username, user_id=user.id) # Save the project info if (result and isinstance(result, dict) and 'p' in result and result['p'] is not None): extra.update(source=result['p']['source'], project_name=result['p']['shortname'], group_id=result['p'].get('sf_id')) # Log the referer cookie if it exists referer_link = request.cookies.get('referer_link') if referer_link: referer_link = unquote(referer_link) try: referer_link = json.loads(referer_link) except ValueError: pass extra['referer_link'] = referer_link return extra
def check(self, text, artifact=None, user=None, content_type='comment', **kw): ip = utils.ip_address(request) ip_int = int(ipaddress.ip_address(unicode(ip))) res = ip_int in self.packed_ips self.record_result(res, artifact, user) return res
def get_data(self, text, artifact=None, user=None, content_type='comment', request=None, **kw): # Docs: https://akismet.com/development/api/ kw['comment_content'] = text kw['comment_type'] = content_type if artifact: try: # if its a comment, get wiki, ticket, etc URL url = artifact.main_url() except Exception: url = artifact.url() kw['permalink'] = h.absurl(url) if hasattr(artifact, 'timestamp'): # Message & Post objects date_created = artifact.timestamp else: # fallback for other artifacts, not exactly "created" date though date_created = artifact.mod_date kw['comment_date_gmt'] = date_created.isoformat() kw['comment_post_modified_gmt'] = artifact.primary( ).mod_date.isoformat() user = user or c.user if user: kw['comment_author'] = user.display_name or user.username kw['comment_author_email'] = user.email_addresses[ 0] if user.email_addresses else '' if request is not None: kw['user_ip'] = utils.ip_address(request) kw['user_agent'] = request.headers.get('USER_AGENT') kw['referrer'] = request.headers.get('REFERER') else: # these are required fields, but for ham/spam reports we don't have the original values to send :/ kw['user_ip'] = None kw['user_agent'] = None if artifact and hasattr( artifact, 'get_version' ): # VersionedArtifacts (includes comment posts) try: kw['user_ip'] = artifact.get_version(1).author.logged_ip except IndexError: log.debug("couldn't get Snapshot for this artifact %s", artifact) # kw will be urlencoded, need to utf8-encode for k, v in kw.items(): kw[k] = h.really_unicode(v).encode('utf8') return kw
def auditlog_user(message, *args, **kwargs): """ Create an audit log entry for a user, including the IP address :param str message: :param user: a :class:`allura.model.auth.User` """ from allura import model as M ip_address = utils.ip_address(request) message = 'IP Address: {}\n'.format(ip_address) + message if kwargs.get('user') and kwargs['user'] != c.user: message = 'Done by user: {}\n'.format(c.user.username) + message return M.AuditLog.log_user(message, *args, **kwargs)
def track_active(self, req): user_ip = utils.ip_address(req) user_agent = req.headers.get('User-Agent') now = datetime.utcnow() last_date = self.last_access['session_date'] date_changed = last_date is None or last_date.date() != now.date() ip_changed = user_ip != self.last_access['session_ip'] ua_changed = user_agent != self.last_access['session_ua'] if date_changed or ip_changed or ua_changed: self.last_access['session_date'] = datetime.utcnow() self.last_access['session_ip'] = user_ip self.last_access['session_ua'] = user_agent session(self).flush(self)
def auditlog_user(message, *args, **kwargs): """ Create an audit log entry for a user, including the IP address :param str message: :param user: a :class:`allura.model.auth.User` """ from allura import model as M ip_address = utils.ip_address(request) message = 'IP Address: {}\n'.format(ip_address) + message if c.user and kwargs.get('user') and kwargs['user'] != c.user: message = 'Done by user: {}\n'.format(c.user.username) + message return M.AuditLog.log_user(message, *args, **kwargs)
def get_data(self, text, artifact=None, user=None, content_type='comment', **kw): kw['comment_content'] = text kw['comment_type'] = content_type if artifact: kw['permalink'] = artifact.url() user = user or c.user if user: kw['comment_author'] = user.display_name or user.username kw['comment_author_email'] = user.email_addresses[ 0] if user.email_addresses else '' kw['user_ip'] = utils.ip_address(request) kw['user_agent'] = request.headers.get('USER_AGENT') kw['referrer'] = request.headers.get('REFERER') # kw will be urlencoded, need to utf8-encode for k, v in kw.items(): kw[k] = h.really_unicode(v).encode('utf8') return kw
def commit(self, update_stats=True): '''Save off a snapshot of the artifact and increment the version #''' try: ip_address = utils.ip_address(request) except: ip_address = '0.0.0.0' data = dict( artifact_id=self._id, artifact_class='%s.%s' % ( self.__class__.__module__, self.__class__.__name__), author=dict( id=c.user._id, username=c.user.username, display_name=c.user.get_pref('display_name'), logged_ip=ip_address), data=state(self).clone()) while True: self.version += 1 data['version'] = self.version data['timestamp'] = datetime.utcnow() ss = self.__mongometa__.history_class(**data) try: session(ss).insert_now(ss, state(ss)) except pymongo.errors.DuplicateKeyError: log.warning('Trying to create duplicate version %s of %s', self.version, self.__class__) session(ss).expunge(ss) continue else: break log.debug('Snapshot version %s of %s', self.version, self.__class__) if update_stats: if self.version > 1: g.statsUpdater.modifiedArtifact( self.type_s, self.mod_date, self.project, c.user) else: g.statsUpdater.newArtifact( self.type_s, self.mod_date, self.project, c.user) return ss
def get_data(self, text, artifact=None, user=None, content_type='comment', request=None, **kw): # Docs: https://akismet.com/development/api/ kw['comment_content'] = text kw['comment_type'] = content_type if artifact: try: # if its a comment, get wiki, ticket, etc URL url = artifact.main_url() except Exception: url = artifact.url() kw['permalink'] = h.absurl(url) if hasattr(artifact, 'timestamp'): # Message & Post objects date_created = artifact.timestamp else: # fallback for other artifacts, not exactly "created" date though date_created = artifact.mod_date kw['comment_date_gmt'] = date_created.isoformat() kw['comment_post_modified_gmt'] = artifact.primary().mod_date.isoformat() user = user or c.user if user: kw['comment_author'] = user.display_name or user.username kw['comment_author_email'] = user.email_addresses[0] if user.email_addresses else '' if request: kw['user_ip'] = utils.ip_address(request) kw['user_agent'] = request.headers.get('USER_AGENT') kw['referrer'] = request.headers.get('REFERER') else: # these are required fields, but for ham/spam reports we don't have the original values to send :/ kw['user_ip'] = None kw['user_agent'] = None if artifact and hasattr(artifact, 'get_version'): # VersionedArtifacts (includes comment posts) try: kw['user_ip'] = artifact.get_version(1).author.logged_ip except IndexError: log.debug("couldn't get Snapshot for this artifact %s", artifact) # kw will be urlencoded, need to utf8-encode for k, v in kw.items(): kw[k] = h.really_unicode(v).encode('utf8') return kw
def get_data(self, text, artifact=None, user=None, content_type="comment", request=None, **kw): kw["comment_content"] = text kw["comment_type"] = content_type if artifact: try: # if its a comment, get wiki, ticket, etc URL url = artifact.main_url() except: url = artifact.url() kw["permalink"] = url user = user or c.user if user: kw["comment_author"] = user.display_name or user.username kw["comment_author_email"] = user.email_addresses[0] if user.email_addresses else "" if request: kw["user_ip"] = utils.ip_address(request) kw["user_agent"] = request.headers.get("USER_AGENT") kw["referrer"] = request.headers.get("REFERER") # kw will be urlencoded, need to utf8-encode for k, v in kw.items(): kw[k] = h.really_unicode(v).encode("utf8") return kw
def _make_extra(self): result = dict(self.extra_proto, action=self._action) try: if hasattr(c, 'app') and c.app: result['tool_type'] = c.app.config.tool_name result['tool_mount'] = c.app.config.options['mount_point'] if hasattr(c, 'project') and c.project: result['project'] = c.project.shortname result['neighborhood'] = c.project.neighborhood.name if hasattr(c, 'user') and c.user: result['username'] = c.user.username else: result['username'] = '******' try: result['url'] = request.url result['ip_address'] = utils.ip_address(request) except TypeError: pass return result except: self._logger.warning( 'Error logging to rtstats, some info may be missing', exc_info=True) return result
def test_ip_address(): req = Mock() req.remote_addr = "1.2.3.4" req.headers = {} assert_equal(utils.ip_address(req), "1.2.3.4")
def test_ip_address(): req = Mock() req.remote_addr = '1.2.3.4' req.headers = {} assert_equal(utils.ip_address(req), '1.2.3.4')
def test_ip_address_header_not_set(): req = Mock() req.remote_addr = "1.2.3.4" req.headers = {} with h.push_config(config, **{"ip_address_header": "X_FORWARDED_FOR"}): assert_equal(utils.ip_address(req), "1.2.3.4")