Esempio n. 1
0
    Поместить сообщение в лог сообщений.

    Дополнительно можно при помещении в лог указать дополнительный тэг, который будет сохранен в логе
    вместе с сообщением.

    @param domain: домен, относительно которого идёт анализ
    @type domain: L{IDomain}
    @param message: сообщение
    @type message: L{spamfighter.interfaces.IMessage}
    @param log: имя свойства домена, содержащего лог сообщений
    @type log: C{str}
    @param tag: дополнительный тэг, записываемый в лог
    @type tag: C{str}
    """
    try:
        messageLog = domain.get(log)
    except DomainKeyError:
        raise errors.AttributeKeyException, log

    if not IMessageLog.providedBy(messageLog):
        raise errors.NotAMessageLogError, log
    
    if tag is None:
        tags=[]
    else:
        tags=[tag]

    return messageLog.put(message=message, tags=tags).addCallback(lambda _: True)

factory.registerRule(messageLogPut)
Esempio n. 2
0
        try:
            self.text = message[attribute].value()
        except AttributeNotFoundError:
            raise errors.MessageAttributeKeyException, attribute

class modelClassify(ModelRule):
    """
    Классификация сообщения по модели: истинно, если модель сообщает, что сообщение
    относится к классу *плохих*.
    """
    def analyze(self, domain, message, **kwargs):
        super(modelClassify, self).analyze(domain, message, **kwargs)

        return self.model.classify(self.text)

class modelTrain(ModelRule):
    """
    Обучить модель на сообщении: всегда истинно.
    """
    def analyze(self, domain, message, marker="good", **kwargs):
        """
        @param marker: тип сообщения для модели, "good" или "bad"
        @type marker: C{str}
        """
        super(modelTrain, self).analyze(domain, message, **kwargs)

        return self.model.train(self.text, marker == "good").addCallback(lambda _: True)

factory.registerRule(modelClassify)
factory.registerRule(modelTrain)
Esempio n. 3
0
    @type attribute: C{int}
    @param storage: имя атрибута домена, содержащего хранилище
    @type storage: C{str}
    @param timeout: время в течении которого пользователь может отправлять указанное количество сообщений
    @type timeout: C{int}
    @param count: максимально допустимое количество сообщение в указанный период времени
    @type count: C{int}
    """
    storage = domain.get(storage)
    user_key = 'ufreq_' + attribute + str(message.get(attribute).serialize())

    def gotKey(value):
        if value < count:
            return storage.incr(user_key).addCallback(lambda value: value < count).addErrback(noKey)
        else:
            return False

    def noKey(failure):
        failure.trap(KeyError)

        def errback(failure):
            failure.trap(KeyError)
            return gotKey(0)

        return storage.add(user_key, 1, timeout).addCallback(lambda _: True).addErrback(errback)

    return storage.get(user_key).addCallbacks(gotKey, noKey)

factory.registerRule(userFrequencyCheck)
factory.registerRule(messageFrequencyCheck)
Esempio n. 4
0
    @param attribute: имя атрибута сообщения для проверки на соответствие
    @type attribute: C{str}
    @param value: значение для проверки на соответствие
    @type value: C{object}
    """

    return message.get(attribute).value() == value

def hasAttribute(domain, message, attribute):
    """
    Правило проверки наличия аттрибута у сообщения

    @param domain: домен, относительно которого идёт анализ
    @type domain: L{IDomain}
    @param message: сообщение
    @type message: L{spamfighter.interfaces.IMessage}
    @param attribute: имя атрибута сообщения для проверки на наличие
    @type attribute: C{str}
    """

    try:
        message.get(attribute)
        return True
    except AttributeNotFoundError:
        return False

factory.registerRule(regexpCheck)
factory.registerRule(lengthCheck)
factory.registerRule(hasAttribute)
factory.registerRule(attributeCheck)
Esempio n. 5
0
    @param minLength: минимальная длина сообщения для анализа
    @type minLength: C{int}
    @param minMean: минимальное значение математического ожидания
    @type minMean: C{float}
    @param maxVariance: максимальное значение дисперсии
    @type maxVariance: C{float}
    """

    str = clearSpacesRE.sub('', message.get(attribute).value()).lower()

    if len(str) < minLength:
        return True

    result = {}
    for i in xrange(len(str)-2):
        result[str[i:i+3]] = result.get(str[i:i+3], 0) + 1

    s = sum(result.itervalues())
    sum_sqr = sum(imap(lambda x: x*x, result.itervalues()))
    n = len(result)

    mean = s/float(n) if n > 0 else 0
    variance = (sum_sqr - s*mean)/float(n-1) if n > 1 else 0

    if mean > minMean and variance < maxVariance:
        return False

    return True

factory.registerRule(messageFloodCheck)