Merge branch 'v2.0' into globalLogout

This commit is contained in:
Christophe Maudoux 2019-11-20 21:09:38 +01:00
commit 7324172023
40 changed files with 519 additions and 170 deletions

View File

@ -129,8 +129,8 @@ E2E_TESTS='portal/*.js'
# LDAP backend test
LLNGTESTLDAP_SLAPD_BIN=/usr/sbin/slapd
LLNGTESTLDAP_SLAPADD_BIN=/usr/sbin/slapdadd
LLNGTESTLDAP_SCHEMA_DIR=/etc/slapd/schema
LLNGTESTLDAP_SLAPADD_BIN=/usr/sbin/slapadd
LLNGTESTLDAP_SCHEMA_DIR=/etc/ldap/schema
# Other
SRCCOMMONDIR=lemonldap-ng-common
@ -623,6 +623,7 @@ install_bin: install_conf_dir
${SRCPORTALDIR}/site/cron/purgeCentralCache \
${SRCPORTALDIR}/scripts/llngDeleteSession \
${SRCCOMMONDIR}/scripts/convertConfig \
${SRCCOMMONDIR}/scripts/convertSessions \
${SRCCOMMONDIR}/scripts/lmMigrateConfFiles2ini \
${SRCCOMMONDIR}/scripts/rotateOidcKeys \
${SRCMANAGERDIR}/scripts/lmConfigEditor \

View File

@ -1,12 +1,14 @@
/etc/lemonldap-ng/lemonldap-ng.ini
/etc/lemonldap-ng/for_etc_hosts
/usr/share/man/man1/convertConfig.1p
/usr/share/man/man1/convertSessions.1p
/usr/share/man/man1/lemonldap-ng-cli.1p
/usr/share/man/man3/Lemonldap::NG::Common*
/usr/share/perl5/auto/Lemonldap/NG/Common
/usr/share/perl5/Lemonldap/NG/Common*
/usr/share/lemonldap-ng/ressources
/usr/share/lemonldap-ng/bin/convertConfig
/usr/share/lemonldap-ng/bin/convertSessions
/usr/share/lemonldap-ng/bin/importMetadata
/usr/share/lemonldap-ng/bin/lmMigrateConfFiles2ini
/usr/share/lemonldap-ng/bin/rotateOidcKeys

View File

@ -70,6 +70,7 @@ META.json
META.yml
README
scripts/convertConfig
scripts/convertSessions
scripts/importMetadata
scripts/lemonldap-ng-cli
scripts/lmMigrateConfFiles2ini

View File

@ -90,6 +90,7 @@ WriteMakefile(
},
MAN1PODS => {
'scripts/convertConfig' => 'blib/man1/convertConfig.1p',
'scripts/convertSessions' => 'blib/man1/convertSessions.1p',
'scripts/lemonldap-ng-cli' => 'blib/man1/lemonldap-ng-cli.1p',
},
);

View File

@ -219,18 +219,24 @@ sub _dbiGKFAS {
$sth->execute;
my %res;
while ( my @row = $sth->fetchrow_array ) {
if ( ref($data) eq 'CODE' ) {
my $tmp =
&$data( $args->{unserialize}->( $row[1], $next ), $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp = $args->{unserialize}->( $row[1], $next );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $args->{unserialize}->( $row[1], $next );
eval {
if ( ref($data) eq 'CODE' ) {
my $tmp =
&$data( $args->{unserialize}->( $row[1], $next ), $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp = $args->{unserialize}->( $row[1], $next );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $args->{unserialize}->( $row[1], $next );
}
};
if ($@) {
print STDERR "Error in session $row[0]\n";
delete $res{ $row[0] };
}
}
return \%res;
@ -249,26 +255,32 @@ sub _FileGKFAS {
my %res;
for my $f (@t) {
open F, '<', "$args->{Directory}/$f";
my $row = join '', <F>;
if ( ref($data) eq 'CODE' ) {
eval { $res{$f} = &$data( $args->{unserialize}->($row), $f ); };
if ($@) {
$res{$f} = &$data( undef, $f );
eval {
my $row = join '', <F>;
if ( ref($data) eq 'CODE' ) {
eval { $res{$f} = &$data( $args->{unserialize}->($row), $f ); };
if ($@) {
$res{$f} = &$data( undef, $f );
}
}
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp;
eval { $tmp = $args->{unserialize}->($row); };
if ($@) {
$res{$f}->{$_} = undef foreach (@$data);
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp;
eval { $tmp = $args->{unserialize}->($row); };
if ($@) {
$res{$f}->{$_} = undef foreach (@$data);
}
else {
$res{$f}->{$_} = $tmp->{$_} foreach (@$data);
}
}
else {
$res{$f}->{$_} = $tmp->{$_} foreach (@$data);
eval { $res{$f} = $args->{unserialize}->($row); };
}
}
else {
eval { $res{$f} = $args->{unserialize}->($row); };
};
if ($@) {
print STDERR "Error in session $f\n";
delete $res{$f};
}
}
return \%res;
@ -318,17 +330,23 @@ sub _DBFileGKFAS {
my %res;
foreach my $k ( keys %{ $class->{dbm} } ) {
if ( ref($data) eq 'CODE' ) {
$res{$k} =
&$data( $args->{unserialize}->( $class->{dbm}->{$k} ), $k );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp = $args->{unserialize}->( $class->{dbm}->{$k} );
$res{$k}->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{$k} = $args->{unserialize}->( $class->{dbm}->{$k} );
eval {
if ( ref($data) eq 'CODE' ) {
$res{$k} =
&$data( $args->{unserialize}->( $class->{dbm}->{$k} ), $k );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp = $args->{unserialize}->( $class->{dbm}->{$k} );
$res{$k}->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{$k} = $args->{unserialize}->( $class->{dbm}->{$k} );
}
};
if ($@) {
print STDERR "Error in session $k\n";
delete $res{$k};
}
}
return \%res;

View File

@ -0,0 +1,250 @@
#!/usr/bin/perl
#=============================================================================
# LemonLDAP::NG session conversion tool
#
# This script lets an administrator migrate existing sessions from one backend
# to another. It is mostly useful when run on persistant sessions, but it can be
# useful in some other cases too, such as OIDC Offline sessions
#
# This is part of LemonLDAP::NG product, released under GPL
#=============================================================================
use Lemonldap::NG::Common::Apache::Session;
use Lemonldap::NG::Common::Session;
use Config::IniFiles;
use strict;
use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
our $VERSION = "2.0.6";
# Options
# -d: debug mode
# -c: configuration file
# -i: ignore errors
my $opts = {};
getopts( 'dic:', $opts );
my $debug = $opts->{d};
my $config_file = $opts->{c};
my $ignore_errors = $opts->{i};
my $nb_converted = 0;
my $nb_error = 0;
sub HELP_MESSAGE {
my $OUT = shift;
print $OUT <<END_MESSAGE;
$0 [-di] -c config_file.ini
-d Debug mode
-i Ignore errors
This script converts sessions in between the two backends specified in the configuration file
The configuration file must contain the following (adjust to your environment):
[sessions_from]
storageModule = Apache::Session::File
storageModuleOptions = { \\
'Directory' => '/var/lib/lemonldap-ng/sessions', \\
'LockDirectory' => '/var/lib/lemonldap-ng/sessions/lock', \\
}
# Only convert some session types
# sessionKind = Persistent, SSO
[sessions_to]
storageModule = Apache::Session::Browseable::Postgres
storageModuleOptions = { \\
'DataSource' => 'DBI:Pg:database=lemonldapdb;host=pg.example.com', \\
'UserName' => 'lemonldaplogin', \\
'Password' => 'lemonldappw', \\
'Commit' => 1, \\
'Index' => 'ipAddr _whatToTrace user', \\
'TableName' => 'sessions', \\
}
END_MESSAGE
}
unless ($config_file) {
HELP_MESSAGE( \*STDERR );
die "You must provide the -c option";
}
my $inicfg =
Config::IniFiles->new( -file => $config_file, -allowcontinue => 1 );
my $cfg = {};
die "Could not read configuration file" unless $inicfg;
for my $section (qw/sessions_from sessions_to/) {
die "Could not find section $section in configuration file $config_file"
unless $inicfg->SectionExists($section);
# Load section parameters
my $r;
foreach ( $inicfg->Parameters($section) ) {
$r->{$_} = $inicfg->val( $section, $_ );
# Remove spaces before and after value (#1488)
$r->{$_} =~ s/^\s*(.+?)\s*/$1/;
if ( $r->{$_} =~ /^[{\[].*[}\]]$/ || $r->{$_} =~ /^sub\s*{.*}$/ ) {
eval "\$r->{$_} = $r->{$_}";
if ($@) {
print $@;
return $r;
}
}
}
$cfg->{$section} = $r;
}
my $backendFrom;
my $backendTo;
my @sessionKindOnly;
if ( $cfg->{sessions_from}->{sessionKind} ) {
@sessionKindOnly = split /\W+/, $cfg->{sessions_from}->{sessionKind};
}
if ( $cfg->{sessions_from}->{storageModule} ) {
$backendFrom = $cfg->{sessions_from}->{storageModuleOptions};
$backendFrom->{backend} = $cfg->{sessions_from}->{storageModule};
}
else {
die
"[sessions_from] configuration section does not declare a storageModule";
}
if ( $cfg->{sessions_to}->{storageModule} ) {
$backendTo = $cfg->{sessions_to}->{storageModuleOptions};
$backendTo->{backend} = $cfg->{sessions_to}->{storageModule};
}
else {
die "[sessions_to] configuration section does not declare a storageModule";
}
Lemonldap::NG::Common::Apache::Session->get_key_from_all_sessions(
$backendFrom,
sub {
my $entry = shift;
my $id = shift;
print "Processing session $id\n" if $debug;
my $s = Lemonldap::NG::Common::Session->new( {
storageModule => $backendTo->{backend},
storageModuleOptions => $backendTo,
id => $id,
info => $entry,
force => 1,
}
);
# If filtering sessionKind
if (@sessionKindOnly) {
unless ( grep { $_ eq $entry->{_session_kind} } @sessionKindOnly ) {
return undef;
}
}
if ( $s->error ) {
die "Error encountered on session $id" unless $ignore_errors;
$nb_error += 1;
print "Error converting session $id : " . $s->error . "\n";
}
else {
print "Session $id successfully converted\n" if $debug;
$nb_converted += 1;
}
}
);
print "$nb_converted sessions have been converted\n";
print "$nb_error errors encountered during conversion\n" if $nb_error;
my $exit = $nb_error ? 1 : 0;
exit $exit;
__END__
=head1 NAME
=encoding utf8
convertSessions - A tool to convert Lemonldap::NG sessions between storage backends.
=head1 SYNOPSIS
convertSession [-di] -c parameters.ini
=head1 DESCRIPTION
convertConfig is a command line tool to migrate all sessions stored
in a source backend (sessions_from), into a new backend (sessions_to).
It requires a special configuration file in which you must list the source
and destination backend modules and parameters.
Sessions will not be deleted from the source backend. Existing sessions in the
destination backend will be kept, unless they have the same session ID as a
session in the source backend. In that case, the source will overwrite the
destination.
=head1 CONFIGURATION FILE FORMAT
The configuration file needs two sections to describe the source and destination backends
Here is an example
[sessions_from]
storageModule = Apache::Session::File
storageModuleOptions = { \
'Directory' => '/var/lib/lemonldap-ng/sessions', \
'LockDirectory' => '/var/lib/lemonldap-ng/sessions/lock', \
}
# Only migrate some session types
# sessionKind = Persistent, SSO
[sessions_to]
storageModule = Apache::Session::Browseable::Postgres
storageModuleOptions = { \
'DataSource' => 'DBI:Pg:database=lemonldapdb;host=pg.example.com', \
'UserName' => 'lemonldaplogin', \
'Password' => 'lemonldappw', \
'Commit' => 1, \
'Index' => 'ipAddr _whatToTrace user', \
'TableName' => 'sessions', \
}
The C<sessionKind> parameter may be used to filter only some session types.
Thanks to this, you can use this script to migrate from one database holding
all your sessions to separate tables from each session type.
=head1 SEE ALSO
L<http://lemonldap-ng.org/>
=head1 AUTHORS
=over
=item Maxime Besson, E<lt>maxime.besson@worteks.comE<gt>
=back
=head1 BUG REPORT
Use OW2 system to report bug or ask for features:
L<https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues>
=head1 DOWNLOAD
Lemonldap::NG is available at
L<http://forge.objectweb.org/project/showfiles.php?group_id=274>

View File

@ -1764,7 +1764,7 @@ qr/^(?:\*\.)?(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][
'managerDn' => {
'default' => '',
'msgFail' => '__badValue__',
'test' => qr/^(?:\w+=.*)?$/,
'test' => qr/^.*$/,
'type' => 'text'
},
'managerPassword' => {

View File

@ -2879,7 +2879,7 @@ sub attributes {
# LDAP
managerDn => {
type => 'text',
test => qr/^(?:\w+=.*)?$/,
test => qr/^.*$/,
msgFail => '__badValue__',
default => '',
documentation => 'LDAP manager DN',

View File

@ -15,10 +15,9 @@ use feature 'state';
extends 'Lemonldap::NG::Common::Conf::AccessLib';
our $VERSION = '2.0.6';
our $VERSION = '2.0.7';
has notifAccess => ( is => 'rw' );
has notifFormat => ( is => 'rw' );
#############################
@ -75,7 +74,6 @@ sub addRoutes {
{ done => { ':notificationId' => 'deleteDoneNotification' } },
['DELETE']
);
}
sub setNotifAccess {
@ -158,6 +156,7 @@ sub notifications {
my ( $notifs, $res );
$notifs = $self->notifAccess->$sub();
my $total = ( keys %$notifs );
# Restrict to wanted values
if (
@ -201,6 +200,7 @@ sub notifications {
result => 1,
count => $count,
values => $res,
total => $total
}
);
}
@ -221,7 +221,7 @@ sub notifications {
}
}
return $self->sendJSONresponse( $req,
{ result => 1, count => scalar(@r), values => \@r } );
{ result => 1, count => scalar(@r), values => \@r, total => $total } );
}
}
@ -289,6 +289,7 @@ sub newNotification {
$self->logger->debug("Notification Date = $json->{date}");
unless ( $json->{date} =~ /^\d{4}-\d{2}-\d{2}$/ ) {
$self->logger->error("Malformed date");
return $self->sendError( $req, "Malformed date", 200 );
}
@ -312,8 +313,8 @@ sub newNotification {
delete $json->{xml};
};
if ($@) {
$self->logger->error("Notification malformed $@");
return $self->sendError( $req, "Notification malformed: $@", 200 );
$self->logger->error("Malformed notification $@");
return $self->sendError( $req, "Malformed notification: $@", 200 );
}
$newNotif = to_json($json);
}

View File

@ -125,11 +125,12 @@ llapp.controller 'NotificationsExplorerCtrl', [ '$scope', '$translator', '$locat
$scope.waiting = false
$scope.init()
# Open node
$scope.stoggle = (scope) ->
node = scope.$modelValue
if node.nodes.length == 0
$scope.updateTree node.value, node.nodes, node.level, node.over, node.query, node.count
scope.toggle()
scope.toggle()
$scope.notifDate = (s) ->
if s?
@ -182,8 +183,8 @@ llapp.controller 'NotificationsExplorerCtrl', [ '$scope', '$translator', '$locat
n.level = level + 1
n.query = query
n.over = over
node.push n
$scope.total = data.total if value == ''
$scope.waiting = false
, (resp) ->
$scope.waiting = false

View File

@ -20,7 +20,7 @@
];
overScheme = function(v, level, over) {
console.log('overSchema => level', level, 'over', over);
console.log('overScheme => level', level, 'over', over);
if (level === 1 && v.length > over) {
return "uid=" + v + "*&groupBy=substr(uid," + (level + over + 1) + ")";
} else {
@ -143,8 +143,8 @@
node = scope.$modelValue;
if (node.nodes.length === 0) {
$scope.updateTree(node.value, node.nodes, node.level, node.over, node.query, node.count);
return scope.toggle();
}
return scope.toggle();
};
$scope.notifDate = function(s) {
var d;
@ -207,6 +207,9 @@
}
node.push(n);
}
if (value === '') {
$scope.total = data.total;
}
}
return $scope.waiting = false;
}, function(resp) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.12.7
// Generated by CoffeeScript 1.12.8
/*
* Sessions explorer

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -232,7 +232,7 @@
"dbiUserTable":"جدول المستخدم",
"decryptValue":"Decrypt value",
"decryptValueFunctions":"Decrypt functions",
"decryptValueRule":"Use rule",
"decryptValueRule":"استخدام القاعدة",
"default":"الاعْتيادي",
"defaultRule":"القاعدة الاعتيادية ",
"demoModeOn":"هذا المدير يعمل في طريقة العرض",
@ -417,7 +417,7 @@
"loadFromUrl":"تحميل من أل يو أر ل",
"localSessionStorage":"وحدة ذاكرة التخزين المؤقت",
"localSessionStorageOptions":"خيارات وحدة التخزين المؤقت",
"locationRules":"قاعدة الدخول",
"locationRules":"Access rules",
"loginHistory":"سجل تسجيل الدخول",
"loginHistoryEnabled":"تفعيل",
"logo":"شعار",
@ -494,6 +494,7 @@
"notAValidPerlExpression":"عبارة بيرل ليست صحيحة",
"notification":"تفعيل",
"notifications":"إشعار",
"notification_s":"notification(s)",
"notificationDefaultCond":"Default condition",
"notificationServer":"إشعارالخادم",
"notificationServerDELETE":"DELETE method",
@ -595,8 +596,8 @@
"oidcServicePublicKeySig":"توقيع على المفتاح العمومي",
"oidcServiceKeyIdSig":"توقيع على هوية المفتاح ",
"oidcServiceAuthorizationCodeExpiration":"Authorization Code expiration",
"oidcServiceAccessTokenExpiration":"ﺎﻨﺘﻫﺍﺀ ﺹﻼﺤﻳﺓ ﺎﻠﺗﻮﻜﻧ",
"oidcServiceIDTokenExpiration":" ﺎﻨﺘﻫﺍﺀ ﺹﻼﺤﻳﺓ ﺖﻋﺮﻴﻓ ﺎﻠﺗﻮﻜﻧ",
"oidcServiceAccessTokenExpiration":"انتهاء صلاحية التوكن",
"oidcServiceIDTokenExpiration":" انتهاء صلاحية تعريف التوكن",
"oidcServiceOfflineSessionExpiration":"Offline session expiration",
"oidcStorage":"اسم وحدة الجلسات",
"oidcStorageOptions":"خيارات وحدة الجلسات",
@ -767,7 +768,7 @@
"returnUrl":"إرجاع اليو آر إل",
"rp":"Relying Party",
"rule":"القاعدة",
"ruleAuthnLevel":"Required authentication level",
"ruleAuthnLevel":"مستوى إثبات الهوية واجب",
"rules":"القواعد",
"rulesAuthnLevel":"Required authentication levels",
"Same":"نفسه",
@ -1081,4 +1082,4 @@
"samlRelayStateTimeout":"تناوب حالة مهلة الجلسة ",
"samlUseQueryStringSpecific":"استخدام أسلوب query_string المعين",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

View File

@ -494,6 +494,7 @@
"notAValidPerlExpression":"Not a valid Perl expression",
"notification":"Activation",
"notifications":"Notifications",
"notification_s":"notification(s)",
"notificationDefaultCond":"Default condition",
"notificationServer":"Notification server",
"notificationServerDELETE":"DELETE method",
@ -1081,4 +1082,4 @@
"samlRelayStateTimeout":"RelayState session timeout",
"samlUseQueryStringSpecific":"Use specific query_string method",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

View File

@ -494,6 +494,7 @@
"notAValidPerlExpression":"Not a valid Perl expression",
"notification":"Activation",
"notifications":"Notifications",
"notification_s":"notification(s)",
"notificationDefaultCond":"Default condition",
"notificationServer":"Notification server",
"notificationServerDELETE":"DELETE method",

View File

@ -494,6 +494,7 @@
"notAValidPerlExpression":"Pas une expression Perl valide",
"notification":"Activation",
"notifications":"Notifications",
"notification_s":"notification(s)",
"notificationDefaultCond":"Condition par défaut",
"notificationServer":"Serveur de notifications",
"notificationServerDELETE":"Méthode DELETE",

View File

@ -232,7 +232,7 @@
"dbiUserTable":"Tabella utente",
"decryptValue":"Decrypt value",
"decryptValueFunctions":"Decrypt functions",
"decryptValueRule":"Use rule",
"decryptValueRule":"Utilizza la regola",
"default":"Predefinito",
"defaultRule":"Regola predefinita",
"demoModeOn":"Questo gestore viene eseguito in modalità demo",
@ -417,7 +417,7 @@
"loadFromUrl":"Carica a partire dall'URL",
"localSessionStorage":"Modulo cache",
"localSessionStorageOptions":"Opzioni modulo cache",
"locationRules":"Regola di accesso",
"locationRules":"Regole di accesso",
"loginHistory":"Cronologia dei login",
"loginHistoryEnabled":"Attivazione",
"logo":"Logo",
@ -494,6 +494,7 @@
"notAValidPerlExpression":"Non una valida espressione Perl",
"notification":"Attivazione",
"notifications":"Notifiche",
"notification_s":"notification(s)",
"notificationDefaultCond":"Default condition",
"notificationServer":"Server di notifica",
"notificationServerDELETE":"DELETE method",
@ -563,7 +564,7 @@
"oidcRPMetaDataNode":"Parti basate su OpenID Connect",
"oidcRPMetaDataOptions":"Opzioni",
"oidcRPMetaDataOptionsAccessTokenExpiration":"Scadenza accesso token",
"oidcRPMetaDataOptionsAuthorizationCodeExpiration":"Scadenza Authorization Code",
"oidcRPMetaDataOptionsAuthorizationCodeExpiration":"Authorization Code expiration",
"oidcRPMetaDataOptionsBypassConsent":"Consenso di bypass",
"oidcRPMetaDataOptionsClientID":"ID Client",
"oidcRPMetaDataOptionsClientSecret":"Segreto Client",
@ -573,7 +574,7 @@
"oidcRPMetaDataOptionsIDTokenExpiration":"Scadenza ID Token",
"oidcRPMetaDataOptionsIDTokenSignAlg":"Algoritmo di firma di identificazione di Token",
"oidcRPMetaDataOptionsIDTokenForceClaims":"Force claims to be returned in ID Token",
"oidcRPMetaDataOptionsOfflineSessionExpiration":"Scadenza Refresh Token",
"oidcRPMetaDataOptionsOfflineSessionExpiration":"Offline session expiration",
"oidcRPMetaDataOptionsRefreshToken":"Use refresh tokens",
"oidcRPMetaDataOptionsUserIDAttr":"Attributo utente",
"oidcRPName":"Nome di OpenID Connect RP",
@ -594,10 +595,10 @@
"oidcServicePrivateKeySig":"Firma della chiave privata",
"oidcServicePublicKeySig":"Firma della chiave pubblica",
"oidcServiceKeyIdSig":"ID del codice di accesso",
"oidcServiceAuthorizationCodeExpiration":"Scadenza Authorization Code",
"oidcServiceAuthorizationCodeExpiration":"Authorization Code expiration",
"oidcServiceAccessTokenExpiration":"Scadenza accesso token",
"oidcServiceIDTokenExpiration":"Scadenza ID Token",
"oidcServiceOfflineSessionExpiration":"Scadenza Refresh Token",
"oidcServiceOfflineSessionExpiration":"Offline session expiration",
"oidcStorage":"Nome del modulo Sessioni",
"oidcStorageOptions":"Opzioni del modulo Sessioni",
"oidcOPMetaDataNodes":"Provider di OpenID Connect",
@ -707,12 +708,12 @@
"proxyUseSoap":"Usa SOAP invece di REST",
"publicKey":"Chiave pubblica",
"purgeNotification":"Elimina definitivamente la notifica",
"radius2f":"Radius second factor",
"radius2f":"Radius secondo fattore",
"radius2fActivation":"Attivazione",
"radius2fServer":"Nome host del server",
"radius2fSecret":"Segreto condiviso",
"radius2fUsernameSessionKey":"Session key containing login",
"radius2fTimeout":"Authentication timeout",
"radius2fTimeout":"Timeout di autenticazione",
"radius2fAuthnLevel":"Livello di autenticazione",
"radius2fLogo":"Logo",
"radius2fLabel":"Label",
@ -767,7 +768,7 @@
"returnUrl":"URL di ritorno",
"rp":"Parte facente affidamento",
"rule":"Regola",
"ruleAuthnLevel":"Required authentication level",
"ruleAuthnLevel":"Livello di autenticazione richiesto",
"rules":"Regole",
"rulesAuthnLevel":"Required authentication levels",
"Same":"Stesso",
@ -1081,4 +1082,4 @@
"samlRelayStateTimeout":"Timeout di sessione di RelayState",
"samlUseQueryStringSpecific":"Utilizza il metodo specifico query_string",
"samlOverrideIDPEntityID":"Sostituisci l'ID entità quando agisce come IDP"
}
}

View File

@ -417,7 +417,7 @@
"loadFromUrl":"Nạp từ URL",
"localSessionStorage":"Mô-đun bộ nhớ cache",
"localSessionStorageOptions":"Tùy chọn mô-đun bộ nhớ cache",
"locationRules":"Quy tắc truy cập",
"locationRules":"Access rules",
"loginHistory":"Lịch sử đăng nhập",
"loginHistoryEnabled":"Kích hoạt",
"logo":"Logo",
@ -494,6 +494,7 @@
"notAValidPerlExpression":"Không phải là một biểu thức Perl hợp lệ",
"notification":"Kích hoạt",
"notifications":"Thông báo",
"notification_s":"notification(s)",
"notificationDefaultCond":"Default condition",
"notificationServer":"Máy chủ Thông báo",
"notificationServerDELETE":"DELETE method",
@ -562,8 +563,8 @@
"oidcRPMetaDataExportedVars":"Biến đã được xuất",
"oidcRPMetaDataNode":"OpenID Connect Relying Parties",
"oidcRPMetaDataOptions":"Tùy chọn",
"oidcRPMetaDataOptionsAccessTokenExpiration":"Hết hạn truy cập Token",
"oidcRPMetaDataOptionsAuthorizationCodeExpiration":"Authorization Code hết hạn",
"oidcRPMetaDataOptionsAccessTokenExpiration":"Access Token expiration",
"oidcRPMetaDataOptionsAuthorizationCodeExpiration":"Authorization Code expiration",
"oidcRPMetaDataOptionsBypassConsent":"Bỏ qua sự đồng ý",
"oidcRPMetaDataOptionsClientID":"Client ID",
"oidcRPMetaDataOptionsClientSecret":"Trình khách bí mật",
@ -573,7 +574,7 @@
"oidcRPMetaDataOptionsIDTokenExpiration":"ID Token hết hạn",
"oidcRPMetaDataOptionsIDTokenSignAlg":"Thuật toán chữ ký ID Token",
"oidcRPMetaDataOptionsIDTokenForceClaims":"Force claims to be returned in ID Token",
"oidcRPMetaDataOptionsOfflineSessionExpiration":"Refresh Token hết hạn",
"oidcRPMetaDataOptionsOfflineSessionExpiration":"Offline session expiration",
"oidcRPMetaDataOptionsRefreshToken":"Use refresh tokens",
"oidcRPMetaDataOptionsUserIDAttr":"thuộc tính người dùng",
"oidcRPName":"OpenID Connect RP Name",
@ -594,10 +595,10 @@
"oidcServicePrivateKeySig":"Ký khóa cá nhân",
"oidcServicePublicKeySig":"Ký khóa công khai",
"oidcServiceKeyIdSig":"Khóa ID chính",
"oidcServiceAuthorizationCodeExpiration":"Authorization Code hết hạn",
"oidcServiceAccessTokenExpiration":"Hết hạn truy cập Token",
"oidcServiceIDTokenExpiration":"ID Token hết hạn",
"oidcServiceOfflineSessionExpiration":"Refresh Token hết hạn",
"oidcServiceAuthorizationCodeExpiration":"Authorization Code expiration",
"oidcServiceAccessTokenExpiration":"Access Token expiration",
"oidcServiceIDTokenExpiration":"ID Token expiration",
"oidcServiceOfflineSessionExpiration":"Offline session expiration",
"oidcStorage":"Tên mô-đun phiên",
"oidcStorageOptions":"Tùy chọn mô-đun phiên",
"oidcOPMetaDataNodes":"Nhà cung cấp Kết nối OpenID",
@ -1081,4 +1082,4 @@
"samlRelayStateTimeout":"Thời gian hết hạn phiên RelayState ",
"samlUseQueryStringSpecific":"Sử dụng phương pháp query_string cụ thể",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

View File

@ -494,6 +494,7 @@
"notAValidPerlExpression":"Not a valid Perl expression",
"notification":"激活",
"notifications":"Notifications",
"notification_s":"notification(s)",
"notificationDefaultCond":"Default condition",
"notificationServer":"Notification server",
"notificationServerDELETE":"DELETE method",
@ -594,7 +595,7 @@
"oidcServicePrivateKeySig":"Signing private key",
"oidcServicePublicKeySig":"Signing public key",
"oidcServiceKeyIdSig":"Signing key ID",
"oidcServiceAuthorizationCodeExpiration":"Authorization code expiration",
"oidcServiceAuthorizationCodeExpiration":"Authorization Code expiration",
"oidcServiceAccessTokenExpiration":"Access Token expiration",
"oidcServiceIDTokenExpiration":"ID Token expiration",
"oidcServiceOfflineSessionExpiration":"Offline session expiration",
@ -1081,4 +1082,4 @@
"samlRelayStateTimeout":"RelayState session timeout",
"samlUseQueryStringSpecific":"Use specific query_string method",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

View File

@ -21,6 +21,7 @@
</ul>
</div>
</div>
<div ng-show="data.length!=0" class="text-center"><p class="badge">{{total}} <span trspan="notification_s"></span></p></div>
<div class="region region-sidebar-first">
<section id="block-superfish-1" class="block block-superfish clearfix">
<div ui-tree data-drag-enabled="false" id="tree-root">

View File

@ -152,6 +152,17 @@ sub authForce {
return 0;
}
#sub setSecurity {
# my $self = shift;
# my ($req) = @_;
# $self->getStack( $req, 'extractFormInfo' ) or return PE_ERROR;
# $req->userData->{_combinationTry} ||= 0;
# eval {
# $req->data->{combinationStack}->[ $req->userData->{_combinationTry} ]
# ->[0]->( 'setSecurity', @_ );
# };
#}
## UserDB steps
###############
# Note that UserDB::Combination uses the same object.

View File

@ -114,7 +114,14 @@ sub init {
sub getUser {
my ( $self, $req, %args ) = @_;
return PE_LDAPCONNECTFAILED unless $self->ldap and $self->bind();
$self->validateLdap;
unless ( $self->ldap ) {
return PE_LDAPCONNECTFAILED;
}
$self->bind();
my $mesg = $self->ldap->search(
base => $self->conf->{ldapBase},
scope => 'sub',

View File

@ -83,9 +83,9 @@
"PE91":"Access not granted on OID service",
"PE92":"Access not granted on GET service",
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"A required attribute is not available",
"PE94":"السمة المطلوبة غير متوفرة",
"PE95":"Access not granted on DECRYPT service",
"PE96":"بيانات الإعتماد خاطئة",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"قبول",
"accessDenied":"ليس لديك إذن بالدخول لهذا التطبيق",
@ -191,7 +191,7 @@
"notFound":"لم يتم العثور: محاولة الدخول إلى صفحة غير متوفرة",
"noTOTPFound":"No TOTP found",
"noU2FKeyFound":"No U2F key found",
"oidcConsent":"التطبيق ٪s هل ترغب في معرفة:",
"oidcConsent":"The application %s would like to:",
"oidcConsents":"OIDC consents",
"oidcConsentsFull":"OpenID Connect consents",
"oneExpired2Fremoved":"An expired 2F device has been removed!",
@ -273,19 +273,19 @@
"warning":"تحذير",
"welcomeOnPortal":"مرحبا بك على بوابة إثبات الهوية الآمنة.",
"yesResendMail":"نعم، أعد إرسال البريد",
"yourAddress":"عنوانك",
"yourAddress":"Know your address",
"yourApps":"التطبيقات الخاصة بك",
"yourEmail":"بريدك الالكتروني",
"yourIdentity":"هويتك",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"هويتك هي",
"yourKeyIsRegistered":"المفتاح الخاص بك تم تسجيله",
"yourKeyIsAlreadyRegistered":"Your key is ALREADY registered!",
"yourKeyIsUnregistered":"تمت إزالة المفتاح",
"yourKeyIsVerified":"تم اختبار المفتاح الخاص بك بنجاح",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "and access your account while you are offline",
"yourPhone":"رقم هاتفك",
"yourProfile":"ملفك الشخصي",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"A required attribute is not available",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Benutzername oder Passwort nicht korrekt",
"PE96":"Invalid verification code",
"2fRegRequired":"Dieser Dienst benötigt Zwei-Faktor-Authentifizierung. Bitte legen Sie ein Gerät an und gehen dann zum Portal zurück.",
"accept":"Akzeptieren",
"accessDenied":"Sie haben keine Zugriffsberechtigung für diese Anwendung",
@ -191,7 +191,7 @@
"notFound":"Nicht gefunden: Du versuchst, auf eine nicht verfügbare Seite zuzugreifen",
"noTOTPFound":"Kein TOTP gefunden",
"noU2FKeyFound":"Kein U2F Schlüssel gefunden",
"oidcConsent":"Die Anwendung %s möchte:",
"oidcConsent":"The application %s would like to:",
"oidcConsents":"OIDC consents",
"oidcConsentsFull":"OpenID Connect consents",
"oneExpired2Fremoved":"An expired 2F device has been removed!",
@ -273,19 +273,19 @@
"warning":"Warnung",
"welcomeOnPortal":"Willkommen in Ihrem gesicherten Authentifizierungsportal.",
"yesResendMail":"Ja, Mail erneut senden.",
"yourAddress":"Wissen Ihre Adresse",
"yourAddress":"Know your address",
"yourApps":"Ihre Applikationen",
"yourEmail":"Wissen Ihre Mailadresse",
"yourIdentity":"Wissen Ihre Identität",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"Ihre Identität ist",
"yourKeyIsRegistered":"Ihr Key wurde registriert",
"yourKeyIsAlreadyRegistered":"Your key is ALREADY registered!",
"yourKeyIsUnregistered":"Your key has been unregistered",
"yourKeyIsVerified":"Ihr Key ist bestätigt",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "and access your account while you are offline",
"yourPhone":"Wissen Ihre Telefonnummer",
"yourProfile":"Wissen Ihr Profil",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Acceso no concedido al servicio de SUPLANTACIÓN",
"PE94":"Un atributo obligatorio no está presente",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Contraseña o identificador incorrecto",
"PE96":"Invalid verification code",
"2fRegRequired":"Este servicio necesita la autenticación de dos factores. Registre un dispositivo ahora, luego reingrese al portal.",
"accept":"Aceptar",
"accessDenied":"No está autorizado a acceder a esta aplicación",
@ -191,7 +191,7 @@
"notFound":"No encontrado: página no disponible",
"noTOTPFound":"TOTP no encontrado",
"noU2FKeyFound":"Llave U2F no encontrada",
"oidcConsent":"La aplicación %s quisiera saber:",
"oidcConsent":"The application %s would like to:",
"oidcConsents":"Permisos OIDC",
"oidcConsentsFull":"Permisos OpenID Connect",
"oneExpired2Fremoved":"¡Un dispositivo 2F caducado ha sido suprimido!",
@ -273,19 +273,19 @@
"warning":"Precaución",
"welcomeOnPortal":"Bienvenido a su portal de autenticación.",
"yesResendMail":"Sí, reenviar el e-mail",
"yourAddress":"Su dirección",
"yourAddress":"Know your address",
"yourApps":"Sus aplicaciones",
"yourEmail":"Su e-mail",
"yourIdentity":"Su identidad",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"Su identidad es",
"yourKeyIsRegistered":"Su llave está registrada",
"yourKeyIsAlreadyRegistered":"¡Su llave YA FUE registrada!",
"yourKeyIsUnregistered":"Su llave ha sido suprimida",
"yourKeyIsVerified":"Su llave está verificada",
"yourNewTotpKey":"Su nueva llave TOTP, por favor pruébela e ingrese el código",
"yourOffline": "Access your account while you are offline",
"yourPhone":"Su número telefónico",
"yourProfile":"Su perfil",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Su llave TOTP",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"A required attribute is not available",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Virheelliset kirjautumistiedot",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"Hyväksy",
"accessDenied":"Sinulla ei ole käyttöoikeutta tähän sovellukseen",
@ -273,19 +273,19 @@
"warning":"Varoitus",
"welcomeOnPortal":"Welcome on your secured authentication portal.",
"yesResendMail":"Kyllä, uudelleen lähetä sähköposti",
"yourAddress":"Osoitteesi",
"yourAddress":"Know your address",
"yourApps":"Sovelluksesi",
"yourEmail":"Sähköpostiosoitteesi",
"yourIdentity":"Your identity",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"Your identity is",
"yourKeyIsRegistered":"Your key is registered",
"yourKeyIsAlreadyRegistered":"Your key is ALREADY registered!",
"yourKeyIsUnregistered":"Your key has been unregistered",
"yourKeyIsVerified":"Your key is verified",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "and access your account while you are offline",
"yourPhone":"Puhelinnumerosi",
"yourProfile":"Profiilisi",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -83,9 +83,9 @@
"PE91":"Accesso non concesso sul servizio OID",
"PE92":"Accesso non concesso sul servizio GET",
"PE93":"Accesso non concesso sul servizio IMPERSONATION",
"PE94":"A required attribute is not available",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Password o ID errati",
"PE94":"Attributo richiesto non disponibile",
"PE95":"Accesso non concesso sul servizio DECRYPT",
"PE96":"Invalid verification code",
"2fRegRequired":"Questo servizio richiede un'autenticazione a doppio fattore. Registrare un dispositivo ora, quindi tornare al portale.",
"accept":"Accetta",
"accessDenied":"Non hai un'autorizzazione di accesso per questa applicazione",
@ -191,7 +191,7 @@
"notFound":"Non trovato: si tenta di accedere ad una pagina non disponibile",
"noTOTPFound":"Nessun TOTP trovato",
"noU2FKeyFound":"Nessuna chiave U2F trovata",
"oidcConsent":"L'applicazione %s vorrebbe:",
"oidcConsent":"The application %s would like to:",
"oidcConsents":"Consensi OIDC",
"oidcConsentsFull":"Consensi OpenID Connect",
"oneExpired2Fremoved":"An expired 2F device has been removed!",
@ -273,19 +273,19 @@
"warning":"Avvertimento",
"welcomeOnPortal":"Benvenuto sul tuo portale di autenticazione protetta.",
"yesResendMail":"Sì, rinvia e-mail",
"yourAddress":"Sapere vostro indirizzo",
"yourAddress":"Know your address",
"yourApps":"Le vostre applicazioni",
"yourEmail":"Sapere vostro E-mail",
"yourIdentity":"Sapere vostro Identità",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"La tua identità é",
"yourKeyIsRegistered":"La vostra chiave è registrata",
"yourKeyIsAlreadyRegistered":"La tua chiave è GIÀ registrata !",
"yourKeyIsUnregistered":"La vostra chiave è stata rimossa",
"yourKeyIsVerified":"La tua chiave é stata testata con successo",
"yourNewTotpKey":"La tua nuova chiave TOTP, per favore provala e inserisci il codice",
"yourOffline": "and access your account while you are offline",
"yourPhone":"Sapere vostro numero di telefono",
"yourProfile":"Sapere vostro profilo",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"La tua chiave TOTP",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"A required attribute is not available",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Wachtwoord of identifier is niet correct",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"Accept",
"accessDenied":"You have no access authorization for this application",
@ -283,9 +283,9 @@
"yourKeyIsUnregistered":"Your key has been unregistered",
"yourKeyIsVerified":"Your key is verified",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "Access your account while you are offline",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"Um atributo exigido não está disponível",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Senha ou identificante incorretos",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"Accept",
"accessDenied":"You have no access authorization for this application",
@ -283,9 +283,9 @@
"yourKeyIsUnregistered":"Your key has been unregistered",
"yourKeyIsVerified":"Your key is verified",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "Access your account while you are offline",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"A required attribute is not available",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Parolă sau identificator incorect",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"Accept",
"accessDenied":"You have no access authorization for this application",
@ -283,9 +283,9 @@
"yourKeyIsUnregistered":"Your key has been unregistered",
"yourKeyIsVerified":"Your key is verified",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "Access your account while you are offline",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"Một thuộc tính bắt buộc không có sẵn",
"PE95":"Access not granted on DECRYPT service",
"PE96":"Thông tin xác thực sai",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"Chấp nhận",
"accessDenied":"Bạn không có quyền truy cập vào ứng dụng này",
@ -191,7 +191,7 @@
"notFound":"Không tìm thấy: bạn cố gắng truy cập vào một trang không có sẵn",
"noTOTPFound":"Đăng xuất khỏi các ứng dụng khác",
"noU2FKeyFound":"No U2F key found",
"oidcConsent":"Ứng dụng %s muốn biết:",
"oidcConsent":"The application %s would like to:",
"oidcConsents":"OIDC consents",
"oidcConsentsFull":"OpenID Connect consents",
"oneExpired2Fremoved":"An expired 2F device has been removed!",
@ -273,19 +273,19 @@
"warning":"Cảnh báo",
"welcomeOnPortal":"Chào mừng bạn đến với cổng thông tin xác thực được bảo mật của bạn.",
"yesResendMail":"Có, gửi lại thư",
"yourAddress":"Địa chỉ của bạn",
"yourAddress":"Know your address",
"yourApps":"Ứng dụng của bạn",
"yourEmail":"Email của bạn",
"yourIdentity":"Nhận dạng của bạn",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"Nhận dạng của bạn là",
"yourKeyIsRegistered":"Khóa của bạn đã được đăng ký",
"yourKeyIsAlreadyRegistered":"Your key is ALREADY registered!",
"yourKeyIsUnregistered":"Khóa của bạn đã bị xóa",
"yourKeyIsVerified":"Chìa khóa của bạn đã được kiểm tra thành công",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "and access your account while you are offline",
"yourPhone":"Số điện thoại của bạn",
"yourProfile":"Profile của bạn",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -85,7 +85,7 @@
"PE93":"Access not granted on IMPERSONATION service",
"PE94":"A required attribute is not available",
"PE95":"Access not granted on DECRYPT service",
"PE96":"认证错误",
"PE96":"Invalid verification code",
"2fRegRequired":"This service requires a double factor authentication. Register a device now, then go back to the portal.",
"accept":"Accept 方法",
"accessDenied":"您无权访问此应用",
@ -273,19 +273,19 @@
"warning":"警告",
"welcomeOnPortal":"欢迎来到您的加密认证 portal",
"yesResendMail":"好的,重新发送邮件",
"yourAddress":"您的地址",
"yourAddress":"Know your address",
"yourApps":"你的应用",
"yourEmail":"您的邮箱",
"yourIdentity":"您的标识",
"yourEmail":"Know your email",
"yourIdentity":"Know your identity",
"yourIdentityIs":"您的身份是",
"yourKeyIsRegistered":"Your key is registered",
"yourKeyIsAlreadyRegistered":"Your key is ALREADY registered!",
"yourKeyIsUnregistered":"Your key has been unregistered",
"yourKeyIsVerified":"Your key is verified",
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourOffline": "and access your account while you are offline",
"yourPhone":"您的电话号码",
"yourProfile":"您的档案",
"yourOffline":"Access your account while you are offline",
"yourPhone":"Know your phone number",
"yourProfile":"Know your profile",
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}
}

View File

@ -10,7 +10,7 @@
"newPwdIs":"Kata laluan baru anda ialah",
"pwdChanged":"Kata laluan anda telah ditukar",
"pwdIs":"Kata laluan anda ialah",
"registerConfirmSubject":"[LemonLDAP::NG] Pengesahan pendaftaran akaun",
"registerConfirmSubject":"[LemonLDAP::NG] Pengesahan pendaftaran akaun",
"registerDoneSubject":"[LemonLDAP::NG] Akaun baru anda",
"requestIssuedFromIP":"Permintaan itu dari alamat IP",
"yourLoginCodeIs":"Kod login anda ialah",

View File

@ -5,7 +5,7 @@ use IO::String;
require 't/test-lib.pm';
my $res;
my $maintests = 3;
my $maintests = 4;
SKIP: {
skip 'LLNGTESTLDAP is not set', $maintests unless ( $ENV{LLNGTESTLDAP} );
@ -32,8 +32,24 @@ SKIP: {
. '&password='
. ( $ENV{LDAPPWD} || 'dwho' );
# Try yo authenticate
# -------------------
# Try to authenticate with
# the server temporarily offline (#2018)
# --------------------------------------
tempStopLdapServer();
ok(
$res = $client->_post(
'/', IO::String->new($postString),
length => length($postString)
),
'Auth query'
);
expectReject( $res, 401, 6 );
# Try to authenticate with the
# server back online
# ----------------------------
tempStartLdapServer();
ok(
$res = $client->_post(
'/', IO::String->new($postString),

View File

@ -1,14 +1,19 @@
# Try to launch an LDAP server
my $slapd_bin;
my $slapadd_bin;
my $slapd_schema_dir;
if ( $ENV{LLNGTESTLDAP} ) {
my $slapd_bin = $ENV{LLNGTESTLDAP_SLAPD_BIN} || '/usr/sbin/slapd';
my $slapadd_bin = $ENV{LLNGTESTLDAP_SLAPADD_BIN} || '/usr/sbin/slapadd';
my $slapd_schema_dir = (
$ENV{LLNGTESTLDAP_SCHEMA_DIR}
and -d $ENV{LLNGTESTLDAP_SCHEMA_DIR} ? $ENV{LLNGTESTLDAP_SCHEMA_DIR}
: -d '/etc/slapd/schema' ? '/etc/slapd/schema'
$slapd_bin = $ENV{LLNGTESTLDAP_SLAPD_BIN} || '/usr/sbin/slapd';
$slapadd_bin = $ENV{LLNGTESTLDAP_SLAPADD_BIN} || '/usr/sbin/slapadd';
$slapd_schema_dir = (
( $ENV{LLNGTESTLDAP_SCHEMA_DIR} and -d $ENV{LLNGTESTLDAP_SCHEMA_DIR} )
? $ENV{LLNGTESTLDAP_SCHEMA_DIR}
: -d '/etc/openldap/schema' ? '/etc/openldap/schema'
: '/etc/ldap/schema'
);
eval { mkdir 't/testslapd/slapd.d' };
eval { mkdir 't/testslapd/data' };
system('cp t/testslapd/slapd.ldif t/testslapd/slapd-test.ldif');
@ -27,10 +32,27 @@ sub stopLdapServer {
if ( $ENV{LLNGTESTLDAP} ) {
open F, 't/testslapd/slapd.pid';
my $pid = join '', <F>;
close F;
system "kill $pid";
system 'rm -rf t/testslapd/slapd.d';
system 'rm -rf t/testslapd/data';
system 'rm -rf t/testslapd/slapd-test.ldif';
}
}
sub tempStopLdapServer {
if ( $ENV{LLNGTESTLDAP} ) {
open F, 't/testslapd/slapd.pid';
my $pid = join '', <F>;
close F;
system "kill $pid";
}
}
sub tempStartLdapServer {
if ( $ENV{LLNGTESTLDAP} ) {
system( $slapd_bin
. ' -s 256 -h "ldap://127.0.0.1:19389/" -F t/testslapd/slapd.d' );
}
}
1;

View File

@ -561,10 +561,12 @@ fi
%config(noreplace) %{apache_confdir}/z-lemonldap-ng-manager.conf
%config(noreplace) %{apache_confdir}/z-lemonldap-ng-portal.conf
%{_mandir}/man1/convertConfig*
%{_mandir}/man1/convertSessions*
%dir %{_libexecdir}/%{name}
%dir %{lm_sbindir}
%dir %{lm_bindir}
%{lm_bindir}/convertConfig
%{lm_bindir}/convertSessions
%{lm_bindir}/importMetadata
%{lm_bindir}/lmMigrateConfFiles2ini
%{lm_bindir}/rotateOidcKeys