Init Gitea
This commit is contained in:
42
Resource/template/admin/customer_edit.twig
Executable file
42
Resource/template/admin/customer_edit.twig
Executable file
@@ -0,0 +1,42 @@
|
||||
{#
|
||||
This file is part of EC-CUBE
|
||||
|
||||
Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
|
||||
http://www.ec-cube.co.jp/
|
||||
|
||||
For the full copyright and license information, please view the LICENSE
|
||||
file that was distributed with this source code.
|
||||
#}
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
$(".c-primaryCol").last().append($("#passkeys_setting").detach());
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="card rounded border-0 mb-4" id="passkeys_setting">
|
||||
<div class="card-header">
|
||||
<div class="row">
|
||||
<div class="col-8"><span class="card-title">{{ 'admin.customer.passkyes.title'|trans }}</span>
|
||||
</div>
|
||||
<div class="col-4 text-end">
|
||||
<a data-bs-toggle="collapse" href="#ordererInfo"
|
||||
aria-expanded="false" aria-controls="ordererInfo">
|
||||
<i class="fa fa-angle-up fa-lg"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse show ec-cardCollapse" id="ordererInfo">
|
||||
<div class="card-body">
|
||||
<div class="row mb-2">
|
||||
<div class="col-3">
|
||||
<span>{{ 'admin.customer.passkeys.authed'|trans }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
{{ form_widget(form.enable_passkeys) }}
|
||||
{{ form_errors(form.enable_passkeys) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
30
Resource/template/admin/shop_edit_tfa.twig
Normal file
30
Resource/template/admin/shop_edit_tfa.twig
Normal file
@@ -0,0 +1,30 @@
|
||||
{#
|
||||
This file is part of EC-CUBE
|
||||
|
||||
Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
|
||||
http://www.ec-cube.co.jp/
|
||||
|
||||
For the full copyright and license information, please view the LICENSE
|
||||
file that was distributed with this source code.
|
||||
#}
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
$('#passkeys_use_div > div.col-3 > div').tooltip();
|
||||
$("#ex-shop-customer").last().append($("#passkeys_use_div").detach());
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="row" id="passkeys_use_div">
|
||||
<div class="col-3">
|
||||
<div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
|
||||
title="{{ 'admin.setting.shop.shop.customer_passkey_auth_tooltip'|trans }}">
|
||||
<span>{{ 'admin.setting.shop.shop.customer_passkey_auth'|trans }}</span>
|
||||
<i class="fa fa-question-circle fa-lg ms-1"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col mb-2">
|
||||
{{ form_widget(form.passkeys_use) }}
|
||||
{{ form_errors(form.passkeys_use) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
192
Resource/template/default/passkey.twig
Normal file
192
Resource/template/default/passkey.twig
Normal file
@@ -0,0 +1,192 @@
|
||||
{#
|
||||
This file is part of EC-CUBE
|
||||
|
||||
Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
|
||||
|
||||
http://www.ec-cube.co.jp/
|
||||
|
||||
For the full copyright and license information, please view the LICENSE
|
||||
file that was distributed with this source code.
|
||||
#}
|
||||
{% extends 'default_frame.twig' %}
|
||||
|
||||
{% set body_class = 'mypage' %}
|
||||
|
||||
{% block stylesheet %}
|
||||
<style>
|
||||
.ec-login-header {
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
.ec-login-header > p {
|
||||
text-align: center;
|
||||
font: var(--unnamed-font-style-normal) normal medium 16px/22px YuGothic;
|
||||
letter-spacing: var(--unnamed-character-spacing-0);
|
||||
text-align: center;
|
||||
font: normal normal medium 16px/22px YuGothic;
|
||||
letter-spacing: 0px;
|
||||
color: #525263;
|
||||
opacity: 1;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block javascript %}
|
||||
<script src="{{ asset('passkeys/assets/dfido2-lib.js', 'plugin') }}"></script>
|
||||
<script>
|
||||
setFidoServerURL('https://fido2.amipro.me');//'https://mac-air-m2.dqj-home.com');
|
||||
var rp, full_uid, domain;
|
||||
window.onload = async function() {
|
||||
domain = window.location.hostname
|
||||
rp = domain + '.ec-cube.service';
|
||||
full_uid = "{{ Customer.username }}_"+domain;
|
||||
|
||||
if(!isWebAuthnSupported()){
|
||||
alert("パスキーをサポートしないブラウザを利用しているため、パスキー認証を無効にします。");
|
||||
$('#mode').val('no_webauthn');
|
||||
$('#passkey_form').submit();
|
||||
return;
|
||||
}
|
||||
|
||||
setTimeout(function(){
|
||||
$('#auto_message').hide();
|
||||
$('#login_form').show();
|
||||
$('#login_email').val("{{ Customer.username }}");
|
||||
$('#login_email').focus();
|
||||
}, 6000);
|
||||
|
||||
/*const sessionOk = await validSession(rp);
|
||||
if(sessionOk){
|
||||
alert("sessionOk: {{ url(succ_route) }}");
|
||||
window.location.href = "{{ url(succ_route) }}";
|
||||
return;
|
||||
}*/
|
||||
|
||||
//Try auth first
|
||||
await logoutFido2UserSession();
|
||||
|
||||
if(canTryAutoAuthentication()){
|
||||
if(await authenticate(full_uid)){
|
||||
const session = getSessionId();
|
||||
$('#mode').val('login_succ');
|
||||
$('#pk_session').val(session);
|
||||
$('#rp').val(rp);
|
||||
|
||||
//alert("{{ succ_route }}"+"|"+full_uid+"|"+session);
|
||||
$('#passkey_form').submit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//Try register
|
||||
alert("生体認証を有効するために、次の画面で生体認証を行ってください。");
|
||||
await register(full_uid);
|
||||
};
|
||||
|
||||
async function clickedAuthenticate(){
|
||||
var uid = $('#login_email').val()
|
||||
if(uid && 0==uid.length)uid=full_uid
|
||||
else uid = uid+'_'+domain;
|
||||
|
||||
if(await authenticate(uid)){
|
||||
const session = getSessionId();
|
||||
$('#mode').val('login_succ');
|
||||
$('#pk_session').val(session);
|
||||
$('#rp').val(rp);
|
||||
|
||||
//alert("{{ succ_route }}"+"|"+uid+"|"+session);
|
||||
$('#passkey_form').submit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
async function authenticate(uid_full){
|
||||
const result = await authenticateFido2(uid_full, rp);
|
||||
|
||||
if(result.status === 'ok'){
|
||||
return true;
|
||||
}else{
|
||||
errProcessFido2(result)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function clickedRegister(){
|
||||
var uid = $('#login_email').val()
|
||||
if(uid && 0==uid.length)uid=full_uid;
|
||||
else uid = uid+'_'+domain;
|
||||
|
||||
await register(uid);
|
||||
}
|
||||
|
||||
async function register(uid_full){
|
||||
const result = await registerFido2(uid_full, 'dis_'+uid_full, rp);
|
||||
|
||||
if(result.status === 'ok'){
|
||||
const session = getSessionId();
|
||||
$('#mode').val('login_succ');
|
||||
$('#pk_session').val(session);
|
||||
$('#rp').val(rp);
|
||||
|
||||
//alert("Reg succ:{{ succ_route }}"+"|"+uid_full+"|"+session);
|
||||
$('#passkey_form').submit();
|
||||
return;
|
||||
}else{
|
||||
const msg = errMessageFido2(result);
|
||||
//alert('reg err:'+msg);
|
||||
if(msg && msg.startsWith('Fido2LibErr105')){
|
||||
//alert('retry auth:'+msg);
|
||||
if(await authenticate(rp)){
|
||||
const session = getSessionId();
|
||||
$('#mode').val('login_succ');
|
||||
$('#pk_session').val(session);
|
||||
$('#rp').val(rp);
|
||||
|
||||
//alert("{{ succ_route }}"+"|"+uid+"|"+session);
|
||||
$('#passkey_form').submit();
|
||||
return;
|
||||
}
|
||||
}else alert(msg)
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
{% endblock javascript %}
|
||||
|
||||
{% block main %}
|
||||
<div class="ec-role">
|
||||
<div class="ec-pageHeader">
|
||||
<h1>{{ 'front.passkeys.title'|trans }}</h1>
|
||||
</div>
|
||||
<div class="ec-off2Grid">
|
||||
<div class="ec-off2Grid__cell">
|
||||
<form name="passkey_form" id="passkey_form" method="post"
|
||||
action="{{ url('plg_customer_passkey_page') }}">
|
||||
<input type="hidden" name="mode" id="mode" value="login">
|
||||
<input type="hidden" name="pk_session" id="pk_session" value="">
|
||||
<input type="hidden" name="rp" id="rp" value="">
|
||||
|
||||
<div class="ec-login ec-login-header" id='auto_message'>
|
||||
<p>{{ 'front.passkeys.message'|trans|nl2br }}</p>
|
||||
</div>
|
||||
<div class="ec-login" id='login_form' style='display:none;'>
|
||||
<!-- div class="ec-login__icon">
|
||||
<div class="ec-icon"><img src="{{ asset('assets/icon/user.svg') }}" alt=""></div>
|
||||
</div -->
|
||||
<div class="ec-login__input">
|
||||
<div class="ec-input">
|
||||
<input type="text" name="login_email" id="login_email" class="ec-input__field"
|
||||
placeholder="{{ 'front.passkeys.email'|trans }}" value="{{ Customer.username }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ec-cartNaviIsset__action">
|
||||
<a class="ec-blockBtn--primary" href="javascript:clickedAuthenticate();">{{ 'front.passkeys.auth'|trans }}</a>
|
||||
<br><br>
|
||||
<a class="ec-blockBtn--action" href="javascript:clickedRegister();">{{ 'front.passkeys.register'|trans }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user