Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions apps/style/login.css
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,37 @@
transition: 80ms;
}

#login-password {
display: none;
width: 220px;
margin-bottom: 10px;
padding: 7px 10px;
color: #fff;
background-color: #eeeeee40;
border: 2px solid #ffffff50;
border-radius: 6px;
outline: none;
text-align: center;
}

#login-password::placeholder {
color: #ffffffaa;
}

#login-error {
display: none;
min-height: 18px;
margin-bottom: 8px;
color: #fff;
font-size: 14px;
text-shadow: 0 1px 3px #000;
}

#loginback.tauri-password #login-password,
#loginback.tauri-password #login-error {
display: block;
}

:root.corner_squ #login {
corner-shape: squircle;
border-radius: 15px;
Expand Down
23 changes: 23 additions & 0 deletions apps/style/setting.css
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,29 @@
box-shadow: 0 1px 2px 1px var(--s3d);
}

.setting-password {
display: grid;
gap: 10px;
}

.setting-password>div>p:first-child {
font-size: 18px;
}

.setting-password>div>p:last-child {
color: var(--text2);
}

.setting-password>.button {
width: max-content;
padding: 5px 18px;
}

.setting-password>.button.disabled {
pointer-events: none;
opacity: 0.6;
}

.checkbox {
width: 40px;
height: 20px;
Expand Down
29 changes: 15 additions & 14 deletions desktop.html
Original file line number Diff line number Diff line change
Expand Up @@ -188,19 +188,9 @@
<div class="user"></div>
<div class="name">Administrator</div>

<div id="login" onclick="$(this).css('opacity','0');$('#login-welc').css('opacity','1');
setTimeout(() => {
$('#loginback').addClass('close');
setTimeout(() => {
$('#loginback').css('opacity', '0');
}, 500);
setTimeout(() => {
$('#loginback').css('display', 'none');
}, 2000);
if(use_music){
document.querySelector('audio#startup-music').play();
}
}, 2000);" data-i18n="login">
<input id="login-password" type="password" autocomplete="current-password" placeholder="密码" onkeydown="if(event.keyCode==13){win12LoginSubmit();}">
<div id="login-error"></div>
<div id="login" onclick="win12LoginSubmit();" data-i18n="login">
登录
</div>
<div id="login-welc" style="opacity: 0;">
Expand Down Expand Up @@ -1558,7 +1548,18 @@ <h2 data-i18n="defender.recreq">请求记录</h2>
<div class="setting-list">
<a><icon></icon><div><p>您的微软账户</p><p>订阅、账单等</p></div><i class="bi bi-chevron-right"></i></a>
<a><icon></icon><div><p>您的账户信息</p><p>电子邮件、日历和联系人使用的帐户</p></div><i class="bi bi-chevron-right"></i></a>
<a><icon></icon><div><p>登录选项</p><p>Windows Hello、安全密钥、密码、动态锁</p></div><i class="bi bi-chevron-right"></i></a>
<a class="dp sign-in-options" onclick="$('.dp.sign-in-options').toggleClass('show');win12RefreshPasswordSettingStatus();"><icon></icon><div><p>登录选项</p><p>Windows Hello、安全密钥、密码、动态锁</p></div><i class="bi bi-chevron-down"></i></a>
<div class="dp sign-in-options">
<div class="setting-password">
<div>
<p>密码</p>
<p id="setting-password-status">加载中</p>
</div>
<input id="setting-password-current" class="input" type="password" autocomplete="current-password" placeholder="当前密码">
<input id="setting-password-new" class="input" type="password" autocomplete="new-password" placeholder="新密码" onkeydown="if(event.keyCode==13){win12SetLoginPassword();}">
<a id="setting-password-submit" class="a button" onclick="win12SetLoginPassword();">保存</a>
</div>
</div>
<a><icon></icon><div><p>电子邮件和账户</p><p>电子邮件、日历和联系人使用的帐户</p></div><i class="bi bi-chevron-right"></i></a>
<a><icon></icon><div><p>家庭</p><p>管理您的家庭群组、编辑帐户类型和设备权限</p></div><i class="bi bi-chevron-right"></i></a>
<a><icon></icon><div><p>Windows 备份</p><p>备份您的文件、应用程序、首选项以跨设备恢复它们</p></div><i class="bi bi-chevron-right"></i></a>
Expand Down
154 changes: 152 additions & 2 deletions desktop.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,151 @@ function stop(e) {
e.stopPropagation();
return false;
}

let loginPasswordHasPassword = false;

function win12FinishLogin() {
$('#login').css('opacity', '0');
$('#login-password').css('opacity', '0');
$('#login-error').css('opacity', '0');
$('#login-welc').css('opacity', '1');
setTimeout(() => {
$('#loginback').addClass('close');
setTimeout(() => {
$('#loginback').css('opacity', '0');
}, 500);
setTimeout(() => {
$('#loginback').css('display', 'none');
}, 2000);
if (use_music) {
document.querySelector('audio#startup-music').play();
}
}, 2000);
}

function setLoginError(text) {
$('#login-error').text(text);
}

async function initLoginPassword() {
if (window.win12Native && window.win12Native.isTauri() && (new URL(location.href)).searchParams.get('skip_login') !== '1') {
try {
const status = await window.win12Native.getLoginPasswordStatus();
loginPasswordHasPassword = !!(status && status.has_password);
if (loginPasswordHasPassword) {
$('#loginback').addClass('tauri-password');
$('#login-password').attr('placeholder', '密码');
$('#login-password').focus();
}
else {
$('#loginback').removeClass('tauri-password');
}
}
catch (e) {
setLoginError('无法读取本地密码状态');
}
}
}

async function win12LoginSubmit() {
if (!(window.win12Native && window.win12Native.isTauri())) {
win12FinishLogin();
return;
}

if (!loginPasswordHasPassword) {
win12FinishLogin();
return;
}

const password = $('#login-password').val();
if (!password) {
setLoginError('请输入密码');
$('#login-password').focus();
return;
}

$('#login').css('pointer-events', 'none');
setLoginError('正在验证');

try {
const result = await window.win12Native.verifyLoginPassword(password);
if (result && result.ok) {
$('#login-password').val('');
win12FinishLogin();
return;
}
setLoginError('密码错误');
$('#login-password').val('').focus();
}
catch (e) {
setLoginError(String(e));
}
finally {
$('#login').css('pointer-events', 'auto');
}
}

async function win12RefreshPasswordSettingStatus() {
if (!(window.win12Native && window.win12Native.isTauri())) {
$('#setting-password-status').text('仅 Tauri App 可用');
$('#setting-password-current').hide();
$('#setting-password-new').prop('disabled', true);
$('#setting-password-submit').addClass('disabled');
return;
}

try {
const status = await window.win12Native.getLoginPasswordStatus();
loginPasswordHasPassword = !!(status && status.has_password);
$('#setting-password-status').text(loginPasswordHasPassword ? '已设置密码' : '未设置密码');
$('#setting-password-current')[loginPasswordHasPassword ? 'show' : 'hide']();
$('#setting-password-current').val('');
$('#setting-password-new').val('').prop('disabled', false);
$('#setting-password-new').attr('placeholder', loginPasswordHasPassword ? '新密码(留空清除密码)' : '新密码');
$('#setting-password-submit').removeClass('disabled');
}
catch (e) {
$('#setting-password-status').text(String(e));
}
}

async function win12SetLoginPassword() {
if (!(window.win12Native && window.win12Native.isTauri())) {
$('#setting-password-status').text('仅 Tauri App 可用');
return;
}

const currentPassword = $('#setting-password-current').val();
const newPassword = $('#setting-password-new').val();
if (!loginPasswordHasPassword && !newPassword) {
$('#setting-password-status').text('请输入新密码');
$('#setting-password-new').focus();
return;
}
if (loginPasswordHasPassword && !currentPassword) {
$('#setting-password-status').text('请输入当前密码');
$('#setting-password-current').focus();
return;
}

$('#setting-password-submit').addClass('disabled');
const clearingPassword = loginPasswordHasPassword && !newPassword;
$('#setting-password-status').text(clearingPassword ? '正在清除' : '正在保存');

try {
await window.win12Native.setLoginPassword(loginPasswordHasPassword ? currentPassword : null, newPassword);
await win12RefreshPasswordSettingStatus();
$('#setting-password-status').text(clearingPassword ? '密码已清空' : '密码已保存');
}
catch (e) {
$('#setting-password-status').text(String(e));
}
finally {
$('#setting-password-submit').removeClass('disabled');
}
}

$('input,textarea,*[contenteditable=true]').on('contextmenu', (e) => {
stop(e);
return true;
Expand Down Expand Up @@ -2413,6 +2558,7 @@ document.getElementsByTagName('body')[0].onload = () => {
$('#loadback').css('display', 'none');
}, 1000);
apps.webapps.init();
initLoginPassword();
//getdata
if (localStorage.getItem('theme') == 'dark') {
$(':root').addClass('dark');
Expand Down Expand Up @@ -2506,10 +2652,14 @@ else {
autoUpdate = (autoUpdate == 'true');
}

// PWA 应用
if (!location.href.match(/((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))/) && !location.href.match('localhost') && !(new URL(location.href)).searchParams.get('develop')) {
const urlParams = new URL(location.href).searchParams;
if (urlParams.get('skip_login') !== '1') {
$('#loginback').css('opacity', '1');
$('#loginback').css('display', 'flex');
}

// PWA 应用
if (!location.href.match(/((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))/) && !location.href.match('localhost') && !urlParams.get('develop')) {
shownotice('about');
navigator.serviceWorker.register('sw.js', { updateViaCache: 'none', scope: './' }).then(reg => {

Expand Down
12 changes: 12 additions & 0 deletions tauri/tauri_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,16 @@ window.win12Native = {
if (!this.isTauri()) return null;
return await window.__TAURI__.core.invoke("get_battery_info");
},
async getLoginPasswordStatus() {
if (!this.isTauri()) return null;
return await window.__TAURI__.core.invoke("get_login_password_status");
},
async verifyLoginPassword(password) {
if (!this.isTauri()) return { ok: true };
return await window.__TAURI__.core.invoke("verify_login_password", { password });
},
async setLoginPassword(currentPassword, newPassword) {
if (!this.isTauri()) return null;
return await window.__TAURI__.core.invoke("set_login_password", { currentPassword, newPassword });
},
};