nightly commit
This commit is contained in:
@@ -12,6 +12,9 @@ ccn-header-user-login=Login
|
||||
ccn-header-user-logout=Logout
|
||||
ccn-header-language=Language
|
||||
|
||||
ccn-js-failToLogin=Fail to login. Please check your username or password.
|
||||
ccn-js-failToLogout=Fail to logout due to unknow reason. Consider refreshing page to solve problem.
|
||||
|
||||
ccn-home-desc=<h1 class="title">coconut-leaf</h1><p>A light, self-host calendar system.</p><p>Originally, this app is served for yyc12345 personal use.</p><br /><p>Pull request / issue / translation are welcomed.</p><p>Submit them in our <a href="https://github.com/yyc12345/coconut-leaf">GitHub project</a>.</p><p>This project source code is licensed <a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL v3</a>.</p>
|
||||
|
||||
ccn-login-form-username=Username
|
||||
|
||||
@@ -12,6 +12,9 @@ ccn-header-user-login=登录
|
||||
ccn-header-user-logout=登出
|
||||
ccn-header-language=语言
|
||||
|
||||
ccn-js-failToLogin=登陆失败,请检查您的用户名和密码。
|
||||
ccn-js-failToLogout=由于未知原因,登出失败,请考虑刷新页面解决问题。
|
||||
|
||||
ccn-home-desc=<h1 class="title">coconut-leaf</h1><p>一个轻量的自建日历系统</p><p>原本是出于yyc12345的个人使用而制作的。</p><br /><p>欢迎提出Pull request / issue / 翻译</p><p>将他们提交到我们的<a href="https://github.com/yyc12345/coconut-leaf">GitHub项目</a>.</p><p>本工程代码使用<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL v3</a>授权。</p>
|
||||
|
||||
ccn-login-form-username=用户名
|
||||
|
||||
@@ -1,3 +1,117 @@
|
||||
function cnn_api_tokenValid() {
|
||||
return true;
|
||||
// var cached_salt = undefined
|
||||
|
||||
/*
|
||||
function cnn_api_common_salt(_username) {
|
||||
// true or false
|
||||
// gotten salt store in cached_salt.
|
||||
var gotten_data = undefined;
|
||||
$.ajax({
|
||||
url: '/api/common/salt',
|
||||
type: "POST",
|
||||
async: false,
|
||||
data: {
|
||||
username: _username
|
||||
},
|
||||
success: function (data) {
|
||||
gotten_data = data;
|
||||
}
|
||||
});
|
||||
|
||||
if (IsResponseOK(gotten_data)) {
|
||||
cached_salt = gotten_data['data'];
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
|
||||
function cnn_api_common_login(_username, password) {
|
||||
// return true or false, token is managed by this js file self.
|
||||
// if cached_salt is undefined, return false directly
|
||||
if (typeof(cached_salt) == undefined) return false;
|
||||
|
||||
var gotten_data = undefined;
|
||||
$.ajax({
|
||||
url: '/api/common/login',
|
||||
type: "POST",
|
||||
async: false,
|
||||
data: {
|
||||
username: _username,
|
||||
password: ComputPasswordWithSalt(password, cached_salt)
|
||||
},
|
||||
success: function (data) {
|
||||
gotten_data = data;
|
||||
}
|
||||
});
|
||||
if (IsResponseOK(gotten_data) && gotten_data['data'] != '') {
|
||||
SetApiToken(gotten_data['data']);
|
||||
cached_salt = undefined;
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
*/
|
||||
|
||||
function cnn_api_common_webLogin(_username, password) {
|
||||
var gotten_data = undefined;
|
||||
$.ajax({
|
||||
url: '/api/common/webLogin',
|
||||
type: "POST",
|
||||
async: false,
|
||||
data: {
|
||||
username: _username,
|
||||
password: password
|
||||
},
|
||||
success: function (data) {
|
||||
gotten_data = data;
|
||||
}
|
||||
});
|
||||
if (IsResponseOK(gotten_data) && gotten_data['data'] != '') {
|
||||
SetApiToken(gotten_data['data']);
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
|
||||
function cnn_api_common_logout() {
|
||||
// return true or false
|
||||
var gotten_data = undefined;
|
||||
$.ajax({
|
||||
url: '/api/common/logout',
|
||||
type: "POST",
|
||||
async: false,
|
||||
data: {
|
||||
token: GetApiToken()
|
||||
},
|
||||
success: function (data) {
|
||||
gotten_data = data;
|
||||
}
|
||||
});
|
||||
|
||||
if (IsResponseOK(gotten_data) && gotten_data['data']) {
|
||||
SetApiToken('');
|
||||
return true;
|
||||
} return false;
|
||||
}
|
||||
|
||||
function cnn_api_common_tokenValid() {
|
||||
// get from local database first, then judge it via post
|
||||
// return true or false
|
||||
var gotten_token = GetApiToken();
|
||||
if (gotten_token == '') return false;
|
||||
|
||||
var gotten_data = undefined;
|
||||
$.ajax({
|
||||
url: '/api/common/tokenValid',
|
||||
type: "POST",
|
||||
async: false,
|
||||
data: {
|
||||
token: GetApiToken()
|
||||
},
|
||||
success: function (data) {
|
||||
gotten_data = data;
|
||||
}
|
||||
});
|
||||
|
||||
if (IsResponseOK(gotten_data) && gotten_data['data']) return true;
|
||||
else {
|
||||
SetApiToken('');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ function cnn_headerNav_Insert() {
|
||||
}
|
||||
|
||||
function cnn_headerNav_LoggedRefresh() {
|
||||
if (cnn_api_tokenValid()) {
|
||||
if (cnn_api_common_tokenValid()) {
|
||||
// logged, show all nav button and logout button
|
||||
$("#cnn-header-nav-home").show();
|
||||
$("#cnn-header-nav-calendar").show();
|
||||
@@ -41,8 +41,16 @@ function cnn_headerNav_BindEvents() {
|
||||
});
|
||||
});
|
||||
|
||||
// todo: bind logout
|
||||
|
||||
// bind logout
|
||||
$("#cnn-header-user-logout").click(function() {
|
||||
if (cnn_api_common_logout()) {
|
||||
// ok, logout
|
||||
// jump into home page again
|
||||
window.location.href = '/web/home';
|
||||
return;
|
||||
|
||||
} else alert($.i18n.prop("ccn-js-failToLogout"));
|
||||
});
|
||||
|
||||
// bind burger menu
|
||||
// copy from bulma website
|
||||
|
||||
@@ -5,6 +5,45 @@ $(document).ready(function() {
|
||||
cnn_headerNav_BindEvents();
|
||||
cnn_headerNav_LoggedRefresh();
|
||||
|
||||
// bind login event
|
||||
$("#ccn-login-form-login").click(StartLogin);
|
||||
|
||||
// apply i18n
|
||||
ccn_i18n_ApplyLanguage();
|
||||
});
|
||||
});
|
||||
|
||||
function StartLogin() {
|
||||
// disable all ui first
|
||||
$("#ccn-login-form-login").attr("disabled",true);
|
||||
$("#ccn-login-form-username").attr("disabled",true);
|
||||
$("#ccn-login-form-password").attr("disabled",true);
|
||||
|
||||
// get form data
|
||||
username = $("#ccn-login-form-username").val();
|
||||
password = $("#ccn-login-form-password").val();
|
||||
|
||||
/*
|
||||
// try get salt
|
||||
if (cnn_api_common_salt(username)) {
|
||||
// continue login
|
||||
if (cnn_api_common_login(username, password)) {
|
||||
// ok, logged
|
||||
// jump into home page again
|
||||
window.location.href = '/web/home';
|
||||
|
||||
} else alert($.i18n.prop("ccn-js-failToLogin"));
|
||||
} else alert($.i18n.prop("ccn-js-failToLogin"));
|
||||
*/
|
||||
if (cnn_api_common_webLogin(username, password)) {
|
||||
// ok, logged
|
||||
// jump into home page again
|
||||
window.location.href = '/web/home';
|
||||
return;
|
||||
|
||||
} else alert($.i18n.prop("ccn-js-failToLogin"));
|
||||
|
||||
// retore ui
|
||||
$("#ccn-login-form-login").removeAttr("disabled");
|
||||
$("#ccn-login-form-username").removeAttr("disabled");
|
||||
$("#ccn-login-form-password").removeAttr("disabled");
|
||||
}
|
||||
|
||||
36
src/static/js/utils.js
Normal file
36
src/static/js/utils.js
Normal file
@@ -0,0 +1,36 @@
|
||||
function ComputPasswordWithSalt(password, salt) {
|
||||
return ComputeSHA256(ComputeSHA256(password) + salt.toString());
|
||||
}
|
||||
|
||||
function ComputeSHA256(strl) {
|
||||
var tempstr = new TextEncoder().encode(strl);
|
||||
var hashedStrl = undefined
|
||||
var shitpromise = crypto.subtle.digest('SHA-256', tempstr);
|
||||
Promise.all(shitpromise).then(function(result) {
|
||||
hashedStrl = result;
|
||||
});
|
||||
var hashArray = Array.from(new Uint8Array(hashedStrl));
|
||||
var hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('');
|
||||
return hashHex.toLowerCase();
|
||||
}
|
||||
|
||||
function IsResponseOK(data) {
|
||||
if (typeof(data) == 'undefined') {
|
||||
console.log("Fail to execute an api!");
|
||||
return false;
|
||||
}
|
||||
if (!data['success']) {
|
||||
console.log("Fail to execute an api! Reason:");
|
||||
console.log(data['error']);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function GetApiToken() {
|
||||
return ccn_localstorageAssist_Get('ccn-token', '');
|
||||
}
|
||||
|
||||
function SetApiToken(value) {
|
||||
ccn_localstorageAssist_Set('ccn-token', value);
|
||||
}
|
||||
Reference in New Issue
Block a user