Compare commits
No commits in common. "cf0c3f20ffd9659b3e1bbbf68bdbbacf13776e67" and "10760e77f245d3bdc421197cdf2383b92ae09f9b" have entirely different histories.
cf0c3f20ff
...
10760e77f2
22 changed files with 686 additions and 711 deletions
|
@ -1,34 +0,0 @@
|
||||||
name: Outbag Tests
|
|
||||||
|
|
||||||
on: [push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
services:
|
|
||||||
database:
|
|
||||||
image: mariadb
|
|
||||||
env:
|
|
||||||
MYSQL_DATABASE: outbag
|
|
||||||
MYSQL_USER: outbag
|
|
||||||
MYSQL_PASSWORD: 12345678
|
|
||||||
MYSQL_ROOT_PASSWORD: 12345678
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: |
|
|
||||||
npm ci
|
|
||||||
mkdir build
|
|
||||||
npm run prepublish
|
|
||||||
npm run bundleRelease
|
|
||||||
apk add openssl
|
|
||||||
- name: Generate Self-Signed Cert
|
|
||||||
run:
|
|
||||||
sh genSelfSignedCert.sh
|
|
||||||
- name: Run Tests
|
|
||||||
run: |
|
|
||||||
node tests/ws.js ci
|
|
||||||
node tests/post.js ci
|
|
1004
package-lock.json
generated
1004
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -4,4 +4,3 @@ export * from "./acts/admin.js"
|
||||||
export * from "./acts/rooms.js"
|
export * from "./acts/rooms.js"
|
||||||
export * from "./acts/server.js"
|
export * from "./acts/server.js"
|
||||||
export * from "./acts/roomContent.js"
|
export * from "./acts/roomContent.js"
|
||||||
export * from "./acts/subscribe.js"
|
|
|
@ -17,7 +17,6 @@ export const getAccounts: Act = {
|
||||||
accounts.name,
|
accounts.name,
|
||||||
accounts.viewable,
|
accounts.viewable,
|
||||||
accounts.deleted,
|
accounts.deleted,
|
||||||
accounts.deletedTime,
|
|
||||||
accounts.maxRooms,
|
accounts.maxRooms,
|
||||||
accounts.maxRoomSize,
|
accounts.maxRoomSize,
|
||||||
accounts.maxUsersPerRoom
|
accounts.maxUsersPerRoom
|
||||||
|
@ -29,12 +28,11 @@ export const getAccounts: Act = {
|
||||||
let name = d[accounts.name];
|
let name = d[accounts.name];
|
||||||
let viewable = d[accounts.viewable] ? true : false;
|
let viewable = d[accounts.viewable] ? true : false;
|
||||||
let deleted = d[accounts.deleted] ? true : false;
|
let deleted = d[accounts.deleted] ? true : false;
|
||||||
let deletedTime = Number(d[accounts.deletedTime]);
|
|
||||||
let maxRooms = d[accounts.maxRooms];
|
let maxRooms = d[accounts.maxRooms];
|
||||||
let maxRoomSize = d[accounts.maxRoomSize];
|
let maxRoomSize = d[accounts.maxRoomSize];
|
||||||
let maxUsersPerRoom = d[accounts.maxUsersPerRoom];
|
let maxUsersPerRoom = d[accounts.maxUsersPerRoom];
|
||||||
if (accID != null && rights != null && name != null && viewable != null && deleted != null && maxRooms != null && maxRoomSize != null && maxUsersPerRoom != null && deletedTime != null) {
|
if (accID != null && rights != null && name != null && viewable != null && deleted != null && maxRooms != null && maxRoomSize != null && maxUsersPerRoom != null) {
|
||||||
return { accID, rights, name, viewable, deleted, deletedTime, maxRooms, maxRoomSize, maxUsersPerRoom };
|
return { accID, rights, name, viewable, deleted, maxRooms, maxRoomSize, maxUsersPerRoom };
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
@ -42,23 +40,6 @@ export const getAccounts: Act = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const recoverAccount: Act = {
|
|
||||||
state: STATE.client,
|
|
||||||
right: PERMISSIONS.CAN_USE_API | PERMISSIONS.EDIT_USERS,
|
|
||||||
data: {
|
|
||||||
accID: "number"
|
|
||||||
},
|
|
||||||
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
|
||||||
let req = await update(accounts)
|
|
||||||
.set(accounts.deleted, false)
|
|
||||||
.set(accounts.deletedTime, 0)
|
|
||||||
.where(eq(accounts.accID, data.accID))
|
|
||||||
.query(db);
|
|
||||||
if(req.affectedRows > 0) aws("ok", "");
|
|
||||||
else aws("error", act_error.ACCOUNT_NOT_EXISTS)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const setPermissions: Act = {
|
export const setPermissions: Act = {
|
||||||
state: STATE.client,
|
state: STATE.client,
|
||||||
right: PERMISSIONS.CAN_USE_API | PERMISSIONS.EDIT_RIGHTS,
|
right: PERMISSIONS.CAN_USE_API | PERMISSIONS.EDIT_RIGHTS,
|
||||||
|
@ -169,7 +150,7 @@ export const addOTA: Act = { // or change it, primary key is the token
|
||||||
let resp = await insert(signupOTA.token, signupOTA.expires, signupOTA.usesLeft)
|
let resp = await insert(signupOTA.token, signupOTA.expires, signupOTA.usesLeft)
|
||||||
.add(data.token, data.expires, data.usesLeft)
|
.add(data.token, data.expires, data.usesLeft)
|
||||||
.query(db);
|
.query(db);
|
||||||
if (resp.affectedRows == 0) throw new Error("insertion fail");
|
if(resp.affectedRows == 0) throw new Error("insertion fail");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await update(signupOTA)
|
await update(signupOTA)
|
||||||
.set(signupOTA.expires, data.expires)
|
.set(signupOTA.expires, data.expires)
|
||||||
|
|
|
@ -18,7 +18,6 @@ export const deleteAccount: Act = {
|
||||||
client.state = STATE.no;
|
client.state = STATE.no;
|
||||||
await update(accounts)
|
await update(accounts)
|
||||||
.set(accounts.deleted, 1)
|
.set(accounts.deleted, 1)
|
||||||
.set(accounts.deletedTime, uts())
|
|
||||||
.where(eq(accounts.accID, client.accID))
|
.where(eq(accounts.accID, client.accID))
|
||||||
.query(db);
|
.query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
|
|
|
@ -6,8 +6,6 @@ import { isCategoryInRoom, isItemInRoom, isProductInRoom, isRoomDataFull } from
|
||||||
import { ROOM_RIGHTS } from "../../server/permissions.js";
|
import { ROOM_RIGHTS } from "../../server/permissions.js";
|
||||||
import { act_error } from "../../server/errors.js";
|
import { act_error } from "../../server/errors.js";
|
||||||
import { uts } from "../../sys/tools.js";
|
import { uts } from "../../sys/tools.js";
|
||||||
import { sendRoomListeners } from "../listener.js";
|
|
||||||
import { LISTENER_ACTION, LISTENER_TYPE } from "../../server/listener.js";
|
|
||||||
|
|
||||||
export const getCategories: Act = {
|
export const getCategories: Act = {
|
||||||
state: STATE.client | STATE.remote,
|
state: STATE.client | STATE.remote,
|
||||||
|
@ -130,12 +128,10 @@ export const addCategory: Act = {
|
||||||
.where(eq(listCategories.roomID, roomID))
|
.where(eq(listCategories.roomID, roomID))
|
||||||
.limit(1)
|
.limit(1)
|
||||||
).query(db);
|
).query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", {
|
||||||
aws("ok", {
|
|
||||||
catID: Number(req.insertId)
|
catID: Number(req.insertId)
|
||||||
});
|
});
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.ADD, [req.insertId]);
|
else aws("error", act_error.ADD_CAT);
|
||||||
} else aws("error", act_error.ADD_CAT);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,10 +165,8 @@ export const changeCategory: Act = {
|
||||||
eq(listCategories.listCatID, data.listCatID)
|
eq(listCategories.listCatID, data.listCatID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.CAT_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.CHANGE, [data.listCatID]);
|
|
||||||
} else aws("error", act_error.CAT_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -208,10 +202,8 @@ export const changeCategoriesOrder: Act = {
|
||||||
.query(db);
|
.query(db);
|
||||||
affacted += req.affectedRows;
|
affacted += req.affectedRows;
|
||||||
}
|
}
|
||||||
if (affacted > 0) {
|
if (affacted > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.CAT_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.CHANGE, data.listCatIDs);
|
|
||||||
} else aws("error", act_error.CAT_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -241,10 +233,8 @@ export const deleteCategory: Act = {
|
||||||
eq(listCategories.listCatID, data.listCatID)
|
eq(listCategories.listCatID, data.listCatID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.CAT_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.DELETE, [data.listCatID]);
|
|
||||||
} else aws("error", act_error.CAT_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -393,12 +383,10 @@ export const addProduct: Act = {
|
||||||
data.ean,
|
data.ean,
|
||||||
data.parent != null ? data.parent : null,
|
data.parent != null ? data.parent : null,
|
||||||
).query(db);
|
).query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", {
|
||||||
aws("ok", {
|
|
||||||
listProdID: Number(req.insertId)
|
listProdID: Number(req.insertId)
|
||||||
});
|
});
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.PRODUCTS, LISTENER_ACTION.ADD, [req.insertId]);
|
else aws("error", act_error.ADD_PROD);
|
||||||
} else aws("error", act_error.ADD_PROD);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -446,10 +434,8 @@ export const changeProduct: Act = {
|
||||||
eq(listProducts.roomID, roomID),
|
eq(listProducts.roomID, roomID),
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.PROD_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.PRODUCTS, LISTENER_ACTION.CHANGE, [data.listProdID]);
|
|
||||||
} else aws("error", act_error.PROD_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -479,10 +465,8 @@ export const deleteProduct: Act = {
|
||||||
eq(listProducts.listProdID, data.listProdID),
|
eq(listProducts.listProdID, data.listProdID),
|
||||||
eq(listProducts.roomID, roomID),
|
eq(listProducts.roomID, roomID),
|
||||||
)).query(db);
|
)).query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.PROD_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.PRODUCTS, LISTENER_ACTION.DELETE, [data.listProdID]);
|
|
||||||
} else aws("error", act_error.PROD_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -575,7 +559,7 @@ export const getItem: Act = {
|
||||||
], listItems)
|
], listItems)
|
||||||
.where(and(
|
.where(and(
|
||||||
eq(listItems.listItemID, data.listItemID),
|
eq(listItems.listItemID, data.listItemID),
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, data.roomID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.length > 0) {
|
if (req.length > 0) {
|
||||||
|
@ -652,12 +636,10 @@ export const addItem: Act = {
|
||||||
data.value,
|
data.value,
|
||||||
data.listProdID != null ? data.listProdID : null,
|
data.listProdID != null ? data.listProdID : null,
|
||||||
).query(db);
|
).query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", {
|
||||||
aws("ok", {
|
|
||||||
listItemID: Number(req.insertId)
|
listItemID: Number(req.insertId)
|
||||||
});
|
});
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.ADD, [req.insertId]);
|
else aws("error", act_error.ADD_ITEM);
|
||||||
} else aws("error", act_error.ADD_ITEM);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -702,13 +684,11 @@ export const changeItem: Act = {
|
||||||
.set(listItems.link, data.listProdID != null ? data.listProdID : null)
|
.set(listItems.link, data.listProdID != null ? data.listProdID : null)
|
||||||
.where(and(
|
.where(and(
|
||||||
eq(listItems.listItemID, data.listItemID),
|
eq(listItems.listItemID, data.listItemID),
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, data.roomID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.ITEM_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.CHANGE, [data.listItemID]);
|
|
||||||
} else aws("error", act_error.ITEM_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -743,10 +723,8 @@ export const changeItemState: Act = {
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.ITEM_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.CHANGE, [data.listItemID]);
|
|
||||||
} else aws("error", act_error.ITEM_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -775,12 +753,7 @@ export const changeItemStates: Act = {
|
||||||
if (
|
if (
|
||||||
data.listItemIDs.length != data.changedTimes.length
|
data.listItemIDs.length != data.changedTimes.length
|
||||||
|| data.changedTimes.length != data.states.length
|
|| data.changedTimes.length != data.states.length
|
||||||
) return void aws("error", act_error.DATA);
|
) return void aws("error", "data");
|
||||||
for (let i = 0; i < data.listItemIDs.length; i++) {
|
|
||||||
let id = data.listItemIDs[i];
|
|
||||||
if (typeof id != "number" || id < 0)
|
|
||||||
return void aws("error", act_error.DATA);
|
|
||||||
}
|
|
||||||
for (let i = 0; i < data.listItemIDs.length; i++) {
|
for (let i = 0; i < data.listItemIDs.length; i++) {
|
||||||
let id = data.listItemIDs[i];
|
let id = data.listItemIDs[i];
|
||||||
let time = data.changedTimes[i];
|
let time = data.changedTimes[i];
|
||||||
|
@ -796,7 +769,6 @@ export const changeItemStates: Act = {
|
||||||
.query(db);
|
.query(db);
|
||||||
}
|
}
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.CHANGE, data.listItemIDs);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -825,10 +797,8 @@ export const deleteItem: Act = {
|
||||||
eq(listItems.listItemID, data.listItemID),
|
eq(listItems.listItemID, data.listItemID),
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
)).query(db);
|
)).query(db);
|
||||||
if (req.affectedRows > 0) {
|
if (req.affectedRows > 0) aws("ok", "");
|
||||||
aws("ok", "");
|
else aws("error", act_error.ITEM_NOT_EXISTS);
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.DELETE, [data.listItemID]);
|
|
||||||
} else aws("error", act_error.ITEM_NOT_EXISTS);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
export const deleteItemByState: Act = {
|
export const deleteItemByState: Act = {
|
||||||
|
@ -857,6 +827,5 @@ export const deleteItemByState: Act = {
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
)).query(db);
|
)).query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.DELETE, []);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -8,8 +8,6 @@ import { isRoomFull } from "../helper.js";
|
||||||
import { fetchRemoteAsServer } from "../server.js";
|
import { fetchRemoteAsServer } from "../server.js";
|
||||||
import { Act, Client, STATE } from "../user.js";
|
import { Act, Client, STATE } from "../user.js";
|
||||||
import { act_error } from "../../server/errors.js";
|
import { act_error } from "../../server/errors.js";
|
||||||
import { sendRoomListeners } from "../listener.js";
|
|
||||||
import { LISTENER_ACTION, LISTENER_TYPE } from "../../server/listener.js";
|
|
||||||
|
|
||||||
export const listRooms: Act = {
|
export const listRooms: Act = {
|
||||||
state: STATE.client | STATE.remote,
|
state: STATE.client | STATE.remote,
|
||||||
|
@ -48,7 +46,7 @@ export const listRooms: Act = {
|
||||||
if (name != null && owner != null && rights != null && visibility != null && title != null && description != null && icon != null && confirmed != null) {
|
if (name != null && owner != null && rights != null && visibility != null && title != null && description != null && icon != null && confirmed != null) {
|
||||||
return { name, server, owner, rights, visibility, title, description, icon, debug: global.debug, confirmed };
|
return { name, server, owner, rights, visibility, title, description, icon, debug: global.debug, confirmed };
|
||||||
}
|
}
|
||||||
//console.log(name, server, owner, rights, visibility, title, description, icon, global.debug, confirmed)
|
console.log(name, server, owner, rights, visibility, title, description, icon, global.debug, confirmed)
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
if (client.state == STATE.client) {
|
if (client.state == STATE.client) {
|
||||||
|
@ -610,7 +608,6 @@ export const setAdminStatus: Act = {
|
||||||
} else {
|
} else {
|
||||||
aws("error", act_error.MEMBER_NOT_EXISTS);
|
aws("error", act_error.MEMBER_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ROOMINFO, LISTENER_ACTION.CHANGE, []);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -620,7 +617,6 @@ export const leaveRoom: Act = {
|
||||||
data: {
|
data: {
|
||||||
room: "string",
|
room: "string",
|
||||||
server: "string",
|
server: "string",
|
||||||
// TODO: add force option for remote rooms
|
|
||||||
},
|
},
|
||||||
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
||||||
if (!checkSelfTag(data.server)) {
|
if (!checkSelfTag(data.server)) {
|
||||||
|
@ -710,7 +706,6 @@ export const setRoomRight: Act = {
|
||||||
.where(eq(rooms.roomID, roomID))
|
.where(eq(rooms.roomID, roomID))
|
||||||
.query(db);
|
.query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ROOMINFO, LISTENER_ACTION.CHANGE, []);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -740,6 +735,5 @@ export const changeRoomMeta: Act = {
|
||||||
.where(eq(rooms.roomID, roomID))
|
.where(eq(rooms.roomID, roomID))
|
||||||
.query(db);
|
.query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
sendRoomListeners(roomID, LISTENER_TYPE.ROOMINFO, LISTENER_ACTION.CHANGE, []);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
|
@ -1,68 +0,0 @@
|
||||||
import { act_error } from "../../server/errors.js";
|
|
||||||
import { checkSelfTag } from "../../server/outbagURL.js";
|
|
||||||
import { Act, Client, STATE } from "../user.js";
|
|
||||||
import { wsClient } from "../ws.js";
|
|
||||||
|
|
||||||
export const subscribeRoom: Act = {
|
|
||||||
state: STATE.client | STATE.remote,
|
|
||||||
right: 0,
|
|
||||||
data: {
|
|
||||||
room: "name",
|
|
||||||
server: "string",
|
|
||||||
},
|
|
||||||
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
|
||||||
if (!(client.connectionClient instanceof wsClient)) {
|
|
||||||
return void aws("error", act_error.CONNECTION);
|
|
||||||
}
|
|
||||||
if (!checkSelfTag(data.server)) {
|
|
||||||
throw new Error("Remote not yet implemented.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const roomID = await client.isInRoom(data.room);
|
|
||||||
if (roomID == -1) {
|
|
||||||
aws("error", act_error.NOT_IN_ROOM);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
client.connectionClient.listenRoom(roomID, data.room, data.server);
|
|
||||||
aws("ok", "");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const unsubscribeRoom: Act = {
|
|
||||||
state: STATE.client | STATE.remote,
|
|
||||||
right: 0,
|
|
||||||
data: {
|
|
||||||
room: "name",
|
|
||||||
server: "string",
|
|
||||||
},
|
|
||||||
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
|
||||||
if (!(client.connectionClient instanceof wsClient)) {
|
|
||||||
return void aws("error", act_error.CONNECTION);
|
|
||||||
}
|
|
||||||
if (!checkSelfTag(data.server)) {
|
|
||||||
throw new Error("Remote not yet implemented.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const roomID = await client.isInRoom(data.room);
|
|
||||||
if (roomID == -1) {
|
|
||||||
aws("error", act_error.NOT_IN_ROOM);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
client.connectionClient.unlistenRoom(roomID);
|
|
||||||
aws("ok", "");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const unsubscribeAllRooms: Act = {
|
|
||||||
state: STATE.client | STATE.remote,
|
|
||||||
right: 0,
|
|
||||||
data: {},
|
|
||||||
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
|
||||||
if (!(client.connectionClient instanceof wsClient)) {
|
|
||||||
return void aws("error", act_error.CONNECTION);
|
|
||||||
}
|
|
||||||
// TODO: When implemented close remote listeners
|
|
||||||
client.connectionClient.unlistenAllRooms();
|
|
||||||
aws("ok", "");
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,38 +0,0 @@
|
||||||
import { wsClient } from "./ws.js"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
interface RoomListener {
|
|
||||||
client: wsClient;
|
|
||||||
room: string;
|
|
||||||
server: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
let roomListeners: { [key: number]: RoomListener[] } = {};
|
|
||||||
|
|
||||||
export const sendRoomListeners = async (roomID: number, type: string | number, action: number, ids: number[]) => {
|
|
||||||
for (const listener of roomListeners[roomID] ?? []) {
|
|
||||||
listener.client.sendFromServer({
|
|
||||||
room: listener.room,
|
|
||||||
server: listener.server,
|
|
||||||
type,
|
|
||||||
action,
|
|
||||||
ids,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addRoomListener = (client: wsClient, roomID: number, room: string, server: string) => {
|
|
||||||
if (!Array.isArray(roomListeners[roomID])) roomListeners[roomID] = [];
|
|
||||||
const existingListener = roomListeners[roomID].find(listener => listener.client === client);
|
|
||||||
if (!existingListener) roomListeners[roomID].push({ client, room, server });
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
export const removeRoomListener = (client: wsClient, roomID: number | null = null) => {
|
|
||||||
let keys = roomID == null ? Object.keys(roomListeners) as any : [roomID];
|
|
||||||
for (const key of keys) {
|
|
||||||
roomListeners[key] = roomListeners[key].filter(listener => listener.client !== client);
|
|
||||||
if (roomListeners[key].length === 0) delete roomListeners[key];
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -116,8 +116,7 @@ export const addPostMethods = (server: express.Express) => {
|
||||||
export class postClient {
|
export class postClient {
|
||||||
lastReq = uts();
|
lastReq = uts();
|
||||||
client: Client;
|
client: Client;
|
||||||
constructor(ip: string, client: Client | null = null) {
|
constructor(ip: string, client = new Client(ip)) {
|
||||||
if (client === null) client = new Client(ip, this);
|
|
||||||
this.client = client;
|
this.client = client;
|
||||||
}
|
}
|
||||||
async runAct(act: Act, json: any, aws: (state: string, data: any) => void) {
|
async runAct(act: Act, json: any, aws: (state: string, data: any) => void) {
|
||||||
|
|
|
@ -5,8 +5,6 @@ import { outbagServer, outbagURLfromTag } from "../server/outbagURL.js";
|
||||||
import { fetchRemoteAs } from "./server.js";
|
import { fetchRemoteAs } from "./server.js";
|
||||||
import { debug } from "../sys/log.js";
|
import { debug } from "../sys/log.js";
|
||||||
import { act_error } from "../server/errors.js";
|
import { act_error } from "../server/errors.js";
|
||||||
import { wsClient } from "./ws.js";
|
|
||||||
import { postClient } from "./post.js";
|
|
||||||
|
|
||||||
export const STATE = {
|
export const STATE = {
|
||||||
no: 0b00001,
|
no: 0b00001,
|
||||||
|
@ -42,10 +40,7 @@ export class Client {
|
||||||
challenge: string = "";
|
challenge: string = "";
|
||||||
remoteKey: string = "";
|
remoteKey: string = "";
|
||||||
|
|
||||||
connectionClient: wsClient | postClient;
|
constructor(ip: string) {
|
||||||
|
|
||||||
constructor(ip: string, client: wsClient | postClient) {
|
|
||||||
this.connectionClient = client;
|
|
||||||
this.server = new outbagServer("", "", "", "");
|
this.server = new outbagServer("", "", "", "");
|
||||||
this.ip = ip;
|
this.ip = ip;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import { Act, checktype, Client } from "./user.js";
|
||||||
import { debug, error } from "../sys/log.js";
|
import { debug, error } from "../sys/log.js";
|
||||||
import * as importActs from "./acts.js"
|
import * as importActs from "./acts.js"
|
||||||
import { act_error } from "../server/errors.js";
|
import { act_error } from "../server/errors.js";
|
||||||
import { addRoomListener, removeRoomListener } from "./listener.js";
|
|
||||||
|
|
||||||
let acts = importActs as { [key: string]: Act };
|
let acts = importActs as { [key: string]: Act };
|
||||||
|
|
||||||
|
@ -31,11 +30,9 @@ export class wsClient {
|
||||||
activeRequests = 0;
|
activeRequests = 0;
|
||||||
client: Client;
|
client: Client;
|
||||||
constructor(socket: ws.WebSocket, req: http.IncomingMessage) {
|
constructor(socket: ws.WebSocket, req: http.IncomingMessage) {
|
||||||
this.client = new Client(req.socket.remoteAddress ?? "", this);
|
this.client = new Client(req.socket.remoteAddress ?? "");
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
|
|
||||||
clients.push(this);
|
|
||||||
|
|
||||||
socket.on("message", async (msg: any) => {
|
socket.on("message", async (msg: any) => {
|
||||||
try {
|
try {
|
||||||
this.activeRequests++;
|
this.activeRequests++;
|
||||||
|
@ -144,7 +141,6 @@ export class wsClient {
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('close', () => {
|
socket.on('close', () => {
|
||||||
this.unlistenAllRooms();
|
|
||||||
this.open = false;
|
this.open = false;
|
||||||
var i = clients.indexOf(this);
|
var i = clients.indexOf(this);
|
||||||
delete clients[i];
|
delete clients[i];
|
||||||
|
@ -156,7 +152,6 @@ export class wsClient {
|
||||||
|
|
||||||
close(ms: number) {
|
close(ms: number) {
|
||||||
return new Promise<void>(res => {
|
return new Promise<void>(res => {
|
||||||
this.unlistenAllRooms();
|
|
||||||
if (this.activeRequests == 0) {
|
if (this.activeRequests == 0) {
|
||||||
this.socket.close();
|
this.socket.close();
|
||||||
return void res();
|
return void res();
|
||||||
|
@ -167,34 +162,6 @@ export class wsClient {
|
||||||
}, Math.max(100, ms));
|
}, Math.max(100, ms));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sendFromServer(data: any): Promise<boolean> {
|
|
||||||
if (this.socket.readyState != WebSocket.OPEN) {
|
|
||||||
return Promise.resolve(false);
|
|
||||||
}
|
|
||||||
return new Promise((res, rej) => {
|
|
||||||
this.socket.send(JSON.stringify({
|
|
||||||
id: -1,
|
|
||||||
state: "server",
|
|
||||||
data: data
|
|
||||||
}), (err) => {
|
|
||||||
if(err) return void rej(false);
|
|
||||||
return void res(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
listenRoom(roomID: number, room: string, server: string) {
|
|
||||||
addRoomListener(this, roomID, room, server);
|
|
||||||
}
|
|
||||||
unlistenRoom(roomID: number) {
|
|
||||||
removeRoomListener(this, roomID);
|
|
||||||
}
|
|
||||||
unlistenAllRooms() {
|
|
||||||
removeRoomListener(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const closeWebSocket = async () => {
|
export const closeWebSocket = async () => {
|
||||||
|
|
|
@ -20,7 +20,6 @@ import { activatePost, addPostMethods } from "./api/post.js";
|
||||||
import { activateWS, closeWebSocket, wsOnConnection } from "./api/ws.js";
|
import { activateWS, closeWebSocket, wsOnConnection } from "./api/ws.js";
|
||||||
import { startUpdateCert } from "./server/serverCerts.js";
|
import { startUpdateCert } from "./server/serverCerts.js";
|
||||||
import { wait } from "./sys/tools.js";
|
import { wait } from "./sys/tools.js";
|
||||||
import { startChecks } from "./server/checks.js";
|
|
||||||
|
|
||||||
global.provideLog = 10;
|
global.provideLog = 10;
|
||||||
|
|
||||||
|
@ -71,8 +70,6 @@ nman.addShutdownTask(() => new Promise(async (res, rej) => {
|
||||||
if (serverclose != null) {
|
if (serverclose != null) {
|
||||||
serverclose.keepAliveTimeout = 100;
|
serverclose.keepAliveTimeout = 100;
|
||||||
serverclose.close(() => res());
|
serverclose.close(() => res());
|
||||||
} else {
|
|
||||||
res();
|
|
||||||
}
|
}
|
||||||
}), 10000);
|
}), 10000);
|
||||||
|
|
||||||
|
@ -124,10 +121,9 @@ async function complete_loaded() {
|
||||||
await nman.shutdown();
|
await nman.shutdown();
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
warn("Outbag", "Keep running due to debug Mode");
|
warn("Outbag", "Keep running tue to debug Mode");
|
||||||
}
|
}
|
||||||
activatePost();
|
activatePost();
|
||||||
activateWS();
|
activateWS();
|
||||||
startChecks();
|
|
||||||
log("Server", 'Listening...');
|
log("Server", 'Listening...');
|
||||||
}
|
}
|
|
@ -1,17 +0,0 @@
|
||||||
import { and, le, remove } from "dblang";
|
|
||||||
import { addShutdownTask } from "nman";
|
|
||||||
import { accounts, db } from "../sys/db.js"
|
|
||||||
import { uts } from "../sys/tools.js";
|
|
||||||
import { oConf } from "../sys/config.js";
|
|
||||||
|
|
||||||
export function startChecks() {
|
|
||||||
let i1 = setInterval(async () => {
|
|
||||||
await remove(accounts)
|
|
||||||
.where(and(
|
|
||||||
accounts.deleted,
|
|
||||||
le(accounts.deletedTime, uts() - oConf.get("Settings", "deletedAccountKeepSec"))
|
|
||||||
)).query(db);
|
|
||||||
}, 60000);
|
|
||||||
|
|
||||||
addShutdownTask(() => clearInterval(i1), 500);
|
|
||||||
}
|
|
|
@ -10,7 +10,6 @@ export const act_error = {
|
||||||
SERVER: "server", // uncaught error in server
|
SERVER: "server", // uncaught error in server
|
||||||
RECURSION: "recursion", // not allowed due to suspected remote recursion, will only appear with miss configureation
|
RECURSION: "recursion", // not allowed due to suspected remote recursion, will only appear with miss configureation
|
||||||
REMOTE: "remote", // error while remote request (like could not contact the remote server)
|
REMOTE: "remote", // error while remote request (like could not contact the remote server)
|
||||||
CONNECTION: "connection", // the current connection type is not correct
|
|
||||||
|
|
||||||
CLIENT_NOT_EXISTS: "clientnotexists", // seems like your own account does not exists (client.ts acts)
|
CLIENT_NOT_EXISTS: "clientnotexists", // seems like your own account does not exists (client.ts acts)
|
||||||
ACCOUNT_NOT_EXISTS: "accountnotexists", // referred account does not exists (admin / client trennen? )
|
ACCOUNT_NOT_EXISTS: "accountnotexists", // referred account does not exists (admin / client trennen? )
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
export const LISTENER_TYPE = {
|
|
||||||
ROOMINFO: 0,
|
|
||||||
ITEMS: 1,
|
|
||||||
CATEGORIES: 2,
|
|
||||||
PRODUCTS: 3,
|
|
||||||
}
|
|
||||||
|
|
||||||
export const LISTENER_ACTION = {
|
|
||||||
ADD: 0,
|
|
||||||
CHANGE: 1,
|
|
||||||
DELETE: 2,
|
|
||||||
}
|
|
|
@ -256,12 +256,8 @@ const outbag = async () => {
|
||||||
name: "defaultViewable",
|
name: "defaultViewable",
|
||||||
message: "Should outbag accounts be viewable by default?",
|
message: "Should outbag accounts be viewable by default?",
|
||||||
initial: oConf.get("Settings", "defaultViewable"),
|
initial: oConf.get("Settings", "defaultViewable"),
|
||||||
}, {
|
},
|
||||||
type: "number",
|
|
||||||
name: "deletedAccountKeepSec",
|
|
||||||
message: "Please enter the number of days a deleted Account is being save until final deletion!",
|
|
||||||
initial: oConf.get("Settings", "deletedAccountKeepSec") / 60 / 60 / 24
|
|
||||||
}
|
|
||||||
]);
|
]);
|
||||||
if (
|
if (
|
||||||
resp.maxUsers == null
|
resp.maxUsers == null
|
||||||
|
@ -269,7 +265,6 @@ const outbag = async () => {
|
||||||
|| resp.defaultMaxRoomSize == null
|
|| resp.defaultMaxRoomSize == null
|
||||||
|| resp.defaultMaxUsersPerRoom == null
|
|| resp.defaultMaxUsersPerRoom == null
|
||||||
|| resp.defaultViewable == null
|
|| resp.defaultViewable == null
|
||||||
|| resp.deletedAccountKeepSec == null
|
|
||||||
) {
|
) {
|
||||||
warn("Setup", "You have to provide all informations!");
|
warn("Setup", "You have to provide all informations!");
|
||||||
return false;
|
return false;
|
||||||
|
@ -290,7 +285,6 @@ const outbag = async () => {
|
||||||
oConf.set("Settings", "defaultMaxRoomSize", resp.defaultMaxRoomSize);
|
oConf.set("Settings", "defaultMaxRoomSize", resp.defaultMaxRoomSize);
|
||||||
oConf.set("Settings", "defaultMaxUsersPerRoom", resp.defaultMaxUsersPerRoom);
|
oConf.set("Settings", "defaultMaxUsersPerRoom", resp.defaultMaxUsersPerRoom);
|
||||||
oConf.set("Settings", "defaultViewable", resp.defaultViewable);
|
oConf.set("Settings", "defaultViewable", resp.defaultViewable);
|
||||||
oConf.set("Settings", "deletedAccountKeepSec", Math.round(resp.deletedAccountKeepSec * 60 * 60 * 24));
|
|
||||||
oConf.save();
|
oConf.save();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -26,8 +26,7 @@ const conf_struct = {
|
||||||
defaultMaxRooms: { type: "number", default: 3, env: "OUTBAG_DEFAULT_MAX_ROOMS" },//Infinity = -1
|
defaultMaxRooms: { type: "number", default: 3, env: "OUTBAG_DEFAULT_MAX_ROOMS" },//Infinity = -1
|
||||||
defaultMaxRoomSize: { type: "number", default: 10000, env: "OUTBAG_DEFAULT_MAX_ROOMS_SIZE" },//Infinity = -1
|
defaultMaxRoomSize: { type: "number", default: 10000, env: "OUTBAG_DEFAULT_MAX_ROOMS_SIZE" },//Infinity = -1
|
||||||
defaultMaxUsersPerRoom: { type: "number", default: 5, env: "OUTBAG_DEFAULT_MAX_USERS_PER_ROOM" },//Infinity = -1
|
defaultMaxUsersPerRoom: { type: "number", default: 5, env: "OUTBAG_DEFAULT_MAX_USERS_PER_ROOM" },//Infinity = -1
|
||||||
defaultViewable: { type: "boolean", default: false, env: "OUTBAG_DEFAULT_VIEWABLE" },
|
defaultViewable: { type: "boolean", default: false, env: "OUTBAG_DEFAULT_VIEWABLE" }
|
||||||
deletedAccountKeepSec: { type: "number", default: 60 * 60 * 24 * 20, env: "OUTBAG_DEL_ACCOUNT_KEEP_SEC" },
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,6 @@ accounts.addAttributes({
|
||||||
viewable: { type: BOOL, default: false },
|
viewable: { type: BOOL, default: false },
|
||||||
|
|
||||||
deleted: { type: BOOL, default: false },
|
deleted: { type: BOOL, default: false },
|
||||||
deletedTime: { type: BIGINT, default: 0 },
|
|
||||||
|
|
||||||
maxRooms: { type: INT },
|
maxRooms: { type: INT },
|
||||||
maxRoomSize: { type: INT },
|
maxRoomSize: { type: INT },
|
||||||
|
@ -118,9 +117,7 @@ rooms.addAttributes({
|
||||||
owner: {
|
owner: {
|
||||||
type: INT,
|
type: INT,
|
||||||
foreignKey: {
|
foreignKey: {
|
||||||
link: accounts.accID,
|
link: accounts.accID
|
||||||
onDelete: onAction.cascade,
|
|
||||||
onUpdate: onAction.cascade
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
rights: { type: INT, default: 0b11111 },
|
rights: { type: INT, default: 0b11111 },
|
||||||
|
|
|
@ -37,11 +37,10 @@ export const warn = (name: string, ...args: any[]) => {
|
||||||
let dateString = (new Date()).toLocaleString();
|
let dateString = (new Date()).toLocaleString();
|
||||||
console.warn(
|
console.warn(
|
||||||
"\x1b[33m%s\x1b[0m" +
|
"\x1b[33m%s\x1b[0m" +
|
||||||
"\x1b[1m\x1b[48;5;208m%s\x1b[0m\x1b[48;5;208m",
|
"\x1b[1m\x1b[36m%s\x1b[0m",
|
||||||
dateString+" ",
|
dateString,
|
||||||
`[${name}]:`,
|
` [${name}]:`,
|
||||||
...args,
|
...args
|
||||||
"\x1b[0m"
|
|
||||||
);
|
);
|
||||||
if (global.provideLog != 0) logList.push([logID++, "warn", dateString, name, args]);
|
if (global.provideLog != 0) logList.push([logID++, "warn", dateString, name, args]);
|
||||||
};
|
};
|
||||||
|
|
|
@ -26,4 +26,3 @@ defaultMaxRooms=2
|
||||||
defaultMaxRoomSize=10
|
defaultMaxRoomSize=10
|
||||||
defaultMaxUsersPerRoom=2
|
defaultMaxUsersPerRoom=2
|
||||||
defaultViewable=true
|
defaultViewable=true
|
||||||
deletedAccountKeepSec=1728000
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ const list = [
|
||||||
name: name2,
|
name: name2,
|
||||||
server: "localhost:7224",
|
server: "localhost:7224",
|
||||||
accountKey: accountKey + "lol"
|
accountKey: accountKey + "lol"
|
||||||
}, "error", act_error.AUTH);
|
}, "error",act_error.AUTH);
|
||||||
}], ["admin", async (req) => {
|
}], ["admin", async (req) => {
|
||||||
let resp = await req({
|
let resp = await req({
|
||||||
"authorization": `Digest name=${name1} server=localhost:7224 accountKey=${accountKey}`
|
"authorization": `Digest name=${name1} server=localhost:7224 accountKey=${accountKey}`
|
||||||
|
@ -150,7 +150,6 @@ const list = [
|
||||||
name: "testUser1",
|
name: "testUser1",
|
||||||
viewable: true,
|
viewable: true,
|
||||||
deleted: false,
|
deleted: false,
|
||||||
deletedTime: 0,
|
|
||||||
maxRooms: 2,
|
maxRooms: 2,
|
||||||
maxRoomSize: 10,
|
maxRoomSize: 10,
|
||||||
maxUsersPerRoom: 2
|
maxUsersPerRoom: 2
|
||||||
|
@ -160,7 +159,6 @@ const list = [
|
||||||
name: "testUser2",
|
name: "testUser2",
|
||||||
viewable: true,
|
viewable: true,
|
||||||
deleted: true,
|
deleted: true,
|
||||||
deletedTime: null,
|
|
||||||
maxRooms: 2,
|
maxRooms: 2,
|
||||||
maxRoomSize: 10,
|
maxRoomSize: 10,
|
||||||
maxUsersPerRoom: 2
|
maxUsersPerRoom: 2
|
||||||
|
@ -181,17 +179,15 @@ const list = [
|
||||||
name: "testUser1",
|
name: "testUser1",
|
||||||
viewable: true,
|
viewable: true,
|
||||||
deleted: false,
|
deleted: false,
|
||||||
deletedTime: 0,
|
|
||||||
maxRooms: 2,
|
maxRooms: 2,
|
||||||
maxRoomSize: 10,
|
maxRoomSize: 10,
|
||||||
maxUsersPerRoom: 2
|
maxUsersPerRoom: 2
|
||||||
}, {
|
}, {
|
||||||
accID: 3,
|
accID: null,
|
||||||
rights: 5,
|
rights: 5,
|
||||||
name: "testUser2",
|
name: "testUser2",
|
||||||
viewable: true,
|
viewable: true,
|
||||||
deleted: true,
|
deleted: true,
|
||||||
deletedTime: null,
|
|
||||||
maxRooms: 2,
|
maxRooms: 2,
|
||||||
maxRoomSize: 10,
|
maxRoomSize: 10,
|
||||||
maxUsersPerRoom: 2
|
maxUsersPerRoom: 2
|
||||||
|
|
Loading…
Reference in a new issue