diff --git a/ldap_NS.pl b/ldap_NS.pl index 146c8b8084eeb01317b79d9ab99cdea31d2df43e..1eced7e0255240090c1ca37bbbc43f11ada78df5 100755 --- a/ldap_NS.pl +++ b/ldap_NS.pl @@ -22,13 +22,11 @@ use HTML::Template; use Crypt::CBC; use Crypt::Blowfish; +use Crypt::SmbHash; use MIME::Base64; +use DateTime; -use lib ( - new Config::IniFiles( - -file => "/opt/etc/ini/global.ini" - )->val( 'APPLICATION', 'LIBRARY' ) -); +use lib ( new Config::IniFiles( -file => "/opt/etc/ini/global.ini" )->val( 'APPLICATION', 'LIBRARY' ) ); use SNET::access; use SNET::common; @@ -36,30 +34,30 @@ use SNET::html; use SNET::ActiveDirectory; use SNET::LdapNS qw(:all); -use Net::LDAP::Constant qw( -LDAP_CONTROL_PASSWORDPOLICY -LDAP_PP_PASSWORD_EXPIRED -LDAP_PP_ACCOUNT_LOCKED -LDAP_PP_CHANGE_AFTER_RESET +use Net::LDAP::Constant qw( + LDAP_CONTROL_PASSWORDPOLICY + LDAP_PP_PASSWORD_EXPIRED + LDAP_PP_ACCOUNT_LOCKED + LDAP_PP_CHANGE_AFTER_RESET ); use SNET::Magic::MagicHash; my $ldap_snmc; -my $homepage='/cgi-bin/auth/ldap_NS.pl'; -my $sessiondir='/var/tmp/www-data/ldapns'; -my $templatedir='/opt/auth/cgi-bin/templates'; +my $homepage = '/cgi-bin/auth/ldap_NS.pl'; +my $sessiondir = '/var/tmp/www-data/ldapns'; +my $templatedir = '/opt/auth/cgi-bin/templates'; -my ($cgi, $params, $error, $message, $sid, $session, $key); -my ($connected, $isAdmin, $userMustChange, $audit_user); +my ( $cgi, $params, $error, $message, $sid, $session, $key ); +my ( $connected, $isAdmin, $userMustChange, $audit_user ); my $debug; my $LOGIN; -my ($TAB_HOME, $INFO, $PASSWD, $EXPIRED); -my ($TAB_USERS, $USERINFOS, $DELUSER, $ADDUSER, $MODUSER, $RESET); -my ($TAB_GROUPS, $GROUPINFOS, $DELGROUP, $ADDGROUP, $MODGROUP); -my ($TAB_POLICY, $POLICYINFOS, $DELPOLICY, $ADDPOLICY, $MODPOLICY); +my ( $TAB_HOME, $INFO, $PASSWD, $EXPIRED ); +my ( $TAB_USERS, $USERINFOS, $DELUSER, $ADDUSER, $ADDUSERPROFILE, $MODUSER, $RESET ); +my ( $TAB_GROUPS, $GROUPINFOS, $DELGROUP, $ADDGROUP, $MODGROUP ); +my ( $TAB_POLICY, $POLICYINFOS, $DELPOLICY, $ADDPOLICY, $MODPOLICY ); sub reconnect_ldap_snmc; sub refresh_posixGroups; @@ -75,2415 +73,2625 @@ my $mod_synchro; INIT { - # unbuffered output: - $| = 1; + # unbuffered output: + $| = 1; - # turn on/off debug - # if isAdmin is set, will be automatically set to 2 - $debug = 1; + # turn on/off debug + # if isAdmin is set, will be automatically set to 2 + $debug = 1; - $mod_synchro = 0; + $mod_synchro = 0; - ($connected, $isAdmin, $userMustChange) = (0, 0, 0); + ( $connected, $isAdmin, $userMustChange ) = ( 0, 0, 0 ); - $ldap_snmc = { - #'server' => 'ldap.snmc.cec.eu.int', - 'server' => 'vldap-jmo.snmc.cec.eu.int', - 'label' => 'ldap_snmc', - 'starttls' => 1, - 'debug' => $debug, - 'verbose' => $debug, - }; + $ldap_snmc = { - reset_tab_actions; + #'server' => 'ldap.snmc.cec.eu.int', + 'server' => 'vldap-jmo.snmc.cec.eu.int', + 'label' => 'ldap_snmc', + 'starttls' => 1, + 'debug' => $debug, + 'verbose' => $debug, + }; - # add and overwrite some FormBuilder validation methods - my $validate = \%CGI::FormBuilder::Field::VALIDATE; + reset_tab_actions; - $validate->{'IM'} = '/^IM[0-9]{10}$/'; + # add and overwrite some FormBuilder validation methods + my $validate = \%CGI::FormBuilder::Field::VALIDATE; - my $uid = '[a-zA-Z][\-a-zA-Z0-9]{6,16}'; - $validate->{'UID'} = '/^'.$uid.'$/'; + $validate->{'IM'} = '/^IM[0-9]{10}$/'; - my $word = '[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]'; - my $anchored_word = '/^'.$word.'$/'; + my $uid = '[a-zA-Z][\-a-zA-Z0-9]{6,16}'; + $validate->{'UID'} = '/^' . $uid . '$/'; - my $peopletree = $SNET::LdapNS::PEOPLE.','.$SNET::LdapNS::SNET; - $validate->{'USERDN'} = '/^(?i)uid='.$uid.','.$peopletree.'$/'; + my $word = '[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]'; + my $anchored_word = '/^' . $word . '$/'; - $validate->{'GROUP'} = $anchored_word; + my $peopletree = $SNET::LdapNS::PEOPLE . ',' . $SNET::LdapNS::SNET; + $validate->{'USERDN'} = '/^(?i)uid=' . $uid . ',' . $peopletree . '$/'; - $validate->{'UIDNUMBER'} = '/^[2-9][0-9]{3}$/'; - $validate->{'GIDNUMBER'} = '/^[2-9][0-9]{3}$/'; - $validate->{'EMAIL'} = '/^[\w\-\+\._]+\@[a-zA-Z0-9][-a-zA-Z0-9\.]*(\.[a-zA-Z]+)+$/'; - $validate->{'GECOS'} = '/^\w+(\s+\w+)+$/'; - $validate->{'DESCRIPTION'} = '/^\w+(\s+\w+)*$/'; - $validate->{'GROUPCLASS'} = '/^(posixGroup|groupOfNames)$/'; + $validate->{'GROUP'} = $anchored_word; - $validate->{'PPOLICY'} = $anchored_word; - $validate->{'PPOLICYDN'} = '/^(?i)documentIdentifier='.$word.','.$SNET::LdapNS::POLICIES.'/'; + $validate->{'UIDNUMBER'} = '/^[2-9][0-9]{3}$/'; + $validate->{'GIDNUMBER'} = '/^[2-9][0-9]{3}$/'; + $validate->{'EMAIL'} = '/^[\w\-\+\._]+\@[a-zA-Z0-9][-a-zA-Z0-9\.]*(\.[a-zA-Z]+)+$/'; + $validate->{'GECOS'} = '/^\w+(\s+\w+)+$/'; + $validate->{'DESCRIPTION'} = '/^\w+(\s+\w+)*$/'; + $validate->{'GROUPCLASS'} = '/^(posixGroup|groupOfNames)$/'; + $validate->{'PROFILE'} = '/^(Compliance|Managment|Network|Official|ProjectImplementation|ProjectManager|Security|ServiceDesk|SuportingService|TestDesignArchitect)$/'; - while (my ($k, $v) = each %{$SNET::LdapNS::pwdPolicyAttributes}) { - my $type = ${$v}[0]; - if ($type eq 'bool') { - $validate->{$k} = '/^(true|false)$/'; - } - elsif ($type eq 'nbool') { - $validate->{$k} = '/^(counted|forbidden)$/'; - } - elsif ($type eq 'extbool') { - $validate->{$k} = '/^(on|off|strict)$/'; - } - elsif (($type eq 'int') || ($type eq 'second')) { - $validate->{$k} = '/^[0-9]+$/'; + $validate->{'PPOLICY'} = $anchored_word; + $validate->{'PPOLICYDN'} = '/^(?i)documentIdentifier=' . $word . ',' . $SNET::LdapNS::POLICIES . '/'; + + while ( my ( $k, $v ) = each %{$SNET::LdapNS::pwdPolicyAttributes} ) { + my $type = ${$v}[0]; + if ( $type eq 'bool' ) { + $validate->{$k} = '/^(true|false)$/'; + } elsif ( $type eq 'nbool' ) { + $validate->{$k} = '/^(counted|forbidden)$/'; + } elsif ( $type eq 'extbool' ) { + $validate->{$k} = '/^(on|off|strict)$/'; + } elsif ( ( $type eq 'int' ) || ( $type eq 'second' ) ) { + $validate->{$k} = '/^[0-9]+$/'; + } } - } } -sub reset_actions { - ($INFO, $PASSWD) = (0, 0); - ($USERINFOS, $DELUSER, $ADDUSER, $MODUSER, $RESET) = (0, 0, 0, 0, 0); - ($GROUPINFOS, $DELGROUP, $ADDGROUP, $MODGROUP) = (0, 0, 0, 0); - ($POLICYINFOS, $DELPOLICY, $ADDPOLICY, $MODPOLICY) = (0, 0, 0, 0); +sub reset_actions +{ + ( $INFO, $PASSWD ) = ( 0, 0 ); + ( $USERINFOS, $DELUSER, $ADDUSER, $ADDUSERPROFILE, $MODUSER, $RESET ) = ( 0, 0, 0, 0, 0, 0 ); + ( $GROUPINFOS, $DELGROUP, $ADDGROUP, $MODGROUP ) = ( 0, 0, 0, 0 ); + ( $POLICYINFOS, $DELPOLICY, $ADDPOLICY, $MODPOLICY ) = ( 0, 0, 0, 0 ); } -sub reset_tab_actions { - $LOGIN = 0; - $TAB_HOME = 0; - $TAB_USERS = 0; - $TAB_GROUPS = 0; - $TAB_POLICY = 0; - reset_actions; +sub reset_tab_actions +{ + $LOGIN = 0; + $TAB_HOME = 0; + $TAB_USERS = 0; + $TAB_GROUPS = 0; + $TAB_POLICY = 0; + reset_actions; } -sub parse_messages { - if (defined($session) && defined($session->param('error'))) { - $error = $session->param('error'); - $session->clear(['error']); - } - if (defined($session) && defined($session->param('message'))) { - $message = $session->param('message'); - $session->clear(['message']); - } - $error =~ s/\s+at\s+(\/|ldap).*//i if ( - defined($error) && ($debug < 2) - ); +sub parse_messages +{ + if ( defined( $session ) && defined( $session->param( 'error' ) ) ) { + $error = $session->param( 'error' ); + $session->clear( ['error'] ); + } + if ( defined( $session ) && defined( $session->param( 'message' ) ) ) { + $message = $session->param( 'message' ); + $session->clear( ['message'] ); + } + $error =~ s/\s+at\s+(\/|ldap).*//i if ( defined( $error ) && ( $debug < 2 ) ); } -sub redirect($) { - my $params = shift; - $params = '?tab=home' unless (defined($params) && ($params =~ m/^\?.+=.+/)); - if ($params =~ m/\?tab=([[:alnum:]]+)/) { - $session->param('tab', $1); - } - print $cgi->redirect( - $homepage.$params, - -status => 302 - ); - exit 0; +sub redirect($) +{ + my $params = shift; + $params = '?tab=home' unless ( defined( $params ) && ( $params =~ m/^\?.+=.+/ ) ); + if ( $params =~ m/\?tab=([[:alnum:]]+)/ ) { + $session->param( 'tab', $1 ); + } + print $cgi->redirect( $homepage . $params, -status => 302 ); + exit 0; } -sub redirect_login { - redirect('?login=1'); +sub redirect_login +{ + redirect( '?login=1' ); } -sub redirect_homepage { - redirect('?tab=home'); +sub redirect_homepage +{ + redirect( '?tab=home' ); } -sub ldapns_logout { - $session->delete(); - redirect_login; +sub ldapns_logout +{ + $session->delete(); + redirect_login; } -sub synchronize_del_users($$) { +sub synchronize_del_users($$) +{ - my ($uid, $synchronize) = @_; + my ( $uid, $synchronize ) = @_; - print STDERR "synchronize_del_users($mod_synchro/$synchronize)\n"; + print STDERR "synchronize_del_users($mod_synchro/$synchronize)\n"; - return unless ($mod_synchro && $synchronize); + return unless ( $mod_synchro && $synchronize ); - my $error_msg = "unable to delete user from old database: "; - my $error = 0; - my $binddn; + my $error_msg = "unable to delete user from old database: "; + my $error = 0; + my $binddn; - eval { + eval { - die "invalid uid" unless (defined($uid)); + die "invalid uid" unless ( defined( $uid ) ); - my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); - my $ldap_iniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'LDAP' ) ); + my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); + my $ldap_iniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'LDAP' ) ); - my $binddn = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'USER' ); - my $passwd = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'PASSWORD' ); - my @servers = split(/,/, $ldap_iniFile->val( 'LDAP_SNET_SERVER_LIST', 'SERVERS')); + my $binddn = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'USER' ); + my $passwd = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'PASSWORD' ); + my @servers = split( /,/, $ldap_iniFile->val( 'LDAP_SNET_SERVER_LIST', 'SERVERS' ) ); - SNET::LdapNS::ldapns_add_dn_exception($binddn); + SNET::LdapNS::ldapns_add_dn_exception( $binddn ); - foreach my $server (@servers) { + foreach my $server ( @servers ) { - my $host = $ldap_iniFile->val( $server, 'SERVER' ); - my $base = $ldap_iniFile->val( $server, 'BASE' ); + my $host = $ldap_iniFile->val( $server, 'SERVER' ); + my $base = $ldap_iniFile->val( $server, 'BASE' ); - die "invalid host `$host'" unless ($host =~ m/^(?:ldap:\/\/)?([^:]+)(?::389)?$/i); - my $fqdn = $1; + die "invalid host `$host'" unless ( $host =~ m/^(?:ldap:\/\/)?([^:]+)(?::389)?$/i ); + my $fqdn = $1; - SNET::LdapNS::ldapns_bind( - $fqdn, - $binddn, - $passwd, - $host, - 'LDAPISS', - 0, 0, 0 - ); - - my $connection = SNET::LdapNS::get_connection($host); + SNET::LdapNS::ldapns_bind( $fqdn, $binddn, $passwd, $host, 'LDAPISS', 0, 0, 0 ); - $uid = $connection->clean_dn($uid); - my $res; + my $connection = SNET::LdapNS::get_connection( $host ); - eval { - $res = SNET::LdapNS::getPosixAccount( - $host, - $uid, - 'ou=People,'.$base - ); - }; - if ($@) { - $error++; - $error_msg .= "[uid=$uid]: skipping missing user; "; - print STDERR "synchronize_del_users: skipping non-existing user `$uid'\n"; - next; - } - - print STDERR "synchronize_del_users: deleting user `$uid'\n"; - my @keys = keys(%{$res}); - my $dn = shift(@keys); - die "invalid uid `$uid'" unless ( - lc($dn) eq lc('uid='.$uid.',ou=People,'.$base) - ); - - eval { - - my $entry = Net::LDAP::Entry->new($dn); - $entry->delete(); - my $result = $entry->update($connection->{'connection'}); - die "[uid=$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - # update automount - $entry = Net::LDAP::Entry->new( - 'automountKey='.$uid.',automountMapName=auto_home,'.$base, - ); - $entry->delete(); - $result = $entry->update($connection->{'connection'}); - die "[homedir=$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - # update cn=snmc - $entry = Net::LDAP::Entry->new( - 'cn=snmc,ou=group,'.$base, - ); - $entry->changetype('modify'); - $entry->delete('memberUid' => [$uid]); - $result = $entry->update($connection->{'connection'}); - die "[cn=snmc:$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - # update cn=NS - $entry = Net::LDAP::Entry->new( - 'cn=NS,ou=group,'.$base, - ); - $entry->changetype('modify'); - $entry->delete('memberUid' => [$uid]); - $result = $entry->update($connection->{'connection'}); - die "[cn=snmc:$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - }; - if ($@) { - $error_msg.='['.$host.'] '.$@.';'; - $error++; - } + $uid = $connection->clean_dn( $uid ); + my $res; - } + eval { $res = SNET::LdapNS::getPosixAccount( $host, $uid, 'ou=People,' . $base ); }; + if ( $@ ) { + $error++; + $error_msg .= "[uid=$uid]: skipping missing user; "; + print STDERR "synchronize_del_users: skipping non-existing user `$uid'\n"; + next; + } - }; - if ($@) { - $error++; - $error_msg .= $@; - } - SNET::LdapNS::ldapns_del_dn_exception($binddn) if (defined($binddn)); - $session->param('error', $error_msg) if ($error); + print STDERR "synchronize_del_users: deleting user `$uid'\n"; + my @keys = keys( %{$res} ); + my $dn = shift( @keys ); + die "invalid uid `$uid'" unless ( lc( $dn ) eq lc( 'uid=' . $uid . ',ou=People,' . $base ) ); + + eval { + + my $entry = Net::LDAP::Entry->new( $dn ); + $entry->delete(); + my $result = $entry->update( $connection->{'connection'} ); + die "[uid=$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); + + # update automount + $entry = Net::LDAP::Entry->new( 'automountKey=' . $uid . ',automountMapName=auto_home,' . $base, ); + $entry->delete(); + $result = $entry->update( $connection->{'connection'} ); + die "[homedir=$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); + + # update cn=snmc + $entry = Net::LDAP::Entry->new( 'cn=snmc,ou=group,' . $base, ); + $entry->changetype( 'modify' ); + $entry->delete( 'memberUid' => [$uid] ); + $result = $entry->update( $connection->{'connection'} ); + die "[cn=snmc:$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); + + # update cn=NS + $entry = Net::LDAP::Entry->new( 'cn=NS,ou=group,' . $base, ); + $entry->changetype( 'modify' ); + $entry->delete( 'memberUid' => [$uid] ); + $result = $entry->update( $connection->{'connection'} ); + die "[cn=snmc:$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); + + }; + if ( $@ ) { + $error_msg .= '[' . $host . '] ' . $@ . ';'; + $error++; + } -} + } -sub synchronize_add_users($$) { + }; + if ( $@ ) { + $error++; + $error_msg .= $@; + } + SNET::LdapNS::ldapns_del_dn_exception( $binddn ) if ( defined( $binddn ) ); + $session->param( 'error', $error_msg ) if ( $error ); - my ($entry, $synchronize) = @_; - return unless ($mod_synchro && $synchronize); +} - my $error_msg = "unable to synchronize user with old database: "; - my $error = 0; - my $binddn; +sub synchronize_add_users($$) +{ - eval { + my ( $entry, $synchronize ) = @_; + return unless ( $mod_synchro && $synchronize ); - my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); - my $ldap_iniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'LDAP' ) ); + my $error_msg = "unable to synchronize user with old database: "; + my $error = 0; + my $binddn; - my $binddn = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'USER' ); - my $passwd = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'PASSWORD' ); - my @servers = split(/,/, $ldap_iniFile->val( 'LDAP_SNET_SERVER_LIST', 'SERVERS')); - my $homeserver = $ldap_iniFile->val( 'LDAP_SNET_HOMESERVER', 'SERVER' ); + eval { - SNET::LdapNS::ldapns_add_dn_exception($binddn); + my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); + my $ldap_iniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'LDAP' ) ); - die "invalid entry" unless ( - defined($entry) - && - (ref($entry) eq 'HASH') - ); + my $binddn = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'USER' ); + my $passwd = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'PASSWORD' ); + my @servers = split( /,/, $ldap_iniFile->val( 'LDAP_SNET_SERVER_LIST', 'SERVERS' ) ); + my $homeserver = $ldap_iniFile->val( 'LDAP_SNET_HOMESERVER', 'SERVER' ); - my %nocasehash; - tie %nocasehash, 'MagicHash', { - 'KEY' => sub { return lc($_[0]) }, - }; + SNET::LdapNS::ldapns_add_dn_exception( $binddn ); - while (my ($k, $v) = each %{$entry}) { + die "invalid entry" unless ( defined( $entry ) + && ( ref( $entry ) eq 'HASH' ) ); - die 'entry uid undefined' unless ( - (ref($v) eq 'HASH') && (defined($v->{'uid'})) - ); + my %nocasehash; + tie %nocasehash, 'MagicHash', { 'KEY' => sub { return lc( $_[0] ) }, }; - my %nocasehash_v; - tie %nocasehash_v, 'MagicHash', { - 'KEY' => sub { return lc($_[0]) }, - }; - while (my ($kk, $vv) = each %{$v}) { - $nocasehash_v{$kk} = $vv; - } - $nocasehash{$k} = \%nocasehash_v; + while ( my ( $k, $v ) = each %{$entry} ) { - $nocasehash{$k}->{'homeDirectory'} = ['/home/'.${$v->{'uid'}}[0]]; - $nocasehash{$k}->{'shadowLastChange'} = ['11640']; - $nocasehash{$k}->{'shadowFlag'} = [0]; - $nocasehash{$k}->{'loginShell'} = ['/bin/ksh']; - $nocasehash{$k}->{'cn'} = [${$v->{'uid'}}[0]]; + die 'entry uid undefined' unless ( ( ref( $v ) eq 'HASH' ) && ( defined( $v->{'uid'} ) ) ); - } + my %nocasehash_v; + tie %nocasehash_v, 'MagicHash', { 'KEY' => sub { return lc( $_[0] ) }, }; + while ( my ( $kk, $vv ) = each %{$v} ) { + $nocasehash_v{$kk} = $vv; + } + $nocasehash{$k} = \%nocasehash_v; - foreach my $server (@servers) { + $nocasehash{$k}->{'homeDirectory'} = [ '/home/' . ${ $v->{'uid'} }[0] ]; + $nocasehash{$k}->{'shadowLastChange'} = ['11640']; + $nocasehash{$k}->{'shadowFlag'} = [0]; + $nocasehash{$k}->{'loginShell'} = ['/bin/ksh']; + $nocasehash{$k}->{'cn'} = [ ${ $v->{'uid'} }[0] ]; - my $host = $ldap_iniFile->val( $server, 'SERVER' ); - my $base = $ldap_iniFile->val( $server, 'BASE' ); - my $class = $ldap_iniFile->val( $server, 'MAILCLASS' ); + } - die "invalid host `$host'" unless ($host =~ m/^(?:ldap:\/\/)?([^:]+)(?::389)?$/i); - my $fqdn = $1; + foreach my $server ( @servers ) { - SNET::LdapNS::ldapns_bind( - $fqdn, - $binddn, - $passwd, - $host, - 'LDAPISS', - 0, 0, 0 - ); - - my $connection = SNET::LdapNS::get_connection($host); + my $host = $ldap_iniFile->val( $server, 'SERVER' ); + my $base = $ldap_iniFile->val( $server, 'BASE' ); + my $class = $ldap_iniFile->val( $server, 'MAILCLASS' ); - while (my ($k, $v) = each %nocasehash) { + die "invalid host `$host'" unless ( $host =~ m/^(?:ldap:\/\/)?([^:]+)(?::389)?$/i ); + my $fqdn = $1; - my $uid = $connection->clean_dn(${$v->{'uid'}}[0]); - my $res; + SNET::LdapNS::ldapns_bind( $fqdn, $binddn, $passwd, $host, 'LDAPISS', 0, 0, 0 ); - eval { - $res = SNET::LdapNS::getPosixAccount( - $host, - $uid, - 'ou=People,'.$base - ); - }; - if (!$@) { - if (defined($res) && (keys(%{$res}) >= 1)) { - $error++; - $error_msg .= "[uid=$uid]: skipping existing user; "; - print STDERR "synchronize_add_users: skipping existing user `$uid'\n"; - next; - } - } + my $connection = SNET::LdapNS::get_connection( $host ); - print STDERR "synchronize_add_users: synchronizing user `$uid'\n"; + while ( my ( $k, $v ) = each %nocasehash ) { - delete($v->{'objectclass'}); - delete($v->{'auditinformation'}); - delete($v->{'pwdreset'}); + my $uid = $connection->clean_dn( ${ $v->{'uid'} }[0] ); + my $res; - $v->{'objectClass'} = [qw(top posixAccount shadowAccount account), $class]; + eval { $res = SNET::LdapNS::getPosixAccount( $host, $uid, 'ou=People,' . $base ); }; + if ( !$@ ) { + if ( defined( $res ) && ( keys( %{$res} ) >= 1 ) ) { + $error++; + $error_msg .= "[uid=$uid]: skipping existing user; "; + print STDERR "synchronize_add_users: skipping existing user `$uid'\n"; + next; + } + } - my $dn = 'uid='.$uid.',ou=People,'.$base; + print STDERR "synchronize_add_users: synchronizing user `$uid'\n"; - eval { + delete( $v->{'objectclass'} ); + delete( $v->{'auditinformation'} ); + delete( $v->{'pwdreset'} ); - my $entry = Net::LDAP::Entry->new($dn); - while (my ($kk, $vv) = each %{$v}) { - $entry->add($kk => $vv); - } - $entry->changetype('add'); - - #print STDERR 'uid='.$uid.',ou=People,'.$base.' => '.Dumper($entry)."\n"; - - my $result = $entry->update($connection->{'connection'}); - die "[uid=$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - # update automount - $entry = Net::LDAP::Entry->new( - 'automountKey='.$uid.',automountMapName=auto_home,'.$base, - 'automountkey' => [$uid], - 'objectClass' => [ 'automount', 'top' ], - 'automountInformation' => [ $homeserver.':/opt/home/&' ], - ); - $entry->changetype('add'); - $result = $entry->update($connection->{'connection'}); - die "[homedir=$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - # update cn=snmc - $entry = Net::LDAP::Entry->new( - 'cn=snmc,ou=group,'.$base, - ); - $entry->changetype('modify'); - $entry->add('memberUid' => [$uid]); - $result = $entry->update($connection->{'connection'}); - die "[cn=snmc=$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); - - # update cn=NS - $entry = Net::LDAP::Entry->new( - 'cn=NS,ou=group,'.$base, - ); - $entry->changetype('modify'); - $entry->add('memberUid' => [$uid]); - $result = $entry->update($connection->{'connection'}); - die "[cn=snmc=$uid]: ".( - defined($result->error_desc) ? $result->error_desc : $result->error() - ).'; ' if ($result->is_error()); + $v->{'objectClass'} = [ qw(top posixAccount shadowAccount account), $class ]; - }; - if ($@) { - $error_msg.='['.$host.'] '.$@.';'; - $error++; - } + my $dn = 'uid=' . $uid . ',ou=People,' . $base; - } + eval { - } + my $entry = Net::LDAP::Entry->new( $dn ); + while ( my ( $kk, $vv ) = each %{$v} ) { + $entry->add( $kk => $vv ); + } + $entry->changetype( 'add' ); - }; - if ($@) { - $error++; - $error_msg .= $@; - } - SNET::LdapNS::ldapns_del_dn_exception($binddn) if (defined($binddn)); - $session->param('error', $error_msg) if ($error); + #print STDERR 'uid='.$uid.',ou=People,'.$base.' => '.Dumper($entry)."\n"; -} + my $result = $entry->update( $connection->{'connection'} ); + die "[uid=$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); -sub synchronize_passwords($$$;$$) { + # update automount + $entry = Net::LDAP::Entry->new( + 'automountKey=' . $uid . ',automountMapName=auto_home,' . $base, + 'automountkey' => [$uid], + 'objectClass' => [ 'automount', 'top' ], + 'automountInformation' => [ $homeserver . ':/opt/home/&' ], + ); + $entry->changetype( 'add' ); + $result = $entry->update( $connection->{'connection'} ); + die "[homedir=$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); - my $error_msg = "unable to synchronize password with old database: "; - my $error = 0; + # update cn=snmc + $entry = Net::LDAP::Entry->new( 'cn=snmc,ou=group,' . $base, ); + $entry->changetype( 'modify' ); + $entry->add( 'memberUid' => [$uid] ); + $result = $entry->update( $connection->{'connection'} ); + die "[cn=snmc=$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); - eval { + # update cn=NS + $entry = Net::LDAP::Entry->new( 'cn=NS,ou=group,' . $base, ); + $entry->changetype( 'modify' ); + $entry->add( 'memberUid' => [$uid] ); + $result = $entry->update( $connection->{'connection'} ); + die "[cn=snmc=$uid]: " . ( defined( $result->error_desc ) ? $result->error_desc : $result->error() ) . '; ' if ( $result->is_error() ); - my ($synchronize, $label, $new, $uid, $old) = @_; - return unless ($mod_synchro && $synchronize); + }; + if ( $@ ) { + $error_msg .= '[' . $host . '] ' . $@ . ';'; + $error++; + } - die 'missing parameters' unless ( - defined($label) && defined($new) - ); + } - my $ldap = SNET::LdapNS::get_connection($label) - or die "invalid connection's label `$label'"; + } - if (defined($uid)) { - $uid = $ldap->clean_dn($uid); - } - else { - $uid = $ldap->clean_dn($ldap->{'user'}); + }; + if ( $@ ) { + $error++; + $error_msg .= $@; } + SNET::LdapNS::ldapns_del_dn_exception( $binddn ) if ( defined( $binddn ) ); + $session->param( 'error', $error_msg ) if ( $error ); - $error_msg .= '[uid='.$uid.'] : '; - - my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); - my $ldap_iniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'LDAP' ) ); +} - my $salt = join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]; - my $crypt = '{CRYPT}'.crypt($new, $salt); +sub synchronize_samba_password($$;$) +{ - my @servers = split(/,/, $ldap_iniFile->val( 'LDAP_SNET_SERVER_LIST', 'SERVERS')); + my $error_msg = "unable to synchronize password with samba credential: "; + my $error = 0; - foreach my $server (@servers) { + eval { + my ( $label, $new, $uid ) = @_; - my $host = $ldap_iniFile->val( $server, 'SERVER' ); - my $base = $ldap_iniFile->val( $server, 'BASE' ); + die 'missing parameters' unless ( defined( $label ) && defined( $new ) ); - eval { + my $ldap = SNET::LdapNS::get_connection( $label ) + or die "invalid connection's label `$label'"; - die "invalid host `$host'" unless ($host =~ m/^(?:ldap:\/\/)?([^:]+)(?::389)?$/i); - my $fqdn = $1; + if ( defined( $uid ) ) { + $uid = $ldap->clean_dn( $uid ); + } else { + $uid = $ldap->clean_dn( $ldap->{'user'} ); + } - my $dn = 'uid='.$uid.',ou=People,'.$base; - my $binddn; - my $passwd; + $error_msg .= '[uid=' . $uid . '] : '; - if (defined($old)) { - $binddn = 'uid='.$uid.',ou=People,'.$base; - $passwd = $old; - } - else { - $binddn = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'USER' ); - $passwd = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'PASSWORD' ); - die "not going to reset $binddn password" if (lc($dn) eq lc($binddn)); - SNET::LdapNS::ldapns_add_dn_exception($binddn); - } + ### If user NOT is SAMBA compliant: + SNET::LdapNS::check_user_smb_ready( $label, $uid ); - SNET::LdapNS::ldapns_bind( - $fqdn, - $binddn, - $passwd, - $host, - 'LDAPISS', - 0, 0, 0 - ); + # TODO: inject SAMBA schema. - my $connection = SNET::LdapNS::get_connection($host); + my ( $lm, $nt ) = ntlmgen $new; + my $dt = DateTime->now()->set_time_zone( "Europe/Luxembourg" ); + my $current_epoch = $dt->epoch(); - if (defined($old)) { - $connection->passwd2($dn, $old, $crypt); - } - else { - $connection->passwd2($dn, $salt, $crypt); - } + SNET::LdapNS::smb_passwd( $label, $lm, $nt, $current_epoch, $uid ) - }; - if ($@) { - $error_msg.='['.$host.'] '.$@.';'; + }; + if ( $@ ) { $error++; - } - + $error_msg .= $@; } - }; - if ($@) { - $error++; - $error_msg .= $@; - } - - $session->param('error', $error_msg) if ($error); + $session->param( 'error', $error_msg ) if ( $error ); } -sub fetch_net1_userinfos($) { +sub synchronize_passwords($$$;$$) +{ - my $uid = shift; + my $error_msg = "unable to synchronize password with old database: "; + my $error = 0; - my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); - my $AiniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'AD' ) ); + eval { - my $ldap_ad = { - 'server' => $AiniFile->val( 'AD_NET1', 'SERVER' ), - 'user' => $AiniFile->val( 'AD_NET1', 'USER' ), - 'password' => $AiniFile->val( 'AD_NET1', 'PASSWORD'), - 'label' => 'ad', - 'starttls' => 0, - 'debug' => 0, - 'verbose' => 0, - }; + my ( $synchronize, $label, $new, $uid, $old ) = @_; + return unless ( $mod_synchro && $synchronize ); - die 'missing parameters' unless ( - defined($uid) && ($uid =~ m/^[a-z0-9]+$/i) - ); + die 'missing parameters' unless ( defined( $label ) && defined( $new ) ); - SNET::LdapNS::ldapns_bind( - $ldap_ad->{'server'}, - $ldap_ad->{'user'}, - $ldap_ad->{'password'}, - $ldap_ad->{'label'}, - 'LDAPISS', - $ldap_ad->{'starttls'}, - $ldap_ad->{'debug'}, - $ldap_ad->{'verbose'} - ); + my $ldap = SNET::LdapNS::get_connection( $label ) + or die "invalid connection's label `$label'"; - my $connection = SNET::LdapNS::get_connection($ldap_ad->{'label'}); + if ( defined( $uid ) ) { + $uid = $ldap->clean_dn( $uid ); + } else { + $uid = $ldap->clean_dn( $ldap->{'user'} ); + } - my $userInfos = $connection->search( - base => 'OU=DIGIT,OU=DGs,DC=net1,DC=cec,DC=eu,DC=int', - scope => 'sub', - filter => '(sAMAccountName='.$uid.')', - attrs => ['mail', 'displayName'] - ); + $error_msg .= '[uid=' . $uid . '] : '; - die "user `$uid' not found in Net1 AD" unless defined($userInfos); - die 'More than 1 entries fetched from the AD Net1' unless (scalar(keys(%{$userInfos})) == 1); + my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); + my $ldap_iniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'LDAP' ) ); - return $userInfos; + my $salt = join '', ( '.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z' )[ rand 64, rand 64 ]; + my $crypt = '{CRYPT}' . crypt( $new, $salt ); -} + my @servers = split( /,/, $ldap_iniFile->val( 'LDAP_SNET_SERVER_LIST', 'SERVERS' ) ); -sub encode_sessionauth($) { + foreach my $server ( @servers ) { - my $password = shift; + my $host = $ldap_iniFile->val( $server, 'SERVER' ); + my $base = $ldap_iniFile->val( $server, 'BASE' ); - my $cipher = Crypt::CBC->new( - -key => $key, - -cipher => 'Blowfish' - ); - my $sessionauth = encode_base64( - $cipher->encrypt($password) - ); - chomp($sessionauth); - $session->param('sessionauth', $sessionauth); + eval { -} + die "invalid host `$host'" unless ( $host =~ m/^(?:ldap:\/\/)?([^:]+)(?::389)?$/i ); + my $fqdn = $1; -sub decode_sessionauth { + my $dn = 'uid=' . $uid . ',ou=People,' . $base; + my $binddn; + my $passwd; - my $cipher = Crypt::CBC->new( - -key => $key, - -cipher => 'Blowfish' - ); - my $password = $cipher->decrypt( - decode_base64($session->param('sessionauth')) - ); - return $password; + if ( defined( $old ) ) { + $binddn = 'uid=' . $uid . ',ou=People,' . $base; + $passwd = $old; + } else { + $binddn = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'USER' ); + $passwd = $ldap_iniFile->val( 'LDAP_CREDENTIALS', 'PASSWORD' ); + die "not going to reset $binddn password" if ( lc( $dn ) eq lc( $binddn ) ); + SNET::LdapNS::ldapns_add_dn_exception( $binddn ); + } -} + SNET::LdapNS::ldapns_bind( $fqdn, $binddn, $passwd, $host, 'LDAPISS', 0, 0, 0 ); -sub connect_ldap_snmc($$$) { - - my ($user, $password, $isAdmin) = @_; - - # overwrite debug for admin - $ldap_snmc->{'debug'} = $isAdmin; - - return if ($connected); - - $ldap_snmc->{'user'} = $user; - $ldap_snmc->{'password'} = $password; - - print STDERR "ldap_NS.pl: creating connection to ".$ldap_snmc->{'server'}." ...\n" if ($debug >2); - - my $pp = SNET::LdapNS::ldapns_bind( - $ldap_snmc->{'server'}, - $ldap_snmc->{'user'}, - $ldap_snmc->{'password'}, - $ldap_snmc->{'label'}, - $audit_user, - $ldap_snmc->{'starttls'}, - $ldap_snmc->{'debug'}, - $ldap_snmc->{'verbose'} - ); - - print STDERR "ldap_NS.pl: connection established\n" if ($debug >2); - - if (!defined($session)) { - $session = new CGI::Session ( - 'driver:File', - undef, - {'Directory' => $sessiondir} - ) or die CGI::Session->errstr; - $sid = $session->id(); - } - - $connected = 1; - - $session->param('user', $user); - - # $error could have been set to 'invalid empty session' - # after a logout/login - undef $error; - $session->clear(['error']); - - if (defined($pp->{'error'})) { - - print STDERR "ldap_NS.pl: ppolicy error!\n" if ($debug >2); - - if ($pp->{'error'} == LDAP_PP_PASSWORD_EXPIRED) { - $session->param('error', 'Your password has expired'); - $session->param('userMustChange', 1); - $userMustChange = 1; - $session->param('isAdmin', 0); - $session->clear(['userInfos']); - } - elsif ($pp->{'error'} == LDAP_PP_CHANGE_AFTER_RESET) { - $session->param('error', 'You must change your password immediately'); - $session->param('userMustChange', 1); - $userMustChange = 1; - $session->param('isAdmin', 0); - $session->clear(['userInfos']); - } - else { - $session->param('error', 'Undefined password policy error('.$pp->{'error'}.')'); - $session->param('isAdmin', 0); - } - } - else { - - if (defined($pp->{'warning'})) { - - print STDERR "ldap_NS.pl: ppolicy warning!\n" if ($debug >2); - - if (defined($pp->{'warning'}->{'graceAuthNsRemaining'})) { - $session->param('error', - 'Grace authentications remaining: '.$pp->{'warning'}->{'graceAuthNsRemaining'} - ); - } - elsif (defined($pp->{'warning'}->{'timeBeforeExpiration'})) { + my $connection = SNET::LdapNS::get_connection( $host ); - if ($pp->{'warning'}->{'timeBeforeExpiration'} > 0) { + if ( defined( $old ) ) { + $connection->passwd2( $dn, $old, $crypt ); + } else { + $connection->passwd2( $dn, $salt, $crypt ); + } - my ($days, $hours, $minutes) = (gmtime($pp->{'warning'}->{'timeBeforeExpiration'}))[7,2,1]; - my @values = (); - my @formats = (); + }; + if ( $@ ) { + $error_msg .= '[' . $host . '] ' . $@ . ';'; + $error++; + } - if ($days == 1) { - push (@formats, 'one day'); - } - elsif ($days > 1) { - push (@values, $days); - push (@formats, '%d days'); - } + } - if ($hours == 1) { - push (@formats, 'one hour'); - } - elsif ($hours > 1) { - push (@values, $hours); - push (@formats, '%d hours'); - } + }; + if ( $@ ) { + $error++; + $error_msg .= $@; + } - if ($minutes <= 1) { - push (@formats, 'one minute'); - } - elsif ($minutes > 1) { - push (@values, $minutes); - push (@formats, '%d minutes'); - } + $session->param( 'error', $error_msg ) if ( $error ); - my $message = sprintf('Your password will expire in '.join(', ', @formats), @values); +} - if ($days < 7) { - $session->param('error', $message); - } - else { - $session->param('message', $message); - } +sub fetch_net1_userinfos($) +{ - } - else { - # no ppolicy, or no pwdChangedTime - $session->param('message', 'Your password never expires'); - } + my $uid = shift; - } + my $global_iniFile = new Config::IniFiles( -file => "/opt/etc/ini/global.ini" ); + my $AiniFile = new Config::IniFiles( -file => $global_iniFile->val( 'INI', 'AD' ) ); + + my $ldap_ad = { + 'server' => $AiniFile->val( 'AD_NET1', 'SERVER' ), + 'user' => $AiniFile->val( 'AD_NET1', 'USER' ), + 'password' => $AiniFile->val( 'AD_NET1', 'PASSWORD' ), + 'label' => 'ad', + 'starttls' => 0, + 'debug' => 0, + 'verbose' => 0, + }; - } + die 'missing parameters' unless ( defined( $uid ) && ( $uid =~ m/^[a-z0-9]+$/i ) ); - $session->param('userMustChange', 0); - refresh_userInfos; + SNET::LdapNS::ldapns_bind( $ldap_ad->{'server'}, $ldap_ad->{'user'}, $ldap_ad->{'password'}, $ldap_ad->{'label'}, 'LDAPISS', $ldap_ad->{'starttls'}, $ldap_ad->{'debug'}, $ldap_ad->{'verbose'} ); - } + my $connection = SNET::LdapNS::get_connection( $ldap_ad->{'label'} ); - encode_sessionauth($password); + my $userInfos = $connection->search( + base => 'OU=DIGIT,OU=DGs,DC=net1,DC=cec,DC=eu,DC=int', + scope => 'sub', + filter => '(sAMAccountName=' . $uid . ')', + attrs => [ 'mail', 'displayName' ] + ); - if ($userMustChange) { - reset_tab_actions; - display_passwd; - } + die "user `$uid' not found in Net1 AD" unless defined( $userInfos ); + die 'More than 1 entries fetched from the AD Net1' unless ( scalar( keys( %{$userInfos} ) ) == 1 ); - $session->param('tab', 'home') unless (defined($session->param('tab'))); + return $userInfos; } -sub reconnect_ldap_snmc { - return if ($connected); - my $user = $session->param('user'); - my $password = decode_sessionauth; - connect_ldap_snmc($user, $password, $isAdmin); -} +sub encode_sessionauth($) +{ -sub refresh_ppolicy { - return if defined($session->param('pwdPolicies')); - eval { + my $password = shift; - reconnect_ldap_snmc; - my $pwdPolicies = SNET::LdapNS::getAllPwdPolicies($ldap_snmc->{'label'}); - if (1) { - my $defaultPwdPolicy = SNET::LdapNS::getPwdPolicy( - $ldap_snmc->{'label'}, $SNET::LdapNS::defaultPwdPolicy - ); - my @keys = keys(%{$defaultPwdPolicy}); - $pwdPolicies->{$keys[0]} = $defaultPwdPolicy->{$keys[0]}; - } - $session->param('pwdPolicies', $pwdPolicies); - - }; - if ($@) { - $session->param('error', $@); - redirect_homepage; - } -} + my $cipher = Crypt::CBC->new( -key => $key, + -cipher => 'Blowfish' ); + my $sessionauth = encode_base64( $cipher->encrypt( $password ) ); + chomp( $sessionauth ); + $session->param( 'sessionauth', $sessionauth ); -sub refresh_posixAccounts { - return if defined($session->param('posixAccounts')); - eval { - reconnect_ldap_snmc; - my $posixAccounts = SNET::LdapNS::getAllPosixAccounts($ldap_snmc->{'label'}); - $session->param('posixAccounts', $posixAccounts); - }; - if ($@) { - $session->param('error', $@); - redirect_homepage; - } } -sub refresh_posixGroups { - return if defined($session->param('posixGroups')); - eval { - reconnect_ldap_snmc; - my $posixGroups = SNET::LdapNS::getAllPosixGroups($ldap_snmc->{'label'}); - $session->param('posixGroups', $posixGroups); - }; - if ($@) { - $session->param('error', $@); - redirect_homepage; - } -} +sub decode_sessionauth +{ + + my $cipher = Crypt::CBC->new( -key => $key, + -cipher => 'Blowfish' ); + my $password = $cipher->decrypt( decode_base64( $session->param( 'sessionauth' ) ) ); + return $password; -sub refresh_groupOfNames { - return if defined($session->param('groupOfNames')); - eval { - reconnect_ldap_snmc; - my $groupOfNames = SNET::LdapNS::getAllGroupOfNames($ldap_snmc->{'label'}); - $session->param('groupOfNames', $groupOfNames); - }; - if ($@) { - $session->param('error', $@); - redirect_homepage; - } } -sub refresh_userInfos { +sub connect_ldap_snmc($$$) +{ - print STDERR "ldap_NS.pl: entering refresh_userInfos\n" if ($debug >2); + my ( $user, $password, $isAdmin ) = @_; - reconnect_ldap_snmc; - - eval { - return if ($session->param('userMustChange') > 0); - print STDERR "ldap_NS.pl: fetching `".$session->param('user')."' posixAccount\n" if ($debug >2); - my $userInfos = SNET::LdapNS::getPosixAccount( - $ldap_snmc->{'label'}, - $session->param('user') - ); - $session->param('userInfos', $userInfos); - - print STDERR "ldap_NS.pl: checking user privileges ...\n" if ($debug >2); - $isAdmin = SNET::LdapNS::isAdmin($ldap_snmc->{'label'}); - $session->param('isAdmin', $isAdmin); - print STDERR "ldap_NS.pl: user ".( - $isAdmin ? "is admin" : "is not admin" - )."\n" if ($debug >2); - - }; - if ($@) { - $session->param('error', $@); - redirect_homepage; - } + # overwrite debug for admin + $ldap_snmc->{'debug'} = $isAdmin; -} + return if ( $connected ); -sub getsize_multipleselect($) { + $ldap_snmc->{'user'} = $user; + $ldap_snmc->{'password'} = $password; - my $options = $_[0]; - my $size = 0; + print STDERR "ldap_NS.pl: creating connection to " . $ldap_snmc->{'server'} . " ...\n" if ( $debug > 2 ); - if (defined($options)) { - if (ref($options) eq 'ARRAY') { - $size = scalar(@{$options}); - } - elsif (ref($options) eq 'HASH') { - $size = scalar(keys(%{$options})); + my $pp = SNET::LdapNS::ldapns_bind( $ldap_snmc->{'server'}, $ldap_snmc->{'user'}, $ldap_snmc->{'password'}, $ldap_snmc->{'label'}, + $audit_user, $ldap_snmc->{'starttls'}, $ldap_snmc->{'debug'}, $ldap_snmc->{'verbose'} ); + + print STDERR "ldap_NS.pl: connection established\n" if ( $debug > 2 ); + + if ( !defined( $session ) ) { + $session = new CGI::Session( 'driver:File', undef, { 'Directory' => $sessiondir } ) or die CGI::Session->errstr; + $sid = $session->id(); } - } - if ($size > 10) { - $size = 10; - } - elsif ($size < 5) { - $size = 5; - } + $connected = 1; - return $size; + $session->param( 'user', $user ); -} + # $error could have been set to 'invalid empty session' + # after a logout/login + undef $error; + $session->clear( ['error'] ); -sub print_ns_headers($) { - - my $title = shift; - my $header_title = $cgi->h1( $cgi->a({href=>$homepage}, "SNet LdapNS") ); - - my $cookies = []; - push (@{$cookies}, - $cgi->cookie( - -name => "SESSION_ID", - -value => $session->id(), - -path => '/cgi-bin/auth', - -secure => 1, - ) - ) if (defined($session)); - - push (@{$cookies}, - $cgi->cookie( - -name => "SESSION_KEY", - -value => $key, - -path => '/cgi-bin/auth', - -secure => 1, - ) - ); - - my $template_header = HTML::Template->new(filename => $templatedir.'/ldapns_header.tmpl'); - - $template_header->param('login', $LOGIN); - - $template_header->param('tab_home', $TAB_HOME); - $template_header->param('isAdmin', $isAdmin); - $template_header->param('userMustChange', $userMustChange); - $template_header->param('info', $INFO); - $template_header->param('passwd', $PASSWD); - - $template_header->param('tab_users', $TAB_USERS); - $template_header->param('userinfos', $USERINFOS); - $template_header->param('adduser', $ADDUSER); - $template_header->param('deluser', $DELUSER); - $template_header->param('moduser', $MODUSER); - $template_header->param('reset', $RESET); - - $template_header->param('tab_groups', $TAB_GROUPS); - $template_header->param('groupinfos', $GROUPINFOS); - $template_header->param('addgroup', $ADDGROUP); - $template_header->param('delgroup', $DELGROUP); - $template_header->param('modgroup', $MODGROUP); - - $template_header->param('tab_policy', $TAB_POLICY); - $template_header->param('policyinfos', $POLICYINFOS); - $template_header->param('addpolicy', $ADDPOLICY); - $template_header->param('delpolicy', $DELPOLICY); - $template_header->param('modpolicy', $MODPOLICY); - - print $cgi->header( - -charset => 'UTF-8', - -cookie => $cookies, - ); - - # $title; $js_enable, $xport, $html, $header_title, $jsarray, $cssarray - dg_header_html( $title, 0, 0, undef, $header_title, undef, ['css/ldapns.css']); - print $template_header->output; + if ( defined( $pp->{'error'} ) ) { -} + print STDERR "ldap_NS.pl: ppolicy error!\n" if ( $debug > 2 ); -sub print_ns_footers { + if ( $pp->{'error'} == LDAP_PP_PASSWORD_EXPIRED ) { + $session->param( 'error', 'Your password has expired' ); + $session->param( 'userMustChange', 1 ); + $userMustChange = 1; + $session->param( 'isAdmin', 0 ); + $session->clear( ['userInfos'] ); + } elsif ( $pp->{'error'} == LDAP_PP_CHANGE_AFTER_RESET ) { + $session->param( 'error', 'You must change your password immediately' ); + $session->param( 'userMustChange', 1 ); + $userMustChange = 1; + $session->param( 'isAdmin', 0 ); + $session->clear( ['userInfos'] ); + } else { + $session->param( 'error', 'Undefined password policy error(' . $pp->{'error'} . ')' ); + $session->param( 'isAdmin', 0 ); + } + } else { - my $template_footer = HTML::Template->new(filename => $templatedir.'/ldapns_footer.tmpl'); - $template_footer->param('login', $LOGIN); + if ( defined( $pp->{'warning'} ) ) { - parse_messages; - $template_footer->param('error' => defined($error)); - $template_footer->param('error_msg' => $error); - $template_footer->param('message' => defined($message)); - $template_footer->param('message_msg' => $message); + print STDERR "ldap_NS.pl: ppolicy warning!\n" if ( $debug > 2 ); - print $template_footer->output; - print $cgi->end_html; - exit 0; + if ( defined( $pp->{'warning'}->{'graceAuthNsRemaining'} ) ) { + $session->param( 'error', 'Grace authentications remaining: ' . $pp->{'warning'}->{'graceAuthNsRemaining'} ); + } elsif ( defined( $pp->{'warning'}->{'timeBeforeExpiration'} ) ) { -} + if ( $pp->{'warning'}->{'timeBeforeExpiration'} > 0 ) { + my ( $days, $hours, $minutes ) = ( gmtime( $pp->{'warning'}->{'timeBeforeExpiration'} ) )[ 7, 2, 1 ]; + my @values = (); + my @formats = (); -sub render_ppolicyinfos($;$) { + if ( $days == 1 ) { + push( @formats, 'one day' ); + } elsif ( $days > 1 ) { + push( @values, $days ); + push( @formats, '%d days' ); + } - my ($policyInfos, $audit) = @_; - $audit = 0 unless defined($audit); + if ( $hours == 1 ) { + push( @formats, 'one hour' ); + } elsif ( $hours > 1 ) { + push( @values, $hours ); + push( @formats, '%d hours' ); + } - my $template = HTML::Template->new(filename => $templatedir.'/policyinfos.tmpl'); + if ( $minutes <= 1 ) { + push( @formats, 'one minute' ); + } elsif ( $minutes > 1 ) { + push( @values, $minutes ); + push( @formats, '%d minutes' ); + } - foreach my $dn (sort { $a cmp $b } keys(%{$policyInfos})) { - my $attrs = $policyInfos->{$dn}; - my @attrs; - delete($attrs->{'auditinformation'}) unless ($audit); - $attrs->{'objectclass'} = [qw(pwdPolicy)]; - foreach my $attr (sort { $a cmp $b } keys(%{$attrs})) { - my $value = $attrs->{$attr}; - foreach my $val (@{$value}) { + my $message = sprintf( 'Your password will expire in ' . join( ', ', @formats ), @values ); - if (defined($SNET::LdapNS::pwdPolicyAttributes->{$attr})) { - my $type = ${$SNET::LdapNS::pwdPolicyAttributes->{$attr}}[0]; - if ($type eq 'bool') { - $val = lc("$val"); - } - elsif ($type eq 'extbool') { - if ($val <= 0) { - $val = 'false'; - } - elsif ($val == 1) { - $val = 'true'; - } - else { - $val = 'strict'; - } - } - elsif ($type eq 'second') { - $val = $val."s"; - } -# elsif ($type eq 'int') { -# } - elsif ($type eq 'string') { - next; - } - elsif ($type eq 'nbool') { - $val = ($val > 0 ) ? 'counted' : 'forbidden'; - } - } - push(@attrs, {'attr' => $attr, 'value' => $val}); - } - } - $template->param('policydn' => $dn); - $template->param('attrs' => \@attrs); - print $template->output; - } + if ( $days < 7 ) { + $session->param( 'error', $message ); + } else { + $session->param( 'message', $message ); + } -} + } else { + # no ppolicy, or no pwdChangedTime + $session->param( 'message', 'Your password never expires' ); + } -sub render_userinfos($;$) { + } - my ($userInfos, $audit) = @_; - $audit = 0 unless defined($audit); + } - my $template = HTML::Template->new(filename => $templatedir.'/userinfos.tmpl'); + $session->param( 'userMustChange', 0 ); + refresh_userInfos; - foreach my $dn (sort { $a cmp $b } keys(%{$userInfos})) { - my $attrs = $userInfos->{$dn}; - my @attrs; - if (defined($attrs->{'pwdreset'})) { - delete($attrs->{'pwdreset'}); - $template->param('reset' => 1); - } - else { - $template->param('reset' => 0); } - delete($attrs->{'auditinformation'}) unless ($audit); - foreach my $attr (sort { $a cmp $b } keys(%{$attrs})) { - my $value = $attrs->{$attr}; - foreach (@{$value}) { - push(@attrs, {'attr' => $attr, 'value' => $_}); - } + + encode_sessionauth( $password ); + + if ( $userMustChange ) { + reset_tab_actions; + display_passwd; } - $template->param('userdn' => $dn); - $template->param('attrs' => \@attrs); - print $template->output; - } + + $session->param( 'tab', 'home' ) unless ( defined( $session->param( 'tab' ) ) ); } -sub render_groupinfos($;$) { +sub reconnect_ldap_snmc +{ + return if ( $connected ); + my $user = $session->param( 'user' ); + my $password = decode_sessionauth; + connect_ldap_snmc( $user, $password, $isAdmin ); +} - my ($groupInfos, $audit) = @_; - $audit = 0 unless defined($audit); +sub refresh_ppolicy +{ + return if defined( $session->param( 'pwdPolicies' ) ); + eval { - my $template = HTML::Template->new(filename => $templatedir.'/groupinfos.tmpl'); + reconnect_ldap_snmc; + my $pwdPolicies = SNET::LdapNS::getAllPwdPolicies( $ldap_snmc->{'label'} ); + if ( 1 ) { + my $defaultPwdPolicy = SNET::LdapNS::getPwdPolicy( $ldap_snmc->{'label'}, $SNET::LdapNS::defaultPwdPolicy ); + my @keys = keys( %{$defaultPwdPolicy} ); + $pwdPolicies->{ $keys[0] } = $defaultPwdPolicy->{ $keys[0] }; + } + $session->param( 'pwdPolicies', $pwdPolicies ); - foreach my $dn (sort { $a cmp $b } keys(%{$groupInfos})) { - my $attrs = $groupInfos->{$dn}; - my $objectClass; - if (defined($attrs->{'objectClass'})) { - $objectClass = ${$attrs->{'objectClass'}}[0]; - delete($attrs->{'objectClass'}); - } - delete($attrs->{'auditinformation'}) unless ($audit); - my @attrs; - foreach my $attr (sort { $a cmp $b } keys(%{$attrs})) { - my $value = $attrs->{$attr}; - foreach (@{$value}) { - push(@attrs, {'attr' => $attr, 'value' => $_}); - } - } - if (defined($objectClass)) { - unshift(@attrs, {'attr' => 'objectclass', 'value' => $objectClass} ); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + redirect_homepage; } - $template->param('groupdn' => $dn); - $template->param('attrs' => \@attrs); - print $template->output; - } +} +sub refresh_posixAccounts +{ + return if defined( $session->param( 'posixAccounts' ) ); + eval { + reconnect_ldap_snmc; + my $posixAccounts = SNET::LdapNS::getAllPosixAccounts( $ldap_snmc->{'label'} ); + $session->param( 'posixAccounts', $posixAccounts ); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + redirect_homepage; + } } -sub get_default_description($) { - - my $group = shift; - my @description; - - if ($group eq 'iss3') { - push(@description, 'CWRA'); - } - elsif ($group eq 'network') { - push(@description, 'CWRW'); - } - elsif ($group eq 'security') { - push(@description, 'CWRO'); - } - elsif ($group eq 'official') { - push(@description, 'CWRO'); - } - else { - return undef; - } - return \@description; +sub refresh_posixGroups +{ + return if defined( $session->param( 'posixGroups' ) ); + eval { + reconnect_ldap_snmc; + my $posixGroups = SNET::LdapNS::getAllPosixGroups( $ldap_snmc->{'label'} ); + $session->param( 'posixGroups', $posixGroups ); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + redirect_homepage; + } } -sub display_userinfos { - - $USERINFOS = 1; - - refresh_posixAccounts; - - my $userInfos; - my $options = {}; - - my $validate = { - uid => 'UID', - }; - - my $form = CGI::FormBuilder->new( - name => 'ldapns_userinfos_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Display user', - fields => [qw(uid audit)], - template => $templatedir.'/selectuser.tmpl', - method => 'post', - javascript => 1, - validate => $validate, - required => 'uid', - submit => 'Display', - ); - - my $posixAccounts = $session->param('posixAccounts'); - foreach my $values (values(%{$posixAccounts})) { - my $uid = ${$values->{'uid'}}[0]; - my $gecos = ${$values->{'gecos'}}[0]; - $options->{$uid} = $uid.' - '.$gecos; - } - - if ($form->submitted eq 'Display') { +sub refresh_groupOfNames +{ + return if defined( $session->param( 'groupOfNames' ) ); eval { - die 'invalid parameters' unless $form->validate; - my @uids = $form->field(name => 'uid'); - die 'You must select at least one user' unless (scalar(@uids) > 0); + reconnect_ldap_snmc; + my $groupOfNames = SNET::LdapNS::getAllGroupOfNames( $ldap_snmc->{'label'} ); + $session->param( 'groupOfNames', $groupOfNames ); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + redirect_homepage; + } +} - map { die "invalid uid `$_'" unless defined($options->{$_}) } @uids; +sub refresh_userInfos +{ - reconnect_ldap_snmc; + print STDERR "ldap_NS.pl: entering refresh_userInfos\n" if ( $debug > 2 ); - foreach my $uid (@uids) { - my $infos = SNET::LdapNS::getPosixAccount( - $ldap_snmc->{'label'}, - $uid - ); - while (my ($k, $v) = each (%{$infos})) { - $userInfos->{$k} = $v; - } - } + reconnect_ldap_snmc; + + eval { + return if ( $session->param( 'userMustChange' ) > 0 ); + print STDERR "ldap_NS.pl: fetching `" . $session->param( 'user' ) . "' posixAccount\n" if ( $debug > 2 ); + my $userInfos = SNET::LdapNS::getPosixAccount( $ldap_snmc->{'label'}, $session->param( 'user' ) ); + $session->param( 'userInfos', $userInfos ); + + print STDERR "ldap_NS.pl: checking user privileges ...\n" if ( $debug > 2 ); + $isAdmin = SNET::LdapNS::isAdmin( $ldap_snmc->{'label'} ); + $session->param( 'isAdmin', $isAdmin ); + print STDERR "ldap_NS.pl: user " . ( $isAdmin ? "is admin" : "is not admin" ) . "\n" if ( $debug > 2 ); }; - if ($@) { - $session->param('error', $@); - undef $userInfos; - } - } - - $form->field( - name => 'audit', - type => 'checkbox', - comment => 'Display auditInformation?', - options => 'yes', - selected => 0, - ); - - $form->field( - name => 'uid', - options => $options, - sortopts => 'NAME', - type => 'select', - size => getsize_multipleselect($options), - multiple => 1, - ); - - my $audit = ( - defined($form->field(name => 'audit')) - ); - - print_ns_headers("LdapNS display users"); - print $form->render; - render_userinfos($userInfos, $audit) if defined($userInfos); - print_ns_footers; + if ( $@ ) { + $session->param( 'error', $@ ); + redirect_homepage; + } } -sub display_adduser { +sub getsize_multipleselect($) +{ - $ADDUSER = 1; + my $options = $_[0]; + my $size = 0; - refresh_posixAccounts; - refresh_posixGroups; + if ( defined( $options ) ) { + if ( ref( $options ) eq 'ARRAY' ) { + $size = scalar( @{$options} ); + } elsif ( ref( $options ) eq 'HASH' ) { + $size = scalar( keys( %{$options} ) ); + } + } - my $options = {}; - - my $jsfunc = <<'EOJS'; - // skip js validation if fetching userInfos from Net1 - if (form._submitted_value.value.match(/^Refresh/)) { - var uid = form.elements['uid'].value; - var group = form.elements['group'].value; - if ((uid == null) && (group == null)) { - alert('Please fill uid and/or group prior to Refresh'); - } - return true; + if ( $size > 10 ) { + $size = 10; + } elsif ( $size < 5 ) { + $size = 5; } -EOJS - my $validate = { - IM => 'IM', - uid => 'UID', - uidNumber => 'UIDNUMBER', - mail => 'EMAIL', - gecos => 'GECOS', - group => 'GIDNUMBER', - description => 'DESCRIPTION', - }; - - my $fields = [qw(IM uid mail gecos group)]; - - my $form_fields = [qw(_submitted_value IM uid uidNumber mail gecos group description)]; - push (@{$form_fields}, 'synchronize') if ($mod_synchro); - - my $form = CGI::FormBuilder->new( - name => 'ldapns_adduser_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Add user', - fields => $form_fields, - template => $templatedir.'/adduser.tmpl', - method => 'post', - javascript => 1, - jsfunc => $jsfunc, - validate => $validate, - required => $fields, - reset => 1, - ); - - if ($mod_synchro) { - $form->field( - name => 'synchronize', - type => 'checkbox', - comment => 'Synchronize with old LDAP database?', - options => 'yes', - ); - $form->field( - name => 'synchronize', - value => 'yes' - ) unless ($form->submitted); - } - $form->tmpl_param('mod_synchro' => $mod_synchro); - - $form->field( - name => 'description', - comment => 'optional', - growable => 1, - ); - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - $form->field( - name => 'uidNumber', - comment => 'optional [2000..9999]', - ); - $form->field( - name => 'IM', - comment => 'SMT ticket number', - ); - $form->field( - name => 'gecos', - comment => 'LASTNAME Firstname', - ); - $form->field( - name => 'group', - comment => 'refresh Description', - ); - $form->field( - name => 'uid', - comment => 'fetch Mail & Gecos', - ); - - my $posixGroups = $session->param('posixGroups'); - foreach my $values (values(%{$posixGroups})) { - my $cn = ${$values->{'cn'}}[0]; - my $gidNumber = ${$values->{'gidnumber'}}[0]; - $options->{$gidNumber} = $cn; - } - - if (scalar(keys(%{$options})) == 0) { - $session->param('error', 'Unable to fetch available posixGroups'); - redirect('?tab=groups&action=addgroup'); - } - - if (($form->submitted eq 'Uid') || ($form->submitted eq 'Group')) { + return $size; - eval { +} - foreach my $field (@{$fields}) { - $form->field( - 'name' => $field, - required => 0 - ); - } - my $valid = 0; - $form->field('name' => 'uid', required => 1); - $valid += $form->validate; - $form->field('name' => 'uid', required => 0); - $form->field('name' => 'group', required => 1); - $valid += $form->validate; +sub print_ns_headers($) +{ + + my $title = shift; + my $header_title = $cgi->h1( $cgi->a( { href => $homepage }, "SNet LdapNS" ) ); + + my $cookies = []; + push( + @{$cookies}, + $cgi->cookie( + -name => "SESSION_ID", + -value => $session->id(), + -path => '/cgi-bin/auth', + -secure => 1, + ) + ) if ( defined( $session ) ); + + push( + @{$cookies}, + $cgi->cookie( + -name => "SESSION_KEY", + -value => $key, + -path => '/cgi-bin/auth', + -secure => 1, + ) + ); - die 'invalid parameters' unless $valid; + my $template_header = HTML::Template->new( filename => $templatedir . '/ldapns_header.tmpl' ); - my $uid = $form->field(name => 'uid'); - if (defined($uid) && length($uid)) { - my $userInfos = fetch_net1_userinfos($uid); - my @keys = keys(%{$userInfos}); - my $dn = $keys[0]; + $template_header->param( 'login', $LOGIN ); - $form->field( - name => 'mail', - force => 1, - value => ${$userInfos->{$dn}->{'mail'}}[0], - ) if defined($userInfos->{$dn}->{'mail'}); - - if (defined($userInfos->{$dn}->{'displayname'})) { - my $gecos = ${$userInfos->{$dn}->{'displayname'}}[0]; - $gecos =~ s/\s+\(.*$//; - $form->field( - name => 'gecos', - force => 1, - value => $gecos, - ); - } - } + $template_header->param( 'tab_home', $TAB_HOME ); + $template_header->param( 'isAdmin', $isAdmin ); + $template_header->param( 'userMustChange', $userMustChange ); + $template_header->param( 'info', $INFO ); + $template_header->param( 'passwd', $PASSWD ); - my $group = $form->field(name => 'group'); - if (defined($group) && length($group)) { - my $description = get_default_description($options->{$group}); - $form->field( - name => 'description', - force => 1, - value => $description, - ); - } + $template_header->param( 'tab_users', $TAB_USERS ); + $template_header->param( 'userinfos', $USERINFOS ); + $template_header->param( 'adduser', $ADDUSER ); + $template_header->param( 'adduserprofile', $ADDUSERPROFILE ); + $template_header->param( 'deluser', $DELUSER ); + $template_header->param( 'moduser', $MODUSER ); + $template_header->param( 'reset', $RESET ); - }; - if ($@) { - $session->param('error', $@); - } + $template_header->param( 'tab_groups', $TAB_GROUPS ); + $template_header->param( 'groupinfos', $GROUPINFOS ); + $template_header->param( 'addgroup', $ADDGROUP ); + $template_header->param( 'delgroup', $DELGROUP ); + $template_header->param( 'modgroup', $MODGROUP ); - } - elsif ($form->submitted eq 'Add') { + $template_header->param( 'tab_policy', $TAB_POLICY ); + $template_header->param( 'policyinfos', $POLICYINFOS ); + $template_header->param( 'addpolicy', $ADDPOLICY ); + $template_header->param( 'delpolicy', $DELPOLICY ); + $template_header->param( 'modpolicy', $MODPOLICY ); - my $entry; + print $cgi->header( -charset => 'UTF-8', + -cookie => $cookies, ); - eval { + # $title; $js_enable, $xport, $html, $header_title, $jsarray, $cssarray + dg_header_html( $title, 0, 0, undef, $header_title, undef, ['css/ldapns.css'] ); + print $template_header->output; - die 'invalid parameters' unless $form->validate($validate); +} - my $uidNumber = $form->field(name => 'uidNumber') || undef; - my $uid = $form->field(name => 'uid'); +sub print_ns_footers +{ - my $posixAccounts = $session->param('posixAccounts'); - foreach my $values (values(%{$posixAccounts})) { - die "user `$uid' already exists" if ( - $uid eq ${$values->{'uid'}}[0] - ); - next unless defined($uidNumber); - die "user id `$uidNumber' already exists" if ( - $uidNumber == ${$values->{'uidnumber'}}[0] - ); - } + my $template_footer = HTML::Template->new( filename => $templatedir . '/ldapns_footer.tmpl' ); + $template_footer->param( 'login', $LOGIN ); - my $group = $form->field(name => 'group'); - my $description = get_default_description($options->{$group}); - $description = [] unless defined($description); + parse_messages; + $template_footer->param( 'error' => defined( $error ) ); + $template_footer->param( 'error_msg' => $error ); + $template_footer->param( 'message' => defined( $message ) ); + $template_footer->param( 'message_msg' => $message ); - if (defined($form->field(name => 'description'))) { - push(@{$description}, $form->field(name => 'description')); - } + print $template_footer->output; + print $cgi->end_html; + exit 0; - my %uniq_description; - foreach my $desc (@{$description}) { - $uniq_description{$desc}++; - } - $description = []; - foreach my $desc (keys(%uniq_description)) { - push(@{$description}, $desc) if ( - defined($desc) - && - length($desc) - ); - } - undef $description unless (scalar(@{$description})); +} - print STDERR "description is defined: ".(defined($description))."\n"; +sub render_ppolicyinfos($;$) +{ + + my ( $policyInfos, $audit ) = @_; + $audit = 0 unless defined( $audit ); + + my $template = HTML::Template->new( filename => $templatedir . '/policyinfos.tmpl' ); + + foreach my $dn ( sort { $a cmp $b } keys( %{$policyInfos} ) ) { + my $attrs = $policyInfos->{$dn}; + my @attrs; + delete( $attrs->{'auditinformation'} ) unless ( $audit ); + $attrs->{'objectclass'} = [qw(pwdPolicy)]; + foreach my $attr ( sort { $a cmp $b } keys( %{$attrs} ) ) { + my $value = $attrs->{$attr}; + foreach my $val ( @{$value} ) { + + if ( defined( $SNET::LdapNS::pwdPolicyAttributes->{$attr} ) ) { + my $type = ${ $SNET::LdapNS::pwdPolicyAttributes->{$attr} }[0]; + if ( $type eq 'bool' ) { + $val = lc( "$val" ); + } elsif ( $type eq 'extbool' ) { + if ( $val <= 0 ) { + $val = 'false'; + } elsif ( $val == 1 ) { + $val = 'true'; + } else { + $val = 'strict'; + } + } elsif ( $type eq 'second' ) { + $val = $val . "s"; + } + + # elsif ($type eq 'int') { + # } + elsif ( $type eq 'string' ) { + next; + } elsif ( $type eq 'nbool' ) { + $val = ( $val > 0 ) ? 'counted' : 'forbidden'; + } + } + push( @attrs, { 'attr' => $attr, 'value' => $val } ); + } + } + $template->param( 'policydn' => $dn ); + $template->param( 'attrs' => \@attrs ); + print $template->output; + } - reconnect_ldap_snmc; - $entry = SNET::LdapNS::addPosixAccount( - $ldap_snmc->{'label'}, - $form->field(name => 'IM'), - $uid, - $group, - $form->field(name => 'gecos'), - $form->field(name => 'mail'), - $uidNumber, - $description, - ) or die "Unable to create LDAP entry for `$uid'"; +} - $session->clear(['posixAccounts']); +sub render_userinfos($;$) +{ - }; - if ($@) { - $session->param('error', $@); - } - else { + my ( $userInfos, $audit ) = @_; + $audit = 0 unless defined( $audit ); - my @attributes = $entry->attributes(nooptions => 1); - my $dn = $entry->dn; - my $userInfos; + my $template = HTML::Template->new( filename => $templatedir . '/userinfos.tmpl' ); - eval { - $userInfos = SNET::LdapNS::getPosixAccount( - $ldap_snmc->{'label'}, - $dn - ); - }; - if ($@) { - print STDERR "unable to fetch userInfos for `$dn': $@\n"; - $userInfos = { - $dn => {}, - }; - foreach my $attr (@attributes) { - next if ($attr =~ m/objectclass/i); - next if ($attr =~ m/shadow/i); - next if ($attr =~ m/^cn|sn$/i); - $userInfos->{$dn}->{lc($attr)} = $entry->get_value($attr, asref => 1); + foreach my $dn ( sort { $a cmp $b } keys( %{$userInfos} ) ) { + my $attrs = $userInfos->{$dn}; + my @attrs; + if ( defined( $attrs->{'pwdreset'} ) ) { + delete( $attrs->{'pwdreset'} ); + $template->param( 'reset' => 1 ); + } else { + $template->param( 'reset' => 0 ); } - } - else { - print STDERR "looking good, fetched userInfos for `$dn'\n"; - foreach my $attr (@attributes) { - next unless ( - ($attr =~ m/userPassword/i) - || - ($attr =~ m/auditinformation/i) - ); - $userInfos->{$dn}->{lc($attr)} = $entry->get_value($attr, asref => 1); + delete( $attrs->{'auditinformation'} ) unless ( $audit ); + foreach my $attr ( sort { $a cmp $b } keys( %{$attrs} ) ) { + my $value = $attrs->{$attr}; + foreach ( @{$value} ) { + push( @attrs, { 'attr' => $attr, 'value' => $_ } ); + } } - } + $template->param( 'userdn' => $dn ); + $template->param( 'attrs' => \@attrs ); + print $template->output; + } + +} + +sub render_groupinfos($;$) +{ - synchronize_add_users($userInfos, defined($form->field(name => 'synchronize'))); + my ( $groupInfos, $audit ) = @_; + $audit = 0 unless defined( $audit ); - $session->param('message', 'user added successfully'); - print_ns_headers("LdapNS add users"); - render_userinfos($userInfos); - print_ns_footers; + my $template = HTML::Template->new( filename => $templatedir . '/groupinfos.tmpl' ); + foreach my $dn ( sort { $a cmp $b } keys( %{$groupInfos} ) ) { + my $attrs = $groupInfos->{$dn}; + my $objectClass; + if ( defined( $attrs->{'objectClass'} ) ) { + $objectClass = ${ $attrs->{'objectClass'} }[0]; + delete( $attrs->{'objectClass'} ); + } + delete( $attrs->{'auditinformation'} ) unless ( $audit ); + my @attrs; + foreach my $attr ( sort { $a cmp $b } keys( %{$attrs} ) ) { + my $value = $attrs->{$attr}; + foreach ( @{$value} ) { + push( @attrs, { 'attr' => $attr, 'value' => $_ } ); + } + } + if ( defined( $objectClass ) ) { + unshift( @attrs, { 'attr' => 'objectclass', 'value' => $objectClass } ); + } + $template->param( 'groupdn' => $dn ); + $template->param( 'attrs' => \@attrs ); + print $template->output; } - } +} - $form->field( - name => 'group', - options => $options, - type => 'select', - size => getsize_multipleselect($options), - sortopts => 'NAME', - selectname => 0, - multiple => 0, - ); +sub get_default_description($) +{ - print_ns_headers("LdapNS add users"); - print $form->render; - print_ns_footers; + my $group = shift; + my @description; + if ( $group eq 'ss' ) { + push( @description, 'CWRA' ); + } elsif ( $group eq 'network' ) { + push( @description, 'CWRW' ); + } elsif ( $group eq 'security' ) { + push( @description, 'CWRW' ); + } elsif ( $group eq 'official' ) { + push( @description, 'CWRO' ); + } else { + return undef; + } + return \@description; } +sub display_userinfos +{ -sub display_deluser { + $USERINFOS = 1; - $DELUSER = 1; + refresh_posixAccounts; - refresh_posixAccounts; + my $userInfos; + my $options = {}; + + my $validate = { uid => 'UID', }; + + my $form = CGI::FormBuilder->new( + name => 'ldapns_userinfos_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Display user', + fields => [qw(uid audit)], + template => $templatedir . '/selectuser.tmpl', + method => 'post', + javascript => 1, + validate => $validate, + required => 'uid', + submit => 'Display', + ); - my $options = {}; - my $deluser = $session->param('deluser'); - my $type = 'select'; - - my $jsfunc = <<'EOJS'; - // skip on Cancel - if (form._submitted_value.value == 'Cancel') { - return true; + my $posixAccounts = $session->param( 'posixAccounts' ); + foreach my $values ( values( %{$posixAccounts} ) ) { + my $uid = ${ $values->{'uid'} }[0]; + my $gecos = ${ $values->{'gecos'} }[0]; + $options->{$uid} = $uid . ' - ' . $gecos; } -EOJS - my $validate = { - IM => 'IM', - uid => 'UID', - }; - - my $form_fields = [qw(_submitted_value IM uid)]; - push (@{$form_fields}, 'synchronize') if ($mod_synchro); - - my $form = CGI::FormBuilder->new( - name => 'ldapns_deluser_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Delete user', - fields => $form_fields, - template => $templatedir.'/deluser.tmpl', - method => 'post', - required => [qw(IM uid)], - javascript => 1, - sticky => 1, - selectname => 0, - jsfunc => $jsfunc, - validate => $validate, - ); - - if ($mod_synchro) { - $form->field( - name => 'synchronize', - type => 'checkbox', - comment => 'Synchronize with old LDAP database?', - options => 'yes', - ); - $form->field( - name => 'synchronize', - value => 'yes' - ) unless ($form->submitted); - } - $form->tmpl_param('mod_synchro' => $mod_synchro); + if ( $form->submitted eq 'Display' ) { + eval { + die 'invalid parameters' unless $form->validate; + my @uids = $form->field( name => 'uid' ); + die 'You must select at least one user' unless ( scalar( @uids ) > 0 ); + map { die "invalid uid `$_'" unless defined( $options->{$_} ) } @uids; - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - $form->field( - name => 'IM', - comment => 'SMT ticket number', - ); + reconnect_ldap_snmc; - if ($form->submitted eq 'Delete') { + foreach my $uid ( @uids ) { + my $infos = SNET::LdapNS::getPosixAccount( $ldap_snmc->{'label'}, $uid ); + while ( my ( $k, $v ) = each( %{$infos} ) ) { + $userInfos->{$k} = $v; + } + } - eval { + }; + if ( $@ ) { + $session->param( 'error', $@ ); + undef $userInfos; + } + } - die 'invalid parameters' unless $form->validate($validate); - my @uids = $form->field(name => 'uid'); - die 'You must select a single user' unless (scalar(@uids) == 1); - - $deluser->{'IM'} = $form->field(name => 'IM'); - foreach my $uid (@uids) { - $options->{$uid} = $deluser->{'options'}->{$uid} - or die "invalid uid `$uid'"; - } - $deluser->{'options'} = $options; - $session->param('deluser', $deluser); - - }; - if ($@) { - $session->param('error', $@); - display_blank("LdapNS delete users"); - } - - $type = 'checkbox'; - $form->field(name => 'uid', disabled => 1); - $form->field(name => 'IM', disabled => 1); - - $form->tmpl_param('submit1' => 'Confirm'); - $form->tmpl_param('submit2' => 1); - $form->tmpl_param('submit2_value' => 'Cancel'); - - } - elsif ($form->submitted eq 'Confirm') { - my $deluser = $session->param('deluser'); - my @uids = keys(%{$deluser->{'options'}}); - my $IM = $deluser->{'IM'}; - my @deleted_uid; - my $uid; - eval { - reconnect_ldap_snmc; - foreach $uid (@uids) { - SNET::LdapNS::deletePosixAccount( - $ldap_snmc->{'label'}, - $IM, - $uid - ); - push(@deleted_uid, $uid); - synchronize_del_users($uid, defined($form->field(name => 'synchronize'))); - } - }; - if ($@) { - $session->param('error', $@); - } - if (scalar(@deleted_uid)) { - print STDERR 'Successful deletion of '.join(', ', @deleted_uid)."\n"; - $session->param('message', 'Successful deletion of '.join(', ', @deleted_uid)); - $session->clear(['posixAccounts']); - } - $session->clear(['deluser']); - display_blank("LdapNS delete users"); - } - elsif ($form->submitted eq 'Cancel') { - $session->param('error', 'delete operation cancelled'); - $session->clear(['deluser']); - display_blank("LdapNS delete users"); - } - else { - my $posixAccounts = $session->param('posixAccounts'); - foreach my $values (values(%{$posixAccounts})) { - my $uid = ${$values->{'uid'}}[0]; - next if ($uid eq $session->param('user')); - my $gecos = ${$values->{'gecos'}}[0]; - $options->{$uid} = $uid.' - '.$gecos; - } - $deluser->{'options'} = $options; - $session->param('deluser', $deluser); - $form->tmpl_param('submit1' => 'Delete'); - } - - if (scalar(keys(%{$options})) == 0) { - $session->param('error', 'Unable to fetch available posixAccounts'); - display_blank("LdapNS delete users"); - } - - $form->field( - name => 'uid', - options => $options, - sortopts => 'NAME', - linebreaks => 1, - type => $type, - multiple => 0, - ); - - if ($type eq 'select') { $form->field( - size => getsize_multipleselect($options), + name => 'audit', + type => 'checkbox', + comment => 'Display auditInformation?', + options => 'yes', + selected => 0, ); - } - print_ns_headers("LdapNS delete users"); - print $form->render(); - print_ns_footers; + $form->field( + name => 'uid', + options => $options, + sortopts => 'NAME', + type => 'select', + size => getsize_multipleselect( $options ), + multiple => 1, + ); -} + my $audit = ( defined( $form->field( name => 'audit' ) ) ); + + print_ns_headers( "LdapNS display users" ); + print $form->render; + render_userinfos( $userInfos, $audit ) if defined( $userInfos ); + print_ns_footers; -sub display_moduser { - $MODUSER = 1; - $session->param('error', 'Not yet implemented'); - display_blank("LdapNS modify users"); } -sub display_reset { +sub display_adduser +{ - $RESET = 1; + $ADDUSER = 1; - refresh_posixAccounts; + refresh_posixAccounts; + refresh_posixGroups; - my $options = {}; - my $reset = $session->param('reset'); - my $type = 'select'; + my $options = {}; - my $jsfunc = <<'EOJS'; - // skip on Cancel - if (form._submitted_value.value == 'Cancel') { + my $jsfunc = <<'EOJS'; + // skip js validation if fetching userInfos from Net1 + if (form._submitted_value.value.match(/^Refresh/)) { + var uid = form.elements['uid'].value; + var group = form.elements['group'].value; + if ((uid == null) && (group == null)) { + alert('Please fill uid and/or group prior to Refresh'); + } return true; } EOJS - my $validate = { - uid => 'UID', - }; - - my $form_fields = [qw(_submitted_value uid)]; - push (@{$form_fields}, 'synchronize') if ($mod_synchro); - - my $form = CGI::FormBuilder->new( - name => 'ldapns_reset_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Reset password', - fields => $form_fields, - template => $templatedir.'/reset.tmpl', - method => 'post', - required => [qw(uid)], - javascript => 1, - selectname => 0, - jsfunc => $jsfunc, - validate => $validate, - ); - - if ($mod_synchro) { - $form->field( - name => 'synchronize', - type => 'checkbox', - comment => 'Synchronize with old LDAP database?', - options => 'yes', + my $validate = { + IM => 'IM', + uid => 'UID', + uidNumber => 'UIDNUMBER', + mail => 'EMAIL', + gecos => 'GECOS', + group => 'GIDNUMBER', + description => 'DESCRIPTION', + }; + + my $fields = [qw(IM uid mail gecos group)]; + + my $form_fields = [qw(_submitted_value IM uid uidNumber mail gecos group description)]; + push( @{$form_fields}, 'synchronize' ) if ( $mod_synchro ); + + my $form = CGI::FormBuilder->new( + name => 'ldapns_adduser_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Add user', + fields => $form_fields, + template => $templatedir . '/adduser.tmpl', + method => 'post', + javascript => 1, + jsfunc => $jsfunc, + validate => $validate, + required => $fields, + reset => 1, ); - $form->field( - name => 'synchronize', - value => 'yes' - ) unless ($form->submitted); - } - $form->tmpl_param('mod_synchro' => $mod_synchro); - - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - - if ($form->submitted eq 'Reset') { - eval { - die 'invalid parameters' unless $form->validate($validate); - my @uids = $form->field(name => 'uid'); - die 'You must select a single user' unless (scalar(@uids) == 1); + if ( $mod_synchro ) { + $form->field( + name => 'synchronize', + type => 'checkbox', + comment => 'Synchronize with old LDAP database?', + options => 'yes', + ); + $form->field( + name => 'synchronize', + value => 'yes' + ) unless ( $form->submitted ); + } + $form->tmpl_param( 'mod_synchro' => $mod_synchro ); - my $uid = shift(@uids); - $options->{$uid} = $reset->{'options'}->{$uid} - or die "invalid uid `$uid'"; + $form->field( + name => 'description', + comment => 'optional', + growable => 1, + ); + $form->field( name => '_submitted_value', + type => 'hidden', ); + $form->field( name => 'uidNumber', + comment => 'optional [2000..9999]', ); + $form->field( name => 'IM', + comment => 'SMT ticket number', ); + $form->field( name => 'gecos', + comment => 'LASTNAME Firstname', ); + $form->field( name => 'group', + comment => 'refresh Description', ); + $form->field( name => 'uid', + comment => 'fetch Mail & Gecos', ); - $reset->{'options'} = $options; - $session->param('reset', $reset); + my $posixGroups = $session->param( 'posixGroups' ); + foreach my $values ( values( %{$posixGroups} ) ) { + my $cn = ${ $values->{'cn'} }[0]; + my $gidNumber = ${ $values->{'gidnumber'} }[0]; + $options->{$gidNumber} = $cn; + } - }; - if ($@) { - $session->param('error', $@); - display_blank("LdapNS reset passwords"); + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->param( 'error', 'Unable to fetch available posixGroups' ); + redirect( '?tab=groups&action=addgroup' ); } - $type = 'checkbox'; - $form->field(name => 'uid', disabled => 1); + if ( ( $form->submitted eq 'Uid' ) || ( $form->submitted eq 'Group' ) ) { - $form->tmpl_param('submit1' => 'Confirm'); - $form->tmpl_param('submit2' => 1); - $form->tmpl_param('submit2_value' => 'Cancel'); + eval { - } - elsif ($form->submitted eq 'Confirm') { - my $reset = $session->param('reset'); - my @uids = keys(%{$reset->{'options'}}); - my $uid = shift(@uids); - eval { + foreach my $field ( @{$fields} ) { + $form->field( 'name' => $field, + required => 0 ); + } + my $valid = 0; + $form->field( 'name' => 'uid', required => 1 ); + $valid += $form->validate; + $form->field( 'name' => 'uid', required => 0 ); + $form->field( 'name' => 'group', required => 1 ); + $valid += $form->validate; + + die 'invalid parameters' unless $valid; + + my $uid = $form->field( name => 'uid' ); + if ( defined( $uid ) && length( $uid ) ) { + my $userInfos = fetch_net1_userinfos( $uid ); + my @keys = keys( %{$userInfos} ); + my $dn = $keys[0]; + + $form->field( + name => 'mail', + force => 1, + value => lc( ${ $userInfos->{$dn}->{'mail'} }[0] ), + ) if defined( $userInfos->{$dn}->{'mail'} ); + + if ( defined( $userInfos->{$dn}->{'displayname'} ) ) { + my $gecos = ${ $userInfos->{$dn}->{'displayname'} }[0]; + $gecos =~ s/\s+\(.*$//; + $form->field( + name => 'gecos', + force => 1, + value => $gecos, + ); + } + } - reconnect_ldap_snmc; - my $pwdinfos = SNET::LdapNS::pwdReset( - $ldap_snmc->{'label'}, - $uid - ) or die "Unable to reset password for `$uid'"; - - synchronize_passwords( - defined($form->field(name => 'synchronize')), - $ldap_snmc->{'label'}, - $pwdinfos->{'value'}, - $uid - ); - - $session->param('error', $pwdinfos->{'error'}) if (defined($pwdinfos->{'error'})); - if (defined($pwdinfos->{'value'})) { - $session->param('message', "new password for `$uid': ".$pwdinfos->{'value'}); + my $group = $form->field( name => 'group' ); + if ( defined( $group ) && length( $group ) ) { + my $description = get_default_description( $options->{$group} ); + $form->field( + name => 'description', + force => 1, + value => $description, + ); + } + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } + + } elsif ( $form->submitted eq 'Add' ) { + + my $entry; + + eval { + + die 'invalid parameters' unless $form->validate( $validate ); + + my $uidNumber = $form->field( name => 'uidNumber' ) || undef; + my $uid = $form->field( name => 'uid' ); + + my $posixAccounts = $session->param( 'posixAccounts' ); + foreach my $values ( values( %{$posixAccounts} ) ) { + die "user `$uid' already exists" if ( $uid eq ${ $values->{'uid'} }[0] ); + next unless defined( $uidNumber ); + die "user id `$uidNumber' already exists" if ( $uidNumber == ${ $values->{'uidnumber'} }[0] ); + } + + my $group = $form->field( name => 'group' ); + my $description = get_default_description( $options->{$group} ); + $description = [] unless defined( $description ); + + if ( defined( $form->field( name => 'description' ) ) ) { + push( @{$description}, $form->field( name => 'description' ) ); + } + + my %uniq_description; + foreach my $desc ( @{$description} ) { + $uniq_description{$desc}++; + } + $description = []; + foreach my $desc ( keys( %uniq_description ) ) { + push( @{$description}, $desc ) if ( defined( $desc ) + && length( $desc ) ); + } + undef $description unless ( scalar( @{$description} ) ); + + print STDERR "description is defined: " . ( defined( $description ) ) . "\n"; + + reconnect_ldap_snmc; + $entry = SNET::LdapNS::addPosixAccount( $ldap_snmc->{'label'}, $form->field( name => 'IM' ), + $uid, $group, + $form->field( name => 'gecos' ), + $form->field( name => 'mail' ), + $uidNumber, $description, ) + or die "Unable to create LDAP entry for `$uid'"; + + $session->clear( ['posixAccounts'] ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } else { + + my @attributes = $entry->attributes( nooptions => 1 ); + my $dn = $entry->dn; + my $userInfos; + + eval { $userInfos = SNET::LdapNS::getPosixAccount( $ldap_snmc->{'label'}, $dn ); }; + if ( $@ ) { + print STDERR "unable to fetch userInfos for `$dn': $@\n"; + $userInfos = { $dn => {}, }; + foreach my $attr ( @attributes ) { + next if ( $attr =~ m/objectclass/i ); + next if ( $attr =~ m/shadow/i ); + next if ( $attr =~ m/^cn|sn$/i ); + $userInfos->{$dn}->{ lc( $attr ) } = $entry->get_value( $attr, asref => 1 ); + } + } else { + print STDERR "looking good, fetched userInfos for `$dn'\n"; + foreach my $attr ( @attributes ) { + next unless ( ( $attr =~ m/userPassword/i ) + || ( $attr =~ m/auditinformation/i ) ); + $userInfos->{$dn}->{ lc( $attr ) } = $entry->get_value( $attr, asref => 1 ); + } + } + + synchronize_add_users( $userInfos, defined( $form->field( name => 'synchronize' ) ) ); + + $session->param( 'message', 'user added successfully' ); + print_ns_headers( "LdapNS add users" ); + render_userinfos( $userInfos ); + print_ns_footers; + + } + + } + + $form->field( + name => 'group', + options => $options, + type => 'select', + size => getsize_multipleselect( $options ), + sortopts => 'NAME', + selectname => 0, + multiple => 0, + ); + + print_ns_headers( "LdapNS add users" ); + print $form->render; + print_ns_footers; + +} + +sub display_adduserprofile +{ + + $ADDUSERPROFILE = 1; + + refresh_posixAccounts; + refresh_posixGroups; + refresh_groupOfNames; + + my $options = (); + + my $jsfunc = <<'EOJS'; + // skip js validation if fetching userInfos from Net1 + if (form._submitted_value.value.match(/^Refresh/)) { + var uid = form.elements['uid'].value; + if (uid == null) { + alert('Please fill uid prior to Refresh'); } + return true; + } +EOJS + my $validate = { + IM => 'IM', + uid => 'UID', + uidNumber => 'UIDNUMBER', + mail => 'EMAIL', + gecos => 'GECOS', + description => 'DESCRIPTION', + profile => 'PROFILE', }; - if ($@) { - $session->param('error', $@); - } - else { - print STDERR "Password resetted for `$uid'\n"; - } - $session->clear(['reset']); - display_blank("LdapNS reset passwords"); - } - elsif ($form->submitted eq 'Cancel') { - $session->param('error', 'reset operation cancelled'); - $session->clear(['reset']); - display_blank("LdapNS reset passwords"); - } - else { - my $posixAccounts = $session->param('posixAccounts'); - foreach my $values (values(%{$posixAccounts})) { - my $uid = ${$values->{'uid'}}[0]; - next if ($uid eq $session->param('user')); - my $gecos = ${$values->{'gecos'}}[0]; - $options->{$uid} = $uid.' - '.$gecos; - } - $reset->{'options'} = $options; - $session->param('reset', $reset); - $form->tmpl_param('submit1' => 'Reset'); - } - - if (scalar(keys(%{$options})) == 0) { - $session->param('error', 'Unable to fetch available posixAccounts'); - display_blank("LdapNS reset passwords"); - } - - $form->field( - name => 'uid', - options => $options, - sortopts => 'NAME', - linebreaks => 1, - type => $type, - multiple => 0, - ); - - if ($type eq 'select') { + + my $fields = [qw(IM uid mail gecos profile)]; + + my $form_fields = [qw(_submitted_value IM uid uidNumber mail gecos profile bcp description)]; + + my $form = CGI::FormBuilder->new( + name => 'ldapns_adduserprofile_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Add user profile based', + fields => $form_fields, + template => $templatedir . '/adduserprofile.tmpl', + method => 'post', + javascript => 1, + jsfunc => $jsfunc, + validate => $validate, + required => $fields, + reset => 1, + ); + + $form->field( + name => 'description', + comment => 'optional', + growable => 1, + ); + $form->field( name => '_submitted_value', + type => 'hidden', ); + $form->field( name => 'uidNumber', + comment => 'optional [2000..9999]', ); + $form->field( name => 'IM', + comment => 'SMT ticket number', ); + $form->field( name => 'gecos', + comment => 'LASTNAME Firstname', ); $form->field( - size => getsize_multipleselect($options), + name => 'bcp', + comment => 'Is the user belonging to the BCP team', + options => 'yes', + selected => 0, ); - } + $form->field( name => 'uid', + comment => 'fetch Mail & Gecos', ); + + $options->{'Compliance'} = 'Compliance'; + $options->{'Managment'} = 'Managment'; + $options->{'Network'} = 'Network'; + $options->{'Official'} = 'Official'; + $options->{'ProjectImplementation'} = 'ProjectImplementation'; + $options->{'ProjectManager'} = 'ProjectManager'; + $options->{'Security'} = 'Security'; + $options->{'ServiceDesk'} = 'ServiceDesk'; + $options->{'SuportingService'} = 'SuportingService'; + $options->{'TestDesignArchitect'} = 'TestDesignArchitect'; + + my $options_profile = (); + $options_profile->{'Compliance'}{'description'} = 'profile:compliance'; + $options_profile->{'Compliance'}{'CWRO'} = 'groupOfNames'; + $options_profile->{'Compliance'}{'PSRO'} = 'groupOfNames'; + $options_profile->{'Compliance'}{'RPRO'} = 'groupOfNames'; + $options_profile->{'Compliance'}{'compliance'} = 'posixGroup'; + $options_profile->{'Compliance'}{'com'} = 'posixGroup'; + $options_profile->{'Compliance'}{'snmc'} = 'posixGroup'; + $options_profile->{'Compliance'}{'casusers'} = 'posixGroup'; + + $options_profile->{'Managment'}{'description'} = 'profile:managment'; + $options_profile->{'Managment'}{'CWRO'} = 'groupOfNames'; + $options_profile->{'Managment'}{'PSRO'} = 'groupOfNames'; + $options_profile->{'Managment'}{'RPRO'} = 'groupOfNames'; + $options_profile->{'Managment'}{'snmc'} = 'posixGroup'; + $options_profile->{'Managment'}{'casusers'} = 'posixGroup'; + + $options_profile->{'Network'}{'description'} = 'profile:network'; + $options_profile->{'Network'}{'CWRW'} = 'groupOfNames'; + $options_profile->{'Network'}{'PSRO'} = 'groupOfNames'; + $options_profile->{'Network'}{'RPRO'} = 'groupOfNames'; + $options_profile->{'Network'}{'network'} = 'posixGroup'; + $options_profile->{'Network'}{'net'} = 'posixGroup'; + $options_profile->{'Network'}{'snmc'} = 'posixGroup'; + $options_profile->{'Network'}{'casusers'} = 'posixGroup'; + + $options_profile->{'Official'}{'description'} = 'profile:official'; + $options_profile->{'Official'}{'CWRO'} = 'groupOfNames'; + $options_profile->{'Official'}{'PSRO'} = 'groupOfNames'; + $options_profile->{'Official'}{'RPRO'} = 'groupOfNames'; + $options_profile->{'Official'}{'c2nsteam'} = 'posixGroup'; + $options_profile->{'Official'}{'officials'} = 'posixGroup'; + $options_profile->{'Official'}{'casusers'} = 'posixGroup'; + $options_profile->{'Official'}{'sherlock'} = 'posixGroup'; + + $options_profile->{'ProjectImplementation'}{'description'} = 'profile:projectimplementation'; + $options_profile->{'ProjectImplementation'}{'CWRW'} = 'groupOfNames'; + $options_profile->{'ProjectImplementation'}{'PSRW'} = 'groupOfNames'; + $options_profile->{'ProjectImplementation'}{'RPRW'} = 'groupOfNames'; + $options_profile->{'ProjectImplementation'}{'pi'} = 'posixGroup'; + $options_profile->{'ProjectImplementation'}{'snmc'} = 'posixGroup'; + $options_profile->{'ProjectImplementation'}{'casusers'} = 'posixGroup'; + + $options_profile->{'ProjectManager'}{'description'} = 'profile:projectmanager'; + $options_profile->{'ProjectManager'}{'CWRO'} = 'groupOfNames'; + $options_profile->{'ProjectManager'}{'PSRO'} = 'groupOfNames'; + $options_profile->{'ProjectManager'}{'RPRO'} = 'groupOfNames'; + $options_profile->{'ProjectManager'}{'pm'} = 'posixGroup'; + $options_profile->{'ProjectManager'}{'project'} = 'posixGroup'; + $options_profile->{'ProjectManager'}{'snmc'} = 'posixGroup'; + $options_profile->{'ProjectManager'}{'casusers'} = 'posixGroup'; + + $options_profile->{'Security'}{'description'} = 'profile:security'; + $options_profile->{'Security'}{'CWRW'} = 'groupOfNames'; + $options_profile->{'Security'}{'PSRW'} = 'groupOfNames'; + $options_profile->{'Security'}{'RPRW'} = 'groupOfNames'; + $options_profile->{'Security'}{'droppy'} = 'groupOfNames'; + $options_profile->{'Security'}{'bindhg'} = 'posixGroup'; + $options_profile->{'Security'}{'logs'} = 'posixGroup'; + $options_profile->{'Security'}{'sec'} = 'posixGroup'; + $options_profile->{'Security'}{'security'} = 'posixGroup'; + $options_profile->{'Security'}{'snmc'} = 'posixGroup'; + $options_profile->{'Security'}{'casusers'} = 'posixGroup'; + + $options_profile->{'ServiceDesk'}{'description'} = 'profile:servicedesk'; + $options_profile->{'ServiceDesk'}{'CWRW'} = 'groupOfNames'; + $options_profile->{'ServiceDesk'}{'PSRW'} = 'groupOfNames'; + $options_profile->{'ServiceDesk'}{'RPRW'} = 'groupOfNames'; + $options_profile->{'ServiceDesk'}{'noc'} = 'posixGroup'; + $options_profile->{'ServiceDesk'}{'snmc'} = 'posixGroup'; + $options_profile->{'ServiceDesk'}{'casusers'} = 'posixGroup'; + + $options_profile->{'SupportingService'}{'description'} = 'profile:supportingservice'; + $options_profile->{'SupportingService'}{'CWRA'} = 'groupOfNames'; + $options_profile->{'SupportingService'}{'PSRW'} = 'groupOfNames'; + $options_profile->{'SupportingService'}{'RPRW'} = 'groupOfNames'; + $options_profile->{'SupportingService'}{'droppy'} = 'groupOfNames'; + $options_profile->{'SupportingService'}{'bindhg'} = 'posixGroup'; + $options_profile->{'SupportingService'}{'logs'} = 'posixGroup'; + $options_profile->{'SupportingService'}{'ss'} = 'posixGroup'; + $options_profile->{'SupportingService'}{'sup'} = 'posixGroup'; + $options_profile->{'SupportingService'}{'vael'} = 'posixGroup'; + $options_profile->{'SupportingService'}{'snmc'} = 'posixGroup'; + $options_profile->{'SupportingService'}{'casusers'} = 'posixGroup'; + + $options_profile->{'TestDesignArchitect'}{'description'} = 'profile:testdesignarchitect'; + $options_profile->{'TestDesignArchitect'}{'CWRW'} = 'groupOfNames'; + $options_profile->{'TestDesignArchitect'}{'PSRW'} = 'groupOfNames'; + $options_profile->{'TestDesignArchitect'}{'RPRW'} = 'groupOfNames'; + $options_profile->{'TestDesignArchitect'}{'tda'} = 'posixGroup'; + $options_profile->{'TestDesignArchitect'}{'snmc'} = 'posixGroup'; + $options_profile->{'TestDesignArchitect'}{'casusers'} = 'posixGroup'; - print_ns_headers("LdapNS reset passwords"); - print $form->render(); - print_ns_footers; + $form->field( + name => 'profile', + comment => 'Select the right profile', + options => $options, + sortopts => 'NAME', + linebreaks => 1, + type => 'select', + multiple => 0, + ); -} + if ( $form->submitted eq 'Uid' ) { + eval { -sub select_group { + foreach my $field ( @{$fields} ) { + $form->field( 'name' => $field, + required => 0 ); + } + my $valid = 0; + $form->field( 'name' => 'uid', required => 1 ); + $valid += $form->validate; + + die 'invalid parameters' unless $valid; + + my $uid = $form->field( name => 'uid' ); + if ( defined( $uid ) && length( $uid ) ) { + my $userInfos = fetch_net1_userinfos( $uid ); + my @keys = keys( %{$userInfos} ); + my $dn = $keys[0]; + + $form->field( + name => 'mail', + force => 1, + value => lc( ${ $userInfos->{$dn}->{'mail'} }[0] ), + ) if defined( $userInfos->{$dn}->{'mail'} ); + + if ( defined( $userInfos->{$dn}->{'displayname'} ) ) { + my $gecos = ${ $userInfos->{$dn}->{'displayname'} }[0]; + $gecos =~ s/\s+\(.*$//; + $form->field( + name => 'gecos', + force => 1, + value => $gecos, + ); + } + } - my $modgroup = $session->param('modgroup'); - my $objectClass = $modgroup->{'objectClass'}; - my $groups; - my $options; + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } + + } elsif ( $form->submitted eq 'Add' ) { - return 1 if (defined($modgroup->{'group'})); + my $entry; - if ($objectClass eq 'posixGroup') { - $groups = $session->param('posixGroups'); - } - else { - $groups = $session->param('groupOfNames'); - } + eval { - my $addoptions = {}; - my $deloptions = {}; + die 'invalid parameters' unless $form->validate( $validate ); - my $validate = { - group => 'GROUP', - }; + my $uidNumber = $form->field( name => 'uidNumber' ) || undef; + my $uid = $form->field( name => 'uid' ); - my $jsfunc = <<'EOJS'; - // skip on back - if (form._submitted_value.value == 'Previous') { + my $posixAccounts = $session->param( 'posixAccounts' ); + foreach my $values ( values( %{$posixAccounts} ) ) { + die "user `$uid' already exists" if ( $uid eq ${ $values->{'uid'} }[0] ); + next unless defined( $uidNumber ); + die "user id `$uidNumber' already exists" if ( $uidNumber == ${ $values->{'uidnumber'} }[0] ); + } + + my $profile = $form->field( name => 'profile' ); + my $group = 'snmc'; + my $group_id = 3500; + if ( $options->{$profile} eq 'Official' ) { + $group = 'officials'; + $group_id = 3800; + } + my $description; + $description = [] unless defined( $description ); + + push( @{$description}, 'profile:' . $options->{$profile} ); + + if ( defined( $form->field( name => 'description' ) ) ) { + push( @{$description}, $form->field( name => 'description' ) ); + } + + my %uniq_description; + foreach my $desc ( @{$description} ) { + $uniq_description{$desc}++; + } + $description = []; + foreach my $desc ( keys( %uniq_description ) ) { + push( @{$description}, $desc ) if ( defined( $desc ) + && length( $desc ) ); + } + undef $description unless ( scalar( @{$description} ) ); + + print STDERR "description is defined: " . ( defined( $description ) ) . "\n"; + + reconnect_ldap_snmc; + $entry = SNET::LdapNS::addPosixAccount( $ldap_snmc->{'label'}, $form->field( name => 'IM' ), + $uid, $group_id, + $form->field( name => 'gecos' ), + $form->field( name => 'mail' ), + $uidNumber, $description, ) + or die "Unable to create LDAP entry for `$uid'"; + + $session->clear( ['posixAccounts'] ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } else { + + my @attributes = $entry->attributes( nooptions => 1 ); + my $dn = $entry->dn; + my $userInfos; + + eval { $userInfos = SNET::LdapNS::getPosixAccount( $ldap_snmc->{'label'}, $dn ); }; + if ( $@ ) { + print STDERR "unable to fetch userInfos for `$dn': $@\n"; + $userInfos = { $dn => {}, }; + foreach my $attr ( @attributes ) { + next if ( $attr =~ m/objectclass/i ); + next if ( $attr =~ m/shadow/i ); + next if ( $attr =~ m/^cn|sn$/i ); + $userInfos->{$dn}->{ lc( $attr ) } = $entry->get_value( $attr, asref => 1 ); + } + } else { + print STDERR "looking good, fetched userInfos for `$dn'\n"; + foreach my $attr ( @attributes ) { + next unless ( ( $attr =~ m/userPassword/i ) + || ( $attr =~ m/auditinformation/i ) ); + $userInfos->{$dn}->{ lc( $attr ) } = $entry->get_value( $attr, asref => 1 ); + } + } + + synchronize_add_users( $userInfos, defined( $form->field( name => 'synchronize' ) ) ); + + $session->param( 'message', 'user added successfully' ); + print_ns_headers( "LdapNS add users" ); + render_userinfos( $userInfos ); + + # user parameters + + # TODO add profile to the group + + undef $entry; + + my $addoptions = {}; + + my $profile = $form->field( name => 'profile' ); + my $IM = $form->field( name => 'IM' ); + my $objectClass = ''; + + if ( defined( $form->field( name => 'audit' ) ) ) { + print Dumper ( $form->field( name => 'audit' ) ); + $options_profile->{$profile}{'bcp'} = 'posixGroup'; + } + + foreach my $group ( keys %{ $options_profile->{$profile} } ) { + + next if ( $group eq 'description' ); + $objectClass = $options_profile->{$profile}{$group}; + print STDERR "Searching the $objectClass group '$group' existance.\n"; + print STDERR Dumper( $session->param( 'posixGroups' ) ); + print STDERR Dumper( $session->param( 'groupOfNames' ) ); + + my $notfound = 1; + if ( $objectClass eq 'posixGroup' ) { + foreach my $values ( values( %{ $session->param( 'posixGroups' ) } ) ) { + if ( ${ $values->{'cn'} }[0] eq $group ) { + $notfound = 0; + last; + } + } + + } else { + + foreach my $values ( values( %{ $session->param( 'groupOfNames' ) } ) ) { + if ( ${ $values->{'cn'} }[0] eq $group ) { + $notfound = 0; + last; + } + } + + } + if ( $notfound ) { + print STDERR "The $objectClass group '$group' doesnot exist, skipping.\n"; + next; + } + + eval { + + my @to_add = keys( %{$addoptions} ); + + my $add_function; + my $get_function; + + if ( $objectClass eq 'posixGroup' ) { + $add_function = \&SNET::LdapNS::addToPosixGroup; + $get_function = \&SNET::LdapNS::getPosixGroup; + } else { + $add_function = \&SNET::LdapNS::addToGroupOfNames; + $get_function = \&SNET::LdapNS::getGroupOfNames; + } + + reconnect_ldap_snmc; + + if ( scalar( @to_add ) ) { + &{$add_function}( $ldap_snmc->{'label'}, $IM, $group, \@to_add ) or die SNET::LdapNS::error( $ldap_snmc->{'label'} ); + } + + $session->param( 'message', 'group modification successful' ); + $entry = &{$get_function}( $ldap_snmc->{'label'}, $group, ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } + if ( defined( $entry ) ) { + render_groupinfos( $entry ); + } + + } + + } + } + + print_ns_headers( "LdapNS add users" ); + print $form->render; + print_ns_footers; + +} + +sub display_deluser +{ + + $DELUSER = 1; + + refresh_posixAccounts; + + my $options = {}; + my $deluser = $session->param( 'deluser' ); + my $type = 'select'; + + my $jsfunc = <<'EOJS'; + // skip on Cancel + if (form._submitted_value.value == 'Cancel') { return true; } EOJS - my $form = CGI::FormBuilder->new( - name => 'ldapns_selectgroup_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => "Select group", - fields => [qw(group)], - template => $templatedir.'/selectgroup.tmpl', - submit => [qw(Previous Next)], - method => 'post', - selectname => 0, - javascript => 1, - jsfunc => $jsfunc, - required => 'ALL', - validate => $validate, - ); - - if ($form->submitted eq 'Previous') { - $session->clear(['modgroup']); - redirect('?tab=groups&action=modgroup'); - } - - foreach my $values (values(%{$groups})) { - my $cn = ${$values->{'cn'}}[0]; - $options->{$cn} = $cn; - } - - if (scalar(keys(%{$options})) == 0) { - $session->clear(['modgroup']); - $session->param('error', 'Unable to fetch available groups'); - redirect('?tab=groups&action=addgroup'); - } - - $form->field( - name => 'group', - options => $options, - sortopts => 'NAME', - type => 'select', - size => getsize_multipleselect($options), - multiple => 0, - ); - - if ($form->submitted eq 'Next') { + my $validate = { + IM => 'IM', + uid => 'UID', + }; - eval { + my $form_fields = [qw(_submitted_value IM uid)]; + push( @{$form_fields}, 'synchronize' ) if ( $mod_synchro ); + + my $form = CGI::FormBuilder->new( + name => 'ldapns_deluser_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Delete user', + fields => $form_fields, + template => $templatedir . '/deluser.tmpl', + method => 'post', + required => [qw(IM uid)], + javascript => 1, + sticky => 1, + selectname => 0, + jsfunc => $jsfunc, + validate => $validate, + ); - die 'invalid parameters' unless $form->validate( - $validate - ); + if ( $mod_synchro ) { + $form->field( + name => 'synchronize', + type => 'checkbox', + comment => 'Synchronize with old LDAP database?', + options => 'yes', + ); + $form->field( + name => 'synchronize', + value => 'yes' + ) unless ( $form->submitted ); + } + $form->tmpl_param( 'mod_synchro' => $mod_synchro ); - my $posixAccounts = $session->param('posixAccounts'); - my $cn = $form->field(name => 'group'); - my $member_attr; - my $group; + $form->field( name => '_submitted_value', + type => 'hidden', ); + $form->field( name => 'IM', + comment => 'SMT ticket number', ); - reconnect_ldap_snmc; - if ($objectClass eq 'posixGroup') { - $group = SNET::LdapNS::getPosixGroup( - $ldap_snmc->{'label'}, - $cn - ); - $member_attr = 'memberuid'; - } - else { - $group = SNET::LdapNS::getGroupOfNames( - $ldap_snmc->{'label'}, - $cn - ); - $member_attr = 'member'; - } - die 'invalid group' unless (keys(%{$group}) == 1); + if ( $form->submitted eq 'Delete' ) { - my @keys = keys(%{$group}); - my $group_dn = shift(@keys); + eval { - while (my ($dn, $attrs) = each(%{$posixAccounts})) { - my $uid = ${$attrs->{'uid'}}[0]; - my $gecos = ${$attrs->{'gecos'}}[0]; - if ($member_attr eq 'memberuid') { - $addoptions->{$uid} = $uid.' - '.$gecos; - } - else { - $addoptions->{lc($dn)} = $uid.' - '.$gecos; + die 'invalid parameters' unless $form->validate( $validate ); + my @uids = $form->field( name => 'uid' ); + die 'You must select a single user' unless ( scalar( @uids ) == 1 ); + + $deluser->{'IM'} = $form->field( name => 'IM' ); + foreach my $uid ( @uids ) { + $options->{$uid} = $deluser->{'options'}->{$uid} + or die "invalid uid `$uid'"; + } + $deluser->{'options'} = $options; + $session->param( 'deluser', $deluser ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( "LdapNS delete users" ); } - } - foreach my $member (@{$group->{$group_dn}->{$member_attr}}) { - $member = lc($member) if ($member_attr eq 'member'); - my $userinfos = $addoptions->{$member}; - if (defined($userinfos)) { - delete($addoptions->{$member}); - $deloptions->{$member} = $userinfos; + $type = 'checkbox'; + $form->field( name => 'uid', disabled => 1 ); + $form->field( name => 'IM', disabled => 1 ); + + $form->tmpl_param( 'submit1' => 'Confirm' ); + $form->tmpl_param( 'submit2' => 1 ); + $form->tmpl_param( 'submit2_value' => 'Cancel' ); + + } elsif ( $form->submitted eq 'Confirm' ) { + my $deluser = $session->param( 'deluser' ); + my @uids = keys( %{ $deluser->{'options'} } ); + my $IM = $deluser->{'IM'}; + my @deleted_uid; + my $uid; + eval { + reconnect_ldap_snmc; + foreach $uid ( @uids ) { + SNET::LdapNS::deletePosixAccount( $ldap_snmc->{'label'}, $IM, $uid ); + push( @deleted_uid, $uid ); + synchronize_del_users( $uid, defined( $form->field( name => 'synchronize' ) ) ); + } + }; + if ( $@ ) { + $session->param( 'error', $@ ); } - else{ - $deloptions->{$member} = $member; + if ( scalar( @deleted_uid ) ) { + print STDERR 'Successful deletion of ' . join( ', ', @deleted_uid ) . "\n"; + $session->param( 'message', 'Successful deletion of ' . join( ', ', @deleted_uid ) ); + $session->clear( ['posixAccounts'] ); } - } + $session->clear( ['deluser'] ); + display_blank( "LdapNS delete users" ); + } elsif ( $form->submitted eq 'Cancel' ) { + $session->param( 'error', 'delete operation cancelled' ); + $session->clear( ['deluser'] ); + display_blank( "LdapNS delete users" ); + } else { + my $posixAccounts = $session->param( 'posixAccounts' ); + foreach my $values ( values( %{$posixAccounts} ) ) { + my $uid = ${ $values->{'uid'} }[0]; + next if ( $uid eq $session->param( 'user' ) ); + my $gecos = ${ $values->{'gecos'} }[0]; + $options->{$uid} = $uid . ' - ' . $gecos; + } + $deluser->{'options'} = $options; + $session->param( 'deluser', $deluser ); + $form->tmpl_param( 'submit1' => 'Delete' ); + } - $modgroup->{'addoptions'} = $addoptions; - $modgroup->{'deloptions'} = $deloptions; - $modgroup->{'group'} = $cn; + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->param( 'error', 'Unable to fetch available posixAccounts' ); + display_blank( "LdapNS delete users" ); + } - }; - if ($@) { - $session->param('error', $@); - display_blank("LdapNS modify groups"); + $form->field( + name => 'uid', + options => $options, + sortopts => 'NAME', + linebreaks => 1, + type => $type, + multiple => 0, + ); + + if ( $type eq 'select' ) { + $form->field( size => getsize_multipleselect( $options ), ); } - $session->param('modgroup', $modgroup); - return 1; - } + print_ns_headers( "LdapNS delete users" ); + print $form->render(); + print_ns_footers; - print_ns_headers("LdapNS modify groups"); - print $form->render; - print_ns_footers; +} +sub display_moduser +{ + $MODUSER = 1; + $session->param( 'error', 'Not yet implemented' ); + display_blank( "LdapNS modify users" ); } -sub select_group_objectclass($) { - - my $title = shift; - my $sessionparam = $session->param('action'); - - if ( - ($sessionparam ne 'addgroup') - && - ($sessionparam ne 'delgroup') - && - ($sessionparam ne 'modgroup') - ) { - $session->param('error', "invalid action $sessionparam"); - redirect_homepage; - } - - if (defined($session->param($sessionparam))) { - - my $objectClass = $session->param($sessionparam)->{'objectClass'}; - if ($objectClass eq 'posixGroup') { - refresh_posixGroups; - } - else { - refresh_groupOfNames; - } - return -1; - } - - my $validate = { - IM => 'IM', - objectClass => 'GROUPCLASS', - }; - - my $form = CGI::FormBuilder->new( - name => 'ldapns_selectgroupclass_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'select group type', - fields => [qw(IM objectClass)], - template => $templatedir.'/selectgroupclass.tmpl', - method => 'post', - submit => 'Select', - javascript => 1, - required => 'ALL', - validate => $validate, - ); - $form->field( - name => 'objectClass', - options => { - 'posixGroup' => 'posixGroups', - 'groupOfNames' => 'groupOfNames' - }, - linebreaks => 1, - comment => 'posixGroups or groupOfNames', - multiple => 0, - ); - $form->field( - name => 'IM', - comment => 'SMT ticket number', - ); - - if ($form->submitted eq 'Select') { - - my $IM = $form->field(name => 'IM'); - my $objectClass = ($form->field(name => 'objectClass') eq 'posixGroup') ? 'posixGroup' : 'groupOfNames'; +sub display_reset +{ - eval { - die 'invalid parameters' unless $form->validate($validate); - $session->param($sessionparam, - { - IM => $IM, - objectClass => $objectClass, - } - ); - }; - if ($@) { - $session->param('error', $@); - display_blank($title); + $RESET = 1; + + refresh_posixAccounts; + + my $options = {}; + my $reset = $session->param( 'reset' ); + my $type = 'select'; + + my $jsfunc = <<'EOJS'; + // skip on Cancel + if (form._submitted_value.value == 'Cancel') { + return true; } +EOJS + + my $validate = { uid => 'UID', }; + + my $form_fields = [qw(_submitted_value uid)]; + push( @{$form_fields}, 'synchronize' ) if ( $mod_synchro ); + + my $form = CGI::FormBuilder->new( + name => 'ldapns_reset_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Reset password', + fields => $form_fields, + template => $templatedir . '/reset.tmpl', + method => 'post', + required => [qw(uid)], + javascript => 1, + selectname => 0, + jsfunc => $jsfunc, + validate => $validate, + ); + + if ( $mod_synchro ) { + $form->field( + name => 'synchronize', + type => 'checkbox', + comment => 'Synchronize with old LDAP database?', + options => 'yes', + ); + $form->field( + name => 'synchronize', + value => 'yes' + ) unless ( $form->submitted ); + } + $form->tmpl_param( 'mod_synchro' => $mod_synchro ); + + $form->field( name => '_submitted_value', + type => 'hidden', ); + + if ( $form->submitted eq 'Reset' ) { + eval { + + die 'invalid parameters' unless $form->validate( $validate ); + my @uids = $form->field( name => 'uid' ); + die 'You must select a single user' unless ( scalar( @uids ) == 1 ); + + my $uid = shift( @uids ); + $options->{$uid} = $reset->{'options'}->{$uid} + or die "invalid uid `$uid'"; + + $reset->{'options'} = $options; + $session->param( 'reset', $reset ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( "LdapNS reset passwords" ); + } + + $type = 'checkbox'; + $form->field( name => 'uid', disabled => 1 ); + + $form->tmpl_param( 'submit1' => 'Confirm' ); + $form->tmpl_param( 'submit2' => 1 ); + $form->tmpl_param( 'submit2_value' => 'Cancel' ); + + } elsif ( $form->submitted eq 'Confirm' ) { + my $reset = $session->param( 'reset' ); + my @uids = keys( %{ $reset->{'options'} } ); + my $uid = shift( @uids ); + eval { - if ($objectClass eq 'posixGroup') { - refresh_posixGroups; + reconnect_ldap_snmc; + my $pwdinfos = SNET::LdapNS::pwdReset( $ldap_snmc->{'label'}, $uid ) or die "Unable to reset password for `$uid'"; + + synchronize_passwords( defined( $form->field( name => 'synchronize' ) ), $ldap_snmc->{'label'}, $pwdinfos->{'value'}, $uid ); + + $session->param( 'error', $pwdinfos->{'error'} ) if ( defined( $pwdinfos->{'error'} ) ); + if ( defined( $pwdinfos->{'value'} ) ) { + $session->param( 'message', "new password for `$uid': " . $pwdinfos->{'value'} ); + } + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } else { + print STDERR "Password resetted for `$uid'\n"; + } + $session->clear( ['reset'] ); + display_blank( "LdapNS reset passwords" ); + } elsif ( $form->submitted eq 'Cancel' ) { + $session->param( 'error', 'reset operation cancelled' ); + $session->clear( ['reset'] ); + display_blank( "LdapNS reset passwords" ); + } else { + my $posixAccounts = $session->param( 'posixAccounts' ); + foreach my $values ( values( %{$posixAccounts} ) ) { + my $uid = ${ $values->{'uid'} }[0]; + next if ( $uid eq $session->param( 'user' ) ); + my $gecos = ${ $values->{'gecos'} }[0]; + $options->{$uid} = $uid . ' - ' . $gecos; + } + $reset->{'options'} = $options; + $session->param( 'reset', $reset ); + $form->tmpl_param( 'submit1' => 'Reset' ); } - else { - refresh_groupOfNames; + + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->param( 'error', 'Unable to fetch available posixAccounts' ); + display_blank( "LdapNS reset passwords" ); } - return 1; + $form->field( + name => 'uid', + options => $options, + sortopts => 'NAME', + linebreaks => 1, + type => $type, + multiple => 0, + ); - } + if ( $type eq 'select' ) { + $form->field( size => getsize_multipleselect( $options ), ); + } - print_ns_headers($title); - print $form->render; - print_ns_footers; + print_ns_headers( "LdapNS reset passwords" ); + print $form->render(); + print_ns_footers; } -sub display_groupinfos { +sub select_group +{ - $GROUPINFOS = 1; + my $modgroup = $session->param( 'modgroup' ); + my $objectClass = $modgroup->{'objectClass'}; + my $groups; + my $options; - refresh_posixGroups; - refresh_groupOfNames; + return 1 if ( defined( $modgroup->{'group'} ) ); - my $groupInfos; - my $options = []; + if ( $objectClass eq 'posixGroup' ) { + $groups = $session->param( 'posixGroups' ); + } else { + $groups = $session->param( 'groupOfNames' ); + } - my $validate = { - group => 'GROUP', - }; + my $addoptions = {}; + my $deloptions = {}; - my $form = CGI::FormBuilder->new( - name => 'ldapns_groupinfos_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Display group', - fields => [qw(group audit)], - template => $templatedir.'/selectgroup.tmpl', - method => 'post', - javascript => 1, - validate => $validate, - required => 'group', - submit => 'Display', - ); + my $validate = { group => 'GROUP', }; - $form->tmpl_param("audit" => 1); + my $jsfunc = <<'EOJS'; + // skip on back + if (form._submitted_value.value == 'Previous') { + return true; + } +EOJS - my $groupClass = {}; + my $form = CGI::FormBuilder->new( + name => 'ldapns_selectgroup_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => "Select group", + fields => [qw(group)], + template => $templatedir . '/selectgroup.tmpl', + submit => [qw(Previous Next)], + method => 'post', + selectname => 0, + javascript => 1, + jsfunc => $jsfunc, + required => 'ALL', + validate => $validate, + ); - foreach my $values (values(%{$session->param('groupOfNames')})) { - my $cn = ${$values->{'cn'}}[0]; - $groupClass->{$cn} = 'groupOfNames'; - } + if ( $form->submitted eq 'Previous' ) { + $session->clear( ['modgroup'] ); + redirect( '?tab=groups&action=modgroup' ); + } - foreach my $k (sort(keys(%{$groupClass}))) { - push (@{$options}, [$k, $k, $groupClass->{$k}]); - } + foreach my $values ( values( %{$groups} ) ) { + my $cn = ${ $values->{'cn'} }[0]; + $options->{$cn} = $cn; + } - foreach my $values (values(%{$session->param('posixGroups')})) { - my $cn = ${$values->{'cn'}}[0]; - $groupClass->{$cn} = 'posixGroup'; - } + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->clear( ['modgroup'] ); + $session->param( 'error', 'Unable to fetch available groups' ); + redirect( '?tab=groups&action=addgroup' ); + } - foreach my $k (sort(keys(%{$groupClass}))) { - push (@{$options}, [$k, $k, $groupClass->{$k}]) unless ( - $groupClass->{$k} eq 'groupOfNames' + $form->field( + name => 'group', + options => $options, + sortopts => 'NAME', + type => 'select', + size => getsize_multipleselect( $options ), + multiple => 0, ); - } - if ($form->submitted eq 'Display') { - eval { - die "invalid parameters" unless $form->validate($validate); - my @groups = $form->field(name => 'group'); - die 'You must select at least one group' unless (scalar(@groups) > 0); - - map { die "invalid group `$_'" unless defined($groupClass->{$_}) } @groups; - - reconnect_ldap_snmc; - - foreach my $group (@groups) { - my $infos; - my $class; - if ($groupClass->{$group} eq 'posixGroup') { - $infos = SNET::LdapNS::getPosixGroup( - $ldap_snmc->{'label'}, - $group - ); - $class = ['posixGroup']; - } - else { - $infos = SNET::LdapNS::getGroupOfNames( - $ldap_snmc->{'label'}, - $group - ); - $class = ['groupOfNames']; - } - while (my ($k, $v) = each (%{$infos})) { - $v->{'objectClass'} = $class; - $groupInfos->{$k} = $v; + if ( $form->submitted eq 'Next' ) { + + eval { + + die 'invalid parameters' unless $form->validate( $validate ); + + my $posixAccounts = $session->param( 'posixAccounts' ); + my $cn = $form->field( name => 'group' ); + my $member_attr; + my $group; + + reconnect_ldap_snmc; + if ( $objectClass eq 'posixGroup' ) { + $group = SNET::LdapNS::getPosixGroup( $ldap_snmc->{'label'}, $cn ); + $member_attr = 'memberuid'; + } else { + $group = SNET::LdapNS::getGroupOfNames( $ldap_snmc->{'label'}, $cn ); + $member_attr = 'member'; + } + die 'invalid group' unless ( keys( %{$group} ) == 1 ); + + my @keys = keys( %{$group} ); + my $group_dn = shift( @keys ); + + while ( my ( $dn, $attrs ) = each( %{$posixAccounts} ) ) { + my $uid = ${ $attrs->{'uid'} }[0]; + my $gecos = ${ $attrs->{'gecos'} }[0]; + if ( $member_attr eq 'memberuid' ) { + $addoptions->{$uid} = $uid . ' - ' . $gecos; + } else { + $addoptions->{ lc( $dn ) } = $uid . ' - ' . $gecos; + } + } + + foreach my $member ( @{ $group->{$group_dn}->{$member_attr} } ) { + $member = lc( $member ) if ( $member_attr eq 'member' ); + my $userinfos = $addoptions->{$member}; + if ( defined( $userinfos ) ) { + delete( $addoptions->{$member} ); + $deloptions->{$member} = $userinfos; + } else { + $deloptions->{$member} = $member; + } + } + + $modgroup->{'addoptions'} = $addoptions; + $modgroup->{'deloptions'} = $deloptions; + $modgroup->{'group'} = $cn; + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( "LdapNS modify groups" ); } - } + $session->param( 'modgroup', $modgroup ); + return 1; + + } + + print_ns_headers( "LdapNS modify groups" ); + print $form->render; + print_ns_footers; +} + +sub select_group_objectclass($) +{ + + my $title = shift; + my $sessionparam = $session->param( 'action' ); + + if ( ( $sessionparam ne 'addgroup' ) + && ( $sessionparam ne 'delgroup' ) + && ( $sessionparam ne 'modgroup' ) ) { + $session->param( 'error', "invalid action $sessionparam" ); + redirect_homepage; + } + + if ( defined( $session->param( $sessionparam ) ) ) { + + my $objectClass = $session->param( $sessionparam )->{'objectClass'}; + if ( $objectClass eq 'posixGroup' ) { + refresh_posixGroups; + } else { + refresh_groupOfNames; + } + return -1; + } + + my $validate = { + IM => 'IM', + objectClass => 'GROUPCLASS', }; - if ($@) { - $session->param('error', $@); - undef $groupInfos; - } - } - - $form->field( - name => 'audit', - type => 'checkbox', - options => 'yes', - comment => 'Display auditInformation?', - selected => 0, - ); - - $form->field( - name => 'group', - options => $options, - optgroups => 1, - type => 'select', - size => getsize_multipleselect($options), - multiple => 1, - ); - - my $audit = ( - defined($form->field(name => 'audit')) - ); - - print_ns_headers("LdapNS display groups"); - print $form->render; - render_groupinfos($groupInfos, $audit) if defined($groupInfos); - print_ns_footers; + + my $form = CGI::FormBuilder->new( + name => 'ldapns_selectgroupclass_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'select group type', + fields => [qw(IM objectClass)], + template => $templatedir . '/selectgroupclass.tmpl', + method => 'post', + submit => 'Select', + javascript => 1, + required => 'ALL', + validate => $validate, + ); + $form->field( + name => 'objectClass', + options => { + 'posixGroup' => 'posixGroups', + 'groupOfNames' => 'groupOfNames' + }, + linebreaks => 1, + comment => 'posixGroups or groupOfNames', + multiple => 0, + ); + $form->field( name => 'IM', + comment => 'SMT ticket number', ); + + if ( $form->submitted eq 'Select' ) { + + my $IM = $form->field( name => 'IM' ); + my $objectClass = ( $form->field( name => 'objectClass' ) eq 'posixGroup' ) ? 'posixGroup' : 'groupOfNames'; + + eval { + die 'invalid parameters' unless $form->validate( $validate ); + $session->param( + $sessionparam, + { + IM => $IM, + objectClass => $objectClass, + } + ); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( $title ); + } + + if ( $objectClass eq 'posixGroup' ) { + refresh_posixGroups; + } else { + refresh_groupOfNames; + } + + return 1; + + } + + print_ns_headers( $title ); + print $form->render; + print_ns_footers; } -sub display_addgroup { +sub display_groupinfos +{ - $ADDGROUP = 1; - select_group_objectclass("LdapNS add groups"); + $GROUPINFOS = 1; - my $addgroup = $session->param('addgroup'); - my $objectClass = $addgroup->{'objectClass'}; - my $IM = $addgroup->{'IM'}; - my $groups; - my $options = {}; + refresh_posixGroups; + refresh_groupOfNames; - if ($objectClass eq 'posixGroup') { - $groups = $session->param('posixGroups'); - } - else { - $groups = $session->param('groupOfNames'); - refresh_posixAccounts; - } + my $groupInfos; + my $options = []; + + my $validate = { group => 'GROUP', }; + + my $form = CGI::FormBuilder->new( + name => 'ldapns_groupinfos_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Display group', + fields => [qw(group audit)], + template => $templatedir . '/selectgroup.tmpl', + method => 'post', + javascript => 1, + validate => $validate, + required => 'group', + submit => 'Display', + ); + + $form->tmpl_param( "audit" => 1 ); + + my $groupClass = {}; + + foreach my $values ( values( %{ $session->param( 'groupOfNames' ) } ) ) { + my $cn = ${ $values->{'cn'} }[0]; + $groupClass->{$cn} = 'groupOfNames'; + } + + foreach my $k ( sort( keys( %{$groupClass} ) ) ) { + push( @{$options}, [ $k, $k, $groupClass->{$k} ] ); + } + + foreach my $values ( values( %{ $session->param( 'posixGroups' ) } ) ) { + my $cn = ${ $values->{'cn'} }[0]; + $groupClass->{$cn} = 'posixGroup'; + } + + foreach my $k ( sort( keys( %{$groupClass} ) ) ) { + push( @{$options}, [ $k, $k, $groupClass->{$k} ] ) unless ( $groupClass->{$k} eq 'groupOfNames' ); + } + + if ( $form->submitted eq 'Display' ) { + eval { + die "invalid parameters" unless $form->validate( $validate ); + my @groups = $form->field( name => 'group' ); + die 'You must select at least one group' unless ( scalar( @groups ) > 0 ); + + map { die "invalid group `$_'" unless defined( $groupClass->{$_} ) } @groups; + + reconnect_ldap_snmc; + + foreach my $group ( @groups ) { + my $infos; + my $class; + if ( $groupClass->{$group} eq 'posixGroup' ) { + $infos = SNET::LdapNS::getPosixGroup( $ldap_snmc->{'label'}, $group ); + $class = ['posixGroup']; + } else { + $infos = SNET::LdapNS::getGroupOfNames( $ldap_snmc->{'label'}, $group ); + $class = ['groupOfNames']; + } + while ( my ( $k, $v ) = each( %{$infos} ) ) { + $v->{'objectClass'} = $class; + $groupInfos->{$k} = $v; + } + } + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + undef $groupInfos; + } + } - my $jsfunc = <<'EOJS'; + $form->field( + name => 'audit', + type => 'checkbox', + options => 'yes', + comment => 'Display auditInformation?', + selected => 0, + ); + + $form->field( + name => 'group', + options => $options, + optgroups => 1, + type => 'select', + size => getsize_multipleselect( $options ), + multiple => 1, + ); + + my $audit = ( defined( $form->field( name => 'audit' ) ) ); + + print_ns_headers( "LdapNS display groups" ); + print $form->render; + render_groupinfos( $groupInfos, $audit ) if defined( $groupInfos ); + print_ns_footers; + +} + +sub display_addgroup +{ + + $ADDGROUP = 1; + select_group_objectclass( "LdapNS add groups" ); + + my $addgroup = $session->param( 'addgroup' ); + my $objectClass = $addgroup->{'objectClass'}; + my $IM = $addgroup->{'IM'}; + my $groups; + my $options = {}; + + if ( $objectClass eq 'posixGroup' ) { + $groups = $session->param( 'posixGroups' ); + } else { + $groups = $session->param( 'groupOfNames' ); + refresh_posixAccounts; + } + + my $jsfunc = <<'EOJS'; // skip on back if (form._submitted_value.value == 'Back') { return true; } EOJS - my $fields = [qw(_submitted_value IM objectClass group)]; - my @required; - push(@required, @{$fields}); - - my $validate = { - IM => 'IM', - group => 'GROUP', - }; - if ($objectClass eq 'posixGroup') { - push(@{$fields}, 'gidNumber'); - $validate->{'gidNumber'} = 'GIDNUMBER'; - } - else { - push(@{$fields}, 'member'); - push(@required, 'member'); - $validate->{'member'} = 'USERDN'; - } - - my $form = CGI::FormBuilder->new( - name => 'ldapns_addgroup_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => "Add $objectClass", - fields => $fields, - template => $templatedir.'/addgroup.tmpl', - method => 'post', - javascript => 1, - jsfunc => $jsfunc, - required => \@required, - validate => $validate, - ); - - if ($form->submitted eq 'Back') { - $session->clear(['addgroup']); - redirect('?tab=groups&action=addgroup'); - } - - $form->field( - name => 'IM', - value => $IM, - label => 'IM', - comment => 'SMT ticket number', - disabled => 1, - ); - $form->field( - name => 'objectClass', - value => $objectClass, - label => 'objectClass', - comment => 'posixGroups or groupOfNames', - disabled => 1, - ); - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - $form->field( - name => 'gidNumber', - comment => 'optional [2000..9999]', - ); - $form->field( - name => 'member', - comment => 'required', - ); - - if ($objectClass ne 'posixGroup') { - my $posixAccounts = $session->param('posixAccounts'); - while (my ($dn, $values) = each (%{$posixAccounts})) { - my $uid = ${$values->{'uid'}}[0]; - my $gecos = ${$values->{'gecos'}}[0]; - $options->{$dn} = $uid.' - '.$gecos; - } - if (scalar(keys(%{$options})) == 0) { - $session->param('error', 'Unable to fetch available posixAccounts'); - redirect('?tab=users&action=adduser'); + my $fields = [qw(_submitted_value IM objectClass group)]; + my @required; + push( @required, @{$fields} ); + + my $validate = { + IM => 'IM', + group => 'GROUP', + }; + if ( $objectClass eq 'posixGroup' ) { + push( @{$fields}, 'gidNumber' ); + $validate->{'gidNumber'} = 'GIDNUMBER'; + } else { + push( @{$fields}, 'member' ); + push( @required, 'member' ); + $validate->{'member'} = 'USERDN'; + } + + my $form = CGI::FormBuilder->new( + name => 'ldapns_addgroup_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => "Add $objectClass", + fields => $fields, + template => $templatedir . '/addgroup.tmpl', + method => 'post', + javascript => 1, + jsfunc => $jsfunc, + required => \@required, + validate => $validate, + ); + + if ( $form->submitted eq 'Back' ) { + $session->clear( ['addgroup'] ); + redirect( '?tab=groups&action=addgroup' ); } + $form->field( - name => 'member', - options => $options, - selectname => 0, - sortopts => 'NAME', - label => 'member', - multiple => 1, + name => 'IM', + value => $IM, + label => 'IM', + comment => 'SMT ticket number', + disabled => 1, ); - } - else { $form->field( - name => 'gidNumber', - options => $options, - label => 'gidNumber', + name => 'objectClass', + value => $objectClass, + label => 'objectClass', + comment => 'posixGroups or groupOfNames', + disabled => 1, ); - } + $form->field( name => '_submitted_value', + type => 'hidden', ); + $form->field( name => 'gidNumber', + comment => 'optional [2000..9999]', ); + $form->field( name => 'member', + comment => 'required', ); + + if ( $objectClass ne 'posixGroup' ) { + my $posixAccounts = $session->param( 'posixAccounts' ); + while ( my ( $dn, $values ) = each( %{$posixAccounts} ) ) { + my $uid = ${ $values->{'uid'} }[0]; + my $gecos = ${ $values->{'gecos'} }[0]; + $options->{$dn} = $uid . ' - ' . $gecos; + } + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->param( 'error', 'Unable to fetch available posixAccounts' ); + redirect( '?tab=users&action=adduser' ); + } + $form->field( + name => 'member', + options => $options, + selectname => 0, + sortopts => 'NAME', + label => 'member', + multiple => 1, + ); + } else { + $form->field( + name => 'gidNumber', + options => $options, + label => 'gidNumber', + ); + } - $form->tmpl_param("posix" => ($objectClass eq 'posixGroup')); + $form->tmpl_param( "posix" => ( $objectClass eq 'posixGroup' ) ); - if ($form->submitted eq 'Add') { - my $entry; - eval { + if ( $form->submitted eq 'Add' ) { + my $entry; + eval { - die 'invalid parameters' unless $form->validate($validate); - print STDERR "addgroup validation ok\n"; + die 'invalid parameters' unless $form->validate( $validate ); + print STDERR "addgroup validation ok\n"; - my $group = $form->field(name => 'group'); - foreach my $dn (keys(%{$groups})) { - $dn =~ s/,.*//; - $dn =~ s/^.*=//; - die "group `$group' already exists" if ($group eq $dn); - } + my $group = $form->field( name => 'group' ); + foreach my $dn ( keys( %{$groups} ) ) { + $dn =~ s/,.*//; + $dn =~ s/^.*=//; + die "group `$group' already exists" if ( $group eq $dn ); + } - my $get_function; - reconnect_ldap_snmc; - if ($objectClass eq 'posixGroup') { - - $get_function = \&SNET::LdapNS::getPosixGroup; - my $gidNumber; - if ( - defined($form->field(name => 'gidNumber')) - && - length($form->field(name => 'gidNumber')) - ) { - $gidNumber = $form->field(name => 'gidNumber'); - } - - SNET::LdapNS::addPosixGroup( - $ldap_snmc->{'label'}, - $form->field(name => 'IM'), - $group, - $gidNumber, - ) or die "Unable to create LDAP entry for `$group'"; - } - else { + my $get_function; + reconnect_ldap_snmc; + if ( $objectClass eq 'posixGroup' ) { - $get_function = \&SNET::LdapNS::getGroupOfNames; + $get_function = \&SNET::LdapNS::getPosixGroup; + my $gidNumber; + if ( defined( $form->field( name => 'gidNumber' ) ) + && length( $form->field( name => 'gidNumber' ) ) ) { + $gidNumber = $form->field( name => 'gidNumber' ); + } - my @members = $form->field(name => 'member'); - die 'You must select at least one member' unless (scalar(@members)); + SNET::LdapNS::addPosixGroup( $ldap_snmc->{'label'}, $form->field( name => 'IM' ), $group, $gidNumber, ) or die "Unable to create LDAP entry for `$group'"; + } else { - map { die "invalid member `$_'" unless defined($options->{$_}) } @members; + $get_function = \&SNET::LdapNS::getGroupOfNames; - SNET::LdapNS::addGroupOfNames( - $ldap_snmc->{'label'}, - $form->field(name => 'IM'), - $group, - \@members, - ) or die "Unable to create LDAP entry for `$group'"; + my @members = $form->field( name => 'member' ); + die 'You must select at least one member' unless ( scalar( @members ) ); - } - $session->param('message', "Group added"); - if ($objectClass eq 'posixGroup') { - $session->clear([qw(addgroup posixGroups)]); - } - else { - $session->clear([qw(addgroup groupOfNames)]); - } + map { die "invalid member `$_'" unless defined( $options->{$_} ) } @members; - $entry = &{$get_function}( - $ldap_snmc->{'label'}, - $group, - ); + SNET::LdapNS::addGroupOfNames( $ldap_snmc->{'label'}, $form->field( name => 'IM' ), $group, \@members, ) or die "Unable to create LDAP entry for `$group'"; - }; - if ($@) { - $session->param('error', $@); - } - reset_actions; - if (defined($entry)) { - print_ns_headers("LdapNS add group"); - render_groupinfos($entry); - print_ns_footers; - } - else { - display_blank("LdapNS add group"); + } + $session->param( 'message', "Group added" ); + if ( $objectClass eq 'posixGroup' ) { + $session->clear( [qw(addgroup posixGroups)] ); + } else { + $session->clear( [qw(addgroup groupOfNames)] ); + } + + $entry = &{$get_function}( $ldap_snmc->{'label'}, $group, ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } + reset_actions; + if ( defined( $entry ) ) { + print_ns_headers( "LdapNS add group" ); + render_groupinfos( $entry ); + print_ns_footers; + } else { + display_blank( "LdapNS add group" ); + } } - } - print_ns_headers("LdapNS add group"); - print $form->render; - print_ns_footers; + print_ns_headers( "LdapNS add group" ); + print $form->render; + print_ns_footers; } -sub display_delgroup { - - $DELGROUP = 1; - select_group_objectclass("LdapNS delete groups"); - - my $delgroup = $session->param('delgroup'); - my $objectClass = $delgroup->{'objectClass'}; - my $IM = $delgroup->{'IM'}; - my $options = {}; - my $type = 'select'; - my $groups; - - if ($objectClass eq 'posixGroup') { - $groups = $session->param('posixGroups'); - } - else { - $groups = $session->param('groupOfNames'); - } - - my $jsfunc = <<'EOJS'; +sub display_delgroup +{ + + $DELGROUP = 1; + select_group_objectclass( "LdapNS delete groups" ); + + my $delgroup = $session->param( 'delgroup' ); + my $objectClass = $delgroup->{'objectClass'}; + my $IM = $delgroup->{'IM'}; + my $options = {}; + my $type = 'select'; + my $groups; + + if ( $objectClass eq 'posixGroup' ) { + $groups = $session->param( 'posixGroups' ); + } else { + $groups = $session->param( 'groupOfNames' ); + } + + my $jsfunc = <<'EOJS'; // skip js validation if on refresh or on cancel if (form._submitted_value.value == 'Refresh') { return true; @@ -2493,199 +2701,180 @@ sub display_delgroup { } EOJS - my $validate = { - IM => 'IM', - objectClass => 'GROUPCLASS', - group => 'GROUP', - }; - - my $form = CGI::FormBuilder->new( - name => 'ldapns_delgroup_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Delete group', - fields => [qw(_submitted_value IM group objectClass)], - template => $templatedir.'/delgroup.tmpl', - method => 'post', - javascript => 1, - jsfunc => $jsfunc, - required => 'ALL', - validate => $validate, - ); - - if ($form->submitted eq 'Back') { - $session->clear(['delgroup']); - redirect('?tab=groups&action=delgroup'); - } - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - $form->field( - name => 'IM', - value => $IM, - disabled => 1, - ); - $form->field( - name => 'objectClass', - value => $objectClass, - disabled => 1, - ); - - if ($form->submitted eq 'Delete') { - eval { + my $validate = { + IM => 'IM', + objectClass => 'GROUPCLASS', + group => 'GROUP', + }; - die 'invalid parameters' unless $form->validate($validate); + my $form = CGI::FormBuilder->new( + name => 'ldapns_delgroup_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Delete group', + fields => [qw(_submitted_value IM group objectClass)], + template => $templatedir . '/delgroup.tmpl', + method => 'post', + javascript => 1, + jsfunc => $jsfunc, + required => 'ALL', + validate => $validate, + ); - my @groups = $form->field(name => 'group'); - die 'You must select at least one group' unless (scalar(@groups) > 0); - foreach my $group (@groups) { + if ( $form->submitted eq 'Back' ) { + $session->clear( ['delgroup'] ); + redirect( '?tab=groups&action=delgroup' ); + } + $form->field( name => '_submitted_value', + type => 'hidden', ); + $form->field( + name => 'IM', + value => $IM, + disabled => 1, + ); + $form->field( + name => 'objectClass', + value => $objectClass, + disabled => 1, + ); + + if ( $form->submitted eq 'Delete' ) { + eval { + + die 'invalid parameters' unless $form->validate( $validate ); - $group = lc($group); + my @groups = $form->field( name => 'group' ); + die 'You must select at least one group' unless ( scalar( @groups ) > 0 ); + foreach my $group ( @groups ) { + $group = lc( $group ); + + eval { + foreach my $dn ( keys( %{$groups} ) ) { + $dn =~ s/,.*//; + $dn =~ s/^.*=//; + die 'found' if ( lc( $group ) eq lc( $dn ) ); + } + }; + die "invalid group `$group'" unless ( $@ ); + die "read-only group `$group'" if ( lc( $group ) eq 'admin' ); + + $options->{$group} = $group; + } + $delgroup->{'options'} = $options; + $session->param( 'delgroup', $delgroup ); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( "LdapNS delete groups" ); + } + $type = 'checkbox'; + $form->field( name => 'group', disabled => 1 ); + $form->tmpl_param( 'submit1' => 'Confirm' ); + $form->tmpl_param( 'submit2' => 'Cancel' ); + } elsif ( $form->submitted eq 'Confirm' ) { + my @groups = keys( %{ $delgroup->{'options'} } ); + my @deleted_groups; + my $group; eval { - foreach my $dn (keys(%{$groups})) { - $dn =~ s/,.*//; - $dn =~ s/^.*=//; - die 'found' if (lc($group) eq lc($dn)); - } + reconnect_ldap_snmc; + if ( $objectClass eq 'posixGroup' ) { + foreach $group ( @groups ) { + SNET::LdapNS::deletePosixGroup( $ldap_snmc->{'label'}, $IM, $group ); + push( @deleted_groups, $group ); + } + } elsif ( $objectClass eq 'groupOfNames' ) { + foreach $group ( @groups ) { + SNET::LdapNS::deleteGroupOfNames( $ldap_snmc->{'label'}, $IM, $group ); + push( @deleted_groups, $group ); + } + } else { + die "invalid objectClass `$objectClass'"; + } }; - die "invalid group `$group'" unless ($@); - die "read-only group `$group'" if (lc($group) eq 'admin'); - - $options->{$group} = $group; - } - $delgroup->{'options'} = $options; - $session->param('delgroup', $delgroup); - }; - if ($@) { - $session->param('error', $@); - display_blank("LdapNS delete groups"); - } - $type = 'checkbox'; - $form->field(name => 'group', disabled => 1); - $form->tmpl_param('submit1' => 'Confirm'); - $form->tmpl_param('submit2' => 'Cancel'); - } - elsif ($form->submitted eq 'Confirm') { - my @groups = keys(%{$delgroup->{'options'}}); - my @deleted_groups; - my $group; - eval { - reconnect_ldap_snmc; - if ($objectClass eq 'posixGroup') { - foreach $group (@groups) { - SNET::LdapNS::deletePosixGroup( - $ldap_snmc->{'label'}, - $IM, - $group - ); - push(@deleted_groups, $group); + if ( $@ ) { + $session->param( 'error', $@ ); } - } - elsif ($objectClass eq 'groupOfNames') { - foreach $group (@groups) { - SNET::LdapNS::deleteGroupOfNames( - $ldap_snmc->{'label'}, - $IM, - $group - ); - push(@deleted_groups, $group); + if ( scalar( @deleted_groups ) ) { + print STDERR 'Successful deletion of ' . join( ', ', @deleted_groups ) . "\n"; + $session->param( 'message', 'Successful deletion of ' . join( ', ', @deleted_groups ) ); + if ( $objectClass eq 'posixGroup' ) { + $session->clear( ['posixGroups'] ); + } else { + $session->clear( ['groupOfNames'] ); + } } - } - else { - die "invalid objectClass `$objectClass'"; - } - }; - if ($@) { - $session->param('error', $@); - } - if (scalar(@deleted_groups)) { - print STDERR 'Successful deletion of '.join(', ', @deleted_groups)."\n"; - $session->param('message', 'Successful deletion of '.join(', ', @deleted_groups)); - if ($objectClass eq 'posixGroup') { - $session->clear(['posixGroups']); - } - else { - $session->clear(['groupOfNames']); - } + $session->clear( ['delgroup'] ); + display_blank( "LdapNS delete groups" ); + } elsif ( $form->submitted eq 'Cancel' ) { + $session->param( 'error', 'delete operation cancelled' ); + $session->clear( ['delgroup'] ); + display_blank( "LdapNS delete groups" ); + } else { + my $groups; + if ( $objectClass eq 'posixGroup' ) { + $groups = $session->param( 'posixGroups' ); + } else { + $groups = $session->param( 'groupOfNames' ); + } + foreach my $values ( values( %{$groups} ) ) { + my $cn = ${ $values->{'cn'} }[0]; + $options->{$cn} = $cn; + } + $form->tmpl_param( 'submit1' => 'Delete' ); + $form->tmpl_param( 'submit2' => 'Back' ); } - $session->clear(['delgroup']); - display_blank("LdapNS delete groups"); - } - elsif ($form->submitted eq 'Cancel') { - $session->param('error', 'delete operation cancelled'); - $session->clear(['delgroup']); - display_blank("LdapNS delete groups"); - } - else { - my $groups; - if ($objectClass eq 'posixGroup') { - $groups = $session->param('posixGroups'); - } - else { - $groups = $session->param('groupOfNames'); - } - foreach my $values (values(%{$groups})) { - my $cn = ${$values->{'cn'}}[0]; - $options->{$cn} = $cn; - } - $form->tmpl_param('submit1' => 'Delete'); - $form->tmpl_param('submit2' => 'Back'); - } - - if (scalar(keys(%{$options})) == 0) { - $session->param('error', 'Unable to fetch available groups'); - display_blank("LdapNS delete groups"); - } - - $form->field( - name => 'group', - options => $options, - sortopts => 'NAME', - linebreaks => 1, - type => $type, - selectname => 0, - multiple => 0, - ); - - if ($type eq 'select') { + + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->param( 'error', 'Unable to fetch available groups' ); + display_blank( "LdapNS delete groups" ); + } + $form->field( - size => getsize_multipleselect($options), + name => 'group', + options => $options, + sortopts => 'NAME', + linebreaks => 1, + type => $type, + selectname => 0, + multiple => 0, ); - } - print_ns_headers("LdapNS delete groups"); - print $form->render(); - print_ns_footers; + if ( $type eq 'select' ) { + $form->field( size => getsize_multipleselect( $options ), ); + } + + print_ns_headers( "LdapNS delete groups" ); + print $form->render(); + print_ns_footers; } -sub display_modgroup { +sub display_modgroup +{ - $MODGROUP = 1; + $MODGROUP = 1; - refresh_posixAccounts; + refresh_posixAccounts; - my $next_step = select_group_objectclass("LdapNS modify groups"); + my $next_step = select_group_objectclass( "LdapNS modify groups" ); - if ($next_step < 0) { - select_group; - } - else { - select_group if ($next_step > 0); - } + if ( $next_step < 0 ) { + select_group; + } else { + select_group if ( $next_step > 0 ); + } - my $modgroup = $session->param('modgroup'); - my $IM = $modgroup->{'IM'}; - my $objectClass = $modgroup->{'objectClass'}; - my $group = $modgroup->{'group'}; - my $deloptions; - my $addoptions; - my $type = 'select'; + my $modgroup = $session->param( 'modgroup' ); + my $IM = $modgroup->{'IM'}; + my $objectClass = $modgroup->{'objectClass'}; + my $group = $modgroup->{'group'}; + my $deloptions; + my $addoptions; + my $type = 'select'; - my $jsfunc = <<'EOJS'; + my $jsfunc = <<'EOJS'; // skip on back if (form._submitted_value.value == 'Back') { return true; @@ -2695,624 +2884,554 @@ sub display_modgroup { } EOJS - my $user_validate = ($objectClass eq 'posixGroup') ? 'UID' : 'USERDN'; - my $validate = { - IM => 'IM', - group => 'GROUP', - objectClass => 'GROUPCLASS', - uid => $user_validate, - }; - - my $form = CGI::FormBuilder->new( - name => 'ldapns_modgroup_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => "Modify $objectClass", - fields => [qw(_submitted_value IM objectClass group deluser adduser)], - template => $templatedir.'/modgroup.tmpl', - method => 'post', - javascript => 1, - jsfunc => $jsfunc, - required => [qw(IM objectClass group)], - validate => $validate, - ); - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - - if ($form->submitted eq 'Back') { - delete($modgroup->{'group'}); - $session->param('modgroup', $modgroup); - redirect('?tab=groups&action=modgroup'); - } - - if ($form->submitted eq 'Cancel') { - $session->param('error', 'modify operation cancelled'); - $session->clear(['modgroup']); - display_blank("LdapNS modify groups"); - } - - $form->field( - name => 'IM', - value => $IM, - disabled => 1, - ); - $form->field( - name => 'objectClass', - value => $objectClass, - disabled => 1, - ); - $form->field( - name => 'group', - value => $group, - disabled => 1, - ); - - if ($form->submitted eq 'Modify') { + my $user_validate = ( $objectClass eq 'posixGroup' ) ? 'UID' : 'USERDN'; + my $validate = { + IM => 'IM', + group => 'GROUP', + objectClass => 'GROUPCLASS', + uid => $user_validate, + }; + + my $form = CGI::FormBuilder->new( + name => 'ldapns_modgroup_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => "Modify $objectClass", + fields => [qw(_submitted_value IM objectClass group deluser adduser)], + template => $templatedir . '/modgroup.tmpl', + method => 'post', + javascript => 1, + jsfunc => $jsfunc, + required => [qw(IM objectClass group)], + validate => $validate, + ); + $form->field( name => '_submitted_value', + type => 'hidden', ); + + if ( $form->submitted eq 'Back' ) { + delete( $modgroup->{'group'} ); + $session->param( 'modgroup', $modgroup ); + redirect( '?tab=groups&action=modgroup' ); + } + + if ( $form->submitted eq 'Cancel' ) { + $session->param( 'error', 'modify operation cancelled' ); + $session->clear( ['modgroup'] ); + display_blank( "LdapNS modify groups" ); + } + + $form->field( + name => 'IM', + value => $IM, + disabled => 1, + ); + $form->field( + name => 'objectClass', + value => $objectClass, + disabled => 1, + ); + $form->field( + name => 'group', + value => $group, + disabled => 1, + ); + + if ( $form->submitted eq 'Modify' ) { + + eval { + + my $deluser = []; + my $adduser = []; + $deloptions = {}; + $addoptions = {}; + + push( @{$deluser}, $form->field( name => 'deluser' ) ) if ( defined( $form->field( name => 'deluser' ) ) ); + push( @{$adduser}, $form->field( name => 'adduser' ) ) if ( defined( $form->field( name => 'adduser' ) ) ); + + die 'You must select at least one user' unless ( scalar( @{$deluser} ) || scalar( @{$adduser} ) ); + + foreach my $user ( @{$deluser} ) { + $deloptions->{$user} = $modgroup->{'deloptions'}->{$user} + or die "invalid user `$user'"; + } + foreach my $user ( @{$adduser} ) { + $addoptions->{$user} = $modgroup->{'addoptions'}->{$user} + or die "invalid user `$user'"; + } + + if ( $objectClass eq 'groupOfNames' ) { + my $members = scalar( keys( %{ $modgroup->{'deloptions'} } ) ); + $members += scalar( keys( %{$addoptions} ) ); + $members -= scalar( keys( %{$deloptions} ) ); + die "groupOfNames must contain at least one member" unless ( $members ); + } - eval { + $modgroup->{'deloptions'} = $deloptions; + $modgroup->{'addoptions'} = $addoptions; + $session->param( 'modgroup', $modgroup ); - my $deluser = []; - my $adduser = []; - $deloptions = {}; - $addoptions = {}; - - push(@{$deluser}, $form->field(name => 'deluser')) if ( - defined($form->field(name => 'deluser')) - ); - push(@{$adduser}, $form->field(name => 'adduser')) if ( - defined($form->field(name => 'adduser')) - ); - - die 'You must select at least one user' unless ( - scalar(@{$deluser}) || scalar(@{$adduser}) - ); - - foreach my $user (@{$deluser}) { - $deloptions->{$user} = $modgroup->{'deloptions'}->{$user} - or die "invalid user `$user'"; - } - foreach my $user (@{$adduser}) { - $addoptions->{$user} = $modgroup->{'addoptions'}->{$user} - or die "invalid user `$user'"; - } + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( "LdapNS modify groups" ); + } + $type = 'checkbox'; + $form->field( name => 'adduser', disabled => 1 ); + $form->field( name => 'deluser', disabled => 1 ); + $form->tmpl_param( 'submit1' => 'Cancel' ); + $form->tmpl_param( 'submit2' => 'Confirm' ); + } elsif ( $form->submitted eq 'Confirm' ) { - if ($objectClass eq 'groupOfNames') { - my $members = scalar(keys(%{$modgroup->{'deloptions'}})); - $members += scalar(keys(%{$addoptions})); - $members -= scalar(keys(%{$deloptions})); - die "groupOfNames must contain at least one member" unless ($members); - } + my $entry; - $modgroup->{'deloptions'} = $deloptions; - $modgroup->{'addoptions'} = $addoptions; - $session->param('modgroup', $modgroup); + eval { - }; - if ($@) { - $session->param('error', $@); - display_blank("LdapNS modify groups"); - } - $type = 'checkbox'; - $form->field(name => 'adduser', disabled => 1); - $form->field(name => 'deluser', disabled => 1); - $form->tmpl_param('submit1' => 'Cancel'); - $form->tmpl_param('submit2' => 'Confirm'); - } - elsif ($form->submitted eq 'Confirm') { + $deloptions = $modgroup->{'deloptions'}; + $addoptions = $modgroup->{'addoptions'}; + my @to_delete = keys( %{$deloptions} ); + my @to_add = keys( %{$addoptions} ); + + my $add_function; + my $del_function; + my $get_function; + + if ( $objectClass eq 'posixGroup' ) { + $add_function = \&SNET::LdapNS::addToPosixGroup; + $del_function = \&SNET::LdapNS::removeFromPosixGroup; + $get_function = \&SNET::LdapNS::getPosixGroup; + } else { + $add_function = \&SNET::LdapNS::addToGroupOfNames; + $del_function = \&SNET::LdapNS::removeFromGroupOfNames; + $get_function = \&SNET::LdapNS::getGroupOfNames; + } - my $entry; + reconnect_ldap_snmc; - eval { + if ( scalar( @to_add ) ) { + &{$add_function}( $ldap_snmc->{'label'}, $IM, $group, \@to_add ) or die SNET::LdapNS::error( $ldap_snmc->{'label'} ); + } - $deloptions = $modgroup->{'deloptions'}; - $addoptions = $modgroup->{'addoptions'}; - my @to_delete = keys(%{$deloptions}); - my @to_add = keys(%{$addoptions}); - - my $add_function; - my $del_function; - my $get_function; - - if ($objectClass eq 'posixGroup') { - $add_function = \&SNET::LdapNS::addToPosixGroup; - $del_function = \&SNET::LdapNS::removeFromPosixGroup; - $get_function = \&SNET::LdapNS::getPosixGroup; - } - else { - $add_function = \&SNET::LdapNS::addToGroupOfNames; - $del_function = \&SNET::LdapNS::removeFromGroupOfNames; - $get_function = \&SNET::LdapNS::getGroupOfNames; - } + if ( scalar( @to_delete ) ) { + &{$del_function}( $ldap_snmc->{'label'}, $IM, $group, \@to_delete ) or die SNET::LdapNS::error( $ldap_snmc->{'label'} ); + } - reconnect_ldap_snmc; - - if (scalar(@to_add)) { - &{$add_function} ( - $ldap_snmc->{'label'}, - $IM, - $group, - \@to_add - ) or die SNET::LdapNS::error($ldap_snmc->{'label'}); - }; - - if (scalar(@to_delete)) { - &{$del_function} ( - $ldap_snmc->{'label'}, - $IM, - $group, - \@to_delete - ) or die SNET::LdapNS::error($ldap_snmc->{'label'}); - }; - - $session->param('message', 'group modification successful'); - if ($objectClass eq 'posixGroup') { - $session->clear([qw(modgroup posixGroups)]); - } - else { - $session->clear([qw(modgroup groupOfNames)]); - } + $session->param( 'message', 'group modification successful' ); + if ( $objectClass eq 'posixGroup' ) { + $session->clear( [qw(modgroup posixGroups)] ); + } else { + $session->clear( [qw(modgroup groupOfNames)] ); + } - $entry = &{$get_function} ( - $ldap_snmc->{'label'}, - $group, - ); + $entry = &{$get_function}( $ldap_snmc->{'label'}, $group, ); - }; - if ($@) { - $session->param('error', $@); - } - reset_actions; - if (defined($entry)) { - print_ns_headers("LdapNS modify group"); - render_groupinfos($entry); - print_ns_footers; - } - else { - display_blank("LdapNS modify groups"); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } + reset_actions; + if ( defined( $entry ) ) { + print_ns_headers( "LdapNS modify group" ); + render_groupinfos( $entry ); + print_ns_footers; + } else { + display_blank( "LdapNS modify groups" ); + } + + } else { + $deloptions = $modgroup->{'deloptions'}; + $addoptions = $modgroup->{'addoptions'}; + $form->tmpl_param( 'submit1' => 'Back' ); + $form->tmpl_param( 'submit2' => 'Modify' ); } - } - else { - $deloptions = $modgroup->{'deloptions'}; - $addoptions = $modgroup->{'addoptions'}; - $form->tmpl_param('submit1' => 'Back'); - $form->tmpl_param('submit2' => 'Modify'); - } + if ( keys %{$deloptions} ) { + $form->field( + name => 'deluser', + options => $deloptions, + sortopts => 'NAME', + linebreaks => 1, + type => $type, + multiple => 1, + disable => ( scalar( keys( %{$deloptions} ) ) == 0 ), + ); - if (keys%{$deloptions}) { - $form->field( - name => 'deluser', - options => $deloptions, - sortopts => 'NAME', - linebreaks => 1, - type => $type, - multiple => 1, - disable => (scalar(keys(%{$deloptions})) == 0), - ); + if ( $type eq 'select' ) { + $form->field( size => getsize_multipleselect( $deloptions ), ); + } - if ($type eq 'select') { - $form->field( - size => getsize_multipleselect($deloptions), - ); + } else { + $form->tmpl_param( 'disable_deluser' => 1 ); } - } - else { - $form->tmpl_param('disable_deluser' => 1); - } + if ( keys( %{$addoptions} ) ) { + $form->field( + name => 'adduser', + options => $addoptions, + sortopts => 'NAME', + linebreaks => 1, + type => $type, + multiple => 1, + disable => ( scalar( keys( %{$addoptions} ) ) == 0 ), + ); - if (keys(%{$addoptions})) { - $form->field( - name => 'adduser', - options => $addoptions, - sortopts => 'NAME', - linebreaks => 1, - type => $type, - multiple => 1, - disable => (scalar(keys(%{$addoptions})) == 0), - ); + if ( $type eq 'select' ) { + $form->field( size => getsize_multipleselect( $addoptions ), ); + } - if ($type eq 'select') { - $form->field( - size => getsize_multipleselect($addoptions), - ); + } else { + $form->tmpl_param( 'disable_adduser' => 1 ); } - } - else { - $form->tmpl_param('disable_adduser' => 1); - } - - print_ns_headers("LdapNS modify groups"); - print $form->render(); - print_ns_footers; + print_ns_headers( "LdapNS modify groups" ); + print $form->render(); + print_ns_footers; } +sub display_passwd +{ + + $PASSWD = 1; + + my $form_fields = [qw(old new repeat)]; + push( @{$form_fields}, 'synchronize' ) if ( $mod_synchro ); + + my $form = CGI::FormBuilder->new( + name => 'ldapns_passwd_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Password change', + fields => $form_fields, + template => $templatedir . '/passwd.tmpl', + method => 'post', + required => [qw(old new repeat)], + submit => 'Change password', + ); -sub display_passwd { + if ( $mod_synchro ) { + $form->field( + name => 'synchronize', + type => 'checkbox', + comment => 'Synchronize with old LDAP database?', + options => 'yes', + ); + $form->field( + name => 'synchronize', + value => 'yes' + ) unless ( $form->submitted ); + } + $form->tmpl_param( 'mod_synchro' => $mod_synchro ); - $PASSWD = 1; + $form->field( name => 'new', + type => 'password', ); + $form->field( name => 'old', + type => 'password', ); + $form->field( name => 'repeat', + type => 'password', ); - my $form_fields = [qw(old new repeat)]; - push (@{$form_fields}, 'synchronize') if ($mod_synchro); + $session->param( 'message', "password must be [10..16] characters long, and must contains 3 different character classes" ); - my $form = CGI::FormBuilder->new( - name => 'ldapns_passwd_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Password change', - fields => $form_fields, - template => $templatedir.'/passwd.tmpl', - method => 'post', - required => [qw(old new repeat)], - submit => 'Change password', - ); + if ( $form->submitted ) { - if ($mod_synchro) { - $form->field( - name => 'synchronize', - type => 'checkbox', - comment => 'Synchronize with old LDAP database?', - options => 'yes', - ); - $form->field( - name => 'synchronize', - value => 'yes' - ) unless ($form->submitted); - } - $form->tmpl_param('mod_synchro' => $mod_synchro); - - $form->field( - name => 'new', - type => 'password', - ); - $form->field( - name => 'old', - type => 'password', - ); - $form->field( - name => 'repeat', - type => 'password', - ); - - $session->param('message', - "password must be [10..16] characters long, and must contains 3 different character classes" - ); - - if ($form->submitted) { + eval { + die 'missing parameters' unless $form->validate(); + die 'password mismatch' unless ( $form->field( name => 'new' ) eq $form->field( name => 'repeat' ) ); - eval { - die 'missing parameters' unless $form->validate(); - die 'password mismatch' unless ( - $form->field(name => 'new') - eq - $form->field(name => 'repeat') - ); - - reconnect_ldap_snmc(); - SNET::LdapNS::passwd( - $ldap_snmc->{'label'}, - $form->field(name => 'old'), - $form->field(name => 'new') - ); - $session->param('message', 'password changed successfully'); - $session->clear(['action', 'error']); - - synchronize_passwords( - defined($form->field(name => 'synchronize')), - $ldap_snmc->{'label'}, - $form->field(name => 'new'), - undef, - $form->field(name => 'old') - ); - - encode_sessionauth($form->field(name => 'new')); - $session->param('userMustChange', 0); - $userMustChange = 0; - refresh_userInfos; - redirect_homepage; + reconnect_ldap_snmc(); + SNET::LdapNS::passwd( $ldap_snmc->{'label'}, $form->field( name => 'old' ), $form->field( name => 'new' ) ); + $session->param( 'message', 'password changed successfully' ); + $session->clear( [ 'action', 'error' ] ); - }; - if ($@) { - $session->param('error', $@); - } - else { - display_blank("LdapNS homepage"); + # synchronize_samba_password( + # $ldap_snmc->{'label'}, + # $form->field(name => 'new') + # ); + + synchronize_passwords( defined( $form->field( name => 'synchronize' ) ), $ldap_snmc->{'label'}, $form->field( name => 'new' ), undef, $form->field( name => 'old' ) ); + + encode_sessionauth( $form->field( name => 'new' ) ); + $session->param( 'userMustChange', 0 ); + $userMustChange = 0; + refresh_userInfos; + redirect_homepage; + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + } else { + display_blank( "LdapNS homepage" ); + } } - } - print_ns_headers("LdapNS homepage"); - print $form->render; - print_ns_footers; + print_ns_headers( "LdapNS homepage" ); + print $form->render; + print_ns_footers; } -sub display_blank($) { +sub display_blank($) +{ - my $title = shift; - my $template_blank = HTML::Template->new(filename => $templatedir.'/blank.tmpl'); + my $title = shift; + my $template_blank = HTML::Template->new( filename => $templatedir . '/blank.tmpl' ); - parse_messages; + parse_messages; - $template_blank->param( - 'br' => (!(defined($error) || defined($message))) - ); + $template_blank->param( 'br' => ( !( defined( $error ) || defined( $message ) ) ) ); - reset_actions; + reset_actions; - print_ns_headers($title); - print $template_blank->output; - print_ns_footers; + print_ns_headers( $title ); + print $template_blank->output; + print_ns_footers; } -sub display_users { - - print STDERR "ldap_NS.pl: entering display_users\n" if ($debug >2); - - if (defined($params->{'action'})) { - if ($params->{'action'} eq 'reset') { - $session->param('action','reset'); - } - elsif ($params->{'action'} eq 'deluser') { - $session->param('action','deluser'); - } - elsif ($params->{'action'} eq 'adduser') { - $session->param('action','adduser'); - } - elsif ($params->{'action'} eq 'moduser') { - $session->param('action','moduser'); - } - elsif ($params->{'action'} eq 'userinfos') { - $session->param('action','userinfos'); +sub display_users +{ + + print STDERR "ldap_NS.pl: entering display_users\n" if ( $debug > 2 ); + + if ( defined( $params->{'action'} ) ) { + if ( $params->{'action'} eq 'reset' ) { + $session->param( 'action', 'reset' ); + } elsif ( $params->{'action'} eq 'deluser' ) { + $session->param( 'action', 'deluser' ); + } elsif ( $params->{'action'} eq 'adduser' ) { + $session->param( 'action', 'adduser' ); + } elsif ( $params->{'action'} eq 'adduserprofile' ) { + $session->param( 'action', 'adduserprofile' ); + } elsif ( $params->{'action'} eq 'moduser' ) { + $session->param( 'action', 'moduser' ); + } elsif ( $params->{'action'} eq 'userinfos' ) { + $session->param( 'action', 'userinfos' ); + } } - } - if (defined($session->param('action'))) { - if ($session->param('action') eq 'adduser') { - display_adduser; - } - elsif ($session->param('action') eq 'moduser') { - display_moduser; - } - elsif ($session->param('action') eq 'deluser') { - display_deluser; - } - elsif ($session->param('action') eq 'reset') { - display_reset; - } - elsif ($session->param('action') eq 'userinfos') { - display_userinfos; - } - else { - $session->clear(['action']); + if ( defined( $session->param( 'action' ) ) ) { + if ( $session->param( 'action' ) eq 'adduser' ) { + display_adduser; + } elsif ( $session->param( 'action' ) eq 'adduserprofile' ) { + display_adduserprofile; + } elsif ( $session->param( 'action' ) eq 'moduser' ) { + display_moduser; + } elsif ( $session->param( 'action' ) eq 'deluser' ) { + display_deluser; + } elsif ( $session->param( 'action' ) eq 'reset' ) { + display_reset; + } elsif ( $session->param( 'action' ) eq 'userinfos' ) { + display_userinfos; + } else { + $session->clear( ['action'] ); + } } - } - display_blank("LdapNS users management"); + display_blank( "LdapNS users management" ); } -sub display_groups { - - print STDERR "ldap_NS.pl: entering display_groups\n" if ($debug >2); +sub display_groups +{ - if (defined($params->{'action'})) { - if ($params->{'action'} eq 'modgroup') { - $session->param('action','modgroup'); - } - elsif ($params->{'action'} eq 'delgroup') { - $session->param('action','delgroup'); - } - elsif ($params->{'action'} eq 'addgroup') { - $session->param('action','addgroup'); - } - elsif ($params->{'action'} eq 'groupinfos') { - $session->param('action','groupinfos'); - } - } - - if (defined($session->param('action'))) { - if ($session->param('action') eq 'addgroup') { - display_addgroup; - } - elsif ($session->param('action') eq 'delgroup') { - display_delgroup; - } - elsif ($session->param('action') eq 'modgroup') { - display_modgroup; - } - elsif ($session->param('action') eq 'groupinfos') { - display_groupinfos; + print STDERR "ldap_NS.pl: entering display_groups\n" if ( $debug > 2 ); + + if ( defined( $params->{'action'} ) ) { + if ( $params->{'action'} eq 'modgroup' ) { + $session->param( 'action', 'modgroup' ); + } elsif ( $params->{'action'} eq 'delgroup' ) { + $session->param( 'action', 'delgroup' ); + } elsif ( $params->{'action'} eq 'addgroup' ) { + $session->param( 'action', 'addgroup' ); + } elsif ( $params->{'action'} eq 'groupinfos' ) { + $session->param( 'action', 'groupinfos' ); + } } - else { - $session->clear(['action']); + + if ( defined( $session->param( 'action' ) ) ) { + if ( $session->param( 'action' ) eq 'addgroup' ) { + display_addgroup; + } elsif ( $session->param( 'action' ) eq 'delgroup' ) { + display_delgroup; + } elsif ( $session->param( 'action' ) eq 'modgroup' ) { + display_modgroup; + } elsif ( $session->param( 'action' ) eq 'groupinfos' ) { + display_groupinfos; + } else { + $session->clear( ['action'] ); + } } - } - display_blank("LdapNS groups management"); + display_blank( "LdapNS groups management" ); } -sub select_policy { +sub select_policy +{ - my $title = shift; - my $sessionparam = $session->param('action'); + my $title = shift; + my $sessionparam = $session->param( 'action' ); - if ( - ($sessionparam ne 'modpolicy') - && - ($sessionparam ne 'delpolicy') - ) { - $session->param('error', "invalid action $sessionparam"); - redirect_homepage; - } + if ( ( $sessionparam ne 'modpolicy' ) + && ( $sessionparam ne 'delpolicy' ) ) { + $session->param( 'error', "invalid action $sessionparam" ); + redirect_homepage; + } - refresh_ppolicy; + refresh_ppolicy; - if (defined($session->param($sessionparam))) { - return 1 if (defined($session->param($sessionparam)->{'policy'})); - } + if ( defined( $session->param( $sessionparam ) ) ) { + return 1 if ( defined( $session->param( $sessionparam )->{'policy'} ) ); + } - my $policies; - my $options; + my $policies; + my $options; - my $validate = { - IM => 'IM', - policy => 'PPOLICYDN', - }; + my $validate = { + IM => 'IM', + policy => 'PPOLICYDN', + }; - my $jsfunc = <<'EOJS'; + my $jsfunc = <<'EOJS'; // skip on back if (form._submitted_value.value == 'Cancel') { return true; } EOJS - my $form = CGI::FormBuilder->new( - name => 'ldapns_selectpolicy_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => "Select policy", - fields => [qw(IM policy)], - template => $templatedir.'/selectpolicy.tmpl', - submit => [qw(Cancel Select)], - method => 'post', - selectname => 0, - javascript => 1, - jsfunc => $jsfunc, - required => 'ALL', - validate => $validate, - ); - - if ($form->submitted eq 'Cancel') { - $session->clear(["$sessionparam"]); - $session->clear(['action']); - redirect('?tab=ppolicies'); - } - - my $pwdPolicies = $session->param('pwdPolicies'); - while (my ($dn, $values) = each (%{$pwdPolicies})) { - my $did = ${$values->{'documentidentifier'}}[0]; - if ( - defined($values->{'description'}) - && - scalar(@{$values->{'description'}}) - ) { - $options->{$dn} = $did.' - '.${$values->{'description'}}[0]; - } - else { - $options->{$dn} = $did; - } - } - - if (scalar(keys(%{$options})) == 0) { - $session->clear(["$sessionparam"]); - $session->param('error', 'Unable to fetch available policies'); - redirect('?tab=ppolicies&action=addpolicy'); - } - - $form->field( - name => 'IM', - comment => 'SMT ticket number', - ); - - $form->field( - name => 'policy', - options => $options, - sortopts => 'NAME', - type => 'select', - size => getsize_multipleselect($options), - multiple => 0, - ); - - if ($form->submitted eq 'Select') { - - my $IM = $form->field(name => 'IM'); - my $policy = $form->field(name => 'policy'); - - eval { - - die 'invalid parameters' unless $form->validate( - $validate - ); + my $form = CGI::FormBuilder->new( + name => 'ldapns_selectpolicy_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => "Select policy", + fields => [qw(IM policy)], + template => $templatedir . '/selectpolicy.tmpl', + submit => [qw(Cancel Select)], + method => 'post', + selectname => 0, + javascript => 1, + jsfunc => $jsfunc, + required => 'ALL', + validate => $validate, + ); - reconnect_ldap_snmc; - my $infos = SNET::LdapNS::getPwdPolicy( - $ldap_snmc->{'label'}, - $policy - ); + if ( $form->submitted eq 'Cancel' ) { + $session->clear( ["$sessionparam"] ); + $session->clear( ['action'] ); + redirect( '?tab=ppolicies' ); + } - $session->param($sessionparam, - { - 'IM' => $IM, - 'policy' => $policy, - 'infos' => $infos->{$policy}, + my $pwdPolicies = $session->param( 'pwdPolicies' ); + while ( my ( $dn, $values ) = each( %{$pwdPolicies} ) ) { + my $did = ${ $values->{'documentidentifier'} }[0]; + if ( defined( $values->{'description'} ) + && scalar( @{ $values->{'description'} } ) ) { + $options->{$dn} = $did . ' - ' . ${ $values->{'description'} }[0]; + } else { + $options->{$dn} = $did; } - ); + } - }; - if ($@) { - $session->param('error', $@); - display_blank($title); + if ( scalar( keys( %{$options} ) ) == 0 ) { + $session->clear( ["$sessionparam"] ); + $session->param( 'error', 'Unable to fetch available policies' ); + redirect( '?tab=ppolicies&action=addpolicy' ); } - return 1; + $form->field( name => 'IM', + comment => 'SMT ticket number', ); + + $form->field( + name => 'policy', + options => $options, + sortopts => 'NAME', + type => 'select', + size => getsize_multipleselect( $options ), + multiple => 0, + ); + + if ( $form->submitted eq 'Select' ) { + + my $IM = $form->field( name => 'IM' ); + my $policy = $form->field( name => 'policy' ); + + eval { + + die 'invalid parameters' unless $form->validate( $validate ); + + reconnect_ldap_snmc; + my $infos = SNET::LdapNS::getPwdPolicy( $ldap_snmc->{'label'}, $policy ); + + $session->param( + $sessionparam, + { + 'IM' => $IM, + 'policy' => $policy, + 'infos' => $infos->{$policy}, + } + ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); + display_blank( $title ); + } + + return 1; - } + } - print_ns_headers($title); - print $form->render; - print_ns_footers; + print_ns_headers( $title ); + print $form->render; + print_ns_footers; } -sub display_addpolicy { +sub display_addpolicy +{ - $ADDPOLICY = 1; - refresh_ppolicy; + $ADDPOLICY = 1; + refresh_ppolicy; - $session->param('error', 'Not yet implemented'); + $session->param( 'error', 'Not yet implemented' ); - display_blank("LdapNS passwords policies management"); + display_blank( "LdapNS passwords policies management" ); } -sub display_delpolicy { +sub display_delpolicy +{ - $DELPOLICY = 1; - refresh_ppolicy; + $DELPOLICY = 1; + refresh_ppolicy; - $session->param('error', 'Not yet implemented'); + $session->param( 'error', 'Not yet implemented' ); - display_blank("LdapNS passwords policies management"); + display_blank( "LdapNS passwords policies management" ); } -sub display_modpolicy { +sub display_modpolicy +{ - $MODPOLICY = 1; + $MODPOLICY = 1; - select_policy("LdapNS modify policy"); + select_policy( "LdapNS modify policy" ); - my $modpolicy = $session->param('modpolicy'); - my $IM = $modpolicy->{'IM'}; - my $policy = $modpolicy->{'policy'}; - my $infos = $modpolicy->{'infos'}; - my $deloptions; - my $addoptions; - my $type = 'select'; + my $modpolicy = $session->param( 'modpolicy' ); + my $IM = $modpolicy->{'IM'}; + my $policy = $modpolicy->{'policy'}; + my $infos = $modpolicy->{'infos'}; + my $deloptions; + my $addoptions; + my $type = 'select'; - my $add = {}; - my $del = {}; + my $add = {}; + my $del = {}; - my $jsfunc = <<'EOJS'; + my $jsfunc = <<'EOJS'; // skip on back if (form._submitted_value.value == 'Back') { return true; @@ -3322,681 +3441,617 @@ sub display_modpolicy { } EOJS - my $validate = { - 'IM' => 'IM', - 'policy' => 'PPOLICYDN', - description => 'DESCRIPTION', - }; - - my $fields = [qw(_submitted_value IM description)]; - my $pwdconstraint_fields = []; - my @keys = keys(%{$SNET::LdapNS::pwdPolicyAttributes}); - foreach my $k (sort { $a cmp $b } @keys) { - next if ($k =~ m/checkmodule|constraint.*length|constraintcheckquality/i); - if ($k =~ m/pwdconstraint/i) { - if ($k =~ m/quality/i) { - unshift(@{$pwdconstraint_fields}, $k); - } - else { - push(@{$pwdconstraint_fields}, $k); - } - } - else { - push(@{$fields}, $k); - } - $validate->{$k} = $CGI::FormBuilder::Field::VALIDATE{$k}; - } - push(@{$fields}, @{$pwdconstraint_fields}); - - my $form = CGI::FormBuilder->new( - name => 'ldapns_modpolicy_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => "Modify policy", - fields => $fields, - template => $templatedir.'/modpolicy.tmpl', - method => 'post', - javascript => 1, - sticky => 1, - jsfunc => $jsfunc, - required => [qw(IM policy)], - validate => $validate, - ); - - $form->field( - name => '_submitted_value', - type => 'hidden', - ); - - if ($form->submitted eq 'Back') { - delete($modpolicy->{'policy'}); - $session->param('modpolicy', $modpolicy); - redirect('?tab=ppolicies&action=modpolicy'); - } - - if ($form->submitted eq 'Cancel') { - $session->param('error', 'modify operation cancelled'); - $session->clear(['modpolicy']); - display_blank("LdapNS modify policies"); - } - - $form->field( - name => 'IM', - value => $IM, - disabled => 1, - ); - $form->field( - name => 'policy', - value => $policy, - disabled => 1, - ); - - $form->field( - name => 'description', - comment => 'optional', - ); - $form->field(name => 'description', value => $infos->{'description'}) - if defined($infos->{'description'}); - - foreach my $k (@{$fields}) { - - next unless (defined($SNET::LdapNS::pwdPolicyAttributes->{$k})); - my $type = ${$SNET::LdapNS::pwdPolicyAttributes->{$k}}[0]; - - my $val = (defined($infos->{$k}) ? ${$infos->{$k}}[0] : 0); - $form->tmpl_param('if_'.$k, 1); - - if ($type eq 'bool') { - $form->field( - name => $k, - comment => ${$SNET::LdapNS::pwdPolicyAttributes->{$k}}[1], - type => 'checkbox', - options => 'true', - ); - if ($form->submitted ne 'Modify') { - $form->field(name => $k, value => 'true') if ("$val" =~ m/true/i); - } - } - elsif ($type eq 'extbool') { - $form->field( - name => $k, - comment => ${$SNET::LdapNS::pwdPolicyAttributes->{$k}}[1], - type => 'checkbox', - options => 'strict', - ); - if ($form->submitted ne 'Modify') { - $form->field(name => $k, value => 'strict') if ($val > 0); - } - } - elsif ($type eq 'nbool') { - $form->field( - name => $k, - comment => ${$SNET::LdapNS::pwdPolicyAttributes->{$k}}[1], - type => 'checkbox', - options => 'counted', - ); - if ($form->submitted ne 'Modify') { - $form->field(name => $k, value => 'counted') if ($val > 0); - } + my $validate = { + 'IM' => 'IM', + 'policy' => 'PPOLICYDN', + description => 'DESCRIPTION', + }; + + my $fields = [qw(_submitted_value IM description)]; + my $pwdconstraint_fields = []; + my @keys = keys( %{$SNET::LdapNS::pwdPolicyAttributes} ); + foreach my $k ( sort { $a cmp $b } @keys ) { + next if ( $k =~ m/checkmodule|constraint.*length|constraintcheckquality/i ); + if ( $k =~ m/pwdconstraint/i ) { + if ( $k =~ m/quality/i ) { + unshift( @{$pwdconstraint_fields}, $k ); + } else { + push( @{$pwdconstraint_fields}, $k ); + } + } else { + push( @{$fields}, $k ); + } + $validate->{$k} = $CGI::FormBuilder::Field::VALIDATE{$k}; + } + push( @{$fields}, @{$pwdconstraint_fields} ); + + my $form = CGI::FormBuilder->new( + name => 'ldapns_modpolicy_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => "Modify policy", + fields => $fields, + template => $templatedir . '/modpolicy.tmpl', + method => 'post', + javascript => 1, + sticky => 1, + jsfunc => $jsfunc, + required => [qw(IM policy)], + validate => $validate, + ); + + $form->field( name => '_submitted_value', + type => 'hidden', ); + + if ( $form->submitted eq 'Back' ) { + delete( $modpolicy->{'policy'} ); + $session->param( 'modpolicy', $modpolicy ); + redirect( '?tab=ppolicies&action=modpolicy' ); } - else { - $form->field( - name => $k, - comment => ${$SNET::LdapNS::pwdPolicyAttributes->{$k}}[1], - ); - if ($form->submitted ne 'Modify') { - $form->field(name => $k, value => $val); - } + + if ( $form->submitted eq 'Cancel' ) { + $session->param( 'error', 'modify operation cancelled' ); + $session->clear( ['modpolicy'] ); + display_blank( "LdapNS modify policies" ); } - $form->field(name => $k, disabled => ($form->submitted eq 'Modify')); - } - if ($form->submitted eq 'Modify') { + $form->field( + name => 'IM', + value => $IM, + disabled => 1, + ); + $form->field( + name => 'policy', + value => $policy, + disabled => 1, + ); + + $form->field( name => 'description', + comment => 'optional', ); + $form->field( name => 'description', value => $infos->{'description'} ) + if defined( $infos->{'description'} ); + + foreach my $k ( @{$fields} ) { - foreach my $k (@{$fields}) { + next unless ( defined( $SNET::LdapNS::pwdPolicyAttributes->{$k} ) ); + my $type = ${ $SNET::LdapNS::pwdPolicyAttributes->{$k} }[0]; - next if ($k eq '_submitted_value'); - next if ($k eq 'IM'); - next if ($k eq 'policy'); + my $val = ( defined( $infos->{$k} ) ? ${ $infos->{$k} }[0] : 0 ); + $form->tmpl_param( 'if_' . $k, 1 ); - if ($k eq 'description') { - my $v = $form->field(name => $k) || undef; - if (defined($v)) { - $add->{$k} = $v; + if ( $type eq 'bool' ) { + $form->field( + name => $k, + comment => ${ $SNET::LdapNS::pwdPolicyAttributes->{$k} }[1], + type => 'checkbox', + options => 'true', + ); + if ( $form->submitted ne 'Modify' ) { + $form->field( name => $k, value => 'true' ) if ( "$val" =~ m/true/i ); + } + } elsif ( $type eq 'extbool' ) { + $form->field( + name => $k, + comment => ${ $SNET::LdapNS::pwdPolicyAttributes->{$k} }[1], + type => 'checkbox', + options => 'strict', + ); + if ( $form->submitted ne 'Modify' ) { + $form->field( name => $k, value => 'strict' ) if ( $val > 0 ); + } + } elsif ( $type eq 'nbool' ) { + $form->field( + name => $k, + comment => ${ $SNET::LdapNS::pwdPolicyAttributes->{$k} }[1], + type => 'checkbox', + options => 'counted', + ); + if ( $form->submitted ne 'Modify' ) { + $form->field( name => $k, value => 'counted' ) if ( $val > 0 ); + } + } else { + $form->field( name => $k, + comment => ${ $SNET::LdapNS::pwdPolicyAttributes->{$k} }[1], ); + if ( $form->submitted ne 'Modify' ) { + $form->field( name => $k, value => $val ); + } } - else { - $del->{$k}++; + $form->field( name => $k, disabled => ( $form->submitted eq 'Modify' ) ); + } + + if ( $form->submitted eq 'Modify' ) { + + foreach my $k ( @{$fields} ) { + + next if ( $k eq '_submitted_value' ); + next if ( $k eq 'IM' ); + next if ( $k eq 'policy' ); + + if ( $k eq 'description' ) { + my $v = $form->field( name => $k ) || undef; + if ( defined( $v ) ) { + $add->{$k} = $v; + } else { + $del->{$k}++; + } + next; + } elsif ( $k =~ m/pwdCheckQuality/i ) { + my $checkquality = $form->field( name => $k ) || undef; + if ( defined( $checkquality ) ) { + $add->{'pwdConstraintCheckQuality'} = 2; + } else { + $del->{'pwdConstraintCheckQuality'}++; + } + } + + next unless ( defined( $SNET::LdapNS::pwdPolicyAttributes->{$k} ) ); + + my $v = $form->field( name => $k ) || undef; + if ( !defined( $v ) ) { + $del->{$k}++; + $form->tmpl_param( 'if_' . $k, 0 ); + next; + } + + $form->tmpl_param( 'if_' . $k, 1 ); + my $type = ${ $SNET::LdapNS::pwdPolicyAttributes->{$k} }[0]; + + if ( $type eq 'bool' ) { + $add->{$k} = ( ( $v =~ m/true/i ) ? 'TRUE' : 'FALSE' ); + } elsif ( $type eq 'extbool' ) { + $add->{$k} = 2; + } elsif ( $type eq 'nbool' ) { + $add->{$k} = 1; + } else { + $add->{$k} = $v; + } + } - next; - } - elsif ($k =~ m/pwdCheckQuality/i) { - my $checkquality = $form->field(name => $k) || undef; - if (defined($checkquality)) { - $add->{'pwdConstraintCheckQuality'} = 2; + + $modpolicy->{'add'} = $add; + $modpolicy->{'del'} = $del; + + $form->tmpl_param( 'submit1' => 'Cancel' ); + $form->tmpl_param( 'submit2' => 'Confirm' ); + + } elsif ( $form->submitted eq 'Confirm' ) { + + my $entry; + + eval { + + reconnect_ldap_snmc; + + SNET::LdapNS::updatePwdPolicy( $ldap_snmc->{'label'}, $IM, $policy, $modpolicy->{'add'}, $modpolicy->{'del'}, ) or die SNET::LdapNS::error( $ldap_snmc->{'label'} ); + + $session->param( 'message', 'policy modification successful' ); + $session->clear( [qw(modpolicy pwdPolicies)] ); + + $entry = SNET::LdapNS::getPwdPolicy( $ldap_snmc->{'label'}, $policy, ); + + }; + if ( $@ ) { + $session->param( 'error', $@ ); } - else { - $del->{'pwdConstraintCheckQuality'}++; + reset_actions; + if ( defined( $entry ) ) { + print_ns_headers( "LdapNS modify policies" ); + render_ppolicyinfos( $entry, 1 ); + print_ns_footers; + } else { + display_blank( "LdapNS modify policies" ); } - } - next unless (defined($SNET::LdapNS::pwdPolicyAttributes->{$k})); + } else { + $form->tmpl_param( 'submit1' => 'Back' ); + $form->tmpl_param( 'submit2' => 'Modify' ); + } - my $v = $form->field(name => $k) || undef; - if (!defined($v)) { - $del->{$k}++; - $form->tmpl_param('if_'.$k, 0); - next; - } + print_ns_headers( "LdapNS modify policies" ); + print $form->render(); + print_ns_footers; - $form->tmpl_param('if_'.$k, 1); - my $type = ${$SNET::LdapNS::pwdPolicyAttributes->{$k}}[0]; +} - if ($type eq 'bool') { - $add->{$k} = (($v =~ m/true/i) ? 'TRUE' : 'FALSE'); - } - elsif ($type eq 'extbool') { - $add->{$k} = 2; - } - elsif ($type eq 'nbool') { - $add->{$k} = 1; - } - else { - $add->{$k} = $v; - } +sub display_policyinfos +{ - } + $POLICYINFOS = 1; - $modpolicy->{'add'} = $add; - $modpolicy->{'del'} = $del; + refresh_ppolicy; - $form->tmpl_param('submit1' => 'Cancel'); - $form->tmpl_param('submit2' => 'Confirm'); + my $policyInfos; + my $options = {}; - } - elsif ($form->submitted eq 'Confirm') { + my $validate = { policy => 'PPOLICYDN', }; - my $entry; + my $form = CGI::FormBuilder->new( + name => 'ldapns_policyinfos_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Display ppolicy', + fields => [qw(policy audit)], + template => $templatedir . '/selectppolicy.tmpl', + method => 'post', + javascript => 1, + validate => $validate, + required => 'policy', + submit => 'Display', + ); - eval { + my $pwdPolicies = $session->param( 'pwdPolicies' ); + while ( my ( $dn, $values ) = each( %{$pwdPolicies} ) ) { + my $did = ${ $values->{'documentidentifier'} }[0]; + if ( defined( $values->{'description'} ) + && scalar( @{ $values->{'description'} } ) ) { + $options->{$dn} = $did . ' - ' . ${ $values->{'description'} }[0]; + } else { + $options->{$dn} = $did; + } + } - reconnect_ldap_snmc; + if ( $form->submitted eq 'Display' ) { + eval { + die 'invalid parameters' unless $form->validate; + my @dids = $form->field( name => 'policy' ); + die 'You must select at least one policy' unless ( scalar( @dids ) > 0 ); - SNET::LdapNS::updatePwdPolicy( - $ldap_snmc->{'label'}, - $IM, - $policy, - $modpolicy->{'add'}, - $modpolicy->{'del'}, - ) or die SNET::LdapNS::error($ldap_snmc->{'label'}); + map { die "invalid policy `$_'" unless defined( $options->{$_} ) } @dids; - $session->param('message', 'policy modification successful'); - $session->clear([qw(modpolicy pwdPolicies)]); + reconnect_ldap_snmc; - $entry = SNET::LdapNS::getPwdPolicy( - $ldap_snmc->{'label'}, - $policy, - ); + foreach my $did ( @dids ) { + my $infos = SNET::LdapNS::getPwdPolicy( $ldap_snmc->{'label'}, $did ); + while ( my ( $k, $v ) = each( %{$infos} ) ) { + $policyInfos->{$k} = $v; + } + } - }; - if ($@) { - $session->param('error', $@); - } - reset_actions; - if (defined($entry)) { - print_ns_headers("LdapNS modify policies"); - render_ppolicyinfos($entry, 1); - print_ns_footers; - } - else { - display_blank("LdapNS modify policies"); + }; + if ( $@ ) { + $session->param( 'error', $@ ); + undef $policyInfos; + } } - } - else { - $form->tmpl_param('submit1' => 'Back'); - $form->tmpl_param('submit2' => 'Modify'); - } + $form->field( + name => 'audit', + type => 'checkbox', + comment => 'Display auditInformation?', + options => 'yes', + selected => 0, + ); + + $form->field( + name => 'policy', + options => $options, + sortopts => 'NAME', + type => 'select', + size => getsize_multipleselect( $options ), + multiple => 1, + ); - print_ns_headers("LdapNS modify policies"); - print $form->render(); - print_ns_footers; + my $audit = ( defined( $form->field( name => 'audit' ) ) ); + + print_ns_headers( "LdapNS display password policies" ); + print $form->render; + render_ppolicyinfos( $policyInfos, $audit ) if defined( $policyInfos ); + print_ns_footers; } -sub display_policyinfos { - - $POLICYINFOS = 1; - - refresh_ppolicy; - - my $policyInfos; - my $options = {}; - - my $validate = { - policy => 'PPOLICYDN', - }; - - my $form = CGI::FormBuilder->new( - name => 'ldapns_policyinfos_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Display ppolicy', - fields => [qw(policy audit)], - template => $templatedir.'/selectppolicy.tmpl', - method => 'post', - javascript => 1, - validate => $validate, - required => 'policy', - submit => 'Display', - ); - - my $pwdPolicies = $session->param('pwdPolicies'); - while (my ($dn, $values) = each (%{$pwdPolicies})) { - my $did = ${$values->{'documentidentifier'}}[0]; - if ( - defined($values->{'description'}) - && - scalar(@{$values->{'description'}}) - ) { - $options->{$dn} = $did.' - '.${$values->{'description'}}[0]; - } - else { - $options->{$dn} = $did; - } - } - - if ($form->submitted eq 'Display') { - eval { - die 'invalid parameters' unless $form->validate; - my @dids = $form->field(name => 'policy'); - die 'You must select at least one policy' unless (scalar(@dids) > 0); +sub display_policies +{ - map { die "invalid policy `$_'" unless defined($options->{$_}) } @dids; + print STDERR "ldap_NS.pl: entering display_policies\n" if ( $debug > 2 ); - reconnect_ldap_snmc; + if ( defined( $params->{'action'} ) ) { + if ( $params->{'action'} eq 'modpolicy' ) { + $session->param( 'action', 'modpolicy' ); + } elsif ( $params->{'action'} eq 'delpolicy' ) { + $session->param( 'action', 'delpolicy' ); + } elsif ( $params->{'action'} eq 'addpolicy' ) { + $session->param( 'action', 'addpolicy' ); + } elsif ( $params->{'action'} eq 'policyinfos' ) { + $session->param( 'action', 'policyinfos' ); + } + } - foreach my $did (@dids) { - my $infos = SNET::LdapNS::getPwdPolicy( - $ldap_snmc->{'label'}, - $did - ); - while (my ($k, $v) = each (%{$infos})) { - $policyInfos->{$k} = $v; + if ( defined( $session->param( 'action' ) ) ) { + if ( $session->param( 'action' ) eq 'addpolicy' ) { + display_addpolicy; + } elsif ( $session->param( 'action' ) eq 'delpolicy' ) { + display_delpolicy; + } elsif ( $session->param( 'action' ) eq 'modpolicy' ) { + display_modpolicy; + } elsif ( $session->param( 'action' ) eq 'policyinfos' ) { + display_policyinfos; + } else { + $session->clear( ['action'] ); } - } + } - }; - if ($@) { - $session->param('error', $@); - undef $policyInfos; - } - } - - $form->field( - name => 'audit', - type => 'checkbox', - comment => 'Display auditInformation?', - options => 'yes', - selected => 0, - ); - - $form->field( - name => 'policy', - options => $options, - sortopts => 'NAME', - type => 'select', - size => getsize_multipleselect($options), - multiple => 1, - ); - - my $audit = ( - defined($form->field(name => 'audit')) - ); - - print_ns_headers("LdapNS display password policies"); - print $form->render; - render_ppolicyinfos($policyInfos, $audit) if defined($policyInfos); - print_ns_footers; + display_blank( "LdapNS passwords policies management" ); } -sub display_policies { - - print STDERR "ldap_NS.pl: entering display_policies\n" if ($debug >2); +sub display_homepage +{ - if (defined($params->{'action'})) { - if ($params->{'action'} eq 'modpolicy') { - $session->param('action','modpolicy'); - } - elsif ($params->{'action'} eq 'delpolicy') { - $session->param('action','delpolicy'); - } - elsif ($params->{'action'} eq 'addpolicy') { - $session->param('action','addpolicy'); - } - elsif ($params->{'action'} eq 'policyinfos') { - $session->param('action','policyinfos'); - } - } - - if (defined($session->param('action'))) { - if ($session->param('action') eq 'addpolicy') { - display_addpolicy; - } - elsif ($session->param('action') eq 'delpolicy') { - display_delpolicy; - } - elsif ($session->param('action') eq 'modpolicy') { - display_modpolicy; - } - elsif ($session->param('action') eq 'policyinfos') { - display_policyinfos; + print STDERR "ldap_NS.pl: entering display_homepage\n" if ( $debug > 2 ); + + if ( defined( $params->{'action'} ) ) { + if ( $params->{'action'} eq 'passwd' ) { + $session->param( 'action', 'passwd' ); + } elsif ( $params->{'action'} eq 'info' ) { + $session->param( 'action', 'info' ); + } } - else { - $session->clear(['action']); + + if ( defined( $session->param( 'action' ) ) ) { + if ( $session->param( 'action' ) eq 'passwd' ) { + display_passwd; + } elsif ( $session->param( 'action' ) eq 'info' ) { + $INFO = 1; + print_ns_headers( "LdapNS homepage" ); + render_userinfos( $session->param( 'userInfos' ) ); + print_ns_footers; + } else { + $session->clear( ['action'] ); + } } - } - display_blank("LdapNS passwords policies management"); + display_blank( "LdapNS homepage" ); } -sub display_homepage { - - print STDERR "ldap_NS.pl: entering display_homepage\n" if ($debug >2); +sub dispatch +{ - if (defined($params->{'action'})) { - if ($params->{'action'} eq 'passwd') { - $session->param('action','passwd'); - } - elsif ($params->{'action'} eq 'info') { - $session->param('action','info'); - } - } + print STDERR "ldap_NS.pl: entering dispatch\n" if ( $debug > 2 ); - if (defined($session->param('action'))) { - if ($session->param('action') eq 'passwd') { - display_passwd; - } - elsif ($session->param('action') eq 'info') { - $INFO=1; - print_ns_headers("LdapNS homepage"); - render_userinfos($session->param('userInfos')); - print_ns_footers; + $session->expire( '+1h' ); + $LOGIN = 0; + + $isAdmin = $session->param( 'isAdmin' ); + $debug = 2 if ( ( $isAdmin ) && ( $debug < 2 ) ); + + if ( defined( $params->{'tab'} ) ) { + $session->param( 'tab', $params->{'tab'} ); } - else { - $session->clear(['action']); + + if ( defined( $session->param( 'tab' ) ) ) { + + if ( $session->param( 'tab' ) eq 'users' ) { + $TAB_USERS = 1; + display_users; + } elsif ( $session->param( 'tab' ) eq 'groups' ) { + $TAB_GROUPS = 1; + display_groups; + } elsif ( $session->param( 'tab' ) eq 'ppolicies' ) { + $TAB_POLICY = 1; + display_policies; + } elsif ( $session->param( 'tab' ) eq 'home' ) { + $TAB_HOME = 1; + display_homepage; + } + } - } - display_blank("LdapNS homepage"); + display_blank( "LdapNS homage" ); } -sub dispatch { +sub display_login +{ + + $LOGIN = 1; + + my $form = CGI::FormBuilder->new( + name => 'ldapns_login_form', + header => 0, + stylesheet => 1, + styleclass => 'ldapns_fb', + text => 'Sign in', + fields => [qw(uid password action)], + template => $templatedir . '/login.tmpl', + method => 'post', + required => 'ALL', + sticky => 1, + submit => 'Sign-up', + ); + $form->field( + name => 'password', + type => 'password', + label => 'password', + ); + $form->field( + name => 'uid', + label => 'login', + comment => 'uid of full dn', + ); + $form->field( + name => 'action', + type => 'hidden', + value => 'login' + ); + + if ( defined( $session ) ) { + if ( defined( $session->param( 'user' ) ) ) { + $form->field( name => 'uid', + value => $session->param( 'user' ), ); + } + } + + if ( $form->submitted ) { - print STDERR "ldap_NS.pl: entering dispatch\n" if ($debug >2); + eval { - $session->expire('+1h'); - $LOGIN = 0; + die "missing required field `login'" unless ( defined( $form->field( name => 'uid' ) ) && ( length( $form->field( name => 'uid' ) ) > 0 ) ); + $ldap_snmc->{'user'} = $form->field( name => 'uid' ); - $isAdmin = $session->param('isAdmin'); - $debug = 2 if (($isAdmin) && ($debug < 2)); + die "missing required field `password'" unless ( defined( $form->field( name => 'password' ) ) && ( length( $form->field( name => 'password' ) ) > 0 ) ); + $ldap_snmc->{'password'} = $form->field( name => 'password' ); - if (defined($params->{'tab'})) { - $session->param('tab', $params->{'tab'}); - } + die 'invalid or missing parameters' unless $form->validate(); - if (defined($session->param('tab'))) { + connect_ldap_snmc( $ldap_snmc->{'user'}, $ldap_snmc->{'password'}, 0 ); - if ($session->param('tab') eq 'users') { - $TAB_USERS = 1; - display_users; - } - elsif ($session->param('tab') eq 'groups') { - $TAB_GROUPS = 1; - display_groups; - } - elsif ($session->param('tab') eq 'ppolicies') { - $TAB_POLICY = 1; - display_policies; - } - elsif ($session->param('tab') eq 'home') { - $TAB_HOME = 1; - display_homepage; + }; + if ( $@ ) { + $error = $@; + } else { + dispatch(); + } } - } + $key = CGI::Session::ID::md5::generate_id(); - display_blank("LdapNS homage"); + print_ns_headers( "LdapNS authentication" ); + parse_messages; + $form->tmpl_param( 'error' => defined( $error ) ); + $form->tmpl_param( 'error_msg' => $error ); + print $form->render( sticky => ( $form->submitted ? 1 : 0 ) ); + print_ns_footers; } -sub display_login { - - $LOGIN = 1; - - my $form = CGI::FormBuilder->new( - name => 'ldapns_login_form', - header => 0, - stylesheet => 1, - styleclass => 'ldapns_fb', - text => 'Sign in', - fields => [qw(uid password action)], - template => $templatedir.'/login.tmpl', - method => 'post', - required => 'ALL', - sticky => 1, - submit => 'Sign-up', - ); - $form->field( - name => 'password', - type => 'password', - label => 'password', - ); - $form->field( - name => 'uid', - label => 'login', - comment => 'uid of full dn', - ); - $form->field( - name => 'action', - type => 'hidden', - value => 'login' - ); - - if (defined($session)) { - if (defined($session->param('user'))) { - $form->field( - name => 'uid', - value => $session->param('user'), - ); - } - } - - if ($form->submitted) { +sub check_remote_infos +{ eval { - die "missing required field `login'" unless ( - defined($form->field(name => 'uid')) && (length($form->field(name => 'uid')) > 0) - ); - $ldap_snmc->{'user'} = $form->field(name => 'uid'); + die 'Unauthorized access from unknown source' unless ( defined( $ENV{'REMOTE_ADDR'} ) && defined( $ENV{"HTTP_AUTHUSER"} ) ); + + my $remote_addr = $ENV{'REMOTE_ADDR'}; + $audit_user = $ENV{"HTTP_AUTHUSER"}; - die "missing required field `password'" unless ( - defined($form->field(name => 'password')) && (length($form->field(name => 'password')) > 0) - ); - $ldap_snmc->{'password'} = $form->field(name => 'password'); + my $auth_ok = 0; - die 'invalid or missing parameters' unless $form->validate(); + foreach my $auth_ip ( @{$authorized_ip} ) { + $auth_ok = 1, last if ( $auth_ip eq $remote_addr ); + } - connect_ldap_snmc($ldap_snmc->{'user'}, $ldap_snmc->{'password'}, 0); + die "Unauthorized access from `$remote_addr'" unless $auth_ok; - }; - if ($@) { - $error = $@; - } - else { - dispatch(); - } - } + my $client_ip = $ENV{'HTTP_CLIENT_IP'}; + $ENV{'REMOTE_ADDR'} = $client_ip, return if ( defined( $client_ip ) ); - $key = CGI::Session::ID::md5::generate_id(); + my $x_forwarded_for = $ENV{'HTTP_X_FORWARDED_FOR'}; + $ENV{'REMOTE_ADDR'} = $x_forwarded_for, return if ( defined( $x_forwarded_for ) ); - print_ns_headers("LdapNS authentication"); - parse_messages; - $form->tmpl_param('error' => defined($error)); - $form->tmpl_param('error_msg' => $error); - print $form->render(sticky => ($form->submitted ? 1 : 0)); - print_ns_footers; + }; + if ( $@ ) { + $error = $@; + display_login; + } } -sub check_remote_infos { - - eval { +eval { - die 'Unauthorized access from unknown source' unless ( - defined($ENV{'REMOTE_ADDR'}) && defined($ENV{"HTTP_AUTHUSER"}) - ); + $cgi = CGI->new; + $params = $cgi->Vars; - my $remote_addr = $ENV{'REMOTE_ADDR'}; - $audit_user = $ENV{"HTTP_AUTHUSER"}; + if ( $debug > 2 ) { - my $auth_ok = 0; + foreach my $hash ( \%ENV, $params ) { + while ( my ( $k, $v ) = each( %{$hash} ) ) { + $v =~ s/./*/g if ( $k =~ m/password|old|new|repeat/ ); + print STDERR 'ldap_NS.pl: ' . $k . ', ' . $v . "\n"; + } + } - foreach my $auth_ip (@{$authorized_ip}) { - $auth_ok = 1, last if ($auth_ip eq $remote_addr); } - die "Unauthorized access from `$remote_addr'" unless $auth_ok; - - my $client_ip = $ENV{'HTTP_CLIENT_IP'}; - $ENV{'REMOTE_ADDR'} = $client_ip, return if (defined($client_ip)); + check_remote_infos; - my $x_forwarded_for = $ENV{'HTTP_X_FORWARDED_FOR'}; - $ENV{'REMOTE_ADDR'} = $x_forwarded_for, return if (defined($x_forwarded_for)); + my $hash = {}; + if ( defined( $cgi->cookie( "SESSION_ID" ) ) ) { + $hash->{'sid'} = $cgi->cookie( "SESSION_ID" ); + } + if ( defined( $cgi->cookie( "SESSION_KEY" ) ) ) { + $hash->{'key'} = $cgi->cookie( "SESSION_KEY" ); + } + my $handler = CGI::Untaint->new( $hash ); - }; - if ($@) { - $error = $@; - display_login; - } + # no key = no session at all + $key = $handler->extract( -as_printable => 'key' ); + display_login unless defined( $key ); -} + # sid is created after successful connection to ldap + $sid = $handler->extract( -as_printable => 'sid' ); + display_login unless defined( $sid ); -eval { + # we must load the session before checking logout + # for cleaning purpose + $session = CGI::Session->load( 'driver:File', $sid, { 'Directory' => $sessiondir } ) or die CGI::Session->errstr; - $cgi = CGI->new; - $params = $cgi->Vars; + if ( defined( $params->{'logout'} ) ) { + $error = 'You have been logged out' unless ( $session->is_empty ); + $session->delete(); + undef $session; + display_login; + } - if ($debug > 2) { + if ( $session->is_expired ) { + $session->delete(); + undef $session; + $error = 'Your session is no longer valid'; + display_login; + } - foreach my $hash (\%ENV, $params) { - while (my ($k, $v) = each (%{$hash})) { - $v =~ s/./*/g if ($k =~ m/password|old|new|repeat/); - print STDERR 'ldap_NS.pl: '.$k.', '.$v."\n"; - } + # session is empty in 2 cases: + # - cookies sent by ua are plain wrong + # - user is relogin after logout, thus is sending + # expired cookies + if ( $session->is_empty ) { + $error = 'Invalid empty session'; + $session->delete(); + undef $session; + display_login; } - - } - - check_remote_infos; - - my $hash = {}; - if (defined($cgi->cookie("SESSION_ID"))) { - $hash->{'sid'} = $cgi->cookie("SESSION_ID"); - } - if (defined($cgi->cookie("SESSION_KEY"))) { - $hash->{'key'} = $cgi->cookie("SESSION_KEY"); - } - my $handler = CGI::Untaint->new($hash); - - # no key = no session at all - $key = $handler->extract(-as_printable => 'key'); - display_login unless defined($key); - - # sid is created after successful connection to ldap - $sid = $handler->extract(-as_printable => 'sid'); - display_login unless defined($sid); - - # we must load the session before checking logout - # for cleaning purpose - $session = CGI::Session->load( - 'driver:File', - $sid, - {'Directory' => $sessiondir} - ) or die CGI::Session->errstr; - - if (defined($params->{'logout'})) { - $error = 'You have been logged out' unless ($session->is_empty); - $session->delete(); - undef $session; - display_login; - } - if ($session->is_expired) { - $session->delete(); - undef $session; - $error = 'Your session is no longer valid'; - display_login; - } - - # session is empty in 2 cases: - # - cookies sent by ua are plain wrong - # - user is relogin after logout, thus is sending - # expired cookies - if ($session->is_empty) { - $error = 'Invalid empty session'; - $session->delete(); - undef $session; - display_login; - } - - # from here we should have a valid session object - $userMustChange = $session->param('userMustChange'); - - if (defined($session->param('userInfos'))) { - $session->expires('userInfos', '+15m'); - } - elsif ($userMustChange) { - display_passwd; - } - else { - $session->param('error', 'Your session has expired') if ( - defined($session->param('isAdmin')) - ); - display_login; - } + # from here we should have a valid session object + $userMustChange = $session->param( 'userMustChange' ); + + if ( defined( $session->param( 'userInfos' ) ) ) { + $session->expires( 'userInfos', '+15m' ); + } elsif ( $userMustChange ) { + display_passwd; + } else { + $session->param( 'error', 'Your session has expired' ) if ( defined( $session->param( 'isAdmin' ) ) ); + display_login; + } - dispatch(); + dispatch(); }; -if ($@) { - print STDERR 'ldap_NS.pl: '.$@."\n"; +if ( $@ ) { + print STDERR 'ldap_NS.pl: ' . $@ . "\n"; } exit 0; END { - if (defined($session)) { - $session->flush(); - } - CGI::Session->find( - 'driver:File', - sub { - my ($session) = @_; - my $id = $session->id(); - if ($session->is_expired) { - print STDERR "cleaning expired session `$id'\n" if (defined($id)); - $session->delete(); - } - }, - {'Directory' => $sessiondir} - ); + if ( defined( $session ) ) { + $session->flush(); + } + CGI::Session->find( + 'driver:File', + sub { + my ( $session ) = @_; + my $id = $session->id(); + if ( $session->is_expired ) { + print STDERR "cleaning expired session `$id'\n" if ( defined( $id ) ); + $session->delete(); + } + }, + { 'Directory' => $sessiondir } + ); }