diff --git a/.gitignore b/.gitignore
index e10fde5c..e2bc7106 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,4 +42,5 @@ __pycache__/
.tauri/
dist.zip
/scripts/
-.env
\ No newline at end of file
+.env
+/server/node/ssl/certificate
\ No newline at end of file
diff --git a/server/node/server.cjs b/server/node/server.cjs
index abf88d98..3a46102f 100644
--- a/server/node/server.cjs
+++ b/server/node/server.cjs
@@ -9,6 +9,8 @@ app.use(express.static(path.join(process.cwd(), 'dist'), {index: false}));
app.use(express.json({ limit: '50mb' }));
app.use(express.raw({ type: 'application/octet-stream', limit: '50mb' }));
const {pipeline} = require('stream/promises')
+const https = require('https');
+const sslPath = path.join(process.cwd(), 'server/node/ssl/certificate');
let password = ''
@@ -294,6 +296,57 @@ app.post('/api/write', async (req, res, next) => {
}
});
-app.listen(6001, () => {
- console.log("Server is listening on http://localhost:6001/");
-});
\ No newline at end of file
+async function getHttpsOptions() {
+
+ const keyPath = path.join(sslPath, 'server.key');
+ const certPath = path.join(sslPath, 'server.crt');
+
+ console.log(keyPath)
+ console.log(certPath)
+
+ try {
+
+ await fs.access(keyPath);
+ await fs.access(certPath);
+
+ const [key, cert] = await Promise.all([
+ fs.readFile(keyPath),
+ fs.readFile(certPath)
+ ]);
+
+ return { key, cert };
+
+ } catch (error) {
+ console.error('SSL setup errors:', error.message);
+ console.log('Start the server with HTTP instead of HTTPS...');
+ return null;
+ }
+}
+
+async function startServer() {
+ const port = process.env.PORT || 6001;
+ const httpsOptions = await getHttpsOptions();
+
+ if (httpsOptions) {
+ // HTTPS
+ https.createServer(httpsOptions, app).listen(port, () => {
+ console.log("HTTPS server is running.");
+ console.log("https://localhost:6001/");
+ });
+
+ } else {
+ // HTTP
+ app.listen(port, () => {
+ console.log("HTTP server is running.");
+ console.log("http://localhost:6001/");
+ });
+ }
+}
+
+(async () => {
+ try {
+ await startServer();
+ } catch (error) {
+ console.error('Fail to start server :', error);
+ }
+})();
\ No newline at end of file
diff --git a/server/node/ssl/Generate Certificate.bat b/server/node/ssl/Generate Certificate.bat
new file mode 100644
index 00000000..b5a5b41b
--- /dev/null
+++ b/server/node/ssl/Generate Certificate.bat
@@ -0,0 +1,5 @@
+@echo off
+mkdir certificate 2>nul
+openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout certificate\ca.key -out certificate\ca.crt -config ca.conf
+openssl req -new -nodes -newkey rsa:2048 -keyout certificate\server.key -out certificate\server.csr -config server.conf
+openssl x509 -req -in certificate\server.csr -CA certificate\ca.crt -CAkey certificate\ca.key -CAcreateserial -out certificate\server.crt -days 3650 -extensions req_ext -extfile server.conf
\ No newline at end of file
diff --git a/server/node/ssl/Generate Certificate.sh b/server/node/ssl/Generate Certificate.sh
new file mode 100644
index 00000000..2cba2b56
--- /dev/null
+++ b/server/node/ssl/Generate Certificate.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+mkdir -p certificate
+openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout certificate/ca.key -out certificate/ca.crt -config ca.conf
+openssl req -new -nodes -newkey rsa:2048 -keyout certificate/server.key -out certificate/server.csr -config server.conf
+openssl x509 -req -in certificate/server.csr -CA certificate/ca.crt -CAkey certificate/ca.key -CAcreateserial -out certificate/server.crt -days 3650 -extensions req_ext -extfile server.conf
+
+chmod 644 certificate/ca.key certificate/server.key
+chmod 644 certificate/ca.crt certificate/server.crt certificate/server.csr
diff --git a/server/node/ssl/ca.conf b/server/node/ssl/ca.conf
new file mode 100644
index 00000000..abd1df36
--- /dev/null
+++ b/server/node/ssl/ca.conf
@@ -0,0 +1,19 @@
+[ req ]
+default_bits = 2048
+prompt = no
+default_md = sha256
+distinguished_name = dn
+x509_extensions = ca_ext
+
+[ dn ]
+C = KR
+ST = Kivotos
+L = Millennium Science School
+O = Game Development Department
+OU = Certificate Authority
+CN = Aris CA
+
+[ ca_ext ]
+basicConstraints = critical,CA:TRUE
+keyUsage = critical,keyCertSign,cRLSign
+subjectKeyIdentifier = hash
diff --git a/server/node/ssl/server.conf b/server/node/ssl/server.conf
new file mode 100644
index 00000000..c7090687
--- /dev/null
+++ b/server/node/ssl/server.conf
@@ -0,0 +1,23 @@
+[ req ]
+default_bits = 2048
+prompt = no
+default_md = sha256
+distinguished_name = dn
+req_extensions = req_ext
+
+[ dn ]
+C = KR
+ST = Kivotos
+L = Millennium Science School
+O = Game Development Department
+OU = Tendou Aris
+CN = localhost
+
+[ req_ext ]
+subjectAltName = @alt_names
+basicConstraints = CA:FALSE
+keyUsage = digitalSignature, keyEncipherment
+
+[ alt_names ]
+DNS.1 = localhost
+IP.1 = 127.0.0.1
diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts
index d831d517..50aa74bd 100644
--- a/src/ts/parser.svelte.ts
+++ b/src/ts/parser.svelte.ts
@@ -1278,7 +1278,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
}
case 'getglobalvar':{
return getGlobalChatVar(v)
- }
+ } // setglobalvar cbs support?
case 'button':{
return ``
}
@@ -2235,6 +2235,10 @@ export function getGlobalChatVar(key:string){
return DBState.db.globalChatVariables[key] ?? 'null'
}
+export function setGlobalChatVar(key:string, value:string){
+ DBState.db.globalChatVariables[key] = value // String to String Map(dictionary)
+}
+
export function setChatVar(key:string, value:string){
const selectedChar = get(selectedCharID)
if(!DBState.db.characters[selectedChar].chats[DBState.db.characters[selectedChar].chatPage].scriptstate){
diff --git a/src/ts/process/lua.ts b/src/ts/process/lua.ts
index e44fa188..bfe71cda 100644
--- a/src/ts/process/lua.ts
+++ b/src/ts/process/lua.ts
@@ -1,4 +1,4 @@
-import { getChatVar, hasher, setChatVar, type simpleCharacterArgument } from "../parser.svelte";
+import { getChatVar, hasher, setChatVar, getGlobalChatVar, type simpleCharacterArgument } from "../parser.svelte";
import { LuaEngine, LuaFactory } from "wasmoon";
import { getCurrentCharacter, getCurrentChat, getDatabase, setCurrentChat, setDatabase, type Chat, type character, type groupChat } from "../storage/database.svelte";
import { get } from "svelte/store";
@@ -25,7 +25,8 @@ interface LuaEngineState {
mutex: Mutex;
chat: Chat;
setVar: (key:string, value:string) => void,
- getVar: (key:string) => string
+ getVar: (key:string) => string,
+ getGlobalVar: (key:string) => any,
}
let LuaEngines = new Map()
@@ -35,6 +36,7 @@ export async function runLua(code:string, arg:{
chat?:Chat
setVar?: (key:string, value:string) => void,
getVar?: (key:string) => string,
+ getGlobalVar?: (key:string) => any,
lowLevelAccess?: boolean,
mode?: string,
data?: any
@@ -42,6 +44,7 @@ export async function runLua(code:string, arg:{
const char = arg.char ?? getCurrentCharacter()
const setVar = arg.setVar ?? setChatVar
const getVar = arg.getVar ?? getChatVar
+ const getGlobalVar = arg.getGlobalVar ?? getGlobalChatVar
const mode = arg.mode ?? 'manual'
const data = arg.data ?? {}
let chat = arg.chat ?? getCurrentChat()
@@ -60,7 +63,8 @@ export async function runLua(code:string, arg:{
mutex: new Mutex(),
chat,
setVar,
- getVar
+ getVar,
+ getGlobalVar
}
LuaEngines.set(mode, luaEngineState)
wasEmpty = true
@@ -68,6 +72,7 @@ export async function runLua(code:string, arg:{
luaEngineState.chat = chat
luaEngineState.setVar = setVar
luaEngineState.getVar = getVar
+ luaEngineState.getGlobalVar = getGlobalVar
}
return await luaEngineState.mutex.runExclusive(async () => {
if (wasEmpty || code !== luaEngineState.code) {
@@ -87,6 +92,12 @@ export async function runLua(code:string, arg:{
}
return luaEngineState.getVar(key)
})
+ luaEngine.global.set('getGlobalVar', (id:string, key:string) => {
+ if(!LuaSafeIds.has(id) && !LuaEditDisplayIds.has(id)){
+ return
+ }
+ return luaEngineState.getGlobalVar(key)
+ })
luaEngine.global.set('stopChat', (id:string) => {
if(!LuaSafeIds.has(id)){
return