Example #1
0
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')
Example #2
0
 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)
Example #3
0
 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
Example #4
0
 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
Example #5
0
 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
Example #6
0
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')
Example #7
0
 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)
Example #8
0
 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
Example #9
0
 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
Example #10
0
 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
Example #11
0
    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
Example #12
0
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)
Example #13
0
 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)
Example #14
0
 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)
Example #15
0
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)
Example #16
0
 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
Example #17
0
 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
Example #18
0
 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
Example #19
0
    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
Example #20
0
 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
Example #21
0
 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
Example #22
0
 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
Example #23
0
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")
Example #24
0
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')
Example #25
0
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")
Example #26
0
 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