Add labels and logos to all 2F providers (#1873)

This commit is contained in:
Maxime Besson 2019-08-01 17:27:14 +02:00 committed by Christophe Maudoux
parent 216d683f22
commit c1afdbefac
41 changed files with 392 additions and 95 deletions

View File

@ -706,10 +706,11 @@ sub sfExtra {
my $res = [];
foreach my $mod ( keys %$val ) {
my $tmp;
$tmp->{title} = $mod;
$tmp->{id} = "sfExtra/$mod";
$tmp->{type} = 'sfExtra';
$tmp->{data}->{$_} = $val->{$mod}->{$_} foreach (qw(type rule));
$tmp->{title} = $mod;
$tmp->{id} = "sfExtra/$mod";
$tmp->{type} = 'sfExtra';
$tmp->{data}->{$_} = $val->{$mod}->{$_}
foreach (qw(type rule logo label));
my $over = $val->{$mod}->{over} // {};
$tmp->{data}->{over} = [ map { [ $_, $over->{$_} ] } keys %$over ];
push @$res, $tmp;

View File

@ -1142,6 +1142,9 @@ qr/^(?:\*\.)?(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][
'default' => '\\d{6}',
'type' => 'pcre'
},
'ext2fLabel' => {
'type' => 'text'
},
'ext2fLogo' => {
'type' => 'text'
},
@ -1647,6 +1650,9 @@ qr/^(?:\*\.)?(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][
'default' => '\\d{6}',
'type' => 'pcre'
},
'mail2fLabel' => {
'type' => 'text'
},
'mail2fLogo' => {
'type' => 'text'
},
@ -2530,6 +2536,9 @@ qr/(?:(?:https?):\/\/(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.]
'rest2fInitUrl' => {
'type' => 'url'
},
'rest2fLabel' => {
'type' => 'text'
},
'rest2fLogo' => {
'type' => 'text'
},
@ -3453,6 +3462,12 @@ qr/^(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-
'totp2fIssuer' => {
'type' => 'text'
},
'totp2fLabel' => {
'type' => 'text'
},
'totp2fLogo' => {
'type' => 'text'
},
'totp2fRange' => {
'default' => 1,
'type' => 'int'
@ -3499,6 +3514,12 @@ qr/^(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-
'u2fAuthnLevel' => {
'type' => 'int'
},
'u2fLabel' => {
'type' => 'text'
},
'u2fLogo' => {
'type' => 'text'
},
'u2fSelfRegistration' => {
'default' => 0,
'type' => 'boolOrExpr'
@ -3579,6 +3600,12 @@ qr/^(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-
'utotp2fAuthnLevel' => {
'type' => 'int'
},
'utotp2fLabel' => {
'type' => 'text'
},
'utotp2fLogo' => {
'type' => 'text'
},
'vhostAliases' => {
'type' => 'text'
},
@ -3693,6 +3720,12 @@ qr/^(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-
'yubikey2fClientID' => {
'type' => 'text'
},
'yubikey2fLabel' => {
'type' => 'text'
},
'yubikey2fLogo' => {
'type' => 'text'
},
'yubikey2fNonce' => {
'type' => 'text'
},

View File

@ -1420,6 +1420,14 @@ sub attributes {
documentation =>
'Authentication level for users authentified by password+U2F'
},
u2fLabel => {
type => 'text',
documentation => 'Portal label for U2F'
},
u2fLogo => {
type => 'text',
documentation => 'Custom logo for U2F',
},
u2fUserCanRemoveKey => {
type => 'bool',
default => 1,
@ -1446,6 +1454,14 @@ sub attributes {
documentation =>
'Authentication level for users authentified by password+TOTP'
},
totp2fLabel => {
type => 'text',
documentation => 'Portal label for TOTP 2F'
},
totp2fLogo => {
type => 'text',
documentation => 'Custom logo for TOTP 2F',
},
totp2fIssuer => {
type => 'text',
documentation => 'TOTP Issuer',
@ -1497,6 +1513,14 @@ sub attributes {
documentation =>
'Authentication level for users authentified by password+(U2F or TOTP)'
},
utotp2fLabel => {
type => 'text',
documentation => 'Portal label for U2F+TOTP'
},
utotp2fLogo => {
type => 'text',
documentation => 'Custom logo for U2F+TOTP',
},
# Mail second factor
mail2fActivation => {
@ -1526,6 +1550,10 @@ sub attributes {
documentation =>
'Authentication level for users authenticated by Mail second factor'
},
mail2fLabel => {
type => 'text',
documentation => 'Portal label for Mail second factor'
},
mail2fLogo => {
type => 'text',
documentation => 'Custom logo for Mail 2F',
@ -1555,6 +1583,10 @@ sub attributes {
documentation =>
'Authentication level for users authentified by External second factor'
},
ext2fLabel => {
type => 'text',
documentation => 'Portal label for External second factor'
},
ext2fLogo => {
type => 'text',
documentation => 'Custom logo for External 2F',
@ -1595,6 +1627,10 @@ sub attributes {
documentation =>
'Authentication level for users authentified by REST second factor'
},
rest2fLabel => {
type => 'text',
documentation => 'Portal label for REST second factor'
},
rest2fLogo => {
type => 'text',
documentation => 'Custom logo for REST 2F',
@ -1616,6 +1652,14 @@ sub attributes {
documentation =>
'Authentication level for users authentified by Yubikey second factor'
},
yubikey2fLabel => {
type => 'text',
documentation => 'Portal label for Yubikey second factor'
},
yubikey2fLogo => {
type => 'text',
documentation => 'Custom logo for Yubikey 2F',
},
yubikey2fClientID => {
type => 'text',
documentation => 'Yubico client ID',

View File

@ -700,17 +700,18 @@ sub tree {
title => 'utotp2f',
help => 'utotp2f.html',
form => 'simpleInputContainer',
nodes =>
[ 'utotp2fActivation', 'utotp2fAuthnLevel' ]
nodes => [
'utotp2fActivation', 'utotp2fAuthnLevel',
'utotp2fLabel', 'utotp2fLogo'
]
},
{
title => 'totp',
title => 'totp2f',
help => 'totp2f.html',
form => 'simpleInputContainer',
nodes => [
'totp2fActivation',
'totp2fSelfRegistration',
'totp2fAuthnLevel',
'totp2fIssuer',
'totp2fInterval',
'totp2fRange',
@ -719,6 +720,9 @@ sub tree {
'totp2fUserCanChangeKey',
'totp2fUserCanRemoveKey',
'totp2fTTL',
'totp2fAuthnLevel',
'totp2fLabel',
'totp2fLogo',
]
},
{
@ -726,9 +730,10 @@ sub tree {
help => 'u2f.html',
form => 'simpleInputContainer',
nodes => [
'u2fActivation', 'u2fSelfRegistration',
'u2fAuthnLevel', 'u2fUserCanRemoveKey',
'u2fTTL',
'u2fActivation', 'u2fSelfRegistration',
'u2fUserCanRemoveKey', 'u2fTTL',
'u2fAuthnLevel', 'u2fLabel',
'u2fLogo',
]
},
{
@ -739,17 +744,18 @@ sub tree {
'mail2fActivation', 'mail2fCodeRegex',
'mail2fTimeout', 'mail2fSubject',
'mail2fBody', 'mail2fAuthnLevel',
'mail2fLogo',
'mail2fLabel', 'mail2fLogo',
]
},
{
title => 'external2f',
title => 'ext2f',
help => 'external2f.html',
form => 'simpleInputContainer',
nodes => [
'ext2fActivation', 'ext2fCodeActivation',
'ext2FSendCommand', 'ext2FValidateCommand',
'ext2fAuthnLevel', 'ext2fLogo',
'ext2fAuthnLevel', 'ext2fLabel',
'ext2fLogo',
]
},
{
@ -759,7 +765,7 @@ sub tree {
'rest2fActivation', 'rest2fInitUrl',
'rest2fInitArgs', 'rest2fVerifyUrl',
'rest2fVerifyArgs', 'rest2fAuthnLevel',
'rest2fLogo',
'rest2fLabel', 'rest2fLogo',
]
},
{
@ -769,7 +775,6 @@ sub tree {
nodes => [
'yubikey2fActivation',
'yubikey2fSelfRegistration',
'yubikey2fAuthnLevel',
'yubikey2fClientID',
'yubikey2fSecretKey',
'yubikey2fNonce',
@ -777,6 +782,9 @@ sub tree {
'yubikey2fPublicIDSize',
'yubikey2fUserCanRemoveKey',
'yubikey2fTTL',
'yubikey2fAuthnLevel',
'yubikey2fLabel',
'yubikey2fLogo',
],
},
'sfExtra',

View File

@ -799,7 +799,8 @@ sub _scanNodes {
$self->newConf->{$name} = {};
foreach my $node ( @{ $leaf->{nodes} } ) {
my $tmp;
$tmp->{$_} = $node->{data}->{$_} foreach (qw(type rule));
$tmp->{$_} = $node->{data}->{$_}
foreach (qw(type rule logo label));
$tmp->{over} = {};
foreach ( @{ $node->{data}->{over} } ) {
$tmp->{over}->{ $_->[0] } = $_->[1];

View File

@ -337,6 +337,8 @@ llapp.controller 'TreeCtrl', [
data:
type: ''
rule: ''
logo: ''
label: ''
over: []

View File

@ -5,9 +5,11 @@
<table class="table table-striped">
<thead>
<tr>
<th width="25%" trspan="name"></th>
<th width="25%" trspan="type"></th>
<th width="50%" trspan="rule"></th>
<th width="12%" trspan="name"></th>
<th width="11%" trspan="type"></th>
<th width="33%" trspan="label"></th>
<th width="11%" trspan="logo"></th>
<th width="33%" trspan="rule"></th>
<th />
</tr>
</thead>
@ -21,6 +23,12 @@
<option ng-repeat="item in _findContainer().select" ng-selected="item.k===currentNode.data.type" value="{{item.k}}">{{item.v}}</option>
</select>
</td>
<td>
<input class="form-control" ng-model="currentNode.data.label" />
</td>
<td>
<input class="form-control" ng-model="currentNode.data.logo" />
</td>
<td>
<input class="form-control" ng-model="currentNode.data.rule" />
</td>

View File

@ -5,9 +5,11 @@
<table class="table table-striped">
<thead>
<tr>
<th width="25%" trspan="name"></th>
<th width="25%" trspan="type"></th>
<th width="50%" trspan="rule"></th>
<th width="12%" trspan="name"></th>
<th width="11%" trspan="type"></th>
<th width="33%" trspan="label"></th>
<th width="11%" trspan="logo"></th>
<th width="33%" trspan="rule"></th>
<th />
</tr>
</thead>
@ -21,6 +23,12 @@
<option ng-repeat="item in currentNode.select" ng-selected="item.k==s.data.type" value="{{item.k}}">{{item.v}}</option>
</select>
</td>
<td>
<input class="form-control" ng-model="s.data.label" />
</td>
<td>
<input class="form-control" ng-model="s.data.logo" />
</td>
<td>
<input class="form-control" ng-model="s.data.rule" />
</td>

View File

@ -392,6 +392,8 @@ This file contains:
data: {
type: '',
rule: '',
logo: '',
label: '',
over: []
}
});

File diff suppressed because one or more lines are too long

View File

@ -264,10 +264,11 @@
"exportedAttr":"SOAP/REST السمات المصدرة",
"exportedHeaders":"الهيدر المصدرة",
"exportedVars":"المتغيرات المصدرة",
"external2f":" العامل الثاني الخارجي",
"ext2f":" العامل الثاني الخارجي",
"ext2fActivation":"تفعيل",
"ext2fCodeActivation":"Code regex",
"ext2fAuthnLevel":"مستوى إثبات الهوية",
"ext2fLabel":"Label",
"ext2fLogo":"شعار",
"ext2FSendCommand":"إرسال الأمر",
"ext2FValidateCommand":"التحقق من صحة الأمر",
@ -355,6 +356,7 @@
"krbKeytab":"كيتاب",
"krbRemoveDomain":"Remove domain from Kerberos username",
"kerberosParams":"معايير كيربيروس",
"label":"Label",
"languages":"اللغات",
"latest":"الأحدث",
"ldap":"إل‌داب",
@ -418,6 +420,7 @@
"mail2fSubject":"نجاح عنوان البريد",
"mail2fBody":"محتوى البريد الناجح",
"mail2fAuthnLevel":"مستوى إثبات الهوية",
"mail2fLabel":"Label",
"mail2fLogo":"شعار",
"mailBody":"محتوى البريد الناجح",
"mailCharset":"charset",
@ -706,6 +709,7 @@
"rest2f":"REST second factor",
"rest2fActivation":"تفعيل",
"rest2fAuthnLevel":"مستوى إثبات الهوية",
"rest2fLabel":"Label",
"rest2fInitArgs":"Init Arguments",
"rest2fInitUrl":"Init URL",
"rest2fLogo":"شعار",
@ -797,9 +801,11 @@
"timeoutActivity":"مهلة نشاط الجلسات",
"timeoutActivityInterval":"فترة تحديث الجلسات",
"tokenUseGlobalStorage":"استخدام سعة التخزين العامة",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"تفعيل",
"totp2fAuthnLevel":"TOTP authentication level",
"totp2fLabel":"Label",
"totp2fLogo":"ﺶﻋﺍﺭ",
"totp2fDigits":"Number of digits",
"totp2fDisplayExistingSecret":"Display existing secret",
"totp2fInterval":"Interval",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"تفعيل",
"u2fAuthnLevel":"U2F مستوى إثبات الهوية",
"u2fLabel":"Label",
"u2fLogo":"ﺶﻋﺍﺭ",
"u2fSelfRegistration":"التسجيل الذاتي",
"u2fTTL":"Lifetime",
"u2fUserCanRemoveKey":"Allow user to remove U2F key",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-or-U2F",
"utotp2fActivation":"تفعيل",
"utotp2fAuthnLevel":"مستوى إثبات الهوية",
"utotp2fLabel":"Label",
"utotp2fLogo":"ﺶﻋﺍﺭ",
"value":"القيمة",
"values":"القيم",
"variables":"المتغيرات",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"تفعيل",
"yubikey2fAuthnLevel":"مستوى إثبات الهوية",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"ﺶﻋﺍﺭ",
"yubikey2fClientID":"API العميل ID",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"حجم الجزء العام لي OTP آي دي",
@ -1024,4 +1036,4 @@
"samlRelayStateTimeout":"تناوب حالة مهلة الجلسة ",
"samlUseQueryStringSpecific":"استخدام أسلوب query_string المعين",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

View File

@ -264,10 +264,11 @@
"exportedAttr":"SOAP/REST exported attributes",
"exportedHeaders":"Exported headers",
"exportedVars":"Exported Variables",
"external2f":"External second factor",
"ext2f":"External second factor",
"ext2fActivation":"Activation",
"ext2fCodeActivation":"Code regex",
"ext2fAuthnLevel":"Authentication level",
"ext2fLabel":"Label",
"ext2fLogo":"Logo",
"ext2FSendCommand":"Send command",
"ext2FValidateCommand":"Validation command",
@ -355,6 +356,7 @@
"krbKeytab":"keytab file",
"krbRemoveDomain":"Remove domain from Kerberos username",
"kerberosParams":"Kerberos parameters",
"label":"Label",
"languages":"Languages",
"latest":"Latest",
"ldap":"LDAP",
@ -418,6 +420,7 @@
"mail2fSubject":"Mail subject",
"mail2fBody":"Mail body",
"mail2fAuthnLevel":"Authentication level",
"mail2fLabel":"Label",
"mail2fLogo":"Logo",
"mailBody":"Success mail content",
"mailCharset":"Charset",
@ -706,6 +709,7 @@
"rest2f":"REST second factor",
"rest2fActivation":"Activation",
"rest2fAuthnLevel":"Authentication level",
"rest2fLabel":"Label",
"rest2fInitArgs":"Init Arguments",
"rest2fInitUrl":"Init URL",
"rest2fLogo":"Logo",
@ -797,9 +801,11 @@
"timeoutActivity":"Sessions activity timeout",
"timeoutActivityInterval":"Sessions update interval",
"tokenUseGlobalStorage":"Use global storage",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"Activation",
"totp2fAuthnLevel":"TOTP authentication level",
"totp2fLabel":"Label",
"totp2fLogo":"Logo",
"totp2fDigits":"Number of digits",
"totp2fDisplayExistingSecret":"Display existing secret",
"totp2fInterval":"Interval",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"Activation",
"u2fAuthnLevel":"U2F authentication level",
"u2fLabel":"Label",
"u2fLogo":"Logo",
"u2fSelfRegistration":"Self registration",
"u2fTTL":"Lifetime",
"u2fUserCanRemoveKey":"Allow user to remove U2F key",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-or-U2F",
"utotp2fActivation":"Activation",
"utotp2fAuthnLevel":"Authentication level",
"utotp2fLabel":"Label",
"utotp2fLogo":"Logo",
"value":"Value",
"values":"Values",
"variables":"Variables",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"Activation",
"yubikey2fAuthnLevel":"Authentication level",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"Logo",
"yubikey2fClientID":"API client ID",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"OTP public ID part size",
@ -1024,4 +1036,4 @@
"samlRelayStateTimeout":"RelayState session timeout",
"samlUseQueryStringSpecific":"Use specific query_string method",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

View File

@ -264,10 +264,11 @@
"exportedAttr":"SOAP/REST exported attributes",
"exportedHeaders":"Exported headers",
"exportedVars":"Exported Variables",
"external2f":"External second factor",
"ext2f":"External second factor",
"ext2fActivation":"Activation",
"ext2fCodeActivation":"Code regex",
"ext2fAuthnLevel":"Authentication level",
"ext2fLabel":"Label",
"ext2fLogo":"Logo",
"ext2FSendCommand":"Send command",
"ext2FValidateCommand":"Validation command",
@ -355,6 +356,7 @@
"krbKeytab":"keytab file",
"krbRemoveDomain":"Remove domain from Kerberos username",
"kerberosParams":"Kerberos parameters",
"label":"Label",
"languages":"Languages",
"latest":"Latest",
"ldap":"LDAP",
@ -418,6 +420,7 @@
"mail2fSubject":"Mail subject",
"mail2fBody":"Mail body",
"mail2fAuthnLevel":"Authentication level",
"mail2fLabel":"Label",
"mail2fLogo":"Logo",
"mailBody":"Success mail content",
"mailCharset":"Charset",
@ -706,6 +709,7 @@
"rest2f":"REST second factor",
"rest2fActivation":"Activation",
"rest2fAuthnLevel":"Authentication level",
"rest2fLabel":"Label",
"rest2fInitArgs":"Init Arguments",
"rest2fInitUrl":"Init URL",
"rest2fLogo":"Logo",
@ -797,9 +801,11 @@
"timeoutActivity":"Sessions activity timeout",
"timeoutActivityInterval":"Sessions update interval",
"tokenUseGlobalStorage":"Use global storage",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"Activation",
"totp2fAuthnLevel":"TOTP authentication level",
"totp2fLabel":"Label",
"totp2fLogo":"Logo",
"totp2fDigits":"Number of digits",
"totp2fDisplayExistingSecret":"Display existing secret",
"totp2fInterval":"Interval",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"Activation",
"u2fAuthnLevel":"U2F authentication level",
"u2fLabel":"Label",
"u2fLogo":"Logo",
"u2fSelfRegistration":"Self registration",
"u2fTTL":"Lifetime",
"u2fUserCanRemoveKey":"Allow user to remove U2F key",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-or-U2F",
"utotp2fActivation":"Activation",
"utotp2fAuthnLevel":"Authentication level",
"utotp2fLabel":"Label",
"utotp2fLogo":"Logo",
"value":"Value",
"values":"Values",
"variables":"Variables",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"Activation",
"yubikey2fAuthnLevel":"Authentication level",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"Logo",
"yubikey2fClientID":"API client ID",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"OTP public ID part size",

View File

@ -264,10 +264,11 @@
"exportedAttr":"Attributs exportés par le portail (SOAP/REST)",
"exportedHeaders":"En-têtes exportés",
"exportedVars":"Attributs à exporter",
"external2f":"Second facteur externe",
"ext2f":"Second facteur externe",
"ext2fActivation":"Activation",
"ext2fCodeActivation":"Expression régulière pour la génération du code",
"ext2fAuthnLevel":"Niveau de l'authentification",
"ext2fLabel":"Label",
"ext2fLogo":"Logo",
"ext2FSendCommand":"Commande pour l'envoi",
"ext2FValidateCommand":"Commande pour la validation",
@ -355,6 +356,7 @@
"krbKeytab":"Fichier keytab",
"krbRemoveDomain":"Supprimer le domaine du nom d'utilisateur",
"kerberosParams":"Paramètres Kerberos",
"label":"Label",
"languages":"Langues",
"latest":"Dernière",
"ldap":"LDAP",
@ -418,6 +420,7 @@
"mail2fSubject":"Sujet du message d'envoi du code",
"mail2fBody":"Contenu du message d'envoi du code",
"mail2fAuthnLevel":"Niveau de l'authentification",
"mail2fLabel":"Label",
"mail2fLogo":"Logo",
"mailBody":"Contenu du message de succès",
"mailCharset":"Charset",
@ -706,6 +709,7 @@
"rest2f":"Second facteur REST",
"rest2fActivation":"Activation",
"rest2fAuthnLevel":"Niveau d'authentification",
"rest2fLabel":"Label",
"rest2fInitArgs":"Arguments d'initialisation",
"rest2fInitUrl":"URL d'initialisation",
"rest2fLogo":"Logo",
@ -797,9 +801,11 @@
"timeoutActivity":"Délai d'expiration des sessions",
"timeoutActivityInterval":"Intervalle de mise à jour des sessions",
"tokenUseGlobalStorage":"Utiliser le cache global",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"Activation",
"totp2fAuthnLevel":"Niveau d'authentification TOTP",
"totp2fLabel":"Label",
"totp2fLogo":"Logo",
"totp2fDigits":"Nombre de chiffres",
"totp2fDisplayExistingSecret":"Afficher la clef existante",
"totp2fInterval":"Intervalle",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"Activation",
"u2fAuthnLevel":"Niveau d'authentification U2F",
"u2fLabel":"Label",
"u2fLogo":"Logo",
"u2fSelfRegistration":"Auto-enregistrement",
"u2fTTL":"Durée de vie",
"u2fUserCanRemoveKey":"Autoriser les utilisateurs à effacer leur clef U2F",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-ou-U2F",
"utotp2fActivation":"Activation",
"utotp2fAuthnLevel":"Niveau d'authentification",
"utotp2fLabel":"Label",
"utotp2fLogo":"Logo",
"value":"Valeur",
"values":"Valeurs",
"variables":"Variables",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"Activation",
"yubikey2fAuthnLevel":"Niveau d'authentification",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"Logo",
"yubikey2fClientID":"Identifiant client de l'API",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"Taille de la partie publique de l'OTP",

View File

@ -264,10 +264,11 @@
"exportedAttr":"Attributi di SOAP/REST esportati",
"exportedHeaders":"Intestazioni esportate",
"exportedVars":"Variabili esportate",
"external2f":"2° fattore esterno",
"ext2f":"2° fattore esterno",
"ext2fActivation":"Attivazione",
"ext2fCodeActivation":"Codice regex",
"ext2fAuthnLevel":"Livello di autenticazione",
"ext2fLabel":"Label",
"ext2fLogo":"Logo",
"ext2FSendCommand":"Invia comando",
"ext2FValidateCommand":"Comando di convalida",
@ -355,6 +356,7 @@
"krbKeytab":"File keytab",
"krbRemoveDomain":"Rimuovi dominio dal nome utente Kerberos",
"kerberosParams":"Parametri di Kerberos",
"label":"Label",
"languages":"Lingue",
"latest":"Più recente",
"ldap":"LDAP",
@ -418,6 +420,7 @@
"mail2fSubject":"Oggetto della mail",
"mail2fBody":"Corpo del messaggio",
"mail2fAuthnLevel":"Livello di autenticazione",
"mail2fLabel":"Label",
"mail2fLogo":"Logo",
"mailBody":"Successo contenuto di posta",
"mailCharset":"Charset",
@ -706,6 +709,7 @@
"rest2f":"REST secondo fattore",
"rest2fActivation":"Attivazione",
"rest2fAuthnLevel":"Livello di autenticazione",
"rest2fLabel":"Label",
"rest2fInitArgs":"Argomenti di init",
"rest2fInitUrl":"URL iniziale",
"rest2fLogo":"Logo",
@ -797,9 +801,11 @@
"timeoutActivity":"Timeout attività di sessioni",
"timeoutActivityInterval":"Intervallo di aggiornamento delle sessioni",
"tokenUseGlobalStorage":"Utilizza lo storage globale",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"Attivazione",
"totp2fAuthnLevel":"Livello di autenticazione TOTP",
"totp2fLabel":"Label",
"totp2fLogo":"Logo",
"totp2fDigits":"Numero di cifre",
"totp2fDisplayExistingSecret":"Mostra segreto esistente",
"totp2fInterval":"Intervallo",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"Attivazione",
"u2fAuthnLevel":"Livello di autenticazione U2F",
"u2fLabel":"Label",
"u2fLogo":"Logo",
"u2fSelfRegistration":"Auto-registrazione",
"u2fTTL":"Lifetime",
"u2fUserCanRemoveKey":"Autorizza l'utente a rimuovere la chiave U2F",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-or-U2F",
"utotp2fActivation":"Attivazione",
"utotp2fAuthnLevel":"Livello di autenticazione",
"utotp2fLabel":"Label",
"utotp2fLogo":"Logo",
"value":"Valore",
"values":"Valori",
"variables":"Variabili",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"Attivazione",
"yubikey2fAuthnLevel":"Livello di autenticazione",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"Logo",
"yubikey2fClientID":"ID client API",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"Dimensione della parte ID OTP pubblica",
@ -1024,4 +1036,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

@ -264,10 +264,11 @@
"exportedAttr":"Biến SOAP/REST đã được xuất",
"exportedHeaders":"Tiêu đề đã được xuất",
"exportedVars":"Biến đã được xuất",
"external2f":"Yếu tố thứ 2 bên ngoài",
"ext2f":"Yếu tố thứ 2 bên ngoài",
"ext2fActivation":"Kích hoạt",
"ext2fCodeActivation":"Code regex",
"ext2fAuthnLevel":"Mức xác thực",
"ext2fLabel":"Label",
"ext2fLogo":"Logo",
"ext2FSendCommand":"Gửi lệnh",
"ext2FValidateCommand":"Xác nhận lệnh",
@ -355,6 +356,7 @@
"krbKeytab":"tệp keytab",
"krbRemoveDomain":"Remove domain from Kerberos username",
"kerberosParams":"Tham số Kerberos",
"label":"Label",
"languages":"Ngôn ngữ",
"latest":"Mới nhất",
"ldap":"LDAP",
@ -418,6 +420,7 @@
"mail2fSubject":"Mail subject",
"mail2fBody":"Mail body",
"mail2fAuthnLevel":"Mức xác thực",
"mail2fLabel":"Label",
"mail2fLogo":"Logo",
"mailBody":"Nội dung thư thành công",
"mailCharset":"Charset",
@ -706,6 +709,7 @@
"rest2f":"REST second factor",
"rest2fActivation":"Kích hoạt",
"rest2fAuthnLevel":"Mức xác thực",
"rest2fLabel":"Label",
"rest2fInitArgs":"Init Arguments",
"rest2fInitUrl":"Init URL",
"rest2fLogo":"Logo",
@ -797,9 +801,11 @@
"timeoutActivity":"Thời gian chờ của các hoạt động phiên",
"timeoutActivityInterval":"Khoảng thời gian cập nhật phiên",
"tokenUseGlobalStorage":"Sử dụng lưu trữ toàn cục",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"Kích hoạt",
"totp2fAuthnLevel":"TOTP authentication level",
"totp2fLabel":"Label",
"totp2fLogo":"Logo",
"totp2fDigits":"Number of digits",
"totp2fDisplayExistingSecret":"Display existing secret",
"totp2fInterval":"Interval",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"Kích hoạt",
"u2fAuthnLevel":"Mức xác thực U2F",
"u2fLabel":"Label",
"u2fLogo":"Logo",
"u2fSelfRegistration":"Tự đăng ký ",
"u2fTTL":"Lifetime",
"u2fUserCanRemoveKey":"Allow user to remove U2F key",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-or-U2F",
"utotp2fActivation":"Kích hoạt",
"utotp2fAuthnLevel":"Mức xác thực",
"utotp2fLabel":"Label",
"utotp2fLogo":"Logo",
"value":"Giá trị",
"values":"Giá trị",
"variables":"biến",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"Kích hoạt",
"yubikey2fAuthnLevel":"Mức xác thực",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"Logo",
"yubikey2fClientID":"ID ứng dụng khách API",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"Kích thước phần tử công khai OTP",
@ -1024,4 +1036,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

@ -264,10 +264,11 @@
"exportedAttr":"SOAP/REST exported attributes",
"exportedHeaders":"Exported headers",
"exportedVars":"Exported Variables",
"external2f":"External second factor",
"ext2f":"External second factor",
"ext2fActivation":"激活",
"ext2fCodeActivation":"Code regex",
"ext2fAuthnLevel":"认证级别",
"ext2fLabel":"Label",
"ext2fLogo":"Logo",
"ext2FSendCommand":"Send command",
"ext2FValidateCommand":"Validation command",
@ -355,6 +356,7 @@
"krbKeytab":"keytab file",
"krbRemoveDomain":"Remove domain from Kerberos username",
"kerberosParams":"Kerberos 参数",
"label":"Label",
"languages":"语言",
"latest":"最新的",
"ldap":"LDAP",
@ -418,6 +420,7 @@
"mail2fSubject":"Mail subject",
"mail2fBody":"Mail body",
"mail2fAuthnLevel":"认证等级",
"mail2fLabel":"Label",
"mail2fLogo":"Logo",
"mailBody":"Success mail content",
"mailCharset":"Charset",
@ -706,6 +709,7 @@
"rest2f":"REST second factor",
"rest2fActivation":"激活",
"rest2fAuthnLevel":"认证等级",
"rest2fLabel":"Label",
"rest2fInitArgs":"Init Arguments",
"rest2fInitUrl":"Init URL",
"rest2fLogo":"Logo",
@ -797,9 +801,11 @@
"timeoutActivity":"Sessions activity timeout",
"timeoutActivityInterval":"Sessions update interval",
"tokenUseGlobalStorage":"Use global storage",
"totp":"TOTP",
"totp2f":"TOTP",
"totp2fActivation":"激活",
"totp2fAuthnLevel":"TOTP authentication level",
"totp2fLabel":"Label",
"totp2fLogo":"Logo",
"totp2fDigits":"Number of digits",
"totp2fDisplayExistingSecret":"Display existing secret",
"totp2fInterval":"Interval",
@ -821,6 +827,8 @@
"u2f":"U2F",
"u2fActivation":"激活",
"u2fAuthnLevel":"U2F authentication level",
"u2fLabel":"Label",
"u2fLogo":"Logo",
"u2fSelfRegistration":"Self registration",
"u2fTTL":"Lifetime",
"u2fUserCanRemoveKey":"Allow user to remove U2F key",
@ -847,6 +855,8 @@
"utotp2f":"TOTP-or-U2F",
"utotp2fActivation":"激活",
"utotp2fAuthnLevel":"认证等级",
"utotp2fLabel":"Label",
"utotp2fLogo":"Logo",
"value":"Value",
"values":"Values",
"variables":"Variables",
@ -880,6 +890,8 @@
"yubikey2f":"Yubikey",
"yubikey2fActivation":"激活",
"yubikey2fAuthnLevel":"认证等级",
"yubikey2fLabel":"Label",
"yubikey2fLogo":"Logo",
"yubikey2fClientID":"API client ID",
"yubikey2fNonce":"Nonce",
"yubikey2fPublicIDSize":"OTP public ID part size",
@ -1024,4 +1036,4 @@
"samlRelayStateTimeout":"RelayState session timeout",
"samlUseQueryStringSpecific":"Use specific query_string method",
"samlOverrideIDPEntityID":"Override Entity ID when acting as IDP"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -96,7 +96,7 @@ sub init {
# Extra 2F modules
$self->logger->debug('Processing Extra 2F modules');
foreach my $extraKey (sort keys %{ $self->conf->{sfExtra} } ) {
foreach my $extraKey ( sort keys %{ $self->conf->{sfExtra} } ) {
my $moduleType = $self->conf->{sfExtra}->{$extraKey}->{type};
next unless ($moduleType);
@ -113,6 +113,12 @@ sub init {
my $rule = $self->conf->{sfExtra}->{$extraKey}->{rule} || 1;
my $prefix = $m->prefix;
# Overwrite logo and label from user configuration
$m->logo( $self->conf->{sfExtra}->{$extraKey}->{logo} )
if $self->conf->{sfExtra}->{$extraKey}->{logo};
$m->label( $self->conf->{sfExtra}->{$extraKey}->{label} )
if $self->conf->{sfExtra}->{$extraKey}->{label};
# Compile rule
$rule = $self->p->HANDLER->substitute($rule);
unless ( $rule = $self->p->HANDLER->buildSub($rule) ) {
@ -322,7 +328,14 @@ sub run {
MAIN_LOGO => $self->conf->{portalMainLogo},
SKIN => $self->p->getSkin($req),
TOKEN => $token,
MODULES => [ map { { CODE => $_->prefix, LOGO => $_->logo } } @am ],
MODULES => [
map { {
CODE => $_->prefix,
LOGO => $_->logo,
LABEL => $_->label
}
} @am
],
CHECKLOGINS => $checkLogins
}
);

View File

@ -29,9 +29,7 @@ sub init {
}
}
$self->prefix( $self->conf->{sfPrefix} )
if ( $self->conf->{sfPrefix} );
$self->logo( $self->conf->{ext2fLogo} )
if ( $self->conf->{ext2fLogo} );
if ( $self->conf->{sfPrefix} );
return $self->SUPER::init();
}
if ( $self->conf->{ext2fCodeActivation} ) {
@ -41,9 +39,7 @@ sub init {
}
$self->random( Lemonldap::NG::Common::Crypto::srandom() );
$self->prefix( $self->conf->{sfPrefix} )
if ( $self->conf->{sfPrefix} );
$self->logo( $self->conf->{ext2fLogo} )
if ( $self->conf->{ext2fLogo} );
if ( $self->conf->{sfPrefix} );
return $self->SUPER::init();
}
return 0;

View File

@ -45,8 +45,6 @@ sub init {
$self->error("Missing 'mailSessionKey' parameter, aborting");
return 0;
}
$self->logo( $self->conf->{mail2fLogo} )
if ( $self->conf->{mail2fLogo} );
$self->prefix( $self->conf->{sfPrefix} )
if ( $self->conf->{sfPrefix} );
return $self->SUPER::init();

View File

@ -30,8 +30,7 @@ sub init {
return 0;
}
$self->prefix( $self->conf->{sfPrefix} )
if ( $self->conf->{sfPrefix} );
$self->logo( $self->conf->{rest2fLogo} ) if ( $self->conf->{rest2fLogo} );
if ( $self->conf->{sfPrefix} );
foreach my $k ( keys %{ $self->conf->{rest2fInitArgs} } ) {
my $attr = $self->conf->{rest2fInitArgs}->{$k};
$attr =~ s/^$//;

View File

@ -103,8 +103,7 @@ sub run {
my $maxSize = $self->conf->{max2FDevices};
$self->logger->debug("Nbr 2FDevices = $size / $maxSize");
if ( $size >= $maxSize ) {
$self->userLogger->warn(
"Max number of 2F devices is reached");
$self->userLogger->warn("Max number of 2F devices is reached");
return $self->p->sendHtml(
$req, 'error',
params => {

View File

@ -125,8 +125,7 @@ sub verify {
unless ( $session->{__ch} and $session->{__ch} eq $challenge ) {
$self->userLogger->error(
"U2F challenge changed by user: $session->{__ch} / $challenge"
);
"U2F challenge changed by user: $session->{__ch} / $challenge");
$req->error(PE_BADCREDENTIALS);
return $self->fail($req);
}

View File

@ -356,7 +356,8 @@ sub reloadConf {
unless ( $_[0]->pdata->{keepPdata} ) {
$self->logger->debug('Cleaning pdata');
$_[0]->pdata( {} );
$self->userLogger->notice( $_[0]->user . ' connected' ) if $_[0]->user;
$self->userLogger->notice( $_[0]->user . ' connected' )
if $_[0]->user;
}
return PE_OK;
};

View File

@ -31,10 +31,21 @@ has prefix => ( is => 'rw' );
has logo => ( is => 'rw', default => '2f.png' );
has label => ( is => 'rw' );
has noRoute => ( is => 'ro' );
sub init {
my ($self) = @_;
# Set logo if overriden
$self->logo( $self->conf->{ $self->prefix . "2fLogo" } )
if ( $self->conf->{ $self->prefix . "2fLogo" } );
# Set label if provided, translation files will be used otherwise
$self->label( $self->conf->{ $self->prefix . "2fLabel" } )
if ( $self->conf->{ $self->prefix . "2fLabel" } );
unless ( $self->noRoute ) {
$self->logger->debug( 'Adding ' . $self->prefix . '2fcheck routes' );
$self->addAuthRoute(

View File

@ -132,6 +132,7 @@
"enterYubikey":"يرجى استخدام يوبي كي الخاص بك",
"errorMsg":"رسالة خاطئة",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"الاسم الاول",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"البريد",
"mail2f":"Email code",
"mailSent2":"تم إرسال رسالة إلى عنوان بريدك الإلكتروني.",
"maintenanceMode":"هذا التطبيق في صيانة، يرجى محاولة الاتصال في وقت لاحق",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"هل تريد إعادة إرسال رسالة التأكيد؟",
"resentConfirm":"هل تريد إعادة إرسال رسالة التأكيد؟",
"resetPwd":"إعادة تعيين كلمة المرور الخاصة بي",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":" إعادة تحميل الحقوق تحتاج إلى تسجيل الخروج وتسجيل الدخول مرة أخرى",
"scope":"نطاق",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"ابق على اتصال على هذا الجهاز",
"submit":"قدم",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"يرجى لمس جهاز U2F وامض الآن.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"نوع",
"u2f":"U2F Key",
"u2fFailed":"فشل التحقق من U2F. أعد محاولة الاتصال بالمشرف أو اتصل به",
"u2fPermission":"قد تتم مطالبتك بالسماح للموقع إذن الوصول إلى مفاتيح الأمان الخاصة بك.بعد منح الإذن، سيبدأ الجهاز في العملية.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"ترقية الجلسة",
"user":"المستخدم",
"useYubikey":"استخدم اليوبي كي الخاص بك",
"utotp2f":"TOTP-or-U2F",
"value":"القيمة",
"verify":"التحقق",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"رقم هاتفك",
"yourProfile":"ملفك الشخصي",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Benutze bitte deinen Yubikey",
"errorMsg":"Fehlermeldung",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fülle das Formular aus",
"firstName":"Vorname",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Von Dienstanbietern abmelden ...",
"macros":"MACROS",
"mail":"E-Mail",
"mail2f":"Email code",
"mailSent2":"Eine Nachricht wurde an deine E-Mail Adresse gesendet.",
"maintenanceMode":"Diese Anwendung ist in Wartung, bitte versuche später eine Verbindung herzustellen",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Bestätigungsmail erneuert senden ?",
"resentConfirm":"Möchtest du, dass die Bestätigungsmail erneut gesendet wird ?",
"resetPwd":"Mein Passwort zurücksetzen",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Zum Neuladen der Rechte musst du dich ab- und wieder anmelden",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Auf diesem Gerät verbunden bleiben",
"submit":"Absenden",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"Es existiert bereits ein TOTP-Secret",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Typ",
"u2f":"U2F Key",
"u2fFailed":"U2F-Überprüfung fehlgeschlagen. Versuchen Sie es erneut oder wenden Sie sich an Ihren Administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F - Geräteverwaltung",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"Benutzer",
"useYubikey":"Benutze deinen Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"Verify",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Ihre Telefonnummer",
"yourProfile":"Ihr Profil",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Please use your Yubikey",
"errorMsg":"Error Message",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"First name",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Mail",
"mail2f":"Email code",
"mailSent2":"A message has been sent to your mail address.",
"maintenanceMode":"This application is in maintenance, please try to connect later",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Resend confirmation mail?",
"resentConfirm":"Do you want the confirmation mail to be resent?",
"resetPwd":"Reset my password",
"rest2f":"Verification code",
"rightsReloadNeedsLogout": "Rights reloads need to logout and login again",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected": "Stay connected on this device",
"submit":"Submit",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice": "Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp": "Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed": "U2F verification failed. Retry or contact your administrator",
"u2fPermission": "You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome": "U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"User",
"useYubikey":"use your Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify": "Verify",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Your phone number",
"yourProfile":"Your profile",
"yourTotpKey":"Your TOTP key"
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Please use your Yubikey",
"errorMsg":"Error Message",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"First name",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Mail",
"mail2f":"Email code",
"mailSent2":"A message has been sent to your mail address.",
"maintenanceMode":"This application is in maintenance, please try to connect later",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Resend confirmation mail?",
"resentConfirm":"Do you want the confirmation mail to be resent?",
"resetPwd":"Reset my password",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Rights reloads need to logout and login again",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Stay connected on this device",
"submit":"Submit",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed":"U2F verification failed. Retry or contact your administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"User",
"useYubikey":"use your Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"Verify",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Your phone number",
"yourProfile":"Your profile",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Please use your Yubikey",
"errorMsg":"Virhe viesti",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"Etunimi",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Sähköposti",
"mail2f":"Email code",
"mailSent2":"Viesti on lähetetty sähköpostiisi.",
"maintenanceMode":"This application is in maintenance, please try to connect later",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Uudelleen lähetä vahvistus sähköposti?",
"resentConfirm":"Do you want the confirmation mail to be resent?",
"resetPwd":"Palauta salasanani?",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Rights reloads need to logout and login again",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Stay connected on this device",
"submit":"Lähetä",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed":"U2F verification failed. Retry or contact your administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"Käyttäjä",
"useYubikey":"Käytä Yubikeytä",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"Vahvista",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Puhelinnumerosi",
"yourProfile":"Profiilisi",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Utilisez votre Yubikey",
"errorMsg":"Message d'erreur",
"expired2Fremoved":"%s seconds facteurs expirés ont été supprimés !",
"ext2f":"Code de vérification",
"fillTheForm":"Remplissez le formulaire",
"forbidden":"Accès INTERDIT",
"firstName":"Prénom",
@ -161,6 +162,7 @@
"logoutFromSP":"Déconnexion des services ...",
"macros":"MACROS",
"mail":"Adresse mail",
"mail2f":"Code par mail",
"mailSent2":"Un message a été envoyé à votre adresse mail.",
"maintenanceMode":"Cette application est en maintenance, merci de réessayer plus tard",
"maxNumberof2FDevicesReached":"Nombre maximum de seconds facteurs atteint !",
@ -206,6 +208,7 @@
"resendConfirmMail":"Renvoyer le mail de confirmation ?",
"resentConfirm":"Voulez-vous que le message de confirmation soit renvoyé ?",
"resetPwd":"Réinitialiser mon mot de passe",
"rest2f":"Code de vérification",
"rightsReloadNeedsLogout": "Le rechargement des droits nécessite une déconnexion",
"scope": "Informations",
"search":"Chercher",
@ -221,10 +224,12 @@
"stayConnected": "Rester connecté sur cet appareil",
"submit":"Envoyer",
"switchContext":"Changer de contexte",
"totp2f":"Application OTP",
"totpExistingKey":"Un secret TOTP existe déjà !",
"touchU2fDevice": "Posez votre doigt sur le périphérique U2F",
"touchU2fDeviceOrEnterTotp": "Posez votre doigt sur le périphérique U2F ou entrez le code TOTP",
"type":"Type",
"u2f":"Clé U2F",
"u2fFailed": "La vérification U2F a échoué. Réessayez ou contactez votre administrateur",
"u2fPermission": "Il est possible qu'on vous demande d'autoriser le site à accéder à votre clef. Après votre accord, la clef clignotera.",
"u2fWelcome": "Gestion du périphérique U2F",
@ -235,6 +240,7 @@
"upgradeSession":"Se réauthentifier",
"user":"Utilisateur",
"useYubikey":"Utilisez votre Yubikey",
"utotp2f":"TOTP-ou-U2F",
"value":"Valeur",
"verify": "Vérifier",
"VHnotFound":"Hôte virtuel erroné ou inexistant",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Votre nouvelle clef TOTP. Testez-la et entrez le code",
"yourPhone":"Votre numéro de téléphone",
"yourProfile":"Vos informations personnelles",
"yourTotpKey":"Votre clef TOTP"
"yourTotpKey":"Votre clef TOTP",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Utilizza il tuo Yubikey",
"errorMsg":"Messaggio di errore",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Compila il modulo",
"firstName":"Nome",
"forbidden":"Accesso VIETATO",
@ -161,6 +162,7 @@
"logoutFromSP":"Disconnessione dai fornitori di servizi ...",
"macros":"MACROS",
"mail":"Mail",
"mail2f":"Email code",
"mailSent2":"Vi é stato inviato un messaggio via mail",
"maintenanceMode":"Questa applicazione è in manutenzione, prova a connetterti più tardi",
"maxNumberof2FDevicesReached":"Raggiunto il numero massimo di dispositivi 2F !",
@ -206,6 +208,7 @@
"resendConfirmMail":"Inviare nuovamente mail di conferma?",
"resentConfirm":"Vuoi inviare di nuovo la mail di conferma?",
"resetPwd":"Reimpostare la password",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Le ricariche dei diritti necessitano di disconnettersi e di riconnettersi",
"scope":"Ambito",
"search":"Ricerca",
@ -221,10 +224,12 @@
"stayConnected":"Resta connesso su questo dispositivo",
"submit":"Invia",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"Un segreto TOTP esiste già",
"touchU2fDevice":"Adesso tocca il dispositivo U2F lampeggiante.",
"touchU2fDeviceOrEnterTotp":"Tocca il dispositivo U2F lampeggiante o inserisci il codice TOTP.",
"type":"Tipo",
"u2f":"U2F Key",
"u2fFailed":"Verifica U2F non riuscita. Riprovare o contattare l'amministratore",
"u2fPermission":"È possibile che venga richiesto di consentire il permesso del sito per accedere alle chiavi di sicurezza. Dopo aver concesso il permesso, il dispositivo inizierà a lampeggiare.",
"u2fWelcome":"Gestione dei dispositivi U2F",
@ -235,6 +240,7 @@
"upgradeSession":"Sessione di aggiornamento",
"user":"Utente",
"useYubikey":"Usa la tua Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Valore",
"verify":"Verifica",
"VHnotFound":"Host virtuale non trovato",
@ -255,5 +261,6 @@
"yourNewTotpKey":"La tua nuova chiave TOTP, per favore provala e inserisci il codice",
"yourPhone":"Numero di telefono",
"yourProfile":"Il tuo profilo",
"yourTotpKey":"La tua chiave TOTP"
}
"yourTotpKey":"La tua chiave TOTP",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Please use your Yubikey",
"errorMsg":"Error Message",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"First name",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Mail",
"mail2f":"Email code",
"mailSent2":"A message has been sent to your mail address.",
"maintenanceMode":"This application is in maintenance, please try to connect later",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Resend confirmation mail?",
"resentConfirm":"Do you want the confirmation mail to be resent?",
"resetPwd":"Reset my password",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Rights reloads need to logout and login again",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Stay connected on this device",
"submit":"Submit",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed":"U2F verification failed. Retry or contact your administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"User",
"useYubikey":"use your Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"Verify",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Your phone number",
"yourProfile":"Your profile",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Please use your Yubikey",
"errorMsg":"Error Message",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"First name",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Mail",
"mail2f":"Email code",
"mailSent2":"A message has been sent to your mail address.",
"maintenanceMode":"This application is in maintenance, please try to connect later",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Resend confirmation mail?",
"resentConfirm":"Do you want the confirmation mail to be resent?",
"resetPwd":"Reset my password",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Rights reloads need to logout and login again",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Stay connected on this device",
"submit":"Submit",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed":"U2F verification failed. Retry or contact your administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"User",
"useYubikey":"use your Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"Verify",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Your phone number",
"yourProfile":"Your profile",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Please use your Yubikey",
"errorMsg":"Error Message",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"First name",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Mail",
"mail2f":"Email code",
"mailSent2":"A message has been sent to your mail address.",
"maintenanceMode":"This application is in maintenance, please try to connect later",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Resend confirmation mail?",
"resentConfirm":"Do you want the confirmation mail to be resent?",
"resetPwd":"Reset my password",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Rights reloads need to logout and login again",
"scope":"Scope",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Stay connected on this device",
"submit":"Submit",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed":"U2F verification failed. Retry or contact your administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Upgrade session",
"user":"User",
"useYubikey":"use your Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"Verify",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Your phone number",
"yourProfile":"Your profile",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"Vui lòng sử dụng Yubikey của bạn",
"errorMsg":"Thông báo lỗi",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"Tên",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"MACROS",
"mail":"Thư",
"mail2f":"Email code",
"mailSent2":"Một tin nhắn đã được gửi đến địa chỉ thư của bạn.",
"maintenanceMode":"Ứng dụng này đang trong quá trình bảo trì, hãy thử kết nối sau",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"Gửi lại thư xác nhận?",
"resentConfirm":"Bạn có muốn gửi lại thư xác nhận không?",
"resetPwd":"Đặt lại mật khẩu của tôi",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"Tải lại quyền cần đăng xuất và đăng nhập lại",
"scope":"Phạm vi",
"search":"Search",
@ -221,10 +224,12 @@
"stayConnected":"Giữ kết nối trên thiết bị này",
"submit":"Gửi",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Vui lòng chạm vào thiết bị U2F nhấp nháy ngay bây giờ.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Loại",
"u2f":"U2F Key",
"u2fFailed":"Xác minh U2F thất bại. Thử lại hoặc liên hệ với quản trị viên của bạn ",
"u2fPermission":"Bạn có thể được nhắc cho phép trang web được phép truy cập vào các khóa bảo mật của bạn. Sau khi cho phép, thiết bị sẽ bắt đầu nhấp nháy. ",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"Phiên nâng cấp",
"user":"Người dùng",
"useYubikey":"sử dụng Yubikey của bạn",
"utotp2f":"TOTP-or-U2F",
"value":"Giá trị",
"verify":"Xác minh",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"Số điện thoại của bạn",
"yourProfile":"Profile của bạn",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -132,6 +132,7 @@
"enterYubikey":"请使用您的Yubikey",
"errorMsg":"错误消息",
"expired2Fremoved":"%s expired 2F devices have been removed!",
"ext2f":"Verification code",
"fillTheForm":"Fill the form",
"firstName":"名",
"forbidden":"Access FORBIDDEN",
@ -161,6 +162,7 @@
"logoutFromSP":"Logout from service providers ...",
"macros":"宏",
"mail":"邮件",
"mail2f":"Email code",
"mailSent2":"已经发送一封邮件到您的邮箱",
"maintenanceMode":"程序维护中,请稍后再尝试连接。",
"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!",
@ -206,6 +208,7 @@
"resendConfirmMail":"重新发送确认邮件?",
"resentConfirm":"您想确认邮件被重新发送吗?",
"resetPwd":"重置我的密码",
"rest2f":"Verification code",
"rightsReloadNeedsLogout":"重新加载权限需要登出并且再次登录",
"scope":"Scope",
"search":"搜索",
@ -221,10 +224,12 @@
"stayConnected":"在该项设备上保持连接",
"submit":"提交",
"switchContext":"Switch context",
"totp2f":"OTP App",
"totpExistingKey":"A TOTP secret already exists",
"touchU2fDevice":"Please touch the flashing U2F device now.",
"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
"type":"Type",
"u2f":"U2F Key",
"u2fFailed":"U2F verification failed. Retry or contact your administrator",
"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.",
"u2fWelcome":"U2F device management",
@ -235,6 +240,7 @@
"upgradeSession":"升级会话",
"user":"用户",
"useYubikey":"使用您的 Yubikey",
"utotp2f":"TOTP-or-U2F",
"value":"Value",
"verify":"验证",
"VHnotFound":"Virtual Host not found",
@ -255,5 +261,6 @@
"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
"yourPhone":"您的电话号码",
"yourProfile":"您的档案",
"yourTotpKey":"Your TOTP key"
}
"yourTotpKey":"Your TOTP key",
"yubikey2f":"Yubikey"
}

View File

@ -9,6 +9,13 @@
<input type="hidden" name="skin" value="<TMPL_VAR NAME="SKIN">" />
<TMPL_LOOP NAME="MODULES">
<button type="submit" name="sf" value="<TMPL_VAR NAME="CODE">" class="mx-3">
<div class="card-header p-0">
<TMPL_IF LABEL>
<h4 class="mb-0"><TMPL_VAR NAME="LABEL"></h4>
<TMPL_ELSE>
<h4 class="mb-0" trspan="<TMPL_VAR NAME="CODE">2f"></h4>
</TMPL_IF>
</div>
<img src="<TMPL_VAR NAME="STATIC_PREFIX"><TMPL_VAR NAME="SKIN">/<TMPL_VAR NAME="LOGO">" alt="<TMPL_VAR NAME="CODE">2F" title="<TMPL_VAR NAME="CODE">2F" />
</button>
</TMPL_LOOP>

View File

@ -11,23 +11,23 @@ count(1);
my $client = LLNG::Manager::Test->new( {
ini => {
logLevel => 'error',
authentication => 'Demo',
userDB => 'Same',
'sfExtra' => {
logLevel => 'error',
authentication => 'Demo',
userDB => 'Same',
'sfExtra' => {
'home' => {
'over' => {
mail2fCodeRegex => '\w{4}',
mail2fLogo => 'home.jpg',
mail2fCodeRegex => '\w{4}',
},
'logo' => 'home.jpg',
'rule' => '$uid eq "dwho" or $uid eq "msmith"',
'type' => 'Mail2F'
},
'work' => {
'over' => {
mail2fLogo => 'work.jpg',
mail2fCodeRegex => '\d{8}',
mail2fCodeRegex => '\d{8}',
},
'logo' => 'work.jpg',
'rule' => '$uid eq "dwho" or $uid eq "rtyler"',
'type' => 'Mail2F'
}
@ -95,7 +95,6 @@ ok(
);
count(1);
# Expect choice page
my ( $host, $url, $query ) =
expectForm( $res, undef, '/2fchoice', 'token', 'checkLogins' );
@ -103,14 +102,14 @@ my ( $host, $url, $query ) =
ok(
$res->[2]->[0] =~
qq%<img src="/static/bootstrap/work.jpg" alt="work2F" title="work2F" />%,
'Found work.png'
'Found work.jpg'
) or print STDERR Dumper( $res->[2]->[0] );
count(1);
ok(
$res->[2]->[0] =~
qq%<img src="/static/bootstrap/home.jpg" alt="home2F" title="home2F" />%,
'Found home.png'
'Found home.jpg'
) or print STDERR Dumper( $res->[2]->[0] );
count(1);