mirror of
https://github.com/bolucat/Archive.git
synced 2025-09-26 20:21:35 +08:00
Update On Thu Apr 25 20:28:12 CEST 2024
This commit is contained in:
1
.github/update.log
vendored
1
.github/update.log
vendored
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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=
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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...))
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
@@ -41,7 +41,7 @@
|
||||
},
|
||||
"macOS": {
|
||||
"frameworks": [],
|
||||
"minimumSystemVersion": "10.15",
|
||||
"minimumSystemVersion": "11.0",
|
||||
"exceptionDomain": "",
|
||||
"signingIdentity": null,
|
||||
"entitlements": null
|
||||
|
@@ -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 {
|
||||
|
@@ -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,
|
||||
};
|
||||
};
|
||||
|
@@ -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");
|
||||
};
|
||||
|
@@ -101,3 +101,9 @@ export namespace Profile {
|
||||
update_interval?: number;
|
||||
}
|
||||
}
|
||||
|
||||
export interface SystemProxy {
|
||||
enable: boolean;
|
||||
server: string;
|
||||
bypass: string;
|
||||
}
|
||||
|
@@ -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>
|
||||
);
|
||||
});
|
@@ -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>
|
||||
|
@@ -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;
|
@@ -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;
|
@@ -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;
|
@@ -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>
|
||||
|
||||
|
@@ -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),
|
||||
|
@@ -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" },
|
||||
|
@@ -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>
|
||||
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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",
|
||||
|
403
clash-nyanpasu/pnpm-lock.yaml
generated
403
clash-nyanpasu/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
18
filebrowser/.github/workflows/main.yaml
vendored
18
filebrowser/.github/workflows/main.yaml
vendored
@@ -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'
|
||||
|
46
filebrowser/.github/workflows/pr-lint.yaml
vendored
Normal file
46
filebrowser/.github/workflows/pr-lint.yaml
vendored
Normal 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
|
@@ -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
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
},
|
||||
},
|
||||
|
@@ -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
|
||||
|
@@ -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%;
|
||||
}
|
||||
|
||||
|
@@ -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": "هل لديك حساب",
|
||||
|
@@ -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",
|
||||
|
@@ -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": "Έχετε ήδη λογαριασμό",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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": "כבר יש לי חשבון",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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": "ログインする",
|
||||
|
@@ -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": "이미 계정이 있습니다",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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": "Уже есть аккаунт",
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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ı",
|
||||
|
@@ -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": "Вже є обліковий запис",
|
||||
|
@@ -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": "已有用户登录",
|
||||
|
@@ -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": "已有賬戶登錄",
|
||||
|
@@ -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 {
|
||||
|
@@ -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++) {
|
||||
|
@@ -71,7 +71,7 @@
|
||||
<input
|
||||
type="checkbox"
|
||||
v-model="settings.branding.disableUsedPercentage"
|
||||
id="branding-links"
|
||||
id="branding-used-disk"
|
||||
/>
|
||||
{{ t("settings.disableUsedDiskPercentage") }}
|
||||
</p>
|
||||
|
@@ -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
|
||||
|
@@ -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=
|
||||
|
@@ -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
|
||||
|
@@ -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")
|
||||
|
||||
|
@@ -87,7 +87,7 @@ func resourceDeleteHandler(fileCache FileCache) handleFunc {
|
||||
return errToStatus(err), err
|
||||
}
|
||||
|
||||
return http.StatusOK, nil
|
||||
return http.StatusNoContent, nil
|
||||
})
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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 */
|
||||
|
@@ -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
|
||||
|
@@ -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) {
|
||||
|
@@ -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) },
|
||||
|
@@ -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)
|
||||
|
@@ -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),
|
||||
|
@@ -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>;
|
||||
|
@@ -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";
|
||||
};
|
||||
|
||||
|
@@ -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 @@
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -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 @@
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -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 @@
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
@@ -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...))
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
@@ -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(
|
||||
|
20
openwrt-packages/luci-app-filebrowser/po/fa/filebrowser.po
Normal file
20
openwrt-packages/luci-app-filebrowser/po/fa/filebrowser.po
Normal 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 "اعطای دسترسی به مرورگر پرونده"
|
21
openwrt-packages/luci-app-filebrowser/po/pl/filebrowser.po
Normal file
21
openwrt-packages/luci-app-filebrowser/po/pl/filebrowser.po
Normal 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"
|
21
openwrt-packages/luci-app-filebrowser/po/ru/filebrowser.po
Normal file
21
openwrt-packages/luci-app-filebrowser/po/ru/filebrowser.po
Normal 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 "Предоставить доступ к Обозревателю Файлов"
|
20
openwrt-packages/luci-app-filebrowser/po/tr/filebrowser.po
Normal file
20
openwrt-packages/luci-app-filebrowser/po/tr/filebrowser.po
Normal 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"
|
14
openwrt-packages/luci-app-filebrowser/po/uk/filebrowser.po
Normal file
14
openwrt-packages/luci-app-filebrowser/po/uk/filebrowser.po
Normal 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 ""
|
1
openwrt-packages/luci-app-filebrowser/po/zh-cn
Symbolic link
1
openwrt-packages/luci-app-filebrowser/po/zh-cn
Symbolic link
@@ -0,0 +1 @@
|
||||
zh_Hans
|
@@ -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 "授予文件浏览器访问权限"
|
@@ -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)
|
||||
|
||||
|
@@ -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:= \
|
||||
|
@@ -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"
|
||||
|
@@ -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 地址)。"
|
||||
|
||||
|
@@ -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'
|
||||
|
@@ -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)
|
||||
|
@@ -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()
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -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
Reference in New Issue
Block a user