150 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * @package     Joomla.Plugin
 | |
|  * @subpackage  System.webauthn
 | |
|  *
 | |
|  * @copyright   (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
 | |
|  * @license     GNU General Public License version 2 or later; see LICENSE.txt
 | |
|  */
 | |
| 
 | |
| defined('_JEXEC') or die;
 | |
| 
 | |
| use Joomla\CMS\Factory;
 | |
| use Joomla\CMS\HTML\HTMLHelper;
 | |
| use Joomla\CMS\Language\Text;
 | |
| use Joomla\CMS\Layout\FileLayout;
 | |
| use Joomla\CMS\User\User;
 | |
| use Webauthn\PublicKeyCredentialSource;
 | |
| 
 | |
| /**
 | |
|  * Passwordless Login management interface
 | |
|  *
 | |
|  * Generic data
 | |
|  *
 | |
|  * @var   FileLayout $this        The Joomla layout renderer
 | |
|  * @var   array      $displayData The data in array format. DO NOT USE.
 | |
|  *
 | |
|  * Layout specific data
 | |
|  *
 | |
|  * @var   User       $user                The Joomla user whose passwordless login we are managing
 | |
|  * @var   bool       $allow_add           Are we allowed to add passwordless login methods
 | |
|  * @var   array      $credentials         The already stored credentials for the user
 | |
|  * @var   string     $error               Any error messages
 | |
|  * @var   array      $knownAuthenticators Known authenticator metadata
 | |
|  * @var   boolean    $attestationSupport  Is authenticator attestation supported in the plugin?
 | |
|  */
 | |
| 
 | |
| // Extract the data. Do not remove until the unset() line.
 | |
| try {
 | |
|     $app          = Factory::getApplication();
 | |
|     $loggedInUser = $app->getIdentity();
 | |
| 
 | |
|     $app->getDocument()->getWebAssetManager()
 | |
|         ->registerAndUseStyle('plg_system_webauthn.backend', 'plg_system_webauthn/backend.css');
 | |
| } catch (Exception $e) {
 | |
|     $loggedInUser = new User();
 | |
| }
 | |
| 
 | |
| $defaultDisplayData = [
 | |
|         'user'                => $loggedInUser,
 | |
|         'allow_add'           => false,
 | |
|         'credentials'         => [],
 | |
|         'error'               => '',
 | |
|         'knownAuthenticators' => [],
 | |
|         'attestationSupport'  => true,
 | |
| ];
 | |
| extract(array_merge($defaultDisplayData, $displayData));
 | |
| 
 | |
| if ($displayData['allow_add'] === false) {
 | |
|     $error = Text::_('PLG_SYSTEM_WEBAUTHN_CANNOT_ADD_FOR_A_USER');
 | |
|     $allow_add = false;
 | |
| }
 | |
| 
 | |
| // Ensure the GMP or BCmath extension is loaded in PHP - as this is required by third party library
 | |
| if ($allow_add && function_exists('gmp_intval') === false && function_exists('bccomp') === false) {
 | |
|     $error = Text::_('PLG_SYSTEM_WEBAUTHN_REQUIRES_GMP');
 | |
|     $allow_add = false;
 | |
| }
 | |
| 
 | |
| Text::script('JGLOBAL_CONFIRM_DELETE');
 | |
| 
 | |
| HTMLHelper::_('bootstrap.tooltip', '.plg_system_webauth-has-tooltip');
 | |
| ?>
 | |
| <div class="plg_system_webauthn" id="plg_system_webauthn-management-interface">
 | |
|     <?php
 | |
|     if (is_string($error) && !empty($error)) : ?>
 | |
|         <div class="alert alert-danger">
 | |
|             <?php echo htmlentities($error) ?>
 | |
|         </div>
 | |
|     <?php endif; ?>
 | |
| 
 | |
|     <table class="table table-striped">
 | |
|         <caption class="visually-hidden">
 | |
|             <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_TABLE_CAPTION'); ?>,
 | |
|         </caption>
 | |
|         <thead class="table-dark">
 | |
|         <tr>
 | |
|             <th <?php if ($attestationSupport) :
 | |
|                 ?>colspan="2"<?php
 | |
|                 endif; ?> scope="col">
 | |
|                 <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_FIELD_KEYLABEL_LABEL') ?>
 | |
|             </th>
 | |
|             <th scope="col"><?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_HEADER_ACTIONS_LABEL') ?></th>
 | |
|         </tr>
 | |
|         </thead>
 | |
|         <tbody>
 | |
|         <?php
 | |
|         foreach ($credentials as $method) : ?>
 | |
|             <tr data-credential_id="<?php echo $method['id'] ?>">
 | |
|                 <?php
 | |
|                 if ($attestationSupport) :
 | |
|                     $aaguid = ($method['credential'] instanceof PublicKeyCredentialSource) ? $method['credential']->getAaguid() : '';
 | |
|                     $authMetadata = $knownAuthenticators[$aaguid->toString()] ?? $knownAuthenticators[''];
 | |
|                     ?>
 | |
|                 <td class="text-center">
 | |
|                     <img class="plg_system_webauth-has-tooltip bg-secondary"
 | |
|                          style="max-width: 6em; max-height: 3em"
 | |
|                          src="<?php echo $authMetadata->icon ?>"
 | |
|                          alt="<?php echo $authMetadata->description ?>"
 | |
|                          title="<?php echo $authMetadata->description ?>">
 | |
|                 </td>
 | |
|                 <?php endif; ?>
 | |
|                 <th scope="row" class="webauthnManagementCell"><?php echo htmlentities($method['label']) ?></th>
 | |
|                 <td class="webauthnManagementCell">
 | |
|                     <button class="plg_system_webauthn-manage-edit btn btn-secondary">
 | |
|                         <span class="icon-edit" aria-hidden="true"></span>
 | |
|                         <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_BTN_EDIT_LABEL') ?>
 | |
|                     </button>
 | |
|                     <button class="plg_system_webauthn-manage-delete btn btn-danger">
 | |
|                         <span class="icon-minus" aria-hidden="true"></span>
 | |
|                         <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_BTN_DELETE_LABEL') ?>
 | |
|                     </button>
 | |
|                 </td>
 | |
|             </tr>
 | |
|         <?php endforeach; ?>
 | |
|         <?php
 | |
|         if (empty($credentials)) : ?>
 | |
|             <tr>
 | |
|                 <td colspan="<?php echo $attestationSupport ? '3' : '2'; ?>">
 | |
|                     <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_HEADER_NOMETHODS_LABEL') ?>
 | |
|                 </td>
 | |
|             </tr>
 | |
|         <?php endif; ?>
 | |
|         </tbody>
 | |
|     </table>
 | |
| 
 | |
|     <?php
 | |
|     if ($allow_add) : ?>
 | |
|         <p class="plg_system_webauthn-manage-add-container">
 | |
|             <button
 | |
|                 type="button"
 | |
|                 id="plg_system_webauthn-manage-add"
 | |
|                 class="btn btn-success w-100">
 | |
|                 <span class="icon-plus" aria-hidden="true"></span>
 | |
|                 <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_BTN_ADD_LABEL') ?>
 | |
|             </button>
 | |
|         </p>
 | |
|     <?php endif; ?>
 | |
| </div>
 |