Update On Thu Apr 25 20:28:12 CEST 2024

This commit is contained in:
github-action[bot]
2024-04-25 20:28:12 +02:00
parent bff78e28ae
commit 21f49f5dec
160 changed files with 3925 additions and 3026 deletions

1
.github/update.log vendored
View File

@@ -627,3 +627,4 @@ Update On Sun Apr 21 20:27:36 CEST 2024
Update On Mon Apr 22 20:26:02 CEST 2024
Update On Tue Apr 23 20:33:42 CEST 2024
Update On Wed Apr 24 20:26:38 CEST 2024
Update On Thu Apr 25 20:28:01 CEST 2024

View File

@@ -18,8 +18,8 @@ require (
github.com/txthinking/x v0.0.0-20240301021728-6f68aba84c87
github.com/urfave/cli/v2 v2.25.7
github.com/urfave/negroni v1.0.0
golang.org/x/crypto v0.17.0
golang.org/x/net v0.18.0
golang.org/x/crypto v0.22.0
golang.org/x/net v0.24.0
)
require (
@@ -45,7 +45,7 @@ require (
go.uber.org/mock v0.4.0 // indirect
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.13.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect

View File

@@ -96,6 +96,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o=
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -108,6 +110,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -123,6 +127,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=

View File

@@ -1,7 +1,7 @@
{
"version": "20240404",
"text": "Get $10-$50 AI balance",
"link": "https://forms.gle/kjR5MccgzvGFGPp57",
"text_zh": "Get $10-$50 AI balance",
"link_zh": "https://forms.gle/kjR5MccgzvGFGPp57"
"text": "Clean the web with Brook",
"link": "https://www.txthinking.com/talks/articles/brook-clean-the-web-en.article",
"text_zh": "使用 Brook 净化互联网",
"link_zh": "https://www.txthinking.com/talks/articles/brook-clean-the-web.article"
}

View File

@@ -51,8 +51,8 @@ func HandleConn(c net.Conn, tunnel C.Tunnel, cache *lru.LruCache[string, bool],
var resp *http.Response
if !trusted {
resp = authenticate(request, cache)
resp, user := authenticate(request, cache)
additions = append(additions, inbound.WithInUser(user))
trusted = resp == nil
}
@@ -130,7 +130,7 @@ func HandleConn(c net.Conn, tunnel C.Tunnel, cache *lru.LruCache[string, bool],
_ = conn.Close()
}
func authenticate(request *http.Request, cache *lru.LruCache[string, bool]) *http.Response {
func authenticate(request *http.Request, cache *lru.LruCache[string, bool]) (resp *http.Response, u string) {
authenticator := authStore.Authenticator()
if inbound.SkipAuthRemoteAddress(request.RemoteAddr) {
authenticator = nil
@@ -140,23 +140,24 @@ func authenticate(request *http.Request, cache *lru.LruCache[string, bool]) *htt
if credential == "" {
resp := responseWith(request, http.StatusProxyAuthRequired)
resp.Header.Set("Proxy-Authenticate", "Basic")
return resp
return resp, ""
}
authed, exist := cache.Get(credential)
if !exist {
user, pass, err := decodeBasicProxyAuthorization(credential)
authed = err == nil && authenticator.Verify(user, pass)
u = user
cache.Set(credential, authed)
}
if !authed {
log.Infoln("Auth failed from %s", request.RemoteAddr)
return responseWith(request, http.StatusForbidden)
return responseWith(request, http.StatusForbidden), u
}
}
return nil
return nil, u
}
func responseWith(request *http.Request, statusCode int) *http.Response {

View File

@@ -98,11 +98,12 @@ func HandleSocks4(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
if inbound.SkipAuthRemoteAddr(conn.RemoteAddr()) {
authenticator = nil
}
addr, _, err := socks4.ServerHandshake(conn, authenticator)
addr, _, user, err := socks4.ServerHandshake(conn, authenticator)
if err != nil {
conn.Close()
return
}
additions = append(additions, inbound.WithInUser(user))
tunnel.HandleTCPConn(inbound.NewSocket(socks5.ParseAddr(addr), conn, C.SOCKS4, additions...))
}
@@ -111,7 +112,7 @@ func HandleSocks5(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
if inbound.SkipAuthRemoteAddr(conn.RemoteAddr()) {
authenticator = nil
}
target, command, err := socks5.ServerHandshake(conn, authenticator)
target, command, user, err := socks5.ServerHandshake(conn, authenticator)
if err != nil {
conn.Close()
return
@@ -121,5 +122,6 @@ func HandleSocks5(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
io.Copy(io.Discard, conn)
return
}
additions = append(additions, inbound.WithInUser(user))
tunnel.HandleTCPConn(inbound.NewSocket(target, conn, C.SOCKS5, additions...))
}

View File

@@ -43,7 +43,7 @@ var (
var subnet = netip.PrefixFrom(netip.IPv4Unspecified(), 24)
func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr string, command Command, err error) {
func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr string, command Command, user string, err error) {
var req [8]byte
if _, err = io.ReadFull(rw, req[:]); err != nil {
return
@@ -73,6 +73,7 @@ func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr s
if userID, err = readUntilNull(rw); err != nil {
return
}
user = string(userID)
if isReservedIP(dstIP) {
var target []byte
@@ -90,7 +91,7 @@ func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr s
}
// SOCKS4 only support USERID auth.
if authenticator == nil || authenticator.Verify(string(userID), "") {
if authenticator == nil || authenticator.Verify(user, "") {
code = RequestGranted
} else {
code = RequestIdentdMismatched

View File

@@ -106,7 +106,7 @@ type User struct {
}
// ServerHandshake fast-tracks SOCKS initialization to get target address to connect on server side.
func ServerHandshake(rw net.Conn, authenticator auth.Authenticator) (addr Addr, command Command, err error) {
func ServerHandshake(rw net.Conn, authenticator auth.Authenticator) (addr Addr, command Command, user string, err error) {
// Read RFC 1928 for request and reply structure and sizes.
buf := make([]byte, MaxAddrLen)
// read VER, NMETHODS, METHODS
@@ -141,7 +141,7 @@ func ServerHandshake(rw net.Conn, authenticator auth.Authenticator) (addr Addr,
if _, err = io.ReadFull(rw, authBuf[:userLen]); err != nil {
return
}
user := string(authBuf[:userLen])
user = string(authBuf[:userLen])
// Get password
if _, err = rw.Read(header[:1]); err != nil {

View File

@@ -41,7 +41,7 @@
},
"macOS": {
"frameworks": [],
"minimumSystemVersion": "10.15",
"minimumSystemVersion": "11.0",
"exceptionDomain": "",
"signingIdentity": null,
"entitlements": null

View File

@@ -1,13 +1,6 @@
import useSWR from "swr";
import { Clash, clash } from "../service/clash";
import {
getClashInfo as getClashInfoFromTauri,
getRuntimeExists as getRuntimeExistsFromTauri,
getProfiles as getProfilesFromTauri,
setProfiles as setProfilesFromTauri,
setProfilesConfig as setProfilesConfigFromTauri,
patchClashInfo,
} from "@/service/tauri";
import * as tauri from "@/service/tauri";
import { ClashConfig, Profile } from "..";
/**
@@ -17,11 +10,11 @@ import { ClashConfig, Profile } from "..";
export const useClash = () => {
const { deleteConnections, ...api } = clash();
const getClashInfo = useSWR("getClashInfo", getClashInfoFromTauri);
const getClashInfo = useSWR("getClashInfo", tauri.getClashInfo);
const setClashInfo = async (payload: Partial<ClashConfig>) => {
try {
await patchClashInfo(payload);
await tauri.patchClashInfo(payload);
await getClashInfo.mutate();
} finally {
@@ -59,19 +52,16 @@ export const useClash = () => {
}
};
const getRuntimeExists = useSWR(
"getRuntimeExists",
getRuntimeExistsFromTauri,
);
const getRuntimeExists = useSWR("getRuntimeExists", tauri.getRuntimeExists);
const getProfiles = useSWR("getProfiles", getProfilesFromTauri);
const getProfiles = useSWR("getProfiles", tauri.getProfiles);
const setProfiles = async (payload: {
index: string;
profile: Partial<Profile.Item>;
}) => {
try {
await setProfilesFromTauri(payload);
await tauri.setProfiles(payload);
await getProfiles.mutate();
} finally {
@@ -81,7 +71,7 @@ export const useClash = () => {
const setProfilesConfig = async (profiles: Profile.Config) => {
try {
await setProfilesConfigFromTauri(profiles);
await tauri.setProfilesConfig(profiles);
await getProfiles.mutate();
} finally {

View File

@@ -1,13 +1,6 @@
import useSWR from "swr";
import {
getNyanpasuConfig,
patchNyanpasuConfig,
VergeConfig,
getCoreVersion,
setClashCore as setClashCoreWithTauri,
restartSidecar,
updateCore as updateCoreWithTauri,
} from "@/service";
import * as service from "@/service";
import { VergeConfig, restartSidecar, getCoreVersion } from "@/service";
import { fetchCoreVersion, fetchLatestCore } from "@/service/core";
/**
@@ -20,12 +13,12 @@ export const useNyanpasu = (options?: {
}) => {
const { data, error, mutate } = useSWR<VergeConfig>(
"nyanpasuConfig",
getNyanpasuConfig,
service.getNyanpasuConfig,
);
const setNyanpasuConfig = async (payload: Partial<VergeConfig>) => {
try {
await patchNyanpasuConfig(payload);
await service.patchNyanpasuConfig(payload);
const result = await mutate();
@@ -44,7 +37,7 @@ export const useNyanpasu = (options?: {
const setClashCore = async (
clashCore: Required<VergeConfig>["clash_core"],
) => {
await setClashCoreWithTauri(clashCore);
await service.setClashCore(clashCore);
// timeout for restart clash core.
setTimeout(() => {
@@ -55,11 +48,25 @@ export const useNyanpasu = (options?: {
const getLatestCore = useSWR("getLatestCore", fetchLatestCore);
const updateCore = async (core: Required<VergeConfig>["clash_core"]) => {
await updateCoreWithTauri(core);
await service.updateCore(core);
getClashCore.mutate();
};
const getSystemProxy = useSWR("getSystemProxy", service.getSystemProxy);
const getServiceStatus = useSWR("getServiceStatus", service.checkService);
const setServiceStatus = async (type: "install" | "uninstall") => {
if (type === "install") {
await service.installService();
} else {
await service.uninstallService();
}
return getServiceStatus.mutate();
};
return {
nyanpasuConfig: data,
isLoading: !data && !error,
@@ -71,5 +78,8 @@ export const useNyanpasu = (options?: {
restartSidecar,
getLatestCore,
updateCore,
getSystemProxy,
getServiceStatus,
setServiceStatus,
};
};

View File

@@ -1,5 +1,11 @@
import { invoke } from "@tauri-apps/api/tauri";
import { ClashConfig, ClashInfo, VergeConfig, Profile } from "./types";
import {
ClashConfig,
ClashInfo,
VergeConfig,
Profile,
SystemProxy,
} from "./types";
import { ManifestVersion } from "./core";
export const getNyanpasuConfig = async () => {
@@ -66,3 +72,31 @@ export const updateCore = async (
export const pullupUWPTool = async () => {
return await invoke<void>("invoke_uwp_tool");
};
export const getSystemProxy = async () => {
return await invoke<SystemProxy>("get_sys_proxy");
};
export const checkService = async () => {
try {
const result = await invoke<{ code: number }>("check_service");
if (result?.code === 0) {
return "active";
} else if (result?.code === 400) {
return "installed";
} else {
return "unknown";
}
} catch (e) {
return "uninstall";
}
};
export const installService = async () => {
return await invoke<void>("install_service");
};
export const uninstallService = async () => {
return await invoke<void>("uninstall_service");
};

View File

@@ -101,3 +101,9 @@ export namespace Profile {
update_interval?: number;
}
}
export interface SystemProxy {
enable: boolean;
server: string;
bypass: string;
}

View File

@@ -0,0 +1,57 @@
import {
ButtonBaseProps,
Paper,
alpha,
ButtonBase,
Typography,
CircularProgress,
useTheme,
} from "@mui/material";
import { memo } from "react";
export interface PaperSwitchBottonProps extends ButtonBaseProps {
label: string;
checked: boolean;
loading?: boolean;
}
export const PaperSwitchBotton = memo(function PaperSwitchBotton({
label,
checked,
loading,
...props
}: PaperSwitchBottonProps) {
const { palette } = useTheme();
return (
<Paper
elevation={0}
sx={{
borderRadius: 6,
backgroundColor: checked
? alpha(palette.primary.main, 0.1)
: palette.mode == "dark"
? palette.common.black
: palette.common.white,
cursor: loading ? "progress" : "none",
}}
>
<ButtonBase
sx={{
borderRadius: 6,
width: "100%",
textAlign: "start",
padding: 2,
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
{...props}
>
<Typography sx={{ fontWeight: 700 }}>{label}</Typography>
{loading === true && <CircularProgress color="inherit" size={24} />}
</ButtonBase>
</Paper>
);
});

View File

@@ -149,6 +149,7 @@ export const SettingClashCore = () => {
return (
<motion.div
key={index}
initial={false}
animate={show ? "open" : "closed"}
variants={{
open: {
@@ -199,9 +200,7 @@ export const SettingClashCore = () => {
</LoadingButton>
</Box>
<Tooltip title="Show more">
<ExpandMore expand={expand} onClick={() => setExpand(!expand)} />
</Tooltip>
<ExpandMore expand={expand} onClick={() => setExpand(!expand)} />
</ListItem>
</List>
</BaseCard>

View File

@@ -0,0 +1,43 @@
import { BaseCard } from "@nyanpasu/ui";
import Grid from "@mui/material/Unstable_Grid2";
import { PaperSwitchBotton } from "./modules/system-proxy";
import { useTranslation } from "react-i18next";
import { useNyanpasu } from "@nyanpasu/interface";
export const SettingSystemBehavior = () => {
const { t } = useTranslation();
const { nyanpasuConfig, setNyanpasuConfig } = useNyanpasu();
return (
<BaseCard label="Initiating Behavior">
<Grid container spacing={2}>
<Grid xs={6}>
<PaperSwitchBotton
label={t("Auto Launch")}
checked={nyanpasuConfig?.enable_auto_launch || false}
onClick={() =>
setNyanpasuConfig({
enable_auto_launch: !nyanpasuConfig?.enable_auto_launch,
})
}
/>
</Grid>
<Grid xs={6}>
<PaperSwitchBotton
label={t("Silent Start")}
checked={nyanpasuConfig?.enable_silent_start || false}
onClick={() =>
setNyanpasuConfig({
enable_silent_start: !nyanpasuConfig?.enable_silent_start,
})
}
/>
</Grid>
</Grid>
</BaseCard>
);
};
export default SettingSystemBehavior;

View File

@@ -0,0 +1,173 @@
import {
BaseCard,
Expand,
ExpandMore,
NumberItem,
SwitchItem,
} from "@nyanpasu/ui";
import { useTranslation } from "react-i18next";
import Grid from "@mui/material/Unstable_Grid2";
import { useNyanpasu } from "@nyanpasu/interface";
import { useLockFn, useReactive } from "ahooks";
import { useMessage } from "@/hooks/use-notification";
import { PaperSwitchBotton } from "./modules/system-proxy";
import { useState } from "react";
import {
Box,
Button,
InputAdornment,
List,
ListItem,
TextField,
Tooltip,
Typography,
} from "@mui/material";
import { Done } from "@mui/icons-material";
export const SettingSystemProxy = () => {
const { t } = useTranslation();
const { nyanpasuConfig, setNyanpasuConfig, getSystemProxy } = useNyanpasu();
const loading = useReactive({
enable_tun_mode: false,
enable_system_proxy: false,
});
const handleClick = useLockFn(
async (key: "enable_system_proxy" | "enable_tun_mode") => {
try {
loading[key] = true;
await setNyanpasuConfig({
[key]: !nyanpasuConfig?.[key],
});
} catch (e) {
useMessage(`Activation failed!`, {
title: t("Error"),
type: "error",
});
} finally {
loading[key] = false;
}
},
);
const [expand, setExpand] = useState(false);
const [proxyBypass, setProxyBypass] = useState(
nyanpasuConfig?.system_proxy_bypass,
);
return (
<BaseCard
label={t("System Setting")}
labelChildren={
<ExpandMore expand={expand} onClick={() => setExpand(!expand)} />
}
>
<Grid container spacing={2}>
<Grid xs={6}>
<PaperSwitchBotton
label={t("Tun Mode")}
checked={nyanpasuConfig?.enable_tun_mode || false}
loading={loading.enable_tun_mode}
onClick={() => handleClick("enable_tun_mode")}
/>
</Grid>
<Grid xs={6}>
<PaperSwitchBotton
label={t("System Proxy")}
checked={nyanpasuConfig?.enable_system_proxy || false}
loading={loading.enable_system_proxy}
onClick={() => handleClick("enable_system_proxy")}
/>
</Grid>
</Grid>
<Expand open={expand}>
<List disablePadding sx={{ pt: 1 }}>
<SwitchItem
label={t("Proxy Guard")}
checked={nyanpasuConfig?.enable_proxy_guard || false}
onChange={() =>
setNyanpasuConfig({
enable_proxy_guard: !nyanpasuConfig?.enable_proxy_guard,
})
}
/>
<NumberItem
label={t("Guard Duration")}
vaule={nyanpasuConfig?.proxy_guard_duration || 0}
checkEvent={(input) => input <= 0}
checkLabel="Dueation must be greater than 0."
onApply={(value) => {
setNyanpasuConfig({ proxy_guard_duration: value });
}}
textFieldProps={{
inputProps: {
"aria-autocomplete": "none",
},
InputProps: {
endAdornment: <InputAdornment position="end">s</InputAdornment>,
},
}}
/>
<ListItem sx={{ pl: 0, pr: 0 }}>
<TextField
value={proxyBypass}
label={t("Proxy Bypass")}
variant="outlined"
sx={{ width: "100%" }}
multiline
onChange={(e) => setProxyBypass(e.target.value)}
/>
</ListItem>
<Expand open={proxyBypass != nyanpasuConfig?.system_proxy_bypass}>
<Box sx={{ pb: 1 }} display="flex" justifyContent="end">
<Button
variant="contained"
startIcon={<Done />}
onClick={() => {
setNyanpasuConfig({ system_proxy_bypass: proxyBypass });
}}
>
Apply
</Button>
</Box>
</Expand>
<ListItem sx={{ pl: 0, pr: 0 }}>
<Box>
<Typography variant="body1" sx={{ fontSize: "18px", mb: 1 }}>
{t("Current System Proxy")}
</Typography>
{Object.entries(getSystemProxy?.data ?? []).map(
([key, value], index) => {
return (
<Box key={index} display="flex" sx={{ pt: 1 }}>
<Typography
sx={{ width: 80, textTransform: "capitalize" }}
>
{key}:
</Typography>
<Typography>{String(value)}</Typography>
</Box>
);
},
)}
</Box>
</ListItem>
</List>
</Expand>
</BaseCard>
);
};
export default SettingSystemProxy;

View File

@@ -0,0 +1,91 @@
import { useMessage } from "@/hooks/use-notification";
import {
Button,
List,
ListItem,
ListItemText,
Typography,
} from "@mui/material";
import { useNyanpasu } from "@nyanpasu/interface";
import { BaseCard, SwitchItem } from "@nyanpasu/ui";
import { useTranslation } from "react-i18next";
export const SettingSystemService = () => {
const { t } = useTranslation();
const { getServiceStatus, setServiceStatus } = useNyanpasu();
const getButtonString = () => {
switch (getServiceStatus.data) {
case "unknown":
case "installed":
case "active": {
return "Uninstall";
}
case "uninstall": {
return "Install";
}
}
};
const checkDisbale =
getServiceStatus.data === "unknown" ||
getServiceStatus.data === "uninstall";
const handleClick = async () => {
try {
switch (getServiceStatus.data) {
case "unknown":
case "installed":
case "active":
setServiceStatus("uninstall");
break;
case "uninstall":
setServiceStatus("install");
break;
default:
break;
}
} catch (e) {
const errorMessage =
getServiceStatus.data === "uninstall"
? "Install failed"
: "Uninstall failed";
useMessage(errorMessage, {
type: "error",
title: t("Error"),
});
}
};
return (
<BaseCard label="System Service">
<List disablePadding>
<SwitchItem label={t("Service Mode")} disabled={checkDisbale} />
{checkDisbale && (
<ListItem sx={{ pl: 0, pr: 0 }}>
<Typography>
Information: Please make sure that the Clash Nyanpasu Service is
installed and enabled
</Typography>
</ListItem>
)}
<ListItem sx={{ pl: 0, pr: 0 }}>
<ListItemText primary={`Current State: ${getServiceStatus.data}`} />
<Button variant="contained" onClick={handleClick}>
{getButtonString()}
</Button>
</ListItem>
</List>
</BaseCard>
);
};
export default SettingSystemService;

View File

@@ -32,8 +32,9 @@ export const BaseCard = ({
display="flex"
justifyContent="space-between"
alignItems="center"
sx={{ pb: 1 }}
>
<Typography sx={{ pb: 1 }} variant="h5" component="div">
<Typography variant="h5" component="div">
{label}
</Typography>

View File

@@ -47,7 +47,7 @@ export const BaseDialog = ({
ok,
divider,
}: BaseDialogProps) => {
const [mounted, setMounted] = useState(true);
const [mounted, setMounted] = useState(false);
const { run: runMounted, cancel: cancelMounted } = useDebounceFn(
() => setMounted(false),

View File

@@ -22,6 +22,7 @@ export const Expand = ({
}): React.JSX.Element => {
return (
<motion.div
initial={false}
animate={open ? "open" : "closed"}
variants={{
open: { opacity: 1, height: "auto" },

View File

@@ -6,6 +6,7 @@ import {
Button,
Typography,
Divider,
TextFieldProps,
} from "@mui/material";
import Done from "@mui/icons-material/Done";
import { ChangeEvent, useMemo, useState } from "react";
@@ -18,6 +19,7 @@ export interface NumberItemprops {
checkLabel: string;
onApply: (input: number) => void;
divider?: boolean;
textFieldProps?: TextFieldProps;
}
/**
@@ -47,6 +49,7 @@ export const NumberItem = ({
checkLabel,
onApply,
divider,
textFieldProps,
}: NumberItemprops) => {
const [changed, setChanged] = useState(false);
@@ -69,6 +72,7 @@ export const NumberItem = ({
setInput(Number(e.target.value));
setChanged(true);
}}
{...textFieldProps}
/>
</ListItem>

View File

@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.18.3",
"mihomo_alpha": "alpha-b2280c8",
"mihomo_alpha": "alpha-7524a3a",
"clash_rs": "v0.1.16",
"clash_premium": "2023-09-05-gdcc8d87"
},
@@ -36,5 +36,5 @@
"darwin-x64": "clash-darwin-amd64-n{}.gz"
}
},
"updated_at": "2024-04-23T22:19:48.601Z"
"updated_at": "2024-04-24T22:20:23.008Z"
}

View File

@@ -65,7 +65,7 @@
"devDependencies": {
"@commitlint/cli": "19.3.0",
"@commitlint/config-conventional": "19.2.2",
"@tauri-apps/cli": "1.5.11",
"@tauri-apps/cli": "1.5.12",
"@types/fs-extra": "11.0.4",
"@types/lodash-es": "4.17.12",
"@types/node": "20.12.7",
@@ -98,7 +98,7 @@
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-order": "6.0.4",
"stylelint-scss": "6.2.1",
"tsx": "4.7.2",
"tsx": "4.7.3",
"typescript": "5.4.5"
},
"packageManager": "pnpm@9.0.6",

File diff suppressed because it is too large Load Diff

View File

@@ -24,21 +24,11 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 1.22.1
go-version: 1.22.2
- run: make lint-backend
lint-commits:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make lint-commits
lint:
runs-on: ubuntu-latest
needs: [lint-frontend, lint-backend, lint-commits]
needs: [lint-frontend, lint-backend]
steps:
- run: echo "done"
@@ -57,7 +47,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 1.22.1
go-version: 1.22.2
- run: make test-backend
test:
runs-on: ubuntu-latest
@@ -76,7 +66,7 @@ jobs:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version: 1.22.1
go-version: 1.22.2
- uses: actions/setup-node@v4
with:
node-version: '18'

View File

@@ -0,0 +1,46 @@
name: "Lint PR"
on:
pull_request_target:
types:
- opened
- reopened
- edited
- synchronize
permissions:
pull-requests: write
jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
id: lint_pr_title
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: marocchino/sticky-pull-request-comment@v2
# When the previous steps fails, the workflow would stop. By adding this
# condition you can continue the execution with the populated error message.
if: always() && (steps.lint_pr_title.outputs.error_message != null)
with:
header: pr-title-lint-error
message: |
Hey there and thank you for opening this pull request! 👋🏼
We require pull request titles to follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/) and it looks like your proposed title needs to be adjusted.
Details:
```
${{ steps.lint_pr_title.outputs.error_message }}
```
# Delete a previous comment when the issue has been resolved
- if: ${{ steps.lint_pr_title.outputs.error_message == null }}
uses: marocchino/sticky-pull-request-comment@v2
with:
header: pr-title-lint-error
delete: true

View File

@@ -27,7 +27,7 @@ test-backend: ## Run backend tests
$Q $(go) test -v ./...
.PHONY: lint
lint: lint-frontend lint-backend lint-commits ## Run all linters
lint: lint-frontend lint-backend ## Run all linters
.PHONY: lint-frontend
lint-frontend: ## Run frontend linters

View File

@@ -60,7 +60,7 @@ list or set it to 0.`,
// User exists in DB.
if err == nil {
if !overwrite {
checkErr(errors.New("user " + strconv.Itoa(int(user.ID)) + " is already registred"))
checkErr(errors.New("user " + strconv.Itoa(int(user.ID)) + " is already registered"))
}
// If the usernames mismatch, check if there is another one in the DB
@@ -84,6 +84,6 @@ list or set it to 0.`,
}
func usernameConflictError(username string, originalID, newID uint) error {
return fmt.Errorf(`can't import user with ID %d and username "%s" because the username is already registred with the user %d`,
return fmt.Errorf(`can't import user with ID %d and username "%s" because the username is already registered with the user %d`,
newID, username, originalID)
}

View File

@@ -74,7 +74,6 @@ export default {
"getETA",
]),
...mapWritableState(useFileStore, ["reload"]),
...mapActions(useUploadStore, ["reset"]),
formattedETA() {
if (!this.getETA || this.getETA === Infinity) {
return "--:--:--";
@@ -92,6 +91,7 @@ export default {
},
},
methods: {
...mapActions(useUploadStore, ["reset"]), // Mapping reset action from upload store
toggle: function () {
this.open = !this.open;
},
@@ -100,8 +100,8 @@ export default {
abortAllUploads();
buttons.done("upload");
this.open = false;
this.reset();
this.reload = true;
this.reset(); // Resetting the upload store state
this.reload = true; // Trigger reload in the file store
}
},
},

View File

@@ -1,7 +1,7 @@
<template>
<select name="selectLanguage" v-on:change="change" :value="locale">
<option v-for="(language, value) in locales" :key="value" :value="value">
{{ $t("languages." + language) }}
{{ language }}
</option>
</select>
</template>
@@ -15,30 +15,30 @@ export default {
data() {
let dataObj = {};
const locales = {
he: "he",
hu: "hu",
ar: "ar",
de: "de",
el: "el",
en: "en",
es: "es",
fr: "fr",
is: "is",
it: "it",
ja: "ja",
ko: "ko",
"nl-be": "nlBE",
pl: "pl",
"pt-br": "ptBR",
pt: "pt",
ro: "ro",
ru: "ru",
sk: "sk",
"sv-se": "svSE",
tr: "tr",
uk: "uk",
"zh-cn": "zhCN",
"zh-tw": "zhTW",
he: "עברית",
hu: "Magyar",
ar: "العربية",
de: "Deutsch",
el: "Ελληνικά",
en: "English",
es: "Español",
fr: "Français",
is: "Icelandic",
it: "Italiano",
ja: "日本語",
ko: "한국어",
"nl-be": "Dutch (Belgium)",
pl: "Polski",
"pt-br": "Português",
pt: "Português (Brasil)",
ro: "Romanian",
ru: "Русский",
sk: "Slovenčina",
"sv-se": "Swedish (Sweden)",
tr: "Türkçe",
uk: "Українська",
"zh-cn": "中文 (简体)",
"zh-tw": "中文 (繁體)",
};
// Vue3 reactivity breaks with this configuration

View File

@@ -68,11 +68,11 @@
border-top: 1px solid var(--borderPrimary);
}
.share__box__items #listing.list .item .name {
#listing.list .item .name {
width: 50%;
}
.share__box__items #listing.list .item .modified {
#listing.list .item .modified {
width: 25%;
}

View File

@@ -89,32 +89,6 @@
"f2": "إعادة تسمية الملف",
"help": "مساعدة"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"ua": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "إنشاء حساب جديد",
"loginInstead": "هل لديك حساب",

View File

@@ -82,32 +82,6 @@
"f2": "Datei umbenennen",
"help": "Hilfe"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Account erstellen",
"loginInstead": "Account besteht bereits",

View File

@@ -85,32 +85,6 @@
"f2": "μετονομασία αρχείου",
"help": "Βοήθεια"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"el": "Ελληνικά",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"ua": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Δημιουργία λογαριασμού",
"loginInstead": "Έχετε ήδη λογαριασμό",

View File

@@ -89,32 +89,6 @@
"f2": "rename file",
"help": "Help"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",

View File

@@ -83,31 +83,6 @@
"f2": "renombrar archivo",
"help": "Ayuda"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Niederländisch (Belgien)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Românesc",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Crear una cuenta",
"loginInstead": "Usuario ya existente",

View File

@@ -85,32 +85,6 @@
"f2": "Renommer le fichier",
"help": "Aide"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Créer un compte",
"loginInstead": "Vous avez déjà un compte",

View File

@@ -89,32 +89,6 @@
"f2": "שינוי שם קובץ",
"help": "עזרה"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "צור חשבון",
"loginInstead": "כבר יש לי חשבון",

View File

@@ -82,32 +82,6 @@
"f2": "fájl átnevezése",
"help": "Súgó"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Fiók létrehozása",
"loginInstead": "Már van fiókom",

View File

@@ -76,32 +76,6 @@
"f2": "endurnefna skjal",
"help": "Hjálp"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Búa til nýjan aðgang",
"loginInstead": "Þú ert þegar með aðgang",

View File

@@ -77,32 +77,6 @@
"f2": "rinomina un file",
"help": "Aiuto"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Crea un account",
"loginInstead": "Hai già un account",

View File

@@ -88,32 +88,6 @@
"f2": "ファイルの名前を変更",
"help": "ヘルプ"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "アカウントを作成",
"loginInstead": "ログインする",

View File

@@ -76,32 +76,6 @@
"f2": "파일 이름 변경",
"help": "도움말"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "계정 생성",
"loginInstead": "이미 계정이 있습니다",

View File

@@ -76,32 +76,6 @@
"f2": "bestand herbenoemen",
"help": "Help"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Account aanmaken",
"loginInstead": "Heeft al een account",

View File

@@ -76,32 +76,6 @@
"f2": "zmień nazwę pliku",
"help": "Pomoc"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Utwórz konto",
"loginInstead": "Takie konto już istnieje",

View File

@@ -83,32 +83,6 @@
"f2": "renomear arquivo",
"help": "Ajuda"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Criar uma conta",
"loginInstead": "Já possui uma conta",

View File

@@ -77,32 +77,6 @@
"f2": "alterar nome do ficheiro",
"help": "Ajuda"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Criar uma conta",
"loginInstead": "Já tenho uma conta",

View File

@@ -76,32 +76,6 @@
"f2": "redenumește fișierul",
"help": "Ajutor"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Crează cont",
"loginInstead": "Am deja cont",

View File

@@ -82,32 +82,6 @@
"f2": "переименовать файл",
"help": "Помощь"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Создать аккаунт",
"loginInstead": "Уже есть аккаунт",

View File

@@ -82,32 +82,6 @@
"f2": "premenuje súbor",
"help": "Pomoc"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Vytvoriť účet",
"loginInstead": "Už mám účet",

View File

@@ -76,32 +76,6 @@
"f2": "ändra namnet på filen",
"help": "Hjälp"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Skapa ett konto",
"loginInstead": "Du har redan ett konto",

View File

@@ -80,32 +80,6 @@
"f2": "dosyayı yeniden adlandır",
"help": "Yardım"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Bir hesap oluşturun",
"loginInstead": "Zaten hesabınız var mı",

View File

@@ -82,32 +82,6 @@
"f2": "перейменувати файл",
"help": "Допомога"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Створити обліковий запис",
"loginInstead": "Вже є обліковий запис",

View File

@@ -87,32 +87,6 @@
"f2": "重命名文件/文件夹",
"help": "帮助"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "创建用户",
"loginInstead": "已有用户登录",

View File

@@ -76,32 +76,6 @@
"f2": "重新命名檔案/資料夾",
"help": "幫助"
},
"languages": {
"he": "עברית",
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"uk": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "新建賬戶",
"loginInstead": "已有賬戶登錄",

View File

@@ -22,7 +22,7 @@ export function copy(text: string) {
}
})
.catch((e) => {
// Firefox doesnt support clipboard-write permission
// Firefox doesn't support clipboard-write permission
if (navigator.userAgent.indexOf("Firefox") != -1) {
navigator.clipboard.writeText(text).then(resolve).catch(reject);
} else {

View File

@@ -35,7 +35,7 @@ export function scanFiles(dt: DataTransfer): Promise<UploadList | FileList> {
const contents: UploadList = [];
if (dt.items) {
// ts didnt like the for of loop even tho
// ts didn't like the for of loop even tho
// it is the official example on MDN
// for (const item of dt.items) {
for (let i = 0; i < dt.items.length; i++) {

View File

@@ -71,7 +71,7 @@
<input
type="checkbox"
v-model="settings.branding.disableUsedPercentage"
id="branding-links"
id="branding-used-disk"
/>
{{ t("settings.disableUsedDiskPercentage") }}
</p>

View File

@@ -64,7 +64,7 @@ require (
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sys v0.18.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect

View File

@@ -203,8 +203,8 @@ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

View File

@@ -1,5 +1,5 @@
#!/bin/sh
PORT=${FB_PORT:-$(jq .port /.filebrowser.json)}
ADDRESS=${FB_ADDRESS:-$(jq .address /.filebrowser.json)}
PORT=${FB_PORT:-$(jq -r .port /.filebrowser.json)}
ADDRESS=${FB_ADDRESS:-$(jq -r .address /.filebrowser.json)}
ADDRESS=${ADDRESS:-localhost}
curl -f http://$ADDRESS:$PORT/health || exit 1

View File

@@ -69,6 +69,7 @@ func NewHandler(
api.PathPrefix("/tus").Handler(monkey(tusPostHandler(), "/api/tus")).Methods("POST")
api.PathPrefix("/tus").Handler(monkey(tusHeadHandler(), "/api/tus")).Methods("HEAD", "GET")
api.PathPrefix("/tus").Handler(monkey(tusPatchHandler(), "/api/tus")).Methods("PATCH")
api.PathPrefix("/tus").Handler(monkey(resourceDeleteHandler(fileCache), "/api/tus")).Methods("DELETE")
api.PathPrefix("/usage").Handler(monkey(diskUsage, "/api/usage")).Methods("GET")

View File

@@ -87,7 +87,7 @@ func resourceDeleteHandler(fileCache FileCache) handleFunc {
return errToStatus(err), err
}
return http.StatusOK, nil
return http.StatusNoContent, nil
})
}

View File

@@ -1,2 +1,2 @@
LINUX_VERSION-5.4 = .273
LINUX_KERNEL_HASH-5.4.273 = 8ba0cfd3faa7222542b30791def49f426d7b50a07217366ead655a5687534743
LINUX_VERSION-5.4 = .274
LINUX_KERNEL_HASH-5.4.274 = eac7b421a43cd46a3dbebf7c85d075faa7e164d80d215d31fcd35544b6f79ed4

View File

@@ -1000,7 +1000,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
u32 mahr = ravb_read(ndev, MAHR);
u32 malr = ravb_read(ndev, MALR);
@@ -2165,7 +2167,7 @@ static int ravb_probe(struct platform_de
@@ -2168,7 +2170,7 @@ static int ravb_probe(struct platform_de
priv->msg_enable = RAVB_DEF_MSG_ENABLE;
/* Read and set MAC address */

View File

@@ -959,14 +959,14 @@ CONFIG_CRYPTO=y
CONFIG_CRYPTO_AES=y
# CONFIG_CRYPTO_AES_586 is not set
# CONFIG_CRYPTO_AES_ARM is not set
# CONFIG_CRYPTO_AES_ARM_BS is not set
# CONFIG_CRYPTO_AES_ARM64_BS is not set
# CONFIG_CRYPTO_AES_ARM_CE is not set
# CONFIG_CRYPTO_AES_ARM64 is not set
# CONFIG_CRYPTO_AES_ARM64_BS is not set
# CONFIG_CRYPTO_AES_ARM64_CE is not set
# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set
# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set
# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set
# CONFIG_CRYPTO_AES_ARM_BS is not set
# CONFIG_CRYPTO_AES_ARM_CE is not set
# CONFIG_CRYPTO_AES_NI_INTEL is not set
# CONFIG_CRYPTO_AES_TI is not set
CONFIG_CRYPTO_ALGAPI=y
@@ -996,8 +996,8 @@ CONFIG_CRYPTO_BLKCIPHER2=y
# CONFIG_CRYPTO_CRC32C_INTEL is not set
# CONFIG_CRYPTO_CRC32_ARM_CE is not set
# CONFIG_CRYPTO_CRCT10DIF is not set
# CONFIG_CRYPTO_CRCT10DIF_ARM_CE is not set
# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set
# CONFIG_CRYPTO_CRCT10DIF_ARM_CE is not set
# CONFIG_CRYPTO_CRYPTD is not set
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
@@ -1054,8 +1054,8 @@ CONFIG_CRYPTO_BLKCIPHER2=y
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_GF128MUL is not set
# CONFIG_CRYPTO_GHASH is not set
# CONFIG_CRYPTO_GHASH_ARM_CE is not set
# CONFIG_CRYPTO_GHASH_ARM64_CE is not set
# CONFIG_CRYPTO_GHASH_ARM_CE is not set
# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
# CONFIG_CRYPTO_HASH is not set
# CONFIG_CRYPTO_HMAC is not set
@@ -1116,8 +1116,8 @@ CONFIG_CRYPTO_PCRYPT=y
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA256_ARM is not set
# CONFIG_CRYPTO_SHA256_ARM64 is not set
# CONFIG_CRYPTO_SHA2_ARM_CE is not set
# CONFIG_CRYPTO_SHA2_ARM64_CE is not set
# CONFIG_CRYPTO_SHA2_ARM_CE is not set
# CONFIG_CRYPTO_SHA3 is not set
# CONFIG_CRYPTO_SHA3_ARM64 is not set
# CONFIG_CRYPTO_SHA512 is not set
@@ -2241,7 +2241,6 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
# CONFIG_INA2XX_ADC is not set
# CONFIG_INDIRECT_PIO is not set
CONFIG_INET=y
CONFIG_INET_TABLE_PERTURB_ORDER=16
# CONFIG_INET6_AH is not set
# CONFIG_INET6_ESP is not set
# CONFIG_INET6_IPCOMP is not set
@@ -2256,6 +2255,7 @@ CONFIG_INET_TABLE_PERTURB_ORDER=16
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_LRO is not set
CONFIG_INET_TABLE_PERTURB_ORDER=16
# CONFIG_INET_TCP_DIAG is not set
# CONFIG_INET_TUNNEL is not set
# CONFIG_INET_UDP_DIAG is not set

View File

@@ -18,7 +18,7 @@ Reviewed-by: Bart Van Assche <bvanassche@acm.org>
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -462,7 +462,7 @@ static void lo_complete_rq(struct reques
@@ -468,7 +468,7 @@ static void lo_complete_rq(struct reques
if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
req_op(rq) != REQ_OP_READ) {
if (cmd->ret < 0)
@@ -27,7 +27,7 @@ Reviewed-by: Bart Van Assche <bvanassche@acm.org>
goto end_io;
}
@@ -1978,7 +1978,10 @@ static void loop_handle_cmd(struct loop_
@@ -2001,7 +2001,10 @@ static void loop_handle_cmd(struct loop_
failed:
/* complete non-aio request */
if (!cmd->use_aio || ret) {

View File

@@ -8,7 +8,7 @@
#define QUECTEL_PRODUCT_RM500K 0x7001
#define CMOTECH_VENDOR_ID 0x16d8
@@ -1246,6 +1247,7 @@ static const struct usb_device_id option
@@ -1251,6 +1252,7 @@ static const struct usb_device_id option
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },

View File

@@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de>
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6947,7 +6947,7 @@ static void __ref alloc_node_mem_map(str
@@ -6949,7 +6949,7 @@ static void __ref alloc_node_mem_map(str
mem_map = NODE_DATA(0)->node_mem_map;
#if defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) || defined(CONFIG_FLATMEM)
if (page_to_pfn(mem_map) != pgdat->node_start_pfn)

View File

@@ -506,7 +506,7 @@ Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+MODULE_ALIAS("nf-flow-table-hw");
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -6006,6 +6006,13 @@ static int nf_tables_flowtable_parse_hoo
@@ -6041,6 +6041,13 @@ static int nf_tables_flowtable_parse_hoo
if (err < 0)
return err;
@@ -520,7 +520,7 @@ Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
ops = kcalloc(n, sizeof(struct nf_hook_ops), GFP_KERNEL);
if (!ops)
return -ENOMEM;
@@ -6150,10 +6157,19 @@ static int nf_tables_newflowtable(struct
@@ -6190,10 +6197,19 @@ static int nf_tables_newflowtable(struct
}
flowtable->data.type = type;
@@ -540,7 +540,7 @@ Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
err = nf_tables_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK],
flowtable);
if (err < 0)
@@ -6279,7 +6295,8 @@ static int nf_tables_fill_flowtable_info
@@ -6319,7 +6335,8 @@ static int nf_tables_fill_flowtable_info
nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) ||
nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) ||
nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle),

View File

@@ -26,7 +26,7 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -857,6 +857,7 @@
@@ -866,6 +866,7 @@
resets = <&cru SRST_GMAC2IO_A>;
reset-names = "stmmaceth";
rockchip,grf = <&grf>;
@@ -34,7 +34,7 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
status = "disabled";
};
@@ -878,6 +879,7 @@
@@ -887,6 +888,7 @@
reset-names = "stmmaceth", "mac-phy";
phy-mode = "rmii";
phy-handle = <&phy>;

View File

@@ -26,7 +26,7 @@ use-case. You've been warned.
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -955,6 +955,33 @@
@@ -964,6 +964,33 @@
status = "disabled";
};

View File

@@ -38,7 +38,7 @@
};
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -822,6 +822,47 @@
@@ -831,6 +831,47 @@
};
};

View File

@@ -31,7 +31,7 @@ Signed-off-by: wevsty <ty@wevs.org>
reg = <0x0 0xff100000 0x0 0x1000>;
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -1882,6 +1882,16 @@
@@ -1890,6 +1890,16 @@
};
};

View File

@@ -11,7 +11,7 @@ Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -1034,6 +1034,13 @@
@@ -1043,6 +1043,13 @@
};
};

View File

@@ -80,8 +80,8 @@ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_CPU_SUP_CYRIX_32=y
@@ -179,8 +179,8 @@ CONFIG_GENERIC_VDSO_32=y
# CONFIG_GEOS is not set
CONFIG_GLOB=y
# CONFIG_HABANA_AI is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_HALTPOLL_CPUIDLE is not set
# CONFIG_HANGCHECK_TIMER is not set
CONFIG_HAS_DMA=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT_MAP=y

View File

@@ -51,8 +51,8 @@ func HandleConn(c net.Conn, tunnel C.Tunnel, cache *lru.LruCache[string, bool],
var resp *http.Response
if !trusted {
resp = authenticate(request, cache)
resp, user := authenticate(request, cache)
additions = append(additions, inbound.WithInUser(user))
trusted = resp == nil
}
@@ -130,7 +130,7 @@ func HandleConn(c net.Conn, tunnel C.Tunnel, cache *lru.LruCache[string, bool],
_ = conn.Close()
}
func authenticate(request *http.Request, cache *lru.LruCache[string, bool]) *http.Response {
func authenticate(request *http.Request, cache *lru.LruCache[string, bool]) (resp *http.Response, u string) {
authenticator := authStore.Authenticator()
if inbound.SkipAuthRemoteAddress(request.RemoteAddr) {
authenticator = nil
@@ -140,23 +140,24 @@ func authenticate(request *http.Request, cache *lru.LruCache[string, bool]) *htt
if credential == "" {
resp := responseWith(request, http.StatusProxyAuthRequired)
resp.Header.Set("Proxy-Authenticate", "Basic")
return resp
return resp, ""
}
authed, exist := cache.Get(credential)
if !exist {
user, pass, err := decodeBasicProxyAuthorization(credential)
authed = err == nil && authenticator.Verify(user, pass)
u = user
cache.Set(credential, authed)
}
if !authed {
log.Infoln("Auth failed from %s", request.RemoteAddr)
return responseWith(request, http.StatusForbidden)
return responseWith(request, http.StatusForbidden), u
}
}
return nil
return nil, u
}
func responseWith(request *http.Request, statusCode int) *http.Response {

View File

@@ -98,11 +98,12 @@ func HandleSocks4(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
if inbound.SkipAuthRemoteAddr(conn.RemoteAddr()) {
authenticator = nil
}
addr, _, err := socks4.ServerHandshake(conn, authenticator)
addr, _, user, err := socks4.ServerHandshake(conn, authenticator)
if err != nil {
conn.Close()
return
}
additions = append(additions, inbound.WithInUser(user))
tunnel.HandleTCPConn(inbound.NewSocket(socks5.ParseAddr(addr), conn, C.SOCKS4, additions...))
}
@@ -111,7 +112,7 @@ func HandleSocks5(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
if inbound.SkipAuthRemoteAddr(conn.RemoteAddr()) {
authenticator = nil
}
target, command, err := socks5.ServerHandshake(conn, authenticator)
target, command, user, err := socks5.ServerHandshake(conn, authenticator)
if err != nil {
conn.Close()
return
@@ -121,5 +122,6 @@ func HandleSocks5(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
io.Copy(io.Discard, conn)
return
}
additions = append(additions, inbound.WithInUser(user))
tunnel.HandleTCPConn(inbound.NewSocket(target, conn, C.SOCKS5, additions...))
}

View File

@@ -43,7 +43,7 @@ var (
var subnet = netip.PrefixFrom(netip.IPv4Unspecified(), 24)
func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr string, command Command, err error) {
func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr string, command Command, user string, err error) {
var req [8]byte
if _, err = io.ReadFull(rw, req[:]); err != nil {
return
@@ -73,6 +73,7 @@ func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr s
if userID, err = readUntilNull(rw); err != nil {
return
}
user = string(userID)
if isReservedIP(dstIP) {
var target []byte
@@ -90,7 +91,7 @@ func ServerHandshake(rw io.ReadWriter, authenticator auth.Authenticator) (addr s
}
// SOCKS4 only support USERID auth.
if authenticator == nil || authenticator.Verify(string(userID), "") {
if authenticator == nil || authenticator.Verify(user, "") {
code = RequestGranted
} else {
code = RequestIdentdMismatched

View File

@@ -106,7 +106,7 @@ type User struct {
}
// ServerHandshake fast-tracks SOCKS initialization to get target address to connect on server side.
func ServerHandshake(rw net.Conn, authenticator auth.Authenticator) (addr Addr, command Command, err error) {
func ServerHandshake(rw net.Conn, authenticator auth.Authenticator) (addr Addr, command Command, user string, err error) {
// Read RFC 1928 for request and reply structure and sizes.
buf := make([]byte, MaxAddrLen)
// read VER, NMETHODS, METHODS
@@ -141,7 +141,7 @@ func ServerHandshake(rw net.Conn, authenticator auth.Authenticator) (addr Addr,
if _, err = io.ReadFull(rw, authBuf[:userLen]); err != nil {
return
}
user := string(authBuf[:userLen])
user = string(authBuf[:userLen])
// Get password
if _, err = rw.Read(header[:1]); err != nil {

View File

@@ -479,9 +479,24 @@ std::unique_ptr<URLRequestContext> BuildURLRequestContext(
builder.DisableHttpCache();
builder.set_net_log(net_log);
std::string proxy_url = params.proxy_url;
bool force_quic = false;
if (proxy_url.compare(0, 7, "quic://") == 0) {
proxy_url.replace(0, 4, "https");
force_quic = true;
}
ProxyConfig proxy_config;
proxy_config.proxy_rules().ParseFromString(params.proxy_url);
LOG(INFO) << "Proxying via " << params.proxy_url;
proxy_config.proxy_rules().ParseFromString(proxy_url);
if (force_quic) {
const ProxyServer& proxy_server =
proxy_config.proxy_rules().single_proxies.First().First();
proxy_config.proxy_rules().single_proxies.SetSingleProxyChain(
ProxyChain::ForIpProtection({ProxyServer(
ProxyServer::Scheme::SCHEME_QUIC, proxy_server.host_port_pair())}));
}
LOG(INFO) << "Proxying via "
<< proxy_config.proxy_rules().single_proxies.ToDebugString();
auto proxy_service =
ConfiguredProxyResolutionService::CreateWithoutProxyResolver(
std::make_unique<ProxyConfigServiceFixed>(
@@ -507,11 +522,8 @@ std::unique_ptr<URLRequestContext> BuildURLRequestContext(
!params.proxy_pass.empty()) {
auto* session = context->http_transaction_factory()->GetSession();
auto* auth_cache = session->http_auth_cache();
std::string proxy_url = params.proxy_url;
GURL proxy_gurl(proxy_url);
if (proxy_url.compare(0, 7, "quic://") == 0) {
proxy_url.replace(0, 4, "https");
proxy_gurl = GURL(proxy_url);
if (force_quic) {
auto* quic = context->quic_context()->params();
quic->supported_versions = {quic::ParsedQuicVersion::RFCv1()};
quic->origins_to_force_quic_on.insert(

View File

@@ -0,0 +1,20 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-04-13 18:37+0000\n"
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfilebrowser/fa/>\n"
"Language: fa\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5-dev\n"
#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/system/filebrowser.js:16
#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3
msgid "File Browser"
msgstr "مرورگر پرونده"
#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3
msgid "Grant access to File Browser"
msgstr "اعطای دسترسی به مرورگر پرونده"

View File

@@ -0,0 +1,21 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-04-13 18:37+0000\n"
"Last-Translator: Matthaiks <kitynska@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfilebrowser/pl/>\n"
"Language: pl\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.5-dev\n"
#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/system/filebrowser.js:16
#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3
msgid "File Browser"
msgstr "Przeglądarka plików"
#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3
msgid "Grant access to File Browser"
msgstr "Udziel dostępu do Przeglądarki plików"

View File

@@ -0,0 +1,21 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-04-13 18:37+0000\n"
"Last-Translator: Yurt Page <yurtpage@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfilebrowser/ru/>\n"
"Language: ru\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.5-dev\n"
#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/system/filebrowser.js:16
#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3
msgid "File Browser"
msgstr "Обозреватель Файлов"
#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3
msgid "Grant access to File Browser"
msgstr "Предоставить доступ к Обозревателю Файлов"

View File

@@ -0,0 +1,20 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-04-13 18:37+0000\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfilebrowser/tr/>\n"
"Language: tr\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5-dev\n"
#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/system/filebrowser.js:16
#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3
msgid "File Browser"
msgstr "Dosya Gezgini"
#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3
msgid "Grant access to File Browser"
msgstr "Dosya gezginine erişim izni verin"

View File

@@ -0,0 +1,14 @@
msgid ""
msgstr ""
"Language: uk\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/system/filebrowser.js:16
#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3
msgid "File Browser"
msgstr ""
#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3
msgid "Grant access to File Browser"
msgstr ""

View File

@@ -0,0 +1 @@
zh_Hans

View File

@@ -0,0 +1,20 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-04-13 18:37+0000\n"
"Last-Translator: try496 <pinghejk@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"openwrt/luciapplicationsfilebrowser/zh_Hans/>\n"
"Language: zh_Hans\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.5-dev\n"
#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/system/filebrowser.js:16
#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3
msgid "File Browser"
msgstr "文件浏览器"
#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3
msgid "Grant access to File Browser"
msgstr "授予文件浏览器访问权限"

View File

@@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_quickstart:=$(ARCH)
PKG_NAME:=quickstart
PKG_VERSION:=0.8.10
PKG_VERSION:=0.8.11
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/
PKG_HASH:=e73a2f4b4d439b2ab51cb6906ea7b42f4470b739beefe6c9047e0687d3ecbc44
PKG_HASH:=a99a07580936f1ff1cbb8f9cd3a3a42f7f2b53eaf7ac2ecaaa89ea5a7e4db1cb
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)

View File

@@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=4.77-3
PKG_VERSION:=4.77-4
PKG_RELEASE:=
PKG_CONFIG_DEPENDS:= \

View File

@@ -266,11 +266,8 @@ o.default = "0"
---- DNS Forward Mode
dns_mode = s:taboption("DNS", ListValue, "dns_mode", translate("Filter Mode"))
dns_mode.rmempty = false
dns_mode:reset_values()
if api.is_finded("dns2tcp") then
dns_mode:value("dns2tcp", translatef("Requery DNS By %s", "TCP"))
end
dns_mode:value("tcp", translatef("Requery DNS By %s", "TCP"))
dns_mode:value("udp", translatef("Requery DNS By %s", "UDP"))
if api.is_finded("dns2socks") then
dns_mode:value("dns2socks", "dns2socks")
end
@@ -280,9 +277,8 @@ end
if has_xray then
dns_mode:value("xray", "Xray")
end
dns_mode:value("udp", translatef("Requery DNS By %s", "UDP"))
o = s:taboption("DNS", ListValue, "xray_dns_mode", " ")
o = s:taboption("DNS", ListValue, "xray_dns_mode", translate("Request protocol"))
o:value("tcp", "TCP")
o:value("tcp+doh", "TCP + DoH (" .. translate("A/AAAA type") .. ")")
o:depends("dns_mode", "xray")
@@ -295,7 +291,7 @@ o.write = function(self, section, value)
end
end
o = s:taboption("DNS", ListValue, "singbox_dns_mode", " ")
o = s:taboption("DNS", ListValue, "singbox_dns_mode", translate("Request protocol"))
o:value("tcp", "TCP")
o:value("doh", "DoH")
o:depends("dns_mode", "sing-box")
@@ -331,7 +327,7 @@ o:value("9.9.9.9", "9.9.9.9 (Quad9-Recommended)")
o:value("208.67.220.220", "208.67.220.220 (OpenDNS)")
o:value("208.67.222.222", "208.67.222.222 (OpenDNS)")
o:depends({dns_mode = "dns2socks"})
o:depends({dns_mode = "dns2tcp"})
o:depends({dns_mode = "tcp"})
o:depends({dns_mode = "udp"})
o:depends({xray_dns_mode = "tcp"})
o:depends({xray_dns_mode = "tcp+doh"})
@@ -375,13 +371,6 @@ o.validate = function(self, value, t)
return value
end
o = s:taboption("DNS", Flag, "dns_cache", translate("Cache Resolved"))
o.default = "1"
o:depends({dns_mode = "dns2socks"})
o:depends({dns_mode = "sing-box", remote_fakedns = false})
o:depends({dns_mode = "xray"})
o.rmempty = false
if api.is_finded("chinadns-ng") then
o = s:taboption("DNS", Flag, "chinadns_ng", translate("ChinaDNS-NG"), translate("The effect is better, recommend."))
o.default = "0"

View File

@@ -145,12 +145,12 @@ msgstr "请确保此Socks服务可用。"
msgid "Format must be:"
msgstr "格式必须为:"
msgid "Request protocol"
msgstr "请求协议"
msgid "Remote DNS DoH"
msgstr "远程 DNS DoH"
msgid "Cache Resolved"
msgstr "缓存解析结果"
msgid "Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address)."
msgstr "用于 DNS 查询时通知 DNS 服务器,客户端所在的地理位置(不能是私有 IP 地址)。"

View File

@@ -6,7 +6,7 @@ config global
option udp_node 'nil'
option tcp_node_socks_port '1070'
option filter_proxy_ipv6 '1'
option dns_mode 'dns2tcp'
option dns_mode 'tcp'
option remote_dns '1.1.1.1'
option use_default_dns 'direct'
option chinadns_ng '1'

View File

@@ -493,9 +493,9 @@ run_chinadns_ng() {
cat <<-EOF > ${_CONF_FILE}
verbose
bind-addr 127.0.0.1
bind-port ${_listen_port}@udp
bind-port ${_listen_port}
china-dns ${_dns_local}
trust-dns udp://${_dns_trust}
trust-dns ${_dns_trust}
filter-qtype 65
EOF
@@ -524,7 +524,7 @@ run_chinadns_ng() {
cat <<-EOF >> ${_CONF_FILE}
group proxylist
group-dnl ${RULES_PATH}/proxy_host
group-upstream udp://${_dns_trust}
group-upstream ${_dns_trust}
group-ipset ${blacklist4_set},${blacklist6_set}
EOF
[ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:proxylist" >> ${_CONF_FILE}
@@ -567,7 +567,7 @@ run_chinadns_ng() {
cat <<-EOF >> ${_CONF_FILE}
group chn_proxy
group-dnl ${RULES_PATH}/chnlist
group-upstream udp://${_dns_trust}
group-upstream ${_dns_trust}
group-ipset ${chnroute4_set},${chnroute6_set}
EOF
[ "${_no_ipv6_trust}" = "1" ] && echo "no-ipv6 tag:chn_proxy" >> ${_CONF_FILE}
@@ -1219,17 +1219,9 @@ stop_crontab() {
}
start_dns() {
TUN_DNS="127.0.0.1#${dns_listen_port}"
echolog "DNS域名解析"
[ "$ENABLED_ACLS" == 1 ] && {
local items=$(uci show ${CONFIG} | grep "=acl_rule" | cut -d '.' -sf 2 | cut -d '=' -sf 1)
[ -n "$items" ] && {
for item in $items; do
[ "$(config_n_get $item enabled)" = "1" ] || continue
done
}
}
TUN_DNS="127.0.0.1#${dns_listen_port}"
case "$DNS_MODE" in
dns2socks)
@@ -1303,33 +1295,44 @@ start_dns() {
run_xray ${_args}
}
;;
dns2tcp)
use_tcp_node_resolve_dns=1
ln_run "$(first_type dns2tcp)" dns2tcp "/dev/null" -L "${TUN_DNS}" -R "$(get_first_dns REMOTE_DNS 53)" -v
echolog " - dns2tcp(${TUN_DNS}) -> tcp://$(get_first_dns REMOTE_DNS 53 | sed 's/#/:/g')"
;;
udp)
use_udp_node_resolve_dns=1
TUN_DNS="$(echo ${REMOTE_DNS} | sed 's/#/:/g' | sed -E 's/\:([^:]+)$/#\1/g')"
echolog " - udp://${TUN_DNS}"
if [ "$CHINADNS_NG" = "1" ] && [ -n "$(first_type chinadns-ng)" ]; then
local china_ng_listen_port=${dns_listen_port}
local china_ng_trust_dns="udp://$(get_first_dns REMOTE_DNS 53 | sed 's/:/#/g')"
else
TUN_DNS="$(echo ${REMOTE_DNS} | sed 's/#/:/g' | sed -E 's/\:([^:]+)$/#\1/g')"
echolog " - udp://${TUN_DNS}"
fi
;;
*)
use_tcp_node_resolve_dns=1
if [ "$CHINADNS_NG" = "1" ] && [ -n "$(first_type chinadns-ng)" ]; then
local china_ng_listen_port=${dns_listen_port}
local china_ng_trust_dns="tcp://$(get_first_dns REMOTE_DNS 53 | sed 's/:/#/g')"
else
ln_run "$(first_type dns2tcp)" dns2tcp "/dev/null" -L "${TUN_DNS}" -R "$(get_first_dns REMOTE_DNS 53)" -v
echolog " - dns2tcp(${TUN_DNS}) -> tcp://$(get_first_dns REMOTE_DNS 53 | sed 's/#/:/g')"
fi
;;
esac
[ -n "${resolve_dns_log}" ] && echolog " - ${resolve_dns_log}"
[ "${use_tcp_node_resolve_dns}" = "1" ] && echolog " * 请确认上游 DNS 支持 TCP 查询,如非直连地址,确保 TCP 代理打开,并且已经正确转发!"
[ "${use_udp_node_resolve_dns}" = "1" ] && echolog " * 要求代理 DNS 请求,如上游 DNS 非直连地址,确保 UDP 代理打开,并且已经正确转发!"
[ "${use_udp_node_resolve_dns}" = "1" ] && echolog " * 请确认上游 DNS 支持 UDP 查询并已使用 UDP 节点,如上游 DNS 非直连地址,确保 UDP 代理打开,并且已经正确转发!"
[ "$CHINADNS_NG" = "1" ] && [ -n "$(first_type chinadns-ng)" ] && {
[ "$FILTER_PROXY_IPV6" = "1" ] && DNSMASQ_FILTER_PROXY_IPV6=0
local china_ng_listen_port=$(expr $dns_listen_port + 1)
[ -z "${china_ng_listen_port}" ] && local china_ng_listen_port=$(expr $dns_listen_port + 1)
local china_ng_listen="127.0.0.1#${china_ng_listen_port}"
[ -z "${china_ng_trust_dns}" ] && local china_ng_trust_dns=${TUN_DNS}
run_chinadns_ng \
_flag="default" \
_listen_port=${china_ng_listen_port} \
_dns_local=$(echo -n $(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n2) | tr " " ",") \
_dns_trust=${TUN_DNS} \
_dns_trust=${china_ng_trust_dns} \
_no_ipv6_trust=${FILTER_PROXY_IPV6} \
_use_direct_list=${USE_DIRECT_LIST} \
_use_proxy_list=${USE_PROXY_LIST} \
@@ -1338,7 +1341,7 @@ start_dns() {
_default_mode=${TCP_PROXY_MODE} \
_default_tag=$(config_t_get global chinadns_ng_default_tag smart)
echolog " - ChinaDNS-NG(127.0.0.1#${china_ng_listen_port})直连DNS$(echo -n $(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n2) | tr " " ",")可信DNS${TUN_DNS}"
echolog " - ChinaDNS-NG(${china_ng_listen})直连DNS$(echo -n $(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n2) | tr " " ",")可信DNS${china_ng_trust_dns}"
USE_DEFAULT_DNS="chinadns_ng"
}
@@ -1763,8 +1766,8 @@ LOCALHOST_PROXY=$(config_t_get global localhost_proxy 1)
LOCALHOST_UDP_PROXY_MODE=$UDP_PROXY_MODE
}
CLIENT_PROXY=$(config_t_get global client_proxy 1)
DNS_MODE=$(config_t_get global dns_mode dns2tcp)
DNS_CACHE=$(config_t_get global dns_cache 0)
DNS_MODE=$(config_t_get global dns_mode tcp)
DNS_CACHE=0
REMOTE_DNS=$(config_t_get global remote_dns 1.1.1.1:53 | sed 's/#/:/g' | sed -E 's/\:([^:]+)$/#\1/g')
CHINADNS_NG=$(config_t_get global chinadns_ng 0)
USE_DEFAULT_DNS=$(config_t_get global use_default_dns direct)

View File

@@ -35,8 +35,10 @@ local haproxy_dns = var["-dns"] or "119.29.29.29:53,223.5.5.5:53"
local cpu_thread = sys.exec('echo -n $(cat /proc/cpuinfo | grep "processor" | wc -l)') or "1"
local health_check_type = uci:get(appname, "@global_haproxy[0]", "health_check_type") or "tcp"
local health_check_inter = uci:get(appname, "@global_haproxy[0]", "health_check_inter") or "10"
local console_port = uci:get(appname, "@global_haproxy[0]", "console_port")
log("HAPROXY 负载均衡...")
log("HAPROXY 负载均衡")
log(string.format(" * 控制台端口:%s", console_port))
fs.mkdir(haproxy_path)
local haproxy_file = haproxy_path .. "/" .. haproxy_conf
@@ -159,7 +161,7 @@ end
table.sort(sortTable, function(a,b) return (a < b) end)
for i, port in pairs(sortTable) do
log(" + 入口 0.0.0.0:%s..." % port)
log(" + 入口 0.0.0.0:%s" % port)
f_out:write("\n" .. string.format([[
listen %s
@@ -201,7 +203,6 @@ listen %s
end
--控制台配置
local console_port = uci:get(appname, "@global_haproxy[0]", "console_port")
local console_user = uci:get(appname, "@global_haproxy[0]", "console_user")
local console_password = uci:get(appname, "@global_haproxy[0]", "console_password")
local str = [[
@@ -214,6 +215,5 @@ listen console
%s
]]
f_out:write("\n" .. string.format(str, console_port, (console_user and console_user ~= "" and console_password and console_password ~= "") and "stats auth " .. console_user .. ":" .. console_password or ""))
log(string.format(" * 控制台端口:%s", console_port))
f_out:close()

View File

@@ -180,9 +180,9 @@ get_wan6_ip() {
}
load_acl() {
([ "$ENABLED_ACLS" == 1 ] || ([ "$ENABLED_DEFAULT_ACL" == 1 ] && [ "$CLIENT_PROXY" == 1 ])) && echolog " - 访问控制:"
[ "$ENABLED_ACLS" == 1 ] && {
acl_app
echolog "访问控制:"
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
eval $(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)
@@ -255,11 +255,11 @@ load_acl() {
if [ "$tcp_no_redir_ports" != "1:65535" ]; then
$ip6t_m -A PSW $(comment "$remarks") ${_ipt_source} -p tcp -m multiport --dport $tcp_no_redir_ports -j RETURN 2>/dev/null
$ipt_tmp -A PSW $(comment "$remarks") ${_ipt_source} -p tcp -m multiport --dport $tcp_no_redir_ports -j RETURN
echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]"
echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]"
else
#结束时会return无需加多余的规则。
unset tcp_port
echolog " - ${msg}不代理所有 TCP 端口"
echolog " - ${msg}不代理所有 TCP 端口"
fi
}
@@ -267,11 +267,11 @@ load_acl() {
if [ "$udp_no_redir_ports" != "1:65535" ]; then
$ip6t_m -A PSW $(comment "$remarks") ${_ipt_source} -p udp -m multiport --dport $udp_no_redir_ports -j RETURN 2>/dev/null
$ipt_m -A PSW $(comment "$remarks") ${_ipt_source} -p udp -m multiport --dport $udp_no_redir_ports -j RETURN
echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]"
echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]"
else
#结束时会return无需加多余的规则。
unset udp_port
echolog " - ${msg}不代理所有 UDP 端口"
echolog " - ${msg}不代理所有 UDP 端口"
fi
}
@@ -298,7 +298,7 @@ load_acl() {
[ "${use_gfw_list}" = "1" ] && $ipt_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "-m multiport --dport") $(dst $IPSET_GFW) -j DROP
[ "${chn_list}" != "0" ] && $ipt_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "-m multiport --dport") $(dst $IPSET_CHN) $(get_jump_ipt ${chn_list} "-j DROP")
[ "${tcp_proxy_mode}" != "disable" ] && $ipt_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "-m multiport --dport") -j DROP
echolog " - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]"
echolog " - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]"
}
[ "$udp_proxy_drop_ports" != "disable" ] && {
@@ -315,7 +315,7 @@ load_acl() {
[ "${use_gfw_list}" = "1" ] && $ipt_m -A PSW $(comment "$remarks") -p udp ${_ipt_source} $(factor $udp_proxy_drop_ports "-m multiport --dport") $(dst $IPSET_GFW) -j DROP
[ "${chn_list}" != "0" ] && $ipt_m -A PSW $(comment "$remarks") -p udp ${_ipt_source} $(factor $udp_proxy_drop_ports "-m multiport --dport") $(dst $IPSET_CHN) $(get_jump_ipt ${chn_list} "-j DROP")
[ "${udp_proxy_mode}" != "disable" ] && $ipt_m -A PSW $(comment "$remarks") -p udp ${_ipt_source} $(factor $udp_proxy_drop_ports "-m multiport --dport") -j DROP
echolog " - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]"
echolog " - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]"
}
}
@@ -374,7 +374,7 @@ load_acl() {
else
msg2="${msg}不代理 TCP"
fi
echolog " - ${msg2}"
echolog " - ${msg2}"
}
$ip6t_m -A PSW $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN 2>/dev/null
@@ -404,7 +404,7 @@ load_acl() {
else
msg2="${msg}不代理 UDP"
fi
echolog " - ${msg2}"
echolog " - ${msg2}"
}
$ip6t_m -A PSW $(comment "$remarks") ${_ipt_source} -p udp -j RETURN 2>/dev/null
$ipt_m -A PSW $(comment "$remarks") ${_ipt_source} -p udp -j RETURN
@@ -424,10 +424,10 @@ load_acl() {
$ip6t_m -A PSW $(comment "默认") -p tcp -m multiport --dport $TCP_NO_REDIR_PORTS -j RETURN
$ipt_tmp -A PSW $(comment "默认") -p tcp -m multiport --dport $TCP_NO_REDIR_PORTS -j RETURN
if [ "$TCP_NO_REDIR_PORTS" != "1:65535" ]; then
echolog " - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]"
echolog " - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]"
else
unset TCP_PROXY_MODE
echolog " - ${msg}不代理所有 TCP 端口"
echolog " - ${msg}不代理所有 TCP 端口"
fi
}
@@ -435,10 +435,10 @@ load_acl() {
$ip6t_m -A PSW $(comment "默认") -p udp -m multiport --dport $UDP_NO_REDIR_PORTS -j RETURN
$ipt_m -A PSW $(comment "默认") -p udp -m multiport --dport $UDP_NO_REDIR_PORTS -j RETURN
if [ "$UDP_NO_REDIR_PORTS" != "1:65535" ]; then
echolog " - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]"
echolog " - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]"
else
unset UDP_PROXY_MODE
echolog " - ${msg}不代理所有 UDP 端口"
echolog " - ${msg}不代理所有 UDP 端口"
fi
}
@@ -465,7 +465,7 @@ load_acl() {
[ "${USE_GFW_LIST}" = "1" ] && $ipt_m -A PSW $(comment "默认") -p tcp $(factor $TCP_PROXY_DROP_PORTS "-m multiport --dport") $(dst $IPSET_GFW) -j DROP
[ "${CHN_LIST}" != "0" ] && $ipt_m -A PSW $(comment "默认") -p tcp $(factor $TCP_PROXY_DROP_PORTS "-m multiport --dport") $(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} "-j DROP")
[ "${TCP_PROXY_MODE}" != "disable" ] && $ipt_m -A PSW $(comment "默认") -p tcp $(factor $TCP_PROXY_DROP_PORTS "-m multiport --dport") -j DROP
echolog " - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]"
echolog " - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]"
}
[ "$UDP_PROXY_DROP_PORTS" != "disable" ] && {
@@ -482,7 +482,7 @@ load_acl() {
[ "${USE_GFW_LIST}" = "1" ] && $ipt_m -A PSW $(comment "默认") -p udp $(factor $UDP_PROXY_DROP_PORTS "-m multiport --dport") $(dst $IPSET_GFW) -j DROP
[ "${CHN_LIST}" != "0" ] && $ipt_m -A PSW $(comment "默认") -p udp $(factor $UDP_PROXY_DROP_PORTS "-m multiport --dport") $(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} "-j DROP")
[ "${UDP_PROXY_MODE}" != "disable" ] && $ipt_m -A PSW $(comment "默认") -p udp $(factor $UDP_PROXY_DROP_PORTS "-m multiport --dport") -j DROP
echolog " - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]"
echolog " - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]"
}
}
@@ -539,7 +539,7 @@ load_acl() {
$ip6t_m -A PSW $(comment "默认") -p tcp $(REDIRECT $TCP_REDIR_PORT TPROXY)
}
echolog " - ${msg2}"
echolog " - ${msg2}"
}
fi
$ipt_n -A PSW $(comment "默认") -p tcp -j RETURN
@@ -568,7 +568,7 @@ load_acl() {
$ip6t_m -A PSW $(comment "默认") -p udp $(REDIRECT $UDP_REDIR_PORT TPROXY)
}
echolog " - ${msg2}"
echolog " - ${msg2}"
udp_flag=1
}
fi
@@ -582,13 +582,13 @@ filter_haproxy() {
local ip=$(get_host_ip ipv4 $(echo $item | awk -F ":" '{print $1}') 1)
ipset -q add $IPSET_VPSLIST $ip
done
echolog "加入负载均衡的节点到ipset[$IPSET_VPSLIST]直连完成"
echolog " - [$?]加入负载均衡的节点到ipset[$IPSET_VPSLIST]"
}
filter_vpsip() {
uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sed -e "/^$/d" | sed -e "s/^/add $IPSET_VPSLIST &/g" | awk '{print $0} END{print "COMMIT"}' | ipset -! -R
uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | sed -e "/^$/d" | sed -e "s/^/add $IPSET_VPSLIST6 &/g" | awk '{print $0} END{print "COMMIT"}' | ipset -! -R
echolog "加入所有节点到ipset[$IPSET_VPSLIST]直连完成"
echolog " - [$?]加入所有节点到ipset[$IPSET_VPSLIST]"
}
filter_node() {
@@ -1108,19 +1108,19 @@ add_firewall_rule() {
$ip6t_m -I OUTPUT $(comment "mangle-OUTPUT-PSW") -o lo -j RETURN
insert_rule_before "$ip6t_m" "OUTPUT" "mwan3" "$(comment mangle-OUTPUT-PSW) -m mark --mark 1 -j RETURN"
$ipt_m -A PSW -p udp --dport 53 -j RETURN
$ip6t_m -A PSW -p udp --dport 53 -j RETURN
}
# 加载ACLS
load_acl
for iface in $(ls ${TMP_IFACE_PATH}); do
$ipt_n -I PSW_OUTPUT -o $iface -j RETURN
$ipt_m -I PSW_OUTPUT -o $iface -j RETURN
done
$ipt_n -I PREROUTING $(comment "PSW") -m mark --mark 1 -j RETURN
$ip6t_n -I PREROUTING $(comment "PSW") -m mark --mark 1 -j RETURN
[ -n "${is_tproxy}" -o -n "${udp_flag}" ] && {
bridge_nf_ipt=$(sysctl -e -n net.bridge.bridge-nf-call-iptables)
echo -n $bridge_nf_ipt > $TMP_PATH/bridge_nf_ipt

View File

@@ -213,9 +213,9 @@ get_wan6_ip() {
}
load_acl() {
([ "$ENABLED_ACLS" == 1 ] || ([ "$ENABLED_DEFAULT_ACL" == 1 ] && [ "$CLIENT_PROXY" == 1 ])) && echolog " - 访问控制:"
[ "$ENABLED_ACLS" == 1 ] && {
acl_app
echolog "访问控制:"
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
eval $(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)
@@ -285,11 +285,11 @@ load_acl() {
if [ "$tcp_no_redir_ports" != "1:65535" ]; then
nft "add rule inet fw4 $nft_prerouting_chain ${_ipt_source} ip protocol tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\""
nft "add rule inet fw4 PSW_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\""
echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]"
echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]"
else
#结束时会return无需加多余的规则。
unset tcp_port
echolog " - ${msg}不代理所有 TCP 端口"
echolog " - ${msg}不代理所有 TCP 端口"
fi
}
@@ -297,11 +297,11 @@ load_acl() {
if [ "$udp_no_redir_ports" != "1:65535" ]; then
nft "add rule inet fw4 PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\""
nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" 2>/dev/null
echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]"
echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]"
else
#结束时会return无需加多余的规则。
unset udp_port
echolog " - ${msg}不代理所有 UDP 端口"
echolog " - ${msg}不代理所有 UDP 端口"
fi
}
@@ -329,7 +329,7 @@ load_acl() {
[ "${use_gfw_list}" = "1" ] && nft "add rule inet fw4 $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr @$NFTSET_GFW counter drop comment \"$remarks\""
[ "${chn_list}" != "0" ] && nft "add rule inet fw4 $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr @$NFTSET_CHN $(get_jump_ipt ${chn_list} "counter drop") comment \"$remarks\""
[ "${tcp_proxy_mode}" != "disable" ] && nft "add rule inet fw4 $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") counter drop comment \"$remarks\""
echolog " - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]"
echolog " - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]"
}
[ "$udp_proxy_drop_ports" != "disable" ] && {
@@ -346,7 +346,7 @@ load_acl() {
[ "${use_gfw_list}" = "1" ] && nft "add rule inet fw4 PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr @$NFTSET_GFW counter drop comment \"$remarks\"" 2>/dev/null
[ "${chn_list}" != "0" ] && nft "add rule inet fw4 PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr @$NFTSET_CHN $(get_jump_ipt ${chn_list} "counter drop") comment \"$remarks\"" 2>/dev/null
[ "${udp_proxy_mode}" != "disable" ] && nft "add rule inet fw4 PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") counter drop comment \"$remarks\"" 2>/dev/null
echolog " - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]"
echolog " - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]"
}
}
@@ -409,7 +409,7 @@ load_acl() {
else
msg2="${msg}不代理 TCP"
fi
echolog " - ${msg2}"
echolog " - ${msg2}"
}
nft "add rule inet fw4 $nft_prerouting_chain ip protocol tcp ${_ipt_source} counter return comment \"$remarks\""
@@ -439,7 +439,7 @@ load_acl() {
else
msg2="${msg}不代理 UDP"
fi
echolog " - ${msg2}"
echolog " - ${msg2}"
}
nft "add rule inet fw4 PSW_MANGLE ip protocol udp ${_ipt_source} counter return comment \"$remarks\""
nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null
@@ -456,10 +456,10 @@ load_acl() {
nft "add rule inet fw4 $nft_prerouting_chain ip protocol tcp $(factor $TCP_NO_REDIR_PORTS "tcp dport") counter return comment \"默认\""
nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_NO_REDIR_PORTS "tcp dport") counter return comment \"默认\""
if [ "$TCP_NO_REDIR_PORTS" != "1:65535" ]; then
echolog " - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]"
echolog " - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]"
else
unset TCP_PROXY_MODE
echolog " - ${msg}不代理所有 TCP 端口"
echolog " - ${msg}不代理所有 TCP 端口"
fi
}
@@ -467,10 +467,10 @@ load_acl() {
nft "add inet fw4 PSW_MANGLE ip protocol udp $(factor $UDP_NO_REDIR_PORTS "udp dport") counter return comment \"默认\""
nft "add inet fw4 PSW_MANGLE_V6 counter meta l4proto udp $(factor $UDP_NO_REDIR_PORTS "udp dport") counter return comment \"默认\""
if [ "$UDP_NO_REDIR_PORTS" != "1:65535" ]; then
echolog " - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]"
echolog " - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]"
else
unset UDP_PROXY_MODE
echolog " - ${msg}不代理所有 UDP 端口"
echolog " - ${msg}不代理所有 UDP 端口"
fi
}
@@ -499,7 +499,7 @@ load_acl() {
[ "${USE_GFW_LIST}" = "1" ] && nft "add inet fw4 $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr @$NFTSET_GFW counter drop comment \"默认\""
[ "${CHN_LIST}" != "0" ] && nft "add inet fw4 $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr @$NFTSET_CHN $(get_jump_ipt ${CHN_LIST} "counter drop") comment \"默认\""
[ "${TCP_PROXY_MODE}" != "disable" ] && nft "add inet fw4 $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter drop comment \"默认\""
echolog " - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]"
echolog " - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]"
}
[ "$UDP_PROXY_DROP_PORTS" != "disable" ] && {
@@ -516,7 +516,7 @@ load_acl() {
[ "${USE_GFW_LIST}" = "1" ] && nft "add rule inet fw4 PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr @$NFTSET_GFW counter drop comment \"默认\""
[ "${CHN_LIST}" != "0" ] && nft "add rule inet fw4 PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr @$NFTSET_CHN $(get_jump_ipt ${CHN_LIST} "counter drop") comment \"默认\""
[ "${UDP_PROXY_MODE}" != "disable" ] && nft "add inet fw4 PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter drop comment \"默认\""
echolog " - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]"
echolog " - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]"
}
}
@@ -580,7 +580,7 @@ load_acl() {
nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto tcp counter return comment \"默认\""
}
echolog " - ${msg2}"
echolog " - ${msg2}"
}
fi
@@ -608,7 +608,7 @@ load_acl() {
nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto udp counter return comment \"默认\""
}
echolog " - ${msg2}"
echolog " - ${msg2}"
udp_flag=1
}
fi
@@ -620,7 +620,7 @@ filter_haproxy() {
local ip=$(get_host_ip ipv4 $(echo $item | awk -F ":" '{print $1}') 1)
insert_nftset $NFTSET_VPSLIST "-1" $ip
done
echolog "加入负载均衡的节点到nftset[$NFTSET_VPSLIST]直连完成"
echolog " - [$?]加入负载均衡的节点到nftset[$NFTSET_VPSLIST]直连完成"
}
filter_vps_addr() {
@@ -635,7 +635,7 @@ filter_vps_addr() {
filter_vpsip() {
insert_nftset $NFTSET_VPSLIST "-1" $(uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sed -e "/^$/d")
insert_nftset $NFTSET_VPSLIST6 "-1" $(uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | sed -e "/^$/d")
echolog "加入所有节点到nftset[$NFTSET_VPSLIST]直连完成"
echolog " - [$?]加入所有节点到nftset[$NFTSET_VPSLIST]直连完成"
}
filter_node() {
@@ -1149,14 +1149,11 @@ add_firewall_rule() {
nft "add rule inet fw4 mangle_output oif lo counter return comment \"PSW_OUTPUT_MANGLE\""
nft "add rule inet fw4 mangle_output meta mark 1 counter return comment \"PSW_OUTPUT_MANGLE\""
nft "add rule inet fw4 PSW_MANGLE ip protocol udp udp dport 53 counter return"
nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto udp udp dport 53 counter return"
}
# 加载ACLS
load_acl
for iface in $(ls ${TMP_IFACE_PATH}); do
nft "insert rule inet fw4 $nft_output_chain oif $iface counter return"
nft "insert rule inet fw4 PSW_OUTPUT_MANGLE_V6 oif $iface counter return"

View File

@@ -206,6 +206,7 @@
101.52.112.0/21
101.52.124.0/22
101.52.128.0/20
101.52.200.0/21
101.52.212.0/22
101.52.216.0/21
101.52.236.0/22
@@ -264,7 +265,6 @@
103.101.148.0/22
103.101.180.0/22
103.101.184.0/22
103.101.204.0/23
103.101.4.0/22
103.101.60.0/22
103.101.8.0/22
@@ -273,7 +273,6 @@
103.102.180.0/22
103.102.184.0/22
103.102.188.0/22
103.102.192.0/21
103.102.192.0/22
103.102.196.0/22
103.102.200.0/22
@@ -325,7 +324,6 @@
103.106.196.0/22
103.106.202.0/23
103.106.212.0/22
103.106.244.0/22
103.106.252.0/22
103.106.36.0/22
103.106.40.0/22
@@ -588,6 +586,7 @@
103.132.80.0/23
103.133.12.0/22
103.133.128.0/22
103.133.128.0/24
103.133.136.0/22
103.133.136.0/23
103.133.176.0/22
@@ -1303,6 +1302,7 @@
103.204.236.0/22
103.204.24.0/22
103.204.72.0/22
103.204.74.0/23
103.204.88.0/22
103.205.108.0/22
103.205.116.0/22
@@ -1409,14 +1409,7 @@
103.213.148.0/22
103.213.152.0/22
103.213.156.0/22
103.213.160.0/22
103.213.164.0/22
103.213.168.0/22
103.213.172.0/22
103.213.176.0/22
103.213.180.0/22
103.213.184.0/22
103.213.188.0/22
103.213.160.0/19
103.213.196.0/23
103.213.198.0/23
103.213.226.0/23
@@ -1427,14 +1420,7 @@
103.213.52.0/22
103.213.56.0/22
103.213.60.0/22
103.213.64.0/22
103.213.68.0/22
103.213.72.0/22
103.213.76.0/22
103.213.80.0/22
103.213.84.0/22
103.213.88.0/22
103.213.92.0/22
103.213.64.0/19
103.213.96.0/22
103.214.212.0/22
103.214.240.0/22
@@ -3294,7 +3280,6 @@
103.73.28.0/22
103.73.4.0/22
103.73.48.0/22
103.73.48.0/24
103.73.8.0/22
103.74.124.0/22
103.74.148.0/22
@@ -3935,6 +3920,7 @@
112.122.0.0/15
112.124.0.0/14
112.128.0.0/14
112.128.0.0/23
112.132.0.0/16
112.137.48.0/21
112.192.0.0/14
@@ -4107,7 +4093,6 @@
114.28.224.0/22
114.28.228.0/23
114.28.235.0/24
114.28.236.0/22
114.28.248.0/21
114.28.68.0/22
114.28.72.0/21
@@ -4363,6 +4348,7 @@
117.72.255.0/24
117.72.32.0/20
117.72.64.0/21
117.72.72.0/22
117.72.8.0/21
117.73.0.0/20
117.73.16.0/21
@@ -4512,7 +4498,6 @@
118.242.0.0/16
118.242.0.0/22
118.242.16.0/22
118.242.200.0/24
118.242.236.0/22
118.242.24.0/22
118.242.32.0/22
@@ -4684,7 +4669,6 @@
119.42.224.0/19
119.44.0.0/15
119.44.0.0/22
119.44.10.0/23
119.44.12.0/24
119.44.16.0/22
119.44.192.0/24
@@ -4705,7 +4689,7 @@
119.44.46.0/24
119.44.56.0/21
119.44.7.0/24
119.44.9.0/24
119.44.8.0/22
119.45.0.0/16
119.48.0.0/13
119.57.0.0/16
@@ -4937,6 +4921,8 @@
122.119.180.0/22
122.119.190.0/24
122.119.20.0/22
122.119.232.0/23
122.119.236.0/24
122.119.24.0/23
122.119.32.0/24
122.119.4.0/23
@@ -5057,6 +5043,7 @@
123.254.96.0/22
123.4.0.0/14
123.49.128.0/17
123.49.192.0/23
123.49.240.0/22
123.50.160.0/19
123.52.0.0/14
@@ -5404,8 +5391,6 @@
140.224.0.0/16
140.237.0.0/16
140.240.0.0/16
140.242.223.0/24
140.242.224.0/24
140.243.0.0/16
140.246.0.0/16
140.249.0.0/16
@@ -5528,7 +5513,6 @@
154.203.4.0/22
154.203.8.0/21
154.204.16.0/21
154.204.181.0/24
154.208.144.0/20
154.209.230.0/23
154.209.24.0/21
@@ -5548,7 +5532,7 @@
154.48.224.0/24
154.48.227.0/24
154.48.237.0/24
154.48.252.0/23
154.48.252.0/24
154.72.41.0/24
154.72.42.0/24
154.72.44.0/24
@@ -5563,7 +5547,6 @@
156.107.170.0/24
156.107.178.0/23
156.107.180.0/23
156.224.27.0/24
156.224.8.0/21
156.225.130.0/24
156.227.1.0/24
@@ -5635,6 +5618,10 @@
157.61.0.0/16
157.66.42.0/23
157.66.70.0/23
157.66.88.0/23
157.66.90.0/23
157.66.92.0/23
157.66.94.0/23
158.140.252.0/22
158.60.0.0/16
158.79.0.0/16
@@ -5701,9 +5688,8 @@
163.181.16.0/22
163.181.160.0/24
163.181.162.0/23
163.181.164.0/24
163.181.166.0/23
163.181.169.0/24
163.181.164.0/22
163.181.168.0/23
163.181.171.0/24
163.181.176.0/21
163.181.184.0/22
@@ -5759,7 +5745,7 @@
163.53.188.0/22
163.53.19.0/24
163.53.240.0/22
163.53.244.0/23
163.53.244.0/24
163.53.247.0/24
163.53.36.0/22
163.53.4.0/22
@@ -5880,7 +5866,6 @@
180.178.252.0/22
180.184.0.0/15
180.184.0.0/21
180.184.12.0/23
180.184.128.0/20
180.184.14.0/24
180.184.144.0/21
@@ -5894,7 +5879,7 @@
180.184.24.0/21
180.184.32.0/19
180.184.64.0/18
180.184.8.0/22
180.184.8.0/23
180.186.0.0/16
180.186.38.0/23
180.186.40.0/22
@@ -6551,7 +6536,7 @@
202.46.41.0/24
202.46.42.0/23
202.46.45.0/24
202.46.46.0/23
202.46.46.0/24
202.46.48.0/20
202.47.100.0/22
202.47.104.0/21
@@ -8581,7 +8566,6 @@
219.232.160.0/19
219.232.192.0/19
219.233.0.0/16
219.234.0.0/21
219.234.128.0/17
219.234.64.0/18
219.235.128.0/19
@@ -8870,7 +8854,7 @@
222.90.0.0/15
222.92.0.0/14
223.0.0.0/15
223.0.1.0/24
223.0.0.0/23
223.0.10.0/24
223.0.12.0/23
223.0.126.0/24
@@ -9023,15 +9007,11 @@
36.206.0.0/16
36.212.0.0/17
36.212.128.0/18
36.212.192.0/24
36.212.202.0/23
36.212.204.0/22
36.212.192.0/22
36.212.200.0/21
36.212.208.0/20
36.212.225.0/24
36.212.226.0/23
36.212.228.0/22
36.212.232.0/21
36.212.240.0/22
36.212.224.0/19
36.213.0.0/20
36.248.0.0/14
36.254.0.0/16
36.255.116.0/22
@@ -9070,7 +9050,6 @@
38.249.0.0/16
38.60.149.0/24
38.60.34.0/24
38.60.40.0/24
38.60.45.0/24
39.0.0.0/24
39.0.128.0/17
@@ -9148,7 +9127,8 @@
42.201.0.0/17
42.201.32.0/19
42.201.64.0/21
42.201.72.0/24
42.201.72.0/22
42.201.76.0/24
42.202.0.0/15
42.204.0.0/14
42.208.0.0/12
@@ -9420,8 +9400,6 @@
43.230.10.0/23
43.230.124.0/22
43.230.136.0/22
43.230.136.0/24
43.230.138.0/23
43.230.182.0/24
43.230.20.0/22
43.230.220.0/22
@@ -10008,6 +9986,7 @@
43.255.0.0/22
43.255.116.0/23
43.255.144.0/22
43.255.156.0/24
43.255.16.0/22
43.255.176.0/22
43.255.184.0/22
@@ -10038,9 +10017,8 @@
44.31.165.0/24
44.31.212.0/24
44.31.216.0/24
44.31.231.0/24
44.31.28.0/24
44.31.42.0/23
44.31.43.0/24
44.31.81.0/24
44.31.96.0/24
44.32.69.0/24
@@ -10277,9 +10255,8 @@
45.147.6.0/24
45.151.47.0/24
45.154.104.0/24
45.157.88.0/24
45.172.164.0/22
45.192.160.0/20
45.192.182.0/23
45.192.184.0/24
45.192.187.0/24
45.192.189.0/24
@@ -10289,6 +10266,8 @@
45.207.176.0/20
45.207.192.0/19
45.207.26.0/23
45.227.248.0/23
45.227.250.0/24
45.248.100.0/22
45.248.104.0/22
45.248.108.0/22
@@ -10751,6 +10730,7 @@
54.222.57.0/24
54.222.59.0/24
54.222.60.0/22
54.222.64.0/24
54.222.70.0/23
54.222.72.0/21
54.222.80.0/21
@@ -10840,7 +10820,7 @@
59.153.152.0/22
59.153.164.0/22
59.153.168.0/22
59.153.168.0/23
59.153.168.0/24
59.153.172.0/22
59.153.176.0/22
59.153.180.0/22
@@ -10942,7 +10922,7 @@
60.218.0.0/15
60.220.0.0/14
60.232.0.0/15
60.232.128.0/17
60.232.0.0/16
60.235.0.0/16
60.24.0.0/14
60.245.128.0/17

Some files were not shown because too many files have changed in this diff Show More