Автоматическое изменение роли пользователя при регистрации в WordPress

Идея простая: при регистрации нового пользователя проверяем полученные данные: E-mail, IP и т.д. На основе этих данных вполне можно определить роль нового пользователя. Если он из Китая, вряд ли он напишет что-то полезное. Если он из США, то может и напишет, мало ли наших живет там, но если его E-mail на каком-нибудь 126.com, то это тоже скорее всего спамер. Поэтому используется бальная система. При каждой проверке начисляю баллы. И по сумме баллов можно сделать вывод.
В коде используется переменная $_SERVER["HTTP_X_COUNTRY"] в которой хранится двухзначный код страны по IP адресу. У меня web-server Nginx отправляет эту переменную вот такой строкой в виртуальном хосте:

1
proxy_set_header X-Country $geo;

(как настроить Nginx для определения страны)

Меняйте под себя все проверки и баллы и получите довольно легкую и гибкую защиту от спамеров, при этом новые друзья смогут беспрепятственно публиковать статьи. Даже если окажется, что их новая роль будет «Участник», они смогут отправить статью на модерацию. Я использую плагин «WP status notifier«, что бы быть в курсе когда статья сохранена для модерации. Злобные спамеры сразу оказываются подписчиками, что не дает им никаких привелегий.

Вот код, который можно вставить в functions.php вашей темы в wordpress:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
add_action('user_register', 'register_role');

function register_role($user_id, $password="", $meta=array()) {
    $userdata = get_userdata($user_id);
    $newdata = array();
    $newdata['ID'] = $user_id;
    $ball=0;
    //Разбиваем Email на части
    $ems = explode("@", $userdata->user_email );
    $ems2 = explode(".", $ems[1] );

    //Список стран, из которых можно принимать друзей))
    $white_countries = array('RU','UA', 'BY', 'MD', 'KZ','UZ');
    // Из этих стран много спамеров
    $black_countries = array('UK','CN', 'US', 'IN','FR');


    //Если не из "друзей"
    if( !in_array($_SERVER["HTTP_X_COUNTRY"], $white_countries ) )
        $ball +=1;


    //Если из неизвестных
    if( $_SERVER["HTTP_X_COUNTRY"] == 'XX'  )
        $ball +=1;

    //Если из "врагов"
    if( in_array($_SERVER["HTTP_X_COUNTRY"], $black_countries ) )
        $ball +=3;

    //Проверяем домен Email. Первый список доменов - наиболее вероятные спамеры, в 99%
    switch( $ems[1]  ){
        case "123.com":
        case "163.com":
        case "126.com":
        case "yahoo.com":
        case "webkiff.info":
        case "accor.com":
        case "hotmail.com":
        case "outlook.com":
        case "o2.pl":
        case "yahoo.fr":
        case "yeah.net":
        case "0accounts.com":
        case "mailcatch.com":
        case "sohu.com":
        case "tresgunforsale.com":
        case "spamavert.com":
        case "pphen375.com":
        case "phen375er.com":
        case "killarbyte.ru":
        case "yahoo.co.uk":
            $ball+=4;
        break;
        //С mail.ru тоже бывают спамеры последнее время.
        case"mail.ru":
            $ball++;
        break;
    }

    //Домен верхнего уровня Email
    switch( $ems2[ sizeof($ems2) - 1 ]){
            //Наши
            case "ru":
            case "su":
            case "ua":
            case "by":
                $ball++;
            break;

            //вражеские
            case "com":
            case "org":
            case "net":
                $ball+=2;
            break;
            //пока остальные +1
            default:
                $ball++;
    }

    //определяем новую роль по баллам
    if( $ball >= 5 )
        $newdata['role'] = 'subscriber';
    elseif ($ball >= 3)
        $newdata['role'] = 'contributor';
    else
        $newdata['role'] = 'author';
   
    //Отправляем письмо себе !!!!Внимание!!! измените E-mail на свой!
    wp_mail('support@modomen.ru','REG debug', "COUNTRY: ".$_SERVER["HTTP_X_COUNTRY"]."\nE-mail: $userdata->user_email\nems1: $ems[1]\n\nems2: ".$ems2[sizeof($ems2)-1]."\nnewrole: ".$newdata['role'].", ".$ball);
    wp_update_user($newdata);

}

Рекурсивная загрузка на WebDav сервер с помощью cadaver

Для рекурсивной загрузки файлов на сервер Webdav (например Yandex.Disk) с помощью cadaver нашел скрипт davcpy.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/sh

usage () { echo "$0 <src> <cadaver-args>*" >/dev/stderr; }
error () { echo "$1" >/dev/stderr; usage; exit 1; }

test $# '<' 3 || \
    error "Source and cadaver arguments expected!";

src="$1"; shift;
test -r "$src" || \
    error "Source argument should be a readable file or directory!";

cd "$(dirname "$src")";
src="$(basename "$src")";
root="$(pwd)";
rc="$(mktemp)";
{
    find "$src" '(' -type d -a -readable ')' \
    -printf 'mkcol "%p"\n';
    find "$src" '(' -type f -a -readable ')' \
    -printf 'cd "%h"\nlcd "%h"\n'            \
    -printf 'mput "%f"\n'                    \
    -printf 'cd -\nlcd "'"$root"'"\n';
    echo "quit";
} > "$rc";

cadaver -r "$rc" "$@";
rm -f "$rc";

Примет использования:

1
# ./davcpy.sh /home/metahome/Pictures https://webdav.yandex.ru

Если на компьютере/сервере доступна fuse, можно воспользоваться davfs2

Как из DJVU файла сделать книгу

Linux очень хорош автоматизацией рутиной работы. 10 минут на написание небольшого скрипта экономят целые часы и даже дни. Попалась мне полезная книга, отсканированая и сохраненная в DJVU формате. Страницы были отсканированы разворотами. Для монитора этот формат и расположение удобны, а вот для печати не пригодно. Пришлось думать как их сделать в книгу. Для верстки книг в Linux есть отличный инструмент — Scribus. Но сперва нужно вытащить все страницы из djvu в отдельные картинки и разрезать пополам.
Читать далее »

Отсутствие звука в Gentoo после обновления

Есть две карты, обе встроенные. Одна в процессоре вместе с видео (HDA ATI HDMI), вторая в метеринке (HD-Audio Generic Realtek ALC887-VD). По умолчанию выбиралась первая и через нее звук не идет. Я так подозреваю там звук идет только на вывод HDMI и в остальных выводах никак не работает.
Решилась проблема не сразу, пришлось полазить по форумам.
Однако, решение-то банальное:

в файле /usr/share/alsa/alsa.conf заменить строки:

1
2
defaults.ctl.card 0
defaults.pcm.card 0

на

1
2
defaults.ctl.card 1
defaults.pcm.card 1

Запрет выполнения PHP скриптов в каталоге uploads блога на WordPress

Для Apache можно решить добавлением строки в файл wp-content/uploads/.htaccess

1
php_value engine off

Для Nginx (в файл конфигурации виртуального сервера)

1
2
3
4
location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php)$ {
types { }
default_type text/plain;
}