Skip to content

Commit

Permalink
fix: waf page
Browse files Browse the repository at this point in the history
  • Loading branch information
naiba committed Nov 30, 2024
1 parent 7463bbe commit 3dc6da8
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 23 deletions.
6 changes: 3 additions & 3 deletions src/api/waf.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { ModelWAF } from "@/types"
import { ModelWAFApiMock } from "@/types"
import { fetcher, FetcherMethod } from "./api"

export const deleteWAF = async (ip: string[]): Promise<void> => {
return fetcher<void>(FetcherMethod.POST, '/api/v1/batch-delete/waf', ip);
}

export const getWAFList = async (): Promise<ModelWAF[]> => {
return fetcher<ModelWAF[]>(FetcherMethod.GET, '/api/v1/waf', null);
export const getWAFList = async (): Promise<ModelWAFApiMock[]> => {
return fetcher<ModelWAFApiMock[]>(FetcherMethod.GET, '/api/v1/waf', null);
}
14 changes: 12 additions & 2 deletions src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,18 @@ export function joinIP(p?: ModelIP) {
return '';
}

export function ip16Str(p: number[]) {
const buf = new Uint8Array(p);
function base64toUint8Array(base64str: string) {
const binary = atob(base64str);
const len = binary.length;
const buf = new Uint8Array(len);
for (let i = 0; i < len; i++) {
buf[i] = binary.charCodeAt(i);
}
return buf;
}

export function ip16Str(base64str: string) {
const buf = base64toUint8Array(base64str);
const ip4 = buf.slice(-6);
if (ip4[0] === 255 && ip4[1] === 255) {
return ip4.slice(2).join('.');
Expand Down
1 change: 1 addition & 0 deletions src/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@
"CustomCodesDashboard": "Custom Codes for Dashboard",
"CustomPublicDNSNameserversforDDNS": "Custom Public DNS Nameservers for DDNS",
"RealIPHeader": "Real IP request header",
"UseDirectConnectingIP": "Use direct connection IP",
"IPChangeNotification": "IP Change notification",
"FullIPNotification": "Show Full IP Address in Notification Messages",
"EditService": "Editing services",
Expand Down
1 change: 1 addition & 0 deletions src/locales/it/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@
"DashboardOriginalHost": "Nome di dominio/IP del server Dashboard (no CDN)",
"CustomPublicDNSNameserversforDDNS": "Server dei nomi DNS pubblici personalizzati per DDNS",
"RealIPHeader": "Intestazione della richiesta IP reale",
"UseDirectConnectingIP": "Utilizzare l'IP di connessione diretta",
"IPChangeNotification": "Notifica di modifica IP",
"FullIPNotification": "Mostra l'indirizzo IP completo nei messaggi di notifica",
"LoginFailed": "Accesso non riuscito",
Expand Down
1 change: 1 addition & 0 deletions src/locales/zh-CN/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
"DashboardOriginalHost": "仪表板服务器域名/IP(无 CDN)",
"CustomPublicDNSNameserversforDDNS": "DDNS 的自定义公共 DNS 名称服务器",
"RealIPHeader": "真实IP请求头",
"UseDirectConnectingIP": "使用直连 IP",
"IPChangeNotification": "IP变更通知",
"FullIPNotification": "在通知消息中显示完整的 IP 地址",
"LoginFailed": "登录失败",
Expand Down
1 change: 1 addition & 0 deletions src/locales/zh-TW/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
"DashboardOriginalHost": "儀表板伺服器網域/IP(無 CDN)",
"CustomPublicDNSNameserversforDDNS": "DDNS 的自訂公共 DNS 名稱伺服器",
"RealIPHeader": "真實IP請求頭",
"UseDirectConnectingIP": "使用直連 IP",
"IPChangeNotification": "IP變更通知",
"FullIPNotification": "在通知訊息中顯示完整的 IP 位址",
"LoginFailed": "登入失敗",
Expand Down
28 changes: 21 additions & 7 deletions src/routes/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ const settingFormSchema = z.object({
});

export default function SettingsPage() {
const { t , i18n} = useTranslation();
const { t, i18n } = useTranslation();
const [config, setConfig] = useState<ModelConfig>();
const [error, setError] = useState<Error>();

Expand All @@ -57,7 +57,7 @@ export default function SettingsPage() {
toast(t("Error"), {
description: t("Results.ErrorFetchingResource", { error: error.message }),
});
// eslint-disable-next-line react-hooks/exhaustive-deps
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [error]);

useEffect(() => {
Expand Down Expand Up @@ -106,9 +106,9 @@ export default function SettingsPage() {
return;
} finally {
toast(t("Success"));
if (values.language!= "auto"){
if (values.language != "auto") {
i18n.changeLanguage(values.language)
}else{
} else {
i18n.changeLanguage(i18n.services.languageDetector.detect());
}
}
Expand Down Expand Up @@ -204,7 +204,7 @@ export default function SettingsPage() {
render={({ field }) => (
<FormItem>
<FormLabel>
{t("CustomPublicDNSNameserversforDDNS")+" " + t("SeparateWithComma")}
{t("CustomPublicDNSNameserversforDDNS") + " " + t("SeparateWithComma")}
</FormLabel>
<FormControl>
<Input {...field} />
Expand All @@ -220,7 +220,21 @@ export default function SettingsPage() {
<FormItem>
<FormLabel>{t("RealIPHeader")}</FormLabel>
<FormControl>
<Input placeholder="NZ::Use-Peer-IP" {...field} />
<div className="flex items-center">
<Input disabled={field.value == 'NZ::Use-Peer-IP'} className="w-1/2" placeholder="CF-Connecting-IP" {...field} />
<Checkbox checked={field.value == 'NZ::Use-Peer-IP'} className="ml-2" onCheckedChange={(checked) => {
if (checked) {
field.disabled = true;
form.setValue("real_ip_header", "NZ::Use-Peer-IP");
} else {
field.disabled = false;
form.setValue("real_ip_header", "");
}
}} />
<FormLabel className="font-normal ml-2">
{t("UseDirectConnectingIP")}
</FormLabel>
</div>
</FormControl>
<FormMessage />
</FormItem>
Expand Down Expand Up @@ -260,7 +274,7 @@ export default function SettingsPage() {
name="ignored_ip_notification"
render={({ field }) => (
<FormItem>
<FormLabel>{t("SpecificServers")+" " + t("SeparateWithComma")}</FormLabel>
<FormLabel>{t("SpecificServers") + " " + t("SeparateWithComma")}</FormLabel>
<FormControl>
<Input placeholder="1,2,3" {...field} />
</FormControl>
Expand Down
14 changes: 7 additions & 7 deletions src/routes/waf.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { useEffect, useMemo } from "react";
import { ActionButtonGroup } from "@/components/action-button-group";
import { HeaderButtonGroup } from "@/components/header-button-group";
import { toast } from "sonner";
import { ModelWAF, wafBlockReasons } from "@/types";
import { ModelWAFApiMock, wafBlockReasons } from "@/types";
import { deleteWAF } from "@/api/waf";
import { ip16Str } from "@/lib/utils";
import { SettingsTab } from "@/components/settings-tab";
Expand All @@ -23,7 +23,7 @@ import { useTranslation } from "react-i18next";

export default function WAFPage() {
const { t } = useTranslation();
const { data, mutate, error, isLoading } = useSWR<ModelWAF[]>("/api/v1/waf", swrFetcher);
const { data, mutate, error, isLoading } = useSWR<ModelWAFApiMock[]>("/api/v1/waf", swrFetcher);

useEffect(() => {
if (error)
Expand All @@ -33,7 +33,7 @@ export default function WAFPage() {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [error]);

const columns: ColumnDef<ModelWAF>[] = [
const columns: ColumnDef<ModelWAFApiMock>[] = [
{
id: "select",
header: ({ table }) => (
Expand All @@ -59,7 +59,7 @@ export default function WAFPage() {
{
header: "IP",
accessorKey: "ip",
accessorFn: (row) => ip16Str(row.ip ?? []),
accessorFn: (row) => ip16Str(row.ip ?? ""),
},
{
header: t("Count"),
Expand All @@ -78,7 +78,7 @@ export default function WAFPage() {
accessorFn: (row) => row.last_block_timestamp,
cell: ({ row }) => {
const s = row.original;
const date = new Date(s.last_block_timestamp || 0);
const date = new Date((s.last_block_timestamp || 0)*1000);
return <span>{date.toISOString()}</span>;
},
},
Expand All @@ -92,7 +92,7 @@ export default function WAFPage() {
className="flex gap-2"
delete={{
fn: deleteWAF,
id: ip16Str(s.ip ?? []),
id: ip16Str(s.ip ?? ""),
mutate: mutate,
}}
>
Expand Down Expand Up @@ -123,7 +123,7 @@ export default function WAFPage() {
className="flex-2 flex gap-2 ml-auto"
delete={{
fn: deleteWAF,
id: selectedRows.map((r) => ip16Str(r.original.ip ?? [])),
id: selectedRows.map((r) => ip16Str(r.original.ip ?? "")),
mutate: mutate,
}}
>
Expand Down
9 changes: 5 additions & 4 deletions src/types/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ export interface GithubComNezhahqNezhaModelCommonResponseArrayModelUser {
success?: boolean;
}

export interface GithubComNezhahqNezhaModelCommonResponseArrayModelWAF {
data?: ModelWAF[];
export interface GithubComNezhahqNezhaModelCommonResponseArrayModelWAFApiMock {
data?: ModelWAFApiMock[];
error?: string;
success?: boolean;
}
Expand Down Expand Up @@ -425,6 +425,7 @@ export interface ModelProfile {

export interface ModelProfileForm {
new_password?: string;
new_username?: string;
original_password?: string;
}

Expand Down Expand Up @@ -647,9 +648,9 @@ export interface ModelUserForm {
username?: string;
}

export interface ModelWAF {
export interface ModelWAFApiMock {
count?: number;
ip?: number[];
ip?: string;
last_block_reason?: number;
last_block_timestamp?: number;
}

0 comments on commit 3dc6da8

Please sign in to comment.