use SL::Auth::LDAP;
use SL::User;
+use SL::DBUpgrade2;
use SL::DBUtils;
use strict;
sub _read_auth_config {
$main::lxdebug->enter_sub();
- my $self = shift;
-
- my $code;
- my $in = IO::File->new('config/authentication.pl', 'r');
-
- if (!$in) {
- my $locale = Locale->new('en');
- $self->mini_error($locale->text('The config file "config/authentication.pl" was not found.'));
- }
-
- while (<$in>) {
- $code .= $_;
- }
- $in->close();
-
- eval $code;
+ my $self = shift;
- if ($@) {
- my $locale = Locale->new('en');
- $self->mini_error($locale->text('The config file "config/authentication.pl" contained invalid Perl code:'), $@);
- }
+ map { $self->{$_} = $::lx_office_conf{authentication}->{$_} } keys %{ $::lx_office_conf{authentication} };
+ $self->{DB_config} = $::lx_office_conf{'authentication/database'};
+ $self->{LDAP_config} = $::lx_office_conf{'authentication/ldap'};
if ($self->{module} eq 'DB') {
$self->{authenticator} = SL::Auth::DB->new($self);
if (!$self->{authenticator}) {
my $locale = Locale->new('en');
- $self->mini_error($locale->text('No or an unknown authenticantion module specified in "config/authentication.pl".'));
+ $self->mini_error($locale->text('No or an unknown authenticantion module specified in "config/lx_office.conf".'));
}
my $cfg = $self->{DB_config};
if (!$cfg) {
my $locale = Locale->new('en');
- $self->mini_error($locale->text('config/authentication.pl: Key "DB_config" is missing.'));
+ $self->mini_error($locale->text('config/lx_office.conf: Key "DB_config" is missing.'));
}
if (!$cfg->{host} || !$cfg->{db} || !$cfg->{user}) {
my $locale = Locale->new('en');
- $self->mini_error($locale->text('config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".'));
+ $self->mini_error($locale->text('config/lx_office.conf: Missing parameters in "authentication/database". Required parameters are "host", "db" and "user".'));
}
$self->{authenticator}->verify_config();
$main::lxdebug->message(LXDebug->DEBUG1, "Auth::dbconnect DSN: $dsn");
- $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { pg_enable_utf8 => $::locale->is_utf8, AutoCommit => 0 });
+ $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { pg_enable_utf8 => $::locale->is_utf8, AutoCommit => 1 });
if (!$may_fail && !$self->{dbh}) {
$main::form->error($main::locale->text('The connection to the authentication database failed:') . "\n" . $DBI::errstr);
}
- $main::lxdebug->leave_sub();
+ $main::lxdebug->leave_sub(2);
return $self->{dbh};
}
$main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database DSN: $dsn");
- my $charset = $main::dbcharset;
+ my $charset = $::lx_office_conf{system}->{dbcharset};
$charset ||= Common::DEFAULT_CHARSET;
my $encoding = $Common::charset_to_db_encoding{$charset};
$encoding ||= 'UNICODE';
my $self = shift;
my $dbh = $self->dbconnect();
- my $charset = $main::dbcharset;
+ my $charset = $::lx_office_conf{system}->{dbcharset};
$charset ||= Common::DEFAULT_CHARSET;
$dbh->rollback();
- User->process_query($main::form, $dbh, 'sql/auth_db.sql', undef, $charset);
+ SL::DBUpgrade2->new(form => $::form)->process_query($dbh, 'sql/auth_db.sql', undef, $charset);
$main::lxdebug->leave_sub();
}
my ($sth, $query, $user_id);
+ $dbh->begin_work;
+
$query = qq|SELECT id FROM auth."user" WHERE login = ?|;
($user_id) = selectrow_query($form, $dbh, $query, $login);
my $form = $main::form;
my $dbh = $self->dbconnect();
+
+ $dbh->begin_work;
+
my $query = qq|SELECT id FROM auth."user" WHERE login = ?|;
my ($id) = selectrow_query($form, $dbh, $query, $login);
- return $main::lxdebug->leave_sub() if (!$id);
+ $dbh->rollback and return $main::lxdebug->leave_sub() if (!$id);
do_query($form, $dbh, qq|DELETE FROM auth.user_group WHERE user_id = ?|, $id);
do_query($form, $dbh, qq|DELETE FROM auth.user_config WHERE user_id = ?|, $id);
if (!$cookie || $cookie->{is_expired} || ($cookie->{ip_address} ne $ENV{REMOTE_ADDR})) {
$self->destroy_session();
$main::lxdebug->leave_sub();
- return SESSION_EXPIRED;
+ return $cookie ? SESSION_EXPIRED : SESSION_NONE;
}
$query = qq|SELECT sess_key, sess_value FROM auth.session_content WHERE session_id = ?|;
$sth = prepare_execute_query($form, $dbh, $query, $session_id);
while (my $ref = $sth->fetchrow_hashref()) {
- my $value = $self->_load_value($ref->{sess_value});
- $self->{SESSION}->{$ref->{sess_key}} = $value;
- $form->{$ref->{sess_key}} = $value if (!defined $form->{$ref->{sess_key}});
+ $self->{SESSION}->{$ref->{sess_key}} = $ref->{sess_value};
+ $form->{$ref->{sess_key}} = $self->_load_value($ref->{sess_value}) if (!defined $form->{$ref->{sess_key}});
}
$sth->finish();
if ($session_id) {
my $dbh = $self->dbconnect();
+ $dbh->begin_work;
+
do_query($main::form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id);
do_query($main::form, $dbh, qq|DELETE FROM auth.session WHERE id = ?|, $session_id);
my $self = shift;
my $dbh = $self->dbconnect();
+
+ $dbh->begin_work;
+
my $query =
qq|DELETE FROM auth.session_content
WHERE session_id IN
$form = $main::form;
$dbh = $self->dbconnect();
+ $dbh->begin_work;
+ do_query($::form, $dbh, qq|LOCK auth.session_content|);
+
$query = qq|SELECT id FROM auth.session WHERE id = ?|;
($id) = selectrow_query($form, $dbh, $query, $session_id);
if ($id) {
do_query($form, $dbh, qq|UPDATE auth.session SET mtime = now() WHERE id = ?|, $session_id);
- do_query($form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id);
} else {
do_query($form, $dbh, qq|INSERT INTO auth.session (id, ip_address, mtime) VALUES (?, ?, now())|, $session_id, $ENV{REMOTE_ADDR});
my $dbh = $provided_dbh || $self->dbconnect();
- my $query = qq|INSERT INTO auth.session_content (session_id, sess_key, sess_value) VALUES (?, ?, ?)|;
- my $sth = prepare_query($::form, $dbh, $query);
+ $dbh->begin_work unless $provided_dbh;
+
+ do_query($::form, $dbh, qq|LOCK auth.session_content|);
+ do_query($::form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id);
+
+ if (%{ $self->{SESSION} }) {
+ my $query = qq|INSERT INTO auth.session_content (session_id, sess_key, sess_value) VALUES (?, ?, ?)|;
+ my $sth = prepare_query($::form, $dbh, $query);
+
+ foreach my $key (sort keys %{ $self->{SESSION} }) {
+ do_statement($::form, $sth, $query, $session_id, $key, $self->{SESSION}->{$key});
+ }
- foreach my $key (sort keys %{ $self->{SESSION} }) {
- do_statement($::form, $sth, $query, $session_id, $key, $self->{SESSION}->{$key});
+ $sth->finish();
}
- $sth->finish();
+ $dbh->commit() unless $provided_dbh;
}
sub set_session_value {
}
$main::lxdebug->leave_sub();
+
+ return $self;
+}
+
+sub delete_session_value {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+
+ $self->{SESSION} ||= { };
+ delete @{ $self->{SESSION} }{ @_ };
+
+ $main::lxdebug->leave_sub();
+
+ return $self;
+}
+
+sub get_session_value {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+ my $value = $self->{SESSION} ? $self->_load_value($self->{SESSION}->{ $_[0] }) : undef;
+
+ $main::lxdebug->leave_sub();
+
+ return $value;
}
sub set_cookie_environment_variable {
my $form = $main::form;
my $dbh = $self->dbconnect();
+ $dbh->begin_work;
+
my ($query, $sth, $row, $rights);
if (!$group->{id}) {
my $form = $main::from;
my $dbh = $self->dbconnect();
+ $dbh->begin_work;
do_query($form, $dbh, qq|DELETE FROM auth.user_group WHERE group_id = ?|, $id);
do_query($form, $dbh, qq|DELETE FROM auth.group_rights WHERE group_id = ?|, $id);