diff --git a/README.md b/README.md index 571bddb6317162d760d1d2e1f79e7ced8c7c7331..b1c3e4fe6c388e4cae81be8d1243b463e693b7ef 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ It requires the following CPAN distributions: * CGI * Config-Tiny * DateTime -* HTTP-AcceptLanguage * List-MoreUtils * Log-Any * Rose-DB-Object diff --git a/lib/AccountManager/App.pm b/lib/AccountManager/App.pm index 984a199187f36bbfb36f5b52e026d33187cc0af0..07e0de4d548cb6989769c14e5a5c5572e269465f 100644 --- a/lib/AccountManager/App.pm +++ b/lib/AccountManager/App.pm @@ -6,7 +6,6 @@ use warnings; use CGI; use DateTime; use English qw(-no_match_vars); -use HTTP::AcceptLanguage; use Log::Any::Adapter; use List::MoreUtils qw(uniq); use Template; @@ -19,6 +18,7 @@ use AccountManager::Metadata; use AccountManager::Service; use AccountManager::Token; use AccountManager::Tools; +use AccountManager::L10N; # Format de type URL HTTP ou URN my $entity_id_pattern = qr{ @@ -61,6 +61,7 @@ sub new { } $self->{logger} = Log::Any->get_logger(); + $self->{lh} = AccountManager::L10N->get_handle(); $self->{cgi} = CGI->new(); @@ -175,14 +176,13 @@ sub respond { support_email => $self->{configuration}->{app}->{support_email}, version => $version, }; - - my $lang = HTTP::AcceptLanguage->new($ENV{HTTP_ACCEPT_LANGUAGE})->match(qw/en fr/) || 'en'; + $in{data}->{lh} = $self->{lh}; ## Parse template my $tt2 = Template->new({ ENCODING => 'utf8', PRE_CHOMP => CHOMP_ONE, - INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/web/$lang" + INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/web" }); $self->{logger}->debug("Responding with outer template '$in{template}' and inner template '$in{data}->{content}'"); @@ -479,12 +479,10 @@ sub req_complete_challenge { ); }; - my $lang = HTTP::AcceptLanguage->new($ENV{HTTP_ACCEPT_LANGUAGE})->match(qw/en fr/) || 'en'; - my $tt2 = Template->new({ ENCODING => 'utf8', PRE_CHOMP => CHOMP_ONE, - INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/mail/$lang" + INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/mail" }); my $template = 'send_authentication_token.tt2.eml'; my $data = { @@ -498,6 +496,7 @@ sub req_complete_challenge { to => $recipient, entityid => $self->{in}->{entityid}, token => $token->token(), + lh => $self->{lh}, }; binmode($handle, ":utf8"); @@ -508,7 +507,7 @@ sub req_complete_challenge { template => 'index-nobanner.tt2.html', data => { content => 'errors.tt2.html', - errors => [ "mail_notification_error" ] + errors => [ "mail_notification_failure" ] } ); } @@ -672,7 +671,7 @@ sub req_create_accounts { template => 'index.tt2.html', data => { content => 'errors.tt2.html', - errors => [ "accounts_creation_failed" ] + errors => [ "accounts_creation_failure" ] } ); } diff --git a/lib/AccountManager/L10N.pm b/lib/AccountManager/L10N.pm new file mode 100644 index 0000000000000000000000000000000000000000..515c038545977d603e837dc509faa3c57dd0f0ec --- /dev/null +++ b/lib/AccountManager/L10N.pm @@ -0,0 +1,8 @@ +package AccountManager::L10N; + +use strict; +use warnings; + +use base 'Locale::Maketext'; + +1; diff --git a/lib/AccountManager/L10N/en.pm b/lib/AccountManager/L10N/en.pm new file mode 100644 index 0000000000000000000000000000000000000000..83b4932e7928230a7cd3e387bb2b41305c386b33 --- /dev/null +++ b/lib/AccountManager/L10N/en.pm @@ -0,0 +1,12 @@ +package AccountManager::L10N::en; + +use strict; +use warnings; + +use base 'AccountManager::L10N'; + +our %Lexicon = ( + '_AUTO' => 1, +); + +1; diff --git a/lib/AccountManager/L10N/fr.pm b/lib/AccountManager/L10N/fr.pm new file mode 100644 index 0000000000000000000000000000000000000000..14789ff6472edbdf99f7bc463446b190380e83f4 --- /dev/null +++ b/lib/AccountManager/L10N/fr.pm @@ -0,0 +1,75 @@ +package AccountManager::L10N::fr; + +use strict; +use warnings; +use utf8; + +use base 'AccountManager::L10N'; + +our %Lexicon = ( + '_AUTO' => 1, + + "Objective" => "Objectif", + "eduGAIN Access Check allows administrators of a Service Provider (SP) registered in <a href=\"[_1]\">eduGAIN</a> federation to create test accounts with different profiles to validate the behaviour and test federated login." => "eduGAIN Access Check permet aux administrateurs d'un fournisseur de service (Service Provider) enregistré dans la fédération <a href=\"[_1]\">eduGAIN</a> de créer des comptes de test avec différents profils, afin de tester l'authentification fédérée et de valider le comportement du service.", + "The test accounts can only be used to access own services." => "Ces comptes de test ne peuvent être utilisés qu'avec ce service.", + "More information" => "Plus d'information", + "Functionning" => "Fonctionnement", + "Get started" => "Commencer", + "To start testing your own services, start by selecting one your are administrator for." => "Pour commencer à tester vos propres services, commencez par en sélectionner un dont vous êtes l'administrateur.", + "Error:" => "Erreur:", + "unknown action" => "action inconnue", + "internal error" => "erreur interne", + "the validation token you provided is incorrect or it has already been used" => "le code de validation fourni est incorrect, ou a déjà été utilisé", + "the validation token you provided cannot be used for this service provider ([_1])" => "le code de validation fourni n'est pas utilisable pour ce fournisseur de service ([_1])", + "mail notification failure" => "échec de notification par mail", + "test accounts creation failure" => "échec de création des comptes", + "missing parameter '[_1]'" => "paramètre manquant '[_1]'", + "You can report the issue to the administrators" => "Vous pouvez informer les administrateurs du problème", + "Select your service" => "Sélectionnez votre service", + "Please select the service that you want to test in the list below." => "Veuillez sélectionner le service que vous désirez tester dans la liste ci-dessous.", + "You must be an administrator of that service to continue afterwards."=> "Vous devez être administrateur de ce service pour continuer ensuite.", + "Type the name or entityID of service to test:" => "Entrez le nom ou l'identifiant (entityID) du service à tester:", + "Only Service Providers included in eduGAIN metadata are included in the list." => "Seuls les fournisseurs de service (Service Provider) inclus dans les métadonnées de la fédération eduGAIN sont inclus dans la liste/", + "Select your email address" => "Sélectionnez votre adresse e-mail", + "Complete email challenge" => "Validez le challenge e-mail", + "Test accounts" => "Comptes de test", + "Before you can create test accounts at this Identity Provider, we need to ensure you are a legitimate administrator of '[_1]'." => "Avant de pouvoir créer des comptes de test sur ce fournisseur d'identité, nous devons nous assurer que vous êtes un administateur légitime de '[_1]'", + "Select the email address where an email challenge can be sent to validate your identity:" => "Sélectionner l'adresse e-mail où envoyer un message pour valider votre identité:", + "Those email addresses have been extracted from your service metadata." => "Ces addresses e-mail ont été extraites des métadonnées pour votre service.", + "No ContactPerson element could be found in your service metadata, therefore we are unable to provide test accounts for this service." => "Aucun élément ContactPerson n'a pu être trouvées das les métadonnées de votre fournisseur de service, c'est pourquoi nous sommes incapable de fournir des comptes de test pour ce service.", + "Please contact your federation administrators to add needed information to the metadata." => "Veuillez contacter les administrateurs de votre fédération pour ajouter les informations nécessaires aux métadonnées.", + "An email challenge including a validation token has been emailed to you at [_1]." => "Un message incluant un code de validation vous a été envoyé à [_1].", + "Please copy and paste the validation token in the form below to proof that you are administrator of this service." => "Veuillez recopier ce code dans le formulaire ci-dessous pour prouver que vous êtes l'administatreur de ce service.", + "<strong>Success:</strong> your identity as administrator of the Service Provider with entityID <strong>[_1]</strong> has been validated!" => "<strong>Succès:</strong> votre identité comme administrateur du service <strong>[_1]</strong> a été validée!", + "Test accounts created" => "Comptes de test créés", + "You can now use these test accounts to login at your federated service." => "Vous pouvez maintenant utiliser ces comptes pour vous identifier sur votre service fédéré.", + "To do so, select <strong>[_1]</strong> when choosing an identity provider." => "Pour le faire, sélectionnez <strong>[_1]</strong> lors du choix du founisseur d'identité à utiliser.", + "Download in CSV format" => "Télécharger au format CSV", + "Account profile: [_1]" => "Profil d'utilisateur: [_1]", + "user name:" => "nom d'utilisateur:", + "password:" => "mot de passe:", + "comment:" => "commentaire:", + "show details" => "montrer les détails", + "List of user attributes" => "Liste des attributs utilisateur", + "Below is the list of user attributes associated to this test account." => "Voici la liste des attributs utilisateur associés à ce compte de test.", + "After a successfull authentication process these attributes are transmited via the SAML protocol from eduGAIN Access Check Identity Provider to your Service Provider." => "Ces attributs sont transmis via le protocole SAML, après une authentification réussie, du fournisseur d'identité eduGAIN Access Check à votre service.", + "value dynamically generated by the SP" => "valeur générée dynamiquement par le SP", + "If you need a customized test account with additional user attributes, you should contact <a href=\"mailto:[_1]\">[_1]</a>." => "Si vous avez besoin d'un compte de test avec eds attributs utilisateurs supplémentaires, vous devriez contacter <a href=\"mailto:[_1]\">[_1]</a>.", + "(1) eduPersonAffiliation and eduPersonScoppedAffilisation attributes are assigned quite differently from federation to federation." => "(1) les attributs eduPersonAffiliation et eduPersonScoppedAffilisation sont valorisés différement d'une fédération à une autre.", + "<a href=\"[_1]\">This usage comparison of eduPersonAffiliation accross different countries</a> discusses these differences." => "<a href=\"[_1]\">Cette comparaison des usages de l'attribut eduPersonAffiliation dans plusieurs pays</a> discute de ces différences.", + "Therefore its values should be handled with great care." => "C'est pourquoi ces valeurs doivent être traitées avec prudence.", + "Note that these test accounts will automatically expire in [_1] days and that they can only be used to test federated login to your eduGAIN-enabled Service Provider with entityID <strong>[_2]</strong>." => "Veuillez noter que ces comptes de test expirent automatiquement dans [_1] jours, et qu'ils ne peuvent être utilisés que pour tester l'authentification fédérée sur le service <strong>[_2]</strong>.", + "Thank you for using the eduGAIN Access Check" => "Merci d'avoir utilisé eduGain Access Check", + "Type the name or entityID of service to test:" => "Entrez le nom ou l'identifiant (entityID) du service à tester:", + "Please provide the validation token here:" => "Veuillez fournir le code de validation:", + "Test accounts request" => "Demande de comptes de test", + "This is an email challenge automatically sent to you by eduGAIN Access Check." => "Ceci est un message envoyé automatiquement par l'application eduGAIN Access Check.", + "Somebody with IP address [_1] has requested to create test accounts for eduGAIN Service Provider with entityID [_2]." => "Quelqu'un avec l'adresse IP [_1] a demandé la création de comptes de test pour le service [_2].", + "The address [_1] is mentioned in the eduGAIN metadata as a contact for this Service Provider." => "L'addresse [_1] est mentionnée dans les métadonnées de la fédération eduGAIN comme contact pour ce service.", + "To complete the creation of test accounts, paste the following validation token in the eduGAIN Access Check web form." => "Pour terminer la création de ces comptes de test, recopiez le code de validation suivant dans l'application eduGAIN Access Check.", + "Validation token:" => "Code de validation:", + "If the creation of test accounts was not initiated by you or a fellow administrator for the above Service Provider, please forward this email and contact [_1] to inform them about a potential abuse of the eduGAIN Access Check service." => "Si la création de comptes de test n'a pas été demandée par vous ou un autre administrateur du service mentionné plus haut, merci de transmettre ce message à [_1] afin d'informer d'une utilisation inappropriée de l'application eduGAIN Access Check.", + "Best Regards" => "Cordialement", +); + +1; diff --git a/lib/Makefile.am b/lib/Makefile.am index 14126a55dc8b5b27a55e0a436efee872f5edba64..ff9df00abc6d16ffced585818338ea28bc1e7a73 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -11,6 +11,9 @@ nobase_modules_DATA = \ AccountManager/Account.pm \ AccountManager/Account/Manager.pm \ AccountManager/Tools.pm \ + AccountManager/L10N.pm \ + AccountManager/L10N/en.pm \ + AccountManager/L10N/fr.pm \ AccountManager/App.pm EXTRA_DIST = $(nobase_modules_DATA) diff --git a/templates/Makefile.am b/templates/Makefile.am index 577e05907c8575953a7dcaa981e04df9588eb426..e1a743a469308dc2e58b5e18ebb9ef1467e85d74 100644 --- a/templates/Makefile.am +++ b/templates/Makefile.am @@ -1,22 +1,13 @@ nobase_templates_DATA = \ accounts/accounts.php.tt2 \ - mail/en/send_authentication_token.tt2.eml \ - mail/fr/send_authentication_token.tt2.eml \ - web/en/errors.tt2.html \ - web/en/home.tt2.html \ - web/en/index.tt2.html \ - web/en/index-nobanner.tt2.html \ - web/en/select_sp.tt2.html \ - web/en/select_email.tt2.html \ - web/en/complete_challenge.tt2.html \ - web/en/create_accounts.tt2.html \ - web/fr/errors.tt2.html \ - web/fr/home.tt2.html \ - web/fr/index.tt2.html \ - web/fr/index-nobanner.tt2.html \ - web/fr/select_sp.tt2.html \ - web/fr/select_email.tt2.html \ - web/fr/complete_challenge.tt2.html \ - web/fr/create_accounts.tt2.html + mail/send_authentication_token.tt2.eml \ + web/errors.tt2.html \ + web/home.tt2.html \ + web/index.tt2.html \ + web/index-nobanner.tt2.html \ + web/select_sp.tt2.html \ + web/select_email.tt2.html \ + web/complete_challenge.tt2.html \ + web/create_accounts.tt2.html EXTRA_DIST = $(nobase_templates_DATA) diff --git a/templates/mail/en/send_authentication_token.tt2.eml b/templates/mail/en/send_authentication_token.tt2.eml deleted file mode 100644 index a6861b35c046acd0b6ec3c1b8340dcf4788bf3c6..0000000000000000000000000000000000000000 --- a/templates/mail/en/send_authentication_token.tt2.eml +++ /dev/null @@ -1,18 +0,0 @@ -From: eduGAIN Access Check <[% from %]> -To: [% to %] -Subject: eduGAIN Access Check - Test accounts request -Content-type: text/plain; charset=UTF-8; format=flowed - -This is an email challenge automatically sent to you by eduGAIN Access Check. Somebody with IP address [% sourceip %] has requested to create test accounts for eduGAIN Service Provider with entityID [% entityid %]. -The address [% to %] is mentioned in the eduGAIN metadata as a contact for this Service Provider. - -To complete the creation of test accounts, paste the following validation token in the eduGAIN Access Check web form. - -Validation token: [% token %] - -eduGAIN Access Check: [% app.url %] - -If the creation of test accounts was not initiated by you or a fellow administrator for the above Service Provider, please forward this email and contact [% app.support_email %] to inform them about a potential abuse of the eduGAIN Access Check service. - -Best Regards -eduGAIN Access Check Bot diff --git a/templates/mail/fr/send_authentication_token.tt2.eml b/templates/mail/fr/send_authentication_token.tt2.eml deleted file mode 100644 index 5f83ded5a449bb6ce9e971b1ca5c845be98789e3..0000000000000000000000000000000000000000 --- a/templates/mail/fr/send_authentication_token.tt2.eml +++ /dev/null @@ -1,26 +0,0 @@ -From: eduGAIN Access Check <[% from %]> -To: [% to %] -Subject: eduGAIN Access Check - Demande de comptes de test -Content-type: text/plain; charset=UTF-8; format=flowed - -Ceci est un message envoyé automatiquement par l'application eduGAIN -Access Check. Quelqu'un avec l'adresse IP [% sourceip %] a demandé la -création de comptes de test pour le service [% entityid %]. L'addresse -[% to %] est mentionnée dans les métadonnées de la fédération eduGAIN -comme contact pour ce service. - -Pour terminer la création de ces comptes de test, recopiez le code de -validation suivant dans l'application eduGAIN Access Check. - -Code de validation: [% token %] - -eduGAIN Access Check: [% app.url %] - -Si la création de comptes de test n'a pas été demandée par vous ou un -autre administrateur du service mentionné plus haut, merci de -transmettre ce message à [% app.support_email %] afin d'informer -d'une utilisation inappropriée de l'application eduGAIN Access -Check. - -Cordialement -eduGAIN Access Check Bot diff --git a/templates/mail/send_authentication_token.tt2.eml b/templates/mail/send_authentication_token.tt2.eml new file mode 100644 index 0000000000000000000000000000000000000000..ca4dbac096ece25ba33342fb0fdc34cfccfb231d --- /dev/null +++ b/templates/mail/send_authentication_token.tt2.eml @@ -0,0 +1,19 @@ +From: eduGAIN Access Check <[% from %]> +To: [% to %] +Subject: eduGAIN Access Check - [% lh.maketex("Test accounts request") %] +Content-type: text/plain; charset=UTF-8; format=flowed + +[% lh.maketex("This is an email challenge automatically sent to you by eduGAIN Access Check.") %] +[% lh.maketex("Somebody with IP address [_1] has requested to create test accounts for eduGAIN Service Provider with entityID [_2].", sourceip, entityid) %] +[% lh.maketex("The address [_1] is mentioned in the eduGAIN metadata as a contact for this Service Provider.", to) %] + +[% lh.maketex("To complete the creation of test accounts, paste the following validation token in the eduGAIN Access Check web form.") %] + +[% lh.maketex("Validation token:") %] [% token %] + +eduGAIN Access Check: [% app.url %] + +[% lh.maketex("If the creation of test accounts was not initiated by you or a fellow administrator for the above Service Provider, please forward this email and contact [_1] to inform them about a potential abuse of the eduGAIN Access Check service.", app.support_email) %] + +[% lh.maketex("Best Regards") %] +eduGAIN Access Check Bot diff --git a/templates/web/complete_challenge.tt2.html b/templates/web/complete_challenge.tt2.html new file mode 100644 index 0000000000000000000000000000000000000000..256faaba62896680663348a3328d53f9456d1428 --- /dev/null +++ b/templates/web/complete_challenge.tt2.html @@ -0,0 +1,13 @@ +<h2>[% lh.maketext("Complete email challenge") %]</h2> +<p> + [% lh.maketext("An email challenge including a validation token has been emailed to you at [_1].") %] + [% lh.maketext("Please copy and paste the validation token in the form below to proof that you are administrator of this service.") %] +</p> + +<fieldset> + <label for="token">[% lh.maketext("Please provide the validation token here:") %]</label> + <input name="token" value="" id="token" type="text" class="required error"/> + <input type="hidden" name="entityid" value="[% entityid %]" id="entityid"/> + <input type="hidden" name="email" value="[% email %]" id="email"/> +</fieldset> + diff --git a/templates/web/create_accounts.tt2.html b/templates/web/create_accounts.tt2.html new file mode 100644 index 0000000000000000000000000000000000000000..9166655d0e47128af9f6bc5bd520b3445d4f9ec1 --- /dev/null +++ b/templates/web/create_accounts.tt2.html @@ -0,0 +1,93 @@ +<div class="grid-x align-center"> + <div class="cell shrink"> + <div class="callout success"> + [% lh.maketext("<strong>Success:</strong> your identity as administrator of the Service Provider with entityID <strong>[_1]</strong> has been validated!", entityid) %] + </div> + </div> +</div> + +<h3>[% lh.maketext("Test accounts created") %]</h3> +<p> + [% lh.maketext("You can now use these test accounts to login at your federated service.") %] + [% lh.maketext("To do so, select <strong>[_1]</strong> when choosing an identity provider.", idp_displayname) %] +</p> + +<p><a class="button" href="[% conf.app_url %]?action=download_accounts&entityid=[% entityid %]&token=[% token %]&key=[% key %]">[% lh.maketext("Download in CSV format") %]</a></p> + +<div class="accounts"> + [% FOREACH account IN accounts %] + <div class="account"> + <table> + <caption>[% lh.maketext("Account profile: [_1]", account.profile()) %]</caption> + <tr> + <td><strong>[% lh.maketext("user name:") %]</strong></td> + <td>user[% account.id() %]</td> + </tr> + <tr> + <td><strong>[% lh.maketext("password:") %]</strong></td> + <td>[% account.password() %]</td> + </tr> + <tr> + <td colspan="2"> + <strong>[% lh.maketext("comment:") %]</strong> + <div class="comment">[% account.comment() %]</div> + </td> + </tr> + <tr> + <td colspan="2" class="text-center" > + <button data-open="account_details_[% account.id() %]" class="button show_account_details" id="show_account_details_[% account.id() %]">[% lh.maketext("show details") %]</button> + </td> + </tr> + </table> + </div> + <div class="reveal" data-reveal id="account_details_[% account.id() %]"> + <button class="close-button" data-close aria-label="Close modal" type="button"> + <span aria-hidden="true">×</span> + </button> + <h3>[% lh.maketext("List of user attributes") %]</h3> + <p> + lh.maketext("Below is the list of user attributes associated to this test account.") %] + lh.maketext("After a successfull authentication process these attributes are transmited via the SAML protocol from eduGAIN Access Check Identity Provider to your Service Provider.") %] + </p> + <div> + <table> + <caption>[% lh.maketext("List of user attributes") %]</caption> + [% FOREACH attribute IN [ 'cn', 'displayName', 'givenName', 'sn', 'mail', 'schacHomeOrganization', 'schacHomeOrganizationType', 'eduPersonPrincipalName' ] %] + <tr> + <th>[% attribute %]</th><td>[% account.$attribute() %]</td> + </tr> + [% END %] + [% FOREACH attribute IN [ 'eduPersonAffiliation', 'eduPersonScopedAffiliation' ] %] + <tr> + <th>[% attribute %]</th><td>[% account.$attribute().join(', ') %]</td> + </tr> + [% END %] + <tr> + <th>eduPersonTargetedID:</th><td><i>[% lh.maketext("value dynamically generated by the SP") %]</i></td> + </tr> + </table> + </div> + + <div class="callout info">[% lh.maketext("If you need a customized test account with additional user attributes, you should contact <a href=\"mailto:[_1]\">[_1]</a>.", app.support_email) %]</div> + <div> + [% lh.maketext("(1) eduPersonAffiliation and eduPersonScoppedAffilisation attributes are assigned quite differently from federation to federation.") %] + [% lh.maketext("<a href=\"[_1]\">This usage comparison of eduPersonAffiliation accross different countries</a> discusses these differences.", "http://tnc2010.terena.org/files/ePSA%20comparison%20v0%2006.ppt") %] + [% lh.maketext("Therefore its values should be handled with great care.") %] + </div> + </div> + [% END %] +</div> + +<div class="grid-x align-center"> + <div class="cell shrink"> + <div class="callout warning"> + <p>[% lh.maketext("Note that these test accounts will automatically expire in [_1] days and that they can only be used to test federated login to your eduGAIN-enabled Service Provider with entityID <strong>[_2]</strong>.", accounts_validity_period, entityid) %]</p> + </div> + </div> +</div> + +<div class="grid-x align-center"> + <div class="cell shrink"> + <strong>[% lh.maketext("Thank you for using the eduGAIN Access Check") %]</strong> + </div> +</div> diff --git a/templates/web/en/complete_challenge.tt2.html b/templates/web/en/complete_challenge.tt2.html deleted file mode 100644 index 155695204f0a53b75455ff23db8ee29b95e9dd3b..0000000000000000000000000000000000000000 --- a/templates/web/en/complete_challenge.tt2.html +++ /dev/null @@ -1,12 +0,0 @@ -<h2>Complete email challenge</h2> -<p>An email challenge including a validation token has been emailed to you at -[% email %]. Please copy and paste the validation token in the form below to -proof that you are administrator of this service.</p> - -<fieldset> - <label for="token">Please provide the validation token here:</label> - <input name="token" value="" id="token" type="text" class="required error"/> - <input type="hidden" name="entityid" value="[% entityid %]" id="entityid"/> - <input type="hidden" name="email" value="[% email %]" id="email"/> -</fieldset> - diff --git a/templates/web/en/create_accounts.tt2.html b/templates/web/en/create_accounts.tt2.html deleted file mode 100644 index 82c73df9e9001137760dee33e6ebbb12ecda900a..0000000000000000000000000000000000000000 --- a/templates/web/en/create_accounts.tt2.html +++ /dev/null @@ -1,86 +0,0 @@ -<div class="grid-x align-center"> - <div class="cell shrink"> - <div class="callout success"> - <strong>Success:</strong> Your identity as administrator of the Service Provider with entityID <strong>[% entityid %]</strong> could successfully be validated! - </div> - </div> -</div> - -<h3>Test accounts created</h3> -<p>You can now use these test accounts to login at your federated service. To -do so, select <strong>[% idp_displayname %]</strong> when choosing an identity -provider.</p> - -<p><a class="button" href="[% conf.app_url %]?action=download_accounts&entityid=[% entityid %]&token=[% token %]&key=[% key %]">Download in CSV format</a></p> - -<div class="accounts"> - [% FOREACH account IN accounts %] - <div class="account"> - <table> - <caption>Account profile: [% account.profile() %]</caption> - <tr> - <td><strong>user name:</strong></td> - <td>user[% account.id() %]</td> - </tr> - <tr> - <td><strong>user password:</strong></td> - <td>[% account.password() %]</td> - </tr> - <tr> - <td colspan="2"> - <strong>comment:</strong> - <div class="comment">[% account.comment() %]</div> - </td> - </tr> - <tr> - <td colspan="2" class="text-center" > - <button data-open="account_details_[% account.id() %]" class="button show_account_details" id="show_account_details_[% account.id() %]">show details</button> - </td> - </tr> - </table> - </div> - <div class="reveal" data-reveal id="account_details_[% account.id() %]"> - <button class="close-button" data-close aria-label="Close modal" type="button"> - <span aria-hidden="true">×</span> - </button> - <h3>List of user attributes associated</h3> - <p>Below is the list of user attributes associated to this test account. After a successfull authentication process these attributes are transmited - via the SAML protocol from eduGAIN Access Check Identity Provider to your Service Provider.</p> - <div> - <table> - <caption>List of user attributes</caption> - [% FOREACH attribute IN [ 'cn', 'displayName', 'givenName', 'sn', 'mail', 'schacHomeOrganization', 'schacHomeOrganizationType', 'eduPersonPrincipalName' ] %] - <tr> - <th>[% attribute %]</th><td>[% account.$attribute() %]</td> - </tr> - [% END %] - [% FOREACH attribute IN [ 'eduPersonAffiliation', 'eduPersonScopedAffiliation' ] %] - <tr> - <th>[% attribute %]</th><td>[% account.$attribute().join(', ') %]</td> - </tr> - [% END %] - <tr> - <th>eduPersonTargetedID:</th><td><i>value dynamically generated by the SP</i></td> - </tr> - </table> - </div> - - <div class="callout info">If you need a customized test account with additional user attributes, you should contact <a href="mailto:[% app.support_email %]">[% app.support_email %]</a>.</div> - <div>(1) eduPersonAffiliation and eduPersonScoppedAffilisation attributes are assigned quite differently from federation to federation. <a href="http://tnc2010.terena.org/files/ePSA%20comparison%20v0%2006.ppt">This usage comparison of eduPersonAffiliation accross different countries</a> discusses these differences. Therefore its values should be handled with great care.</div> - </div> - [% END %] -</div> - -<div class="grid-x align-center"> - <div class="cell shrink"> - <div class="callout warning"> - <p>Note that these test accounts will automatically expire in [% accounts_validity_period %] days and that they can only be used to test federated login to your eduGAIN-enabled Service Provider with entityID <strong>[% entityid %]</strong>.</p> - </div> - </div> -</div> - -<div class="grid-x align-center"> - <div class="cell shrink"> - <strong>Thank you for using the eduGAIN Access Check</strong> - </div> -</div> diff --git a/templates/web/en/errors.tt2.html b/templates/web/en/errors.tt2.html deleted file mode 100644 index ae7b069e8fb17d681ac959ae6f35bbe5950690d7..0000000000000000000000000000000000000000 --- a/templates/web/en/errors.tt2.html +++ /dev/null @@ -1,34 +0,0 @@ -<div class="ui-widget"> - [% FOREACH err IN errors %] - - <p class="ui-state-error ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span> - Error: - - [% IF err == 'unknown_action' %] - unknown action - - [% ELSIF err == 'internal' %] - internal error; administrators of the federation registry have been notified. - - [% ELSIF err == 'wrong_token' %] - the validation token you provided is incorrect or it has already been used - - [% ELSIF err == 'wrong_token_for_sp' %] - the validation token you provided cannot be used to obtain test accounts for this service provider ([% entityid %]) - - [% ELSIF err == 'accounts_creation_failed' %] - failed to create your test accounts - - [% ELSIF (matches = err.match('missing_(\w+)')) %] - missing parameter '[% matches.0 %]' - - [% ELSE %] - [% err %] - - [% END %] - </p> - <br/> - [% END %] - - You can report the issue to the administrators (<a href="mailto:[% app.support_email %]">[% app.support_email %]</a>). -</div> diff --git a/templates/web/en/home.tt2.html b/templates/web/en/home.tt2.html deleted file mode 100644 index e966eec1d0bb6c349f9e0325408ee6b24847524d..0000000000000000000000000000000000000000 --- a/templates/web/en/home.tt2.html +++ /dev/null @@ -1,16 +0,0 @@ -<h2>Objective</h2> -<p>eduGAIN Access Check allows administrators of a Service Provider (SP) -registered in <a -href="http://www.geant.net/service/eduGAIN/Pages/home.aspx">eduGAIN</a> -federation to create test accounts with different profiles to validate the -behaviour and test federated login. The test accounts can only be used to -access own services.</p> -<p><a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Access+Check">More information</a></p> - -<h2>Functionning</h2> -<img class="float-center" alt="eduGAIN Access Check" src="images/edugain_test_idp_basics.png" height="50%" width="50%"/> - -<h2>Getting started</h2> -<p>To start testing your own services, start by selecting one your are administrator for.</p> -<p class="text-center"><a href="[% app.url %]?action=select_sp" class="button">Get started</a></p> - diff --git a/templates/web/en/select_email.tt2.html b/templates/web/en/select_email.tt2.html deleted file mode 100644 index 38baa39375d61723e96f6d53437f00bb3f595fc7..0000000000000000000000000000000000000000 --- a/templates/web/en/select_email.tt2.html +++ /dev/null @@ -1,31 +0,0 @@ -<h2>Select your email address</h2> -<p>Before you can create test accounts at this Identity Provider, we need to ensure you are a legitimate administrator of "[% provider.displayname %]".</p> - -<fieldset class="scrollable"> -[% IF provider.contacts.defined %] - <label for="entityid">Select the email address where an email challenge can be sent to validate your identity:</label> - <br> - <div class="radio_inline"> - [% FOREACH email IN provider.contacts.sort %] - <input name="email" value="[% email %]" type="radio" class="required"/><label for="email">[% email %]</label><br/> - [% END %] - <input type="hidden" name="entityid" value="[% provider.entityid %]" id="entityid"/> - </div> - <p>Those email addresses have been extracted from your service metadata.</p> - -[% ELSE %] - <p>No ContactPerson element could be found in your service metadata, therefore - we are unable to provide test accounts for this service. Please - contact your federation administrators to add needed - information to the metadata.</p> -[% END %] -</fieldset> - -<script type="text/javascript"> - $(function() { - $('label[for="email"]').on('click', function() { - var input = $(this).prev(); - input.val([input.attr('value')]); - }); - }); -</script> diff --git a/templates/web/errors.tt2.html b/templates/web/errors.tt2.html new file mode 100644 index 0000000000000000000000000000000000000000..59dfc88fb40cc5c9b171a3057529b72d45e917ac --- /dev/null +++ b/templates/web/errors.tt2.html @@ -0,0 +1,38 @@ +<div class="ui-widget"> + [% FOREACH err IN errors %] + + <p class="ui-state-error ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span> + [% lh.maketext("Error:") %] + + [% IF err == 'unknown_action' %] + [% lh.maketext("unknown action") %] + + [% ELSIF err == 'internal' %] + [% lh.maketext("internal error") %] + + [% ELSIF err == 'mail_notification_failure' %] + [% lh.maketext("mail notification failure") %] + + [% ELSIF err == 'accounts_creation_failure' %] + [% lh.maketext("test accounts creation failure") %] + + [% ELSIF err == 'wrong_token' %] + [% lh.maketext("the validation token you provided is incorrect or it has already been used") %] + + [% ELSIF err == 'wrong_token_for_sp' %] + [% lh.maketext("the validation token you provided cannot be used for this service provider ([_1])", entityid) %] + + + [% ELSIF (matches = err.match('missing_(\w+)')) %] + [% lh.maketext("missing parameter '[_1]'", matches.0) %] + + [% ELSE %] + [% err %] + + [% END %] + </p> + <br/> + [% END %] + + [% lh.maketext("You can report the issue to the administrators") %] (<a href="mailto:[% app.support_email %]">[% app.support_email %]</a>). +</div> diff --git a/templates/web/fr/complete_challenge.tt2.html b/templates/web/fr/complete_challenge.tt2.html deleted file mode 100644 index 445089b5062fc2675ef1992500124635cfb5fe10..0000000000000000000000000000000000000000 --- a/templates/web/fr/complete_challenge.tt2.html +++ /dev/null @@ -1,10 +0,0 @@ -<h2>Validez le challenge e-mail</h2> -<p>Un message incluant un code de validation vous a été envoyé à [% email %]. Veuillez recopier ce code dans le formulaire ci-dessous pour prouver que vous êtes l'administatreur de ce service.</p> - -<fieldset> - <label for="token">Veuillez fournir le code de validation:</label> - <input name="token" value="" id="token" type="text" class="required error"/> - <input type="hidden" name="entityid" value="[% entityid %]" id="entityid"/> - <input type="hidden" name="email" value="[% email %]" id="email"/> -</fieldset> - diff --git a/templates/web/fr/errors.tt2.html b/templates/web/fr/errors.tt2.html deleted file mode 100644 index f23521f6341613101df9467a08ebe0c1f94ec366..0000000000000000000000000000000000000000 --- a/templates/web/fr/errors.tt2.html +++ /dev/null @@ -1,33 +0,0 @@ -<div class="ui-widget"> - [% FOREACH err IN errors %] - <p class="ui-state-error ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span> - Error: - - [% IF err == 'unknown_action' %] - unknown action - - [% ELSIF err == 'internal' %] - internal error; administrators of the federation registry have been notified. - - [% ELSIF err == 'wrong_token' %] - the validation token you provided is incorrect or it has already been used - - [% ELSIF err == 'wrong_token_for_sp' %] - the validation token you provided cannot be used to obtain test accounts for this service provider ([% entityid %]) - - [% ELSIF err == 'accounts_creation_failed' %] - failed to create your test accounts - - [% ELSIF (matches = err.match('missing_(\w+)')) %] - missing parameter '[% matches.0 %]' - - [% ELSE %] - [% err %] - - [% END %] - </p> - <br/> - [% END %] - - You can report the issue to the administrators (<a href="mailto:[% app.support_email %]">[% app.support_email %]</a>). -</div> diff --git a/templates/web/fr/home.tt2.html b/templates/web/fr/home.tt2.html deleted file mode 100644 index 906bee1ae609a7256a30b9066eeb64d85d885dc5..0000000000000000000000000000000000000000 --- a/templates/web/fr/home.tt2.html +++ /dev/null @@ -1,16 +0,0 @@ -<h2>Objectif</h2> -<p>eduGAIN Access Check permet aux administrateurs d'un fournisseur de service -(Service Provider) enregistré dans la fédération <a -href="http://www.geant.net/service/eduGAIN/Pages/home.aspx">eduGAIN</a> de -créer des comptes de test avec différents profils, afin de tester -l'authentification fédérée et de valider le comportement du service. Ces -comptes de test ne peuvent être utilisés qu'avec ce service.</p> -<p><a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Access+Check">Plus d'information</a></p> - -<h2>Fonctionnement</h2> -<img class="float-center" alt="eduGAIN Access Check" src="images/edugain_test_idp_basics.png" height="50%" width="50%"/> - -<h2>Commencer</h2> -<p>Pour commencer à tester vos propres services, commencez par en sélectionner un dont vous êtes l'administrateur.</p> -<p class="text-center"><a href="[% app.url %]?action=select_sp" class="button">Commencer</a></p> - diff --git a/templates/web/fr/select_email.tt2.html b/templates/web/fr/select_email.tt2.html deleted file mode 100644 index 60aa40b5a739e733457aa78acc0d100b07996be9..0000000000000000000000000000000000000000 --- a/templates/web/fr/select_email.tt2.html +++ /dev/null @@ -1,32 +0,0 @@ -<h2>Sélectionnez votre adresse e-mail</h2> -<p>Avant de pouvoir créer des comptes de test sur ce fournisseur d'identité, nous devons nous assurer que vous êtes un administateur légitime de "[% provider.displayname %]".</p> - -<fieldset class="scrollable"> -[% IF provider.contacts.defined %] - <label for="entityid">Sélectionner l'adresse e-mail où envoyer un message pour valider votre identité:</label> - <br> - <div class="radio_inline"> - [% FOREACH email IN provider.contacts.sort %] - <input name="email" value="[% email %]" type="radio" class="required"/><label for="email">[% email %]</label><br/> - [% END %] - <input type="hidden" name="entityid" value="[% provider.entityid %]" id="entityid"/> - </div> - <p>Ces addresses e-mail ont été extraites des métadonnées pour votre service.</p> - -[% ELSE %] - <p>Aucun élément ContactPerson n'a pu être trouvées das les métadonnées de - votre fournisseur de service, c'est pourquoi nous sommes incapable de - fournir des comptes de test pour ce service. Veuillez contacter les - administrateurs de votre fédération pour ajouter les informations - nécessaires aux métadonnées.</p> -[% END %] -</fieldset> - -<script type="text/javascript"> - $(function() { - $('label[for="email"]').on('click', function() { - var input = $(this).prev(); - input.val([input.attr('value')]); - }); - }); -</script> diff --git a/templates/web/fr/select_sp.tt2.html b/templates/web/fr/select_sp.tt2.html deleted file mode 100644 index 4b643f4338a0a56064b611b66b747d8d5dd5aa98..0000000000000000000000000000000000000000 --- a/templates/web/fr/select_sp.tt2.html +++ /dev/null @@ -1,134 +0,0 @@ - <script type="text/javascript"> - -jQuery(document).ready(function($){ - - var form = $("#create-account-form").show(); - - form.steps({ - headerTag: "h3", - bodyTag: "fieldset", - stepsOrientation: "vertical", - transitionEffect: "slideLeft", - labels: { - next: "Suivant", - previous: "Précédent", - }, - onStepChanging: function (event, currentIndex, newIndex) - { - - // Trigger loading of the 'select_sp' with the selected SP entityid as parameter - // Result gets included in the next tab - if (currentIndex === 0 && newIndex === 1) - { - form.steps("remove", 1); - form.steps("insert", 1, { - title: "Sélectionnez votre adresse e-mail", - contentMode: "async", - contentUrl: "[% app.url %]?action=select_email&entityid="+ - encodeURIComponent($('#entityid').val()) - }); - } - - // Trigger loading of the 'generate_token' with the selected SP entityid as parameter - // Result gets included in the next tab - if (currentIndex === 1 && newIndex === 2) - { - form.steps("remove", 2); - form.steps("insert", 2, { - title: "Validez le challenge e-mail", - contentMode: "async", - contentUrl: "[% app.url %]?action=complete_challenge&entityid="+ - encodeURIComponent($('#entityid').val())+"&email="+encodeURIComponent($("input:checked[name='email']").val()) - }); - } - - // Trigger loading of the 'validate_token' with the list of test accounts created - // Result gets included in the next tab - if (currentIndex === 2 && newIndex === 3) - { - window.location="[% app.url %]?action=create_accounts&entityid="+ - encodeURIComponent($('#entityid').val())+"&token="+encodeURIComponent($('#token').val()) + - "&email="+encodeURIComponent($('#email').val()); - } - - // Allways allow previous action even if the current form is not valid! - if (currentIndex > newIndex) - { - return true; - } - // Needed in some cases if the user went back (clean up) - if (currentIndex < newIndex) - { - // To remove error styles - form.find(".body:eq(" + newIndex + ") label.error").remove(); - form.find(".body:eq(" + newIndex + ") .error").removeClass("error"); - } - form.validate().settings.ignore = ":disabled,:hidden"; - return form.valid(); - - }, - onStepChanged: function (event, currentIndex, priorIndex) - { - }, - onFinishing: function (event, currentIndex) - { - form.validate().settings.ignore = ":disabled"; - return form.valid(); - }, - onFinished: function (event, currentIndex) - { - alert("Submitted!"); - } - }); - - form.validate({ - errorPlacement: function errorPlacement(error, element) { element.before(error); }, - }); - -}); - -$(function() { - $( "#entityid" ).combobox(); - $( "#toggle" ).click(function() { - $( "#combobox" ).toggle(); - }); -}); - -</script> - - -<form id ="create-account-form" - action="[% env.SCRIPT_NAME %]" - method="POST"> - - <h3>Sélectionnez votre service</h3> - <fieldset> - <h2>Sélectionnez votre service</h2> - <p>Veuillez sélectionner le service que vous désirez tester dans la - liste ci-dessous. Vous devez être administrateur de ce service pour - continuer ensuite.</p> - - <label for="entityid">Entrez le nom ou l'identifiant (entityID) du service à tester:</label> - <br> - <select id="entityid" name="entityid" class="required"> - <option value=""></option> - [% FOREACH entity IN metadata.sort('display_name') %] - <option value="[% entity.entityid %]">[% IF entity.display_name %][% entity.display_name %] [% END %]([% entity.entityid %])</option> - [% END %] - </select> - <p>Seuls les fournisseurs de service (Service Provider) inclus dans les métadonnées de la fédération eduGAIN sont inclus dans la liste</p> - </fieldset> - - <h3>Sélectionnez votre adresse e-mail</h3> - <fieldset> - <div data-mode="async" data-url="/rest/service/0"></div> - </fieldset> - - <h3>Validez le challenge e-mail</h3> - <fieldset></fieldset> - - <h3>Comptes de test</h3> - <fieldset></fieldset> - - -</form> diff --git a/templates/web/home.tt2.html b/templates/web/home.tt2.html new file mode 100644 index 0000000000000000000000000000000000000000..d8a1ae131822f7a5b18af3aa8cb7791acff109ed --- /dev/null +++ b/templates/web/home.tt2.html @@ -0,0 +1,19 @@ +<h2>[% lh.maketext("Objective") %]</h2> +<p> +[% + lh.maketext( + "eduGAIN Access Check allows administrators of a Service Provider (SP) registered in <a href=\"[_1]\">eduGAIN</a> federation to create test accounts with different profiles to validate the behaviour and test federated login.", + "http://www.geant.net/service/eduGAIN/Pages/home.aspx" + ) +%] +[% lh.maketext("The test accounts can only be used to access own services.") %] +</p> +<p><a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Access+Check">[% lh.maketext("More information") %]</a></p> + +<h2>[% lh.maketext("Functionning") %]</h2> +<img class="float-center" alt="eduGAIN Access Check" src="images/edugain_test_idp_basics.png" height="50%" width="50%"/> + +<h2>[% lh.maketext("Get started") %]</h2> +<p>[% lh.maketext("To start testing your own services, start by selecting one your are administrator for.") %]</p> +<p class="text-center"><a href="[% app.url %]?action=select_sp" class="button">[% lh.maketext("Get started") %]</a></p> + diff --git a/templates/web/en/index-nobanner.tt2.html b/templates/web/index-nobanner.tt2.html similarity index 100% rename from templates/web/en/index-nobanner.tt2.html rename to templates/web/index-nobanner.tt2.html diff --git a/templates/web/en/index.tt2.html b/templates/web/index.tt2.html similarity index 100% rename from templates/web/en/index.tt2.html rename to templates/web/index.tt2.html diff --git a/templates/web/select_email.tt2.html b/templates/web/select_email.tt2.html new file mode 100644 index 0000000000000000000000000000000000000000..8a87e6adb581546c401bc019bc19dccfea08f499 --- /dev/null +++ b/templates/web/select_email.tt2.html @@ -0,0 +1,31 @@ +<h2>[% lh.maketext("Select your email address") %]</h2> +<p>[% lh.maketext("Before you can create test accounts at this Identity Provider, we need to ensure you are a legitimate administrator of '[_1]'.", provider.displayname) %]</p> + +<fieldset class="scrollable"> +[% IF provider.contacts.defined %] + <label for="entityid">[% lh.maketext("Select the email address where an email challenge can be sent to validate your identity:") %]</label> + <br> + <div class="radio_inline"> + [% FOREACH email IN provider.contacts.sort %] + <input name="email" value="[% email %]" type="radio" class="required"/><label for="email">[% email %]</label><br/> + [% END %] + <input type="hidden" name="entityid" value="[% provider.entityid %]" id="entityid"/> + </div> + <p>[% lh.maketext("Those email addresses have been extracted from your service metadata.") %]</p> + +[% ELSE %] + <p> + [% lh.maketext("No ContactPerson element could be found in your service metadata, therefore we are unable to provide test accounts for this service.") %] + [% lh.maketext("Please contact your federation administrators to add needed information to the metadata.") %] + </p> +[% END %] +</fieldset> + +<script type="text/javascript"> + $(function() { + $('label[for="email"]').on('click', function() { + var input = $(this).prev(); + input.val([input.attr('value')]); + }); + }); +</script> diff --git a/templates/web/en/select_sp.tt2.html b/templates/web/select_sp.tt2.html similarity index 81% rename from templates/web/en/select_sp.tt2.html rename to templates/web/select_sp.tt2.html index 01d41ccfb76557c2ebf77ff9ede0114506e2a4dd..3be067605799048b79b95567a9af73fb89c28b85 100644 --- a/templates/web/en/select_sp.tt2.html +++ b/templates/web/select_sp.tt2.html @@ -18,7 +18,7 @@ jQuery(document).ready(function($){ { form.steps("remove", 1); form.steps("insert", 1, { - title: "Select your email address", + title: "[% lh.maketext("Select your email address") %]", contentMode: "async", contentUrl: "[% app.url %]?action=select_email&entityid="+ encodeURIComponent($('#entityid').val()) @@ -31,7 +31,7 @@ jQuery(document).ready(function($){ { form.steps("remove", 2); form.steps("insert", 2, { - title: "Complete email challenge", + title: "[% lh.maketext("Complete email challenge") %]", contentMode: "async", contentUrl: "[% app.url %]?action=complete_challenge&entityid="+ encodeURIComponent($('#entityid').val())+"&email="+encodeURIComponent($("input:checked[name='email']").val()) @@ -97,14 +97,15 @@ $(function() { action="[% env.SCRIPT_NAME %]" method="POST"> - <h3>Select your service</h3> + <h3>[% lh.maketext("Select your service") %]</h3> <fieldset> - <h2>Select your service</h2> - <p>Please select the service that you want to test in the list - below. You must be an administrator of that service to - continue afterwards.</p> + <h2>[% lh.maketext("Select your service") %]</h2> + <p> + [% lh.maketext("Please select the service that you want to test in the list below.") %] + [% lh.maketext("You must be an administrator of that service to continue afterwards.") %] + </p> - <label for="entityid">Type the name or entityID of service to test:</label> + <label for="entityid">[% lh.maketext("Type the name or entityID of service to test:") %]</label> <br> <select id="entityid" name="entityid" class="required"> <option value=""></option> @@ -112,18 +113,18 @@ $(function() { <option value="[% entity.entityid %]">[% IF entity.display_name %][% entity.display_name %] [% END %]([% entity.entityid %])</option> [% END %] </select> - <p>Only Service Providers included in eduGAIN metadata are included in the list.</p> + <p>[% lh.maketext("Only Service Providers included in eduGAIN metadata are included in the list.") %]</p> </fieldset> - <h3>Select your email address</h3> + <h3>[% lh.maketext("Select your email address") %]</h3> <fieldset> <div data-mode="async" data-url="/rest/service/0"></div> </fieldset> - <h3>Complete email challenge</h3> + <h3>[% lh.maketext("Complete email challenge") %]</h3> <fieldset></fieldset> - <h3>Test accounts</h3> + <h3>[% lh.maketext("Test accounts") %]</h3> <fieldset></fieldset> </form>