Заметка по созданию сервера новостей. Статья адресована специалистам, дабы уберечь их от возможных сложностей при внедрении данного решения.
Постановка задачи
* Авторизация через единую систему LDAP
* Обязательная информация о человеке, оставившем сообщение
* Корректная работа с Thunderbird
Реализация
Для начала действуем согласно Gentoo-Wiki
# emerge inn
# chmod u+s /usr/lib/news/bin/inndstart
# chown -R news:news /var/log/news/
# chown -R news:news /var/spool/news/
# chsh -s /bin/bash news
# su news
# cd /var/spool/news/db
# touch /var/spool/news/db/history
# /usr/lib/news/bin/makedbz -i
# mv history.n.dir history.dir
# mv history.n.hash history.hash
# mv history.n.index history.index
Далее нам необходимо привести файл /etc/news/readers.conf к следующему виду
auth "ldap" {
perl_auth: "/usr/local/bin/inn-ldap-auth.pl"
}
access "ldap" {
newsgroups: *
access: RPA
}
Содержание скрипта /usr/local/bin/inn-ldap-auth.pl
#!/usr/bin/perl -w
#
# INN nnrpd perl auth module for LDAP
#
require '/usr/lib/news/lib/innshellvars.pl';
use strict;
use Net::LDAP;
use Sys::Syslog;
use vars qw(%attributes %authcodes %users $ldap
$ldap_host $ldap_bind_template $ldap_ag_entry $current_user
%ag_attrs );
$ldap_host = '127.0.0.1';
$ldap_bind_template = 'uid=%s,ou=Users,dc=test,dc=ru';
# These codes are a widely implemented de facto standard.
%authcodes = ('allowed' => 281, 'denied' => 502);
# Mappings of LDAP nnrpdAccessGroup attributes to perl hook return keys
%ag_attrs = ( nnrpdNewsgroups => 'newsgroups',
nnrpdRead => 'read',
nnrpdPost => 'post',
nnrpdAccess => 'access',
nnrpdKey => 'key',
nnrpdRejectWith => 'reject_with',
nnrpdMaxRate => 'max_rate',
nnrpdLocaltime => 'localtime',
nnrpdNewsmaster => 'newsmaster',
nnrpdStrippath => 'strippath',
nnrpdPerlfilter => 'perlfilter',
nnrpdPythonfilter => 'pythonfilter',
nnrpdVirtualhost => 'virtualhost',
nnrpdPathhost => 'pathhost' );
sub auth_init() {
openlog('nnrpd-ldap-auth', 'pid', 'news');
syslog('notice','starting');
}
sub authenticate() {
my $user = $attributes{'username'};
my $pass = $attributes{'password'};
return ($authcodes{denied}, "No username given.")
unless defined $user;
my $ldap = ldap_connect();
unless(defined $ldap) {
syslog('err', 'LDAP connect error');
return($authcodes{denied}, 'LDAP connect error (user %s)', $user);
}
my $m = $ldap->bind(sprintf($ldap_bind_template, $user), password => $pass);
if($m->code) {
syslog('err', 'LDAP bind error for %s: %s', $user, $m->error);
ldap_disconnect();
return($authcodes{denied}, );
}
ldap_disconnect();
return($authcodes{allowed}, );
}
sub ldap_connect {
my $l = Net::LDAP->new($ldap_host);
$l;
}
sub ldap_disconnect {
undef $ldap;
}
В файле /usr/lib/news/bin/filter/filter_nnrpd.pl добавляем в функцию filter_post
$modify_headers = 1;
$hdr{'X-From'} = "$user";
$hdr{'From'} =~ s/\r?\n//g;
Это добавит логин автора в шапку сообщения и исправит некорректность формировки поля From.
Комментариев нет:
Отправить комментарий