Compare commits

..

No commits in common. "2527056e85e663e832c7c9bca879dc03c37923fd" and "bd3a81dfbcc56b715eea8c429fa339d8272ea18b" have entirely different histories.

15 changed files with 61 additions and 236 deletions

View File

@ -1,54 +0,0 @@
name: Build and Push Docker Image
on:
push:
branches:
- beta
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=beta
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=sha,prefix=
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@ -4,6 +4,9 @@ on:
push: push:
branches: branches:
- master - master
pull_request:
branches:
- master
workflow_dispatch: workflow_dispatch:
env: env:
@ -34,7 +37,6 @@ jobs:
with: with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: | tags: |
type=raw,value=latest
type=ref,event=branch type=ref,event=branch
type=ref,event=pr type=ref,event=pr
type=semver,pattern={{version}} type=semver,pattern={{version}}

View File

@ -168,11 +168,9 @@ const jaccardSimilarity = (v1: any, v2: any) => {
return intersection.size / union.size; return intersection.size / union.size;
}; };
/* const findRel = async (title: string) => {
const findRel =
async (title: string) => {
const req = await fetch("/api/sort"); const req = await fetch("/api/sort");
};*/ };
// Check words // Check words
const checkIfEmptyArray = []; const checkIfEmptyArray = [];

View File

@ -99,8 +99,6 @@ const deleteAccount = async () => {
const req = await fetch("/api/user/sendUserChanges", { const req = await fetch("/api/user/sendUserChanges", {
method: "DELETE", method: "DELETE",
}); });
const res = await res.json();
console.log(res);
}; };
const submitChangeAction = async (action: string) => { const submitChangeAction = async (action: string) => {
@ -174,42 +172,7 @@ const submitUserPassword = async () => {
}; };
</script> </script>
<template> <template>
<div <div class="justify-center align-center text-center">
class="justify-center align-center text-center absloute inset-0 p-1"
v-if="!isLoggedIn"
>
<form
class="flex flex-col items-center justify-center h-full"
@submit.prevent="submitUserPassword"
v-if="!success"
>
<span class="text-2xl text-bold mb-0">{{ t("settings.login") }}</span>
<span class="mb-4 text-sm mt-0"> {{ t("settings.loginmessage") }}</span>
<div class="">
<Input
type="text"
:placeholder="t('settings.placeholder.user')"
class="mb-2 p-2 border rounded"
v-model="userAccount"
required
/>
<Input
type="password"
:placeholder="t('settings.placeholder.password')"
class="p-2 border rounded mb-2"
v-model="userPassword"
required
/>
</div>
<span v-if="error" class="text-red-600 text-xs m-2"
>Error: {{ errormsg }}</span
>
<button class="bg-black text-white p-2 rounded transition duration-200">
{{ t("settings.loginButton") }}
</button>
</form>
</div>
<div class="justify-center align-center text-center" v-if="isLoggedIn">
<h1 class="text-3xl text-bold p-2"> <h1 class="text-3xl text-bold p-2">
{{ t("settings.greet") {{ t("settings.greet")
}}{{ user || userData.userAccount || t("settings.defaultname") }} }}{{ user || userData.userAccount || t("settings.defaultname") }}

View File

@ -1,33 +0,0 @@
services:
reverse-proxy:
image: traefik:v3.1
command:
- "--providers.docker"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- 127.0.0.1:36694:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- web
newsanalyze-service:
image: ghcr.io/hpware/news-analyze:beta
networks:
- web
labels:
- "traefik.enable=true"
- "traefik.http.routers.newsanalyze.rule=Host(`news.yuanhau.com`)"
- "traefik.http.services.newsanalyze.loadbalancer.server.port=3000"
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
env_file:
- path: ./.env
required: true
deploy:
mode: replicated
replicas: 2
networks:
web:

View File

@ -13,7 +13,7 @@ services:
- web - web
newsanalyze-service: newsanalyze-service:
image: ghcr.io/hpware/news-analyze:latest image: ghcr.io/hpware/news-analyze:master
networks: networks:
- web - web
labels: labels:

View File

@ -86,14 +86,7 @@
"dangerzone": "DANGER ZONE", "dangerzone": "DANGER ZONE",
"submit": "Submit", "submit": "Submit",
"greet": "Greetings, ", "greet": "Greetings, ",
"defaultname": "User", "defaultname": "User"
"login": "Login / Register",
"loginmessage": "We will create a account for you if you don't have one.",
"loginButton": "Log In",
"placeholder": {
"user": "Username",
"password": "Password"
}
}, },
"popuptext": { "popuptext": {
"logout": "Are you sure you want to logout?", "logout": "Are you sure you want to logout?",
@ -145,7 +138,7 @@
"opennewwindow": "This will open a new window", "opennewwindow": "This will open a new window",
"similararticles": "Similar Articles", "similararticles": "Similar Articles",
"similarity": "Similarity", "similarity": "Similarity",
"nosimilararticles": "There aren't any similar articles.", "nosimilararticles": "There isn't any similar articles.",
"articleopenpart1": "This will open a open a new window about this new org", "articleopenpart1": "This will open a open a new window about this new org",
"articleopenpart2": "" "articleopenpart2": ""
} }

View File

@ -86,14 +86,7 @@
"dangerzone": "DANGER ZONE", "dangerzone": "DANGER ZONE",
"submit": "送出", "submit": "送出",
"greet": "嗨, ", "greet": "嗨, ",
"defaultname": "使用者", "defaultname": "使用者"
"login": "登入 / 註冊",
"loginmessage": "如果妳沒有帳號的話,我們會幫你註冊一個。",
"loginButton": "登入按鈕",
"placeholder": {
"user": "使用者帳號",
"password": "密碼"
}
}, },
"popup": { "popup": {
"cancel": "取消", "cancel": "取消",

View File

@ -0,0 +1 @@
export default defineEventHandler(async (event) => {});

View File

@ -1,16 +1,15 @@
import getUserTokenMinusSQLInjection from "~/server/components/getUserToken";
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const loginCookie = await getUserTokenMinusSQLInjection(event); const loginCookie = getCookie(event, "session");
const lastCheckCookie = getCookie(event, "last_check");
const nowDate = new Date().toLocaleString();
try { try {
if (false) { if (loginCookie) {
deleteCookie(event, "token"); deleteCookie(event, "token");
return { return {
success: true, success: true,
error: null, error: null,
}; };
} }
return "testing";
} catch (e) { } catch (e) {
return { return {
success: false, success: false,

View File

@ -1,39 +1,6 @@
import sql from "~/server/components/postgres";
import getUserTokenMinusSQLInjection from "~/server/components/getUserToken";
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
try { const userToken = getCookie(event, "token");
const userToken = await getUserTokenMinusSQLInjection(event); return {
if (userToken.error.length !== 0) { token: userToken,
return { };
error: userToken.error,
};
}
// REMOVE OLD TOKENS
const removeToken = await sql`
DELETE FROM usertokens
WHERE username = ${userToken.user}
`;
console.log(removeToken);
// DELETE USER
const deleteUserAccount = await sql`
DELETE FROM users
WHERE username = ${userToken.user}
`;
const deleteOtherUserMetaData = await sql`
DELETE FROM user_other_data
WHERE username = ${userToken.user}
`;
console.log(deleteUserAccount);
console.log(deleteOtherUserMetaData);
deleteCookie(event, "token");
return {
success: true,
};
} catch (e) {
console.log(e);
return {
error: "INTERNAL_SERVER_ERROR",
e: e.message,
};
}
}); });

View File

@ -1,9 +1,17 @@
import sql from "~/server/components/postgres"; import sql from "~/server/components/postgres";
import getUserTokenMinusSQLInjection from "~/server/components/getUserToken";
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
// Check user data. // Check user data.
const token = await getUserTokenMinusSQLInjection(event); const userToken = getCookie(event, "token");
if (token.error.length !== 0) { if (!userToken) {
return {
error: "ERR_NOT_ALLOWED",
};
}
const checkUserToken = await sql`
select * from usertokens
where token=${userToken}
`;
if (checkUserToken.length === 0) {
return { return {
error: "ERR_NOT_ALLOWED", error: "ERR_NOT_ALLOWED",
}; };
@ -29,11 +37,26 @@ export default defineEventHandler(async (event) => {
` `
UPDATE user_other_data SET ${requestChange} = $1 UPDATE user_other_data SET ${requestChange} = $1
WHERE username = $2`, WHERE username = $2`,
[apiKeyqq[0], token.user], [apiKeyqq[0], checkUserToken[0].username],
); );
/**
* // Example of how requestChange might be validated
const allowedColumns = ['groq_api_key', 'another_column_name'];
if (!allowedColumns.includes(requestChange)) {
throw new Error('Invalid column name provided');
}
const sqlC = await sql`
UPDATE user_other_data SET ${sql.identifier([requestChange])} = ${apiKeyqq[0]}
WHERE username = ${checkUserToken[0].username}`;
*/
return { return {
body: body,
allowed: allowed,
data: body.value.match(clearBadDataRegex),
sqlC: sqlC, sqlC: sqlC,
success: true,
}; };
} }
}); });

View File

@ -1,11 +1,19 @@
import sql from "~/server/components/postgres"; import sql from "~/server/components/postgres";
import getUserTokenMinusSQLInjection from "~/server/components/getUserToken";
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
// Check user data. // Check user data.
const user = getUserTokenMinusSQLInjection(event); const userToken = getCookie(event, "token");
if (user.error.length !== 0) { if (!userToken) {
return { return {
error: user.error, error: "ERR_NOT_ALLOWED",
};
}
const checkUserToken = await sql`
select * from usertokens
where token=${userToken}
`;
if (checkUserToken.length === 0) {
return {
error: "ERR_NOT_ALLOWED",
}; };
} }
// Actual function // Actual function
@ -18,7 +26,7 @@ export default defineEventHandler(async (event) => {
` `
UPDATE user_other_data SET ${requestChange} = $1 UPDATE user_other_data SET ${requestChange} = $1
WHERE username = $2`, WHERE username = $2`,
[apiKeyqq[0], user.user], [apiKeyqq[0], checkUserToken[0].username],
); );
return { return {
body: body, body: body,

View File

@ -1,35 +0,0 @@
import sql from "~/server/components/postgres";
export default async function getUserTokenMinusSQLInjection(event) {
const userToken = await getCookie(event, "token");
if (!userToken) {
return {
token: null,
user: null,
error: "NO_TOKEN",
};
}
const uuidRegex =
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
if (!uuidRegex.test(userToken)) {
return {
token: null,
user: null,
error: "INVALID_TOKEN_FORMAT",
};
}
const getUser = await sql`
select * from usertokens
where token = ${userToken}`;
if (getUser.length === 0) {
return {
token: null,
user: null,
error: "NOT_AUTHED",
};
}
return {
token: userToken,
user: getUser[0].username,
error: "",
};
}

View File

@ -17,7 +17,7 @@ And also I wrote a super stupid cron fix, which is below.
## My stupid cron fix: ## My stupid cron fix:
Cron Job: Cron Job:
``` ```
0 * * * * "bun run /hardpushrevolvconf.ts" > /dev/null 0 1 * * * "bun run /hardpushrevolvconf.ts" > /dev/null
``` ```
Here is the script I used to force the change of my resolv.conf file: Here is the script I used to force the change of my resolv.conf file: