X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FAuthClient.pm;h=0c9e5a97f864b246e4d9dce8e8b5443904f28f64;hb=11aeaa07186197c61dfe610d2a5c981754fd2e9d;hp=5291da20928c2e543a3cd196abc94a5a23c3a9b3;hpb=3ced230d576cb0eff6f8b7805f1682c14e009ef9;p=kivitendo-erp.git diff --git a/SL/DB/AuthClient.pm b/SL/DB/AuthClient.pm index 5291da209..0c9e5a97f 100644 --- a/SL/DB/AuthClient.pm +++ b/SL/DB/AuthClient.pm @@ -1,27 +1,25 @@ -# This file has been auto-generated only because it didn't exist. -# Feel free to modify it at will; it will not be overwritten automatically. - package SL::DB::AuthClient; use strict; -use SL::DB::MetaSetup::AuthClient; - -# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all. -__PACKAGE__->meta->schema('auth'); +use Carp; +use File::Path (); -__PACKAGE__->meta->make_manager_class; +use SL::DBConnect; +use SL::DB::MetaSetup::AuthClient; +use SL::DB::Manager::AuthClient; +use SL::DB::Helper::Util; __PACKAGE__->meta->add_relationship( users => { type => 'many to many', - map_class => 'SL::DB::AuthUserGroup', + map_class => 'SL::DB::AuthClientUser', map_from => 'client', map_to => 'user', }, groups => { type => 'many to many', - map_class => 'SL::DB::AuthUserGroup', + map_class => 'SL::DB::AuthClientGroup', map_from => 'client', map_to => 'group', }, @@ -29,4 +27,166 @@ __PACKAGE__->meta->add_relationship( __PACKAGE__->meta->initialize; +__PACKAGE__->before_save('_before_save_remember_old_name'); +__PACKAGE__->after_save('_after_save_ensure_webdav_symlink_correctness'); +__PACKAGE__->after_delete('_after_delete_delete_webdav_symlink'); + +sub _before_save_remember_old_name { + my ($self) = @_; + + delete $self->{__before_save_remember_old_name}; + if ($self->id && $::lx_office_conf{features}->{webdav}) { + $self->{__before_save_remember_old_name} = SL::DB::AuthClient->new(id => $self->id)->load->name; + } + + return 1; +} + +sub _after_save_ensure_webdav_symlink_correctness { + my ($self) = @_; + + $self->ensure_webdav_symlink_correctness($self->{__before_save_remember_old_name}) if $self->id; + return 1; +} + +sub _after_delete_delete_webdav_symlink { + my ($self) = @_; + + my $name = $self->webdav_symlink_basename; + unlink "webdav/links/${name}"; + return 1; +} + +sub validate { + my ($self) = @_; + + my @errors; + push @errors, $::locale->text('The name is missing.') if !$self->name; + push @errors, $::locale->text('The database name is missing.') if !$self->dbname; + push @errors, $::locale->text('The database host is missing.') if !$self->dbhost; + push @errors, $::locale->text('The database port is missing.') if !$self->dbport; + push @errors, $::locale->text('The database user is missing.') if !$self->dbuser; + push @errors, $::locale->text('The name is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'name'); + push @errors, $::locale->text('The combination of database host, port and name is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'dbhost', 'dbport', 'dbname'); + + return @errors; +} + +sub webdav_symlink_basename { + my ($self, $name) = @_; + + $name = $name || $self->name || ''; + $name =~ s:/+:_:g; + + return $name; +} + +sub ensure_webdav_symlink_correctness { + my ($self, $old_name) = @_; + + croak "Need object ID" unless $self->id; + + my $new_symlink = $self->webdav_symlink_basename; + + croak "Need name" unless $new_symlink; + + my $base_path = 'webdav/links'; + + if ($old_name) { + my $old_symlink = $self->webdav_symlink_basename($old_name); + return if $old_symlink eq $new_symlink; + + if (-l "${base_path}/${old_symlink}") { + rename "${base_path}/${old_symlink}", "${base_path}/${new_symlink}"; + return; + } + } + + File::Path::make_path('webdav/' . $self->id); + symlink '../' . $self->id, "${base_path}/${new_symlink}"; +} + +sub get_dbconnect_args { + my ($self, %params) = @_; + + return ( + 'dbi:Pg:dbname=' . $self->dbname . ';host=' . ($self->dbhost || 'localhost') . ';port=' . ($self->dbport || 5432), + $self->dbuser, + $self->dbpasswd, + SL::DBConnect->get_options(%params), + ); +} + +sub dbconnect { + my ($self, %params) = @_; + return SL::DBConnect->connect($self->get_dbconnect_args(%params)); +} + 1; +__END__ + +=pod + +=encoding utf8 + +=head1 NAME + +SL::DB::AuthClient - RDBO model for the auth.clients table + +=head1 FUNCTIONS + +=over 4 + +=item C + +Establishes a new database connection to the database configured for +C<$self>. Returns a database handle as returned by +L (which is either a normal L handle or +one handled by L). + +C<%params> are optional parameters passed as the fourth argument to +L. They're first filtered through +L so the UTF-8 flag will be set properly. + +=item C + +Handles the symlink creation/deletion for the WebDAV folder. Does +nothing if WebDAV is not enabled in the configuration. + +For each existing client a symbolic link should exist in the directory +C pointing to the actual WebDAV directory which is the +client's database ID. + +The symbolic link's name is the client's name sanitized a bit. It's +calculated by L. + +=item C + +Returns an array of database connection parameters suitable for +passing to L. + +C<%params> are optional parameters passed as the fourth argument to +L. They're first filtered through +L so the UTF-8 flag will be set properly. + +=item C + +Returns an array of human-readable error messages if the object must +not be saved and an empty list if nothing's wrong. + +=item C + +Returns the base name of the symbolic link for the WebDAV C +sub-folder. + +=back + +=head1 BUGS + +Nothing here yet. + +=head1 AUTHOR + +Moritz Bunkus Em.bunkus@linet-services.deE + +=cut