18 <td><?=
GetMessage(
"SEC_OTP_NEW_ACCESS_DENIED")?></td>
26 || (
$USER->getID() !=
$ID && !
$USER->CanDoOperation(
'security_edit_user_otp'))
32$APPLICATION->AddHeadScript(
'/bitrix/js/security/admin/page/user-edit.js');
48 'SEC_OTP_ERROR_TITLE' =>
GetMessage(
'SEC_OTP_ERROR_TITLE'),
49 'SEC_OTP_UNKNOWN_ERROR' =>
GetMessage(
'SEC_OTP_UNKNOWN_ERROR')
52 'userId' => (
int)
$ID,
63 var settings = <?=Json::encode($jsSettings)?>;
64 new BX.Security.UserEdit.Otp(settings.userId, settings);
68<tr
style=
"display: none;">
70<div
id=
"otp-mobile-popup" class=
"otp-popup otp-mobile" data-
title=
"<?=GetMessage('SEC_OTP_CONNECT_MOBILE_TITLE')?>">
71 <div
class=
"otp-description">
73 <li><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_STEP_1')?></li>
74 <li><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_STEP_2')?></li>
75 <li><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_STEP_3')?></li>
78 <div
class=
"otp-connect">
79 <div
id=
"connect-by-qr">
80 <div
class=
"input-type">
81 <span
class=
"current"><?=
GetMessage(
'SEC_OTP_MOBILE_SCAN_QR')?></span><span
class=
"separator"><?=
GetMessage(
'SEC_OTP_MOBILE_INPUT_METHODS_SEPARATOR')?></span><a href=
"#" id=
"connect-mobile-manual-input"><?=
GetMessage(
'SEC_OTP_MOBILE_MANUAL_INPUT')?></a>
83 <div
style=
"margin-bottom: 20px">
84 <?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_SCAN_QR')?>
87 <div
class=
"input-wrapper">
88 <div data-role=
"qr-code-block" data-autoclear=
"yes" style=
"margin-top: 8px; margin-left: 8px;"></div>
92 <div
id=
"connect-by-manual-input" style=
"display: none;">
93 <div
class=
"input-type">
94 <a href=
"#" id=
"connect-mobile-scan-qr"><?=
GetMessage(
'SEC_OTP_MOBILE_SCAN_QR')?></a><span
class=
"separator"><?=
GetMessage(
'SEC_OTP_MOBILE_INPUT_METHODS_SEPARATOR')?></span><span
class=
"current"><?=
GetMessage(
'SEC_OTP_MOBILE_MANUAL_INPUT')?></span>
96 <div
style=
"margin-bottom: 20px">
97 <?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_MANUAL_INPUT')?>
98 <span
class=
"type-title" data-show-type=
"<?= Otp::TYPE_HOTP ?>"><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_MANUAL_INPUT_HOTP')?></span>
99 <span
class=
"type-title" data-show-type=
"<?= Otp::TYPE_TOTP ?>"><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_MANUAL_INPUT_TOTP')?></span>
103 <div
class=
"input-wrapper">
104 <div data-role=
"app-code-block" data-autoclear=
"yes" style=
"margin-left: auto; margin-right: auto; margin-top: 98px; font-weight: bold; text-align: center;">#APP_CODE#</div>
111 <?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_INPUT_DESCRIPTION')?>
114 <input type=
"text" dir=
"ltr" data-autoclear=
"yes" data-role=
"check-code" autocomplete=
"off" placeholder=
"<?=GetMessage('SEC_OTP_CONNECT_MOBILE_ENTER_CODE')?>">
116 <p data-require-two-codes=
"yes">
117 <?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE_INPUT_NEXT_DESCRIPTION')?>
119 <p data-require-two-codes=
"yes">
120 <input type=
"text" dir=
"ltr" data-autoclear=
"yes" data-role=
"check-code" autocomplete=
"off" placeholder=
"<?=GetMessage('SEC_OTP_CONNECT_MOBILE_ENTER_NEXT_CODE')?>">
122 <div data-role=
"error-container" class=
"error-wrapper" data-autoclear=
"yes"></div>
125<div
id=
"otp-device-popup" class=
"otp-popup otp-device" data-
title=
"<?=GetMessage('SEC_OTP_CONNECT_DEVICE_TITLE')?>">
133 <span
class=
"type-title" data-show-type=
"<?=$value?>">
144 <input type=
"text" autocomplete=
"off" data-autoclear=
"yes" data-role=
"secret-code" size=
"40" maxlength=
"64" value=
"">
147 <tr data-show-type=
"<?= Otp::TYPE_TOTP ?>">
152 <input type=
"text" autocomplete=
"off" data-autoclear=
"yes" data-role=
"start-timestamp" size=
"40" maxlength=
"20" value=
"">
156 <td colspan=
"2"><?=
GetMessage(
"SEC_OTP_INIT")?></td>
163 <input type=
"text" autocomplete=
"off" data-autoclear=
"yes" data-role=
"check-code" size=
"8" maxlength=
"8" value=
"">
166 <tr data-require-two-codes=
"yes">
171 <input type=
"text" autocomplete=
"off" data-autoclear=
"yes" data-role=
"check-code" size=
"8" maxlength=
"8" value=
"">
176 <div data-role=
"error-container" class=
"error-wrapper" data-autoclear=
"yes"></div>
181<div
id=
"otp-recovery-codes" class=
"otp-popup otp-recovery-codes" data-
title=
"<?=GetMessage('SEC_OTP_RECOVERY_CODES_TITLE')?>">
183 <?=
GetMessage(
'SEC_OTP_RECOVERY_CODES_DESCRIPTION')?>
186 <?=
GetMessage(
'SEC_OTP_RECOVERY_CODES_WARNING')?>
188 <div
class=
"input-wrapper">
190 <ol data-role=
"recoverycodes-container" class=
"codes-container" style=
"display: none;">
191 <li data-role=
"recoverycode-template" data-autoclear=
"yes">#CODE#</li>
196 <div
style=
"margin-top: 10px">
197 <input type=
"button" data-role=
"print-codes" value=
"<?=GetMessage('SEC_OTP_RECOVERY_CODES_PRINT')?>" />
198 <input type=
"button" data-role=
"save-codes" value=
"<?=GetMessage('SEC_OTP_RECOVERY_CODES_SAVE_FILE')?>" />
202 <div><?=
GetMessage(
'SEC_OTP_RECOVERY_CODES_REGENERATE_DESCRIPTION')?></div>
203 <div data-role=
"error-container" class=
"error-wrapper" data-autoclear=
"yes"></div>
205 <input type=
"button" data-role=
"regenerate-codes" value=
"<?=GetMessage('SEC_OTP_RECOVERY_CODES_REGENERATE')?>" />
209 * <?=
GetMessage(
'SEC_OTP_RECOVERY_CODES_NOTE')?>
215<?
if (!
$otp->isActivated()):?>
217 Otp::isMandatoryUsing()
218 &&
$otp->getInitialDate()
219 &&
$USER->CanDoOperation(
'security_edit_user_otp')
220 && !
$otp->canSkipMandatoryByRights()
224 <?
if (!
$otp->isMandatorySkipped()):?>
226 <?=getMessage(
'SEC_OTP_MANDATORY_EXPIRED')?>
227 <span
class=
"otp-link-button" id=
"otp-deffer"><?=
GetMessage(
'SEC_OTP_MANDATORY_DEFFER')?></span>
231 <?=getMessage(
'SEC_OTP_MANDATORY_ALMOST_EXPIRED',
array(
'#DATE#' =>
$otp->getDeactivateUntil()))?>
232 <span class=
"otp-link-button" id=
"otp-deffer"><?=
GetMessage(
'SEC_OTP_MANDATORY_DEFFER')?></span>
236 <?=getMessage(
'SEC_OTP_MANDATORY_DISABLED')?>
237 <span class=
"otp-link-button" id=
"otp-mandatory-active">
239 <?=
GetMessage(
'SEC_OTP_MANDATORY_ENABLE_DEFAULT')?>
250 <?
if (
$otp->isInitialized()):?>
251 <td
style=
"text-align: left;">
252 <a
class=
"adm-btn-save adm-btn" id=
"otp-activate"><?=
GetMessage(
'SEC_OTP_ENABLE')?></a>
257 <td
style=
"text-align: right;">
258 <a
class=
"adm-btn-save adm-btn adm-btn-menu" id=
"otp-connect-device"><?=
GetMessage(
'SEC_OTP_CONNECT_DEVICE')?></a>
259 <a
class=
"adm-btn-save adm-btn adm-btn-menu" id=
"otp-connect-mobile" style=
"margin-left: 20px;"><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE')?></a>
263 <a
class=
"adm-btn-save adm-btn adm-btn-menu" id=
"otp-connect-device"><?=
GetMessage(
'SEC_OTP_CONNECT_DEVICE')?></a>
264 <a
class=
"adm-btn-save adm-btn adm-btn-menu" id=
"otp-connect-mobile" style=
"margin-left: 20px;"><?=
GetMessage(
'SEC_OTP_CONNECT_MOBILE')?></a>
271 <h3
style=
"clear:both"><br><?=getMessage(
'SEC_OTP_DESCRIPTION_INTRO_TITLE')?></h3>
272 <div
style=
"float: left; margin-right: 20px">
273 <div
style=
"-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border: 2px solid #e0e3e5; border-radius: 2px; height: 156px; width: 156px; background: white url(/bitrix/images/security/etoken_pass.png?v2) no-repeat center center;"></div>
277 getMessage(
'SEC_OTP_DESCRIPTION_INTRO_INTRANET'):
278 getMessage(
'SEC_OTP_DESCRIPTION_INTRO_SITE'))?>
281 if (in_array(LANGUAGE_ID,
array(
'en',
'ru',
'de'), true))
282 $imageLanguage = LANGUAGE_ID;
286 <h3
style=
"clear:both"><br><?=getMessage(
'SEC_OTP_DESCRIPTION_USING_TITLE')?></h3>
287 <div
style=
"float: left; margin-right: 20px">
288 <div
style=
"-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border: 2px solid #e0e3e5; border-radius: 2px; padding: 5px 10px; background: white; height: 150px;">
289 <div
style=
"float: left; background: url(/bitrix/images/security/<?=$imageLanguage?>_login_step0.png) no-repeat top right; width: 220px; height: 120px; padding-top: 20px;" ><?=getMessage(
'SEC_OTP_DESCRIPTION_USING_STEP_0')?></div>
290 <div
style=
"float: left; background: url(/bitrix/images/security/<?=$imageLanguage?>_login_step1.png) no-repeat top right; width: 220px; height: 120px; padding-top: 20px; margin-left:20px;"><?=getMessage(
'SEC_OTP_DESCRIPTION_USING_STEP_1')?></div>
294 <?=getMessage(
'SEC_OTP_DESCRIPTION_USING')?>
296 <h3
style=
"clear:both"><br><?=getMessage(
'SEC_OTP_DESCRIPTION_ACTIVATION_TITLE')?></h3>
298 <?=getMessage(
'SEC_OTP_DESCRIPTION_ACTIVATION')?>
301 <h3><?=getMessage(
'SEC_OTP_DESCRIPTION_ABOUT_TITLE')?></h3>
303 <?=getMessage(
'SEC_OTP_DESCRIPTION_ABOUT')?>
310 <?
if (Otp::isRecoveryCodesEnabled()):?>
312 $codes = \Bitrix\Security\Mfa\RecoveryCodesTable::getList(
array(
313 'select' =>
array(
'ID'),
314 'filter' =>
array(
'=USER_ID' =>
$ID),
318 <tr data-role=
"otp-recovery-codes-warning">
321 "MESSAGE" =>
GetMessage(
'SEC_OTP_WARNING_RECOVERY_CODES'),
330 <td
style=
"text-align: left;">
331 <span><?=
GetMessage(
'SEC_OTP_CONNECTED')?></span>
333 !Otp::isMandatoryUsing()
334 ||
$otp->canSkipMandatory()
335 ||
$USER->CanDoOperation(
'security_edit_user_otp')
337 <span
class=
"otp-link-button" id=
"otp-deactivate"><?=
GetMessage(
'SEC_OTP_DISABLE')?></span>
339 <?
if (Otp::isRecoveryCodesEnabled()):?>
340 <span
class=
"otp-link-button" id=
"otp-show-recovery-codes"><?=
GetMessage(
'SEC_OTP_RECOVERY_CODES_BUTTON')?></span>
342 <?
if (
$USER->CanDoOperation(
'security_edit_user_otp')):?>
343 <span
class=
"otp-link-button" id=
"otp-reinitialize"><?=
GetMessage(
'SEC_OTP_SYNC_NOW')?></span>
346 <td
style=
"text-align: right;">
347 <a
class=
"adm-btn-save adm-btn adm-btn-menu" id=
"otp-connect-device"><?=
GetMessage(
'SEC_OTP_CONNECT_NEW_DEVICE')?></a>
348 <a
class=
"adm-btn-save adm-btn adm-btn-menu" id=
"otp-connect-mobile" style=
"margin-left: 20px;"><?=
GetMessage(
'SEC_OTP_CONNECT_NEW_MOBILE')?></a>
351 <?
if (
$USER->CanDoOperation(
'security_edit_user_otp')):?>
352 <tr
class=
"heading" style=
"display:none;" data-show-on-reinitialize=
"yes">
353 <td colspan=
"2"><?=
GetMessage(
"SEC_OTP_INIT")?></td>
354 <input type=
"hidden" name=
"profile_module_id[]" value=
"security">
356 <tr
style=
"display:none;" data-show-on-reinitialize=
"yes">
361 <input type=
"text" autocomplete=
"off" id=
"security_SYNC1" name=
"security_SYNC1" size=
"8" maxlength=
"8" value=
"">
364 <tr
style=
"display:none;" data-show-on-reinitialize=
"yes">
369 <input type=
"text" autocomplete=
"off" id=
"security_SYNC2" name=
"security_SYNC2" size=
"8" maxlength=
"8" value=
"">
static getDefaultLang($lang)
static ShowMessage($message)
static Init($arExt=array(), $bReturn=false)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(preg_match('/^ else[a-z0-9_]{2}$/i', $siteID)===1)
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
IsModuleInstalled($module_id)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
global_menu_<?echo $menu["menu_id"]?> adm main menu item icon adm main menu item text text adm main menu hover adm submenu menucontainer menu_id menu_id items_id items_id desktop menu_id block none adm global submenu<?=($subMenuDisplay=="block" ? " adm-global-submenu-active" :"")?> global_submenu_<?echo $menu["menu_id"]?> text MAIN_PR_ADMIN_FAV items adm submenu items wrap adm submenu items stretch wrap BX adminMenu itemsStretchScroll()"> <table class if (!empty( $menu["items"])) elseif ( $menu[ 'menu_id']=='desktop') if ( $menu[ 'menu_id']=='desktop') endforeach
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
<? endif;?> window document title
for($i=1; $i<=10; $i++) $jsMessages
$availableTypesDescription