mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-21 09:00:12 +01:00
🎨 Use Endpoint for network connectivity checks when syncing with third-party cloud providers https://github.com/siyuan-note/siyuan/issues/7805
This commit is contained in:
parent
bdf621f8c5
commit
05daece0d1
7 changed files with 43 additions and 61 deletions
|
|
@ -93,11 +93,6 @@ const renderProvider = (provider: number) => {
|
||||||
<option ${window.siyuan.config.sync.s3.skipTlsVerify ? "" : "selected"} value="false">Verify</option>
|
<option ${window.siyuan.config.sync.s3.skipTlsVerify ? "" : "selected"} value="false">Verify</option>
|
||||||
<option ${window.siyuan.config.sync.s3.skipTlsVerify ? "selected" : ""} value="true">Skip</option>
|
<option ${window.siyuan.config.sync.s3.skipTlsVerify ? "selected" : ""} value="true">Skip</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
|
||||||
<label class="b3-label b3-label--noborder fn__flex config__item">
|
|
||||||
<div class="fn__flex-center fn__size200">Connectivity Check URL</div>
|
|
||||||
<div class="fn__space"></div>
|
|
||||||
<input id="checkURL" class="b3-text-field fn__block" value="${window.siyuan.config.sync.s3.checkURL}">
|
|
||||||
</label>`;
|
</label>`;
|
||||||
} else if (provider === 3) {
|
} else if (provider === 3) {
|
||||||
const tip = `<div class="b3-label b3-label--inner">
|
const tip = `<div class="b3-label b3-label--inner">
|
||||||
|
|
@ -138,11 +133,6 @@ const renderProvider = (provider: number) => {
|
||||||
<option ${window.siyuan.config.sync.webdav.skipTlsVerify ? "" : "selected"} value="false">Verify</option>
|
<option ${window.siyuan.config.sync.webdav.skipTlsVerify ? "" : "selected"} value="false">Verify</option>
|
||||||
<option ${window.siyuan.config.sync.webdav.skipTlsVerify ? "selected" : ""} value="true">Skip</option>
|
<option ${window.siyuan.config.sync.webdav.skipTlsVerify ? "selected" : ""} value="true">Skip</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
|
||||||
<label class="b3-label b3-label--noborder fn__flex config__item">
|
|
||||||
<div class="fn__flex-center fn__size200">Connectivity Check URL</div>
|
|
||||||
<div class="fn__space"></div>
|
|
||||||
<input id="checkURL" class="b3-text-field fn__block" value="${window.siyuan.config.sync.webdav.checkURL}">
|
|
||||||
</label>`;
|
</label>`;
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
|
|
@ -227,7 +217,6 @@ const bindProviderEvent = () => {
|
||||||
region: (providerPanelElement.querySelector("#region") as HTMLInputElement).value,
|
region: (providerPanelElement.querySelector("#region") as HTMLInputElement).value,
|
||||||
skipTlsVerify: (providerPanelElement.querySelector("#s3SkipTlsVerify") as HTMLInputElement).value === "true",
|
skipTlsVerify: (providerPanelElement.querySelector("#s3SkipTlsVerify") as HTMLInputElement).value === "true",
|
||||||
timeout: timeout,
|
timeout: timeout,
|
||||||
checkURL: (providerPanelElement.querySelector("#checkURL") as HTMLInputElement).value,
|
|
||||||
};
|
};
|
||||||
fetchPost("/api/sync/setSyncProviderS3", {s3}, () => {
|
fetchPost("/api/sync/setSyncProviderS3", {s3}, () => {
|
||||||
window.siyuan.config.sync.s3 = s3;
|
window.siyuan.config.sync.s3 = s3;
|
||||||
|
|
@ -247,7 +236,6 @@ const bindProviderEvent = () => {
|
||||||
password: (providerPanelElement.querySelector("#password") as HTMLInputElement).value,
|
password: (providerPanelElement.querySelector("#password") as HTMLInputElement).value,
|
||||||
skipTlsVerify: (providerPanelElement.querySelector("#webdavSkipTlsVerify") as HTMLInputElement).value === "true",
|
skipTlsVerify: (providerPanelElement.querySelector("#webdavSkipTlsVerify") as HTMLInputElement).value === "true",
|
||||||
timeout: timeout,
|
timeout: timeout,
|
||||||
checkURL: (providerPanelElement.querySelector("#checkURL") as HTMLInputElement).value,
|
|
||||||
};
|
};
|
||||||
fetchPost("/api/sync/setSyncProviderWebDAV", {webdav}, () => {
|
fetchPost("/api/sync/setSyncProviderWebDAV", {webdav}, () => {
|
||||||
window.siyuan.config.sync.webdav = webdav;
|
window.siyuan.config.sync.webdav = webdav;
|
||||||
|
|
|
||||||
2
app/src/types/index.d.ts
vendored
2
app/src/types/index.d.ts
vendored
|
|
@ -433,7 +433,6 @@ declare interface IConfig {
|
||||||
region: string
|
region: string
|
||||||
skipTlsVerify: boolean
|
skipTlsVerify: boolean
|
||||||
timeout: number
|
timeout: number
|
||||||
checkURL: string
|
|
||||||
}
|
}
|
||||||
webdav: {
|
webdav: {
|
||||||
endpoint: string
|
endpoint: string
|
||||||
|
|
@ -441,7 +440,6 @@ declare interface IConfig {
|
||||||
password: string
|
password: string
|
||||||
skipTlsVerify: boolean
|
skipTlsVerify: boolean
|
||||||
timeout: number
|
timeout: number
|
||||||
checkURL: string
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
lang: string
|
lang: string
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,6 @@ type S3 struct {
|
||||||
PathStyle bool `json:"pathStyle"` // 是否使用路径风格
|
PathStyle bool `json:"pathStyle"` // 是否使用路径风格
|
||||||
SkipTlsVerify bool `json:"skipTlsVerify"` // 是否跳过 TLS 验证
|
SkipTlsVerify bool `json:"skipTlsVerify"` // 是否跳过 TLS 验证
|
||||||
Timeout int `json:"timeout"` // 超时时间,单位:秒
|
Timeout int `json:"timeout"` // 超时时间,单位:秒
|
||||||
CheckURL string `json:"checkURL"` // 连通性检查 URL // https://github.com/siyuan-note/siyuan/issues/7805
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebDAV struct {
|
type WebDAV struct {
|
||||||
|
|
@ -56,7 +55,6 @@ type WebDAV struct {
|
||||||
Password string `json:"password"` // 密码
|
Password string `json:"password"` // 密码
|
||||||
SkipTlsVerify bool `json:"skipTlsVerify"` // 是否跳过 TLS 验证
|
SkipTlsVerify bool `json:"skipTlsVerify"` // 是否跳过 TLS 验证
|
||||||
Timeout int `json:"timeout"` // 超时时间,单位:秒
|
Timeout int `json:"timeout"` // 超时时间,单位:秒
|
||||||
CheckURL string `json:"checkURL"` // 连通性检查 URL // https://github.com/siyuan-note/siyuan/issues/7805
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -268,19 +268,11 @@ func InitConf() {
|
||||||
}
|
}
|
||||||
Conf.Sync.S3.Endpoint = util.NormalizeEndpoint(Conf.Sync.S3.Endpoint)
|
Conf.Sync.S3.Endpoint = util.NormalizeEndpoint(Conf.Sync.S3.Endpoint)
|
||||||
Conf.Sync.S3.Timeout = util.NormalizeTimeout(Conf.Sync.S3.Timeout)
|
Conf.Sync.S3.Timeout = util.NormalizeTimeout(Conf.Sync.S3.Timeout)
|
||||||
Conf.Sync.S3.CheckURL = util.NormalizeCheckURL(Conf.Sync.S3.CheckURL)
|
|
||||||
if "" == Conf.Sync.S3.CheckURL {
|
|
||||||
Conf.Sync.S3.CheckURL = conf.NewSyncProviderCheckURL()
|
|
||||||
}
|
|
||||||
if nil == Conf.Sync.WebDAV {
|
if nil == Conf.Sync.WebDAV {
|
||||||
Conf.Sync.WebDAV = &conf.WebDAV{}
|
Conf.Sync.WebDAV = &conf.WebDAV{}
|
||||||
}
|
}
|
||||||
Conf.Sync.WebDAV.Endpoint = util.NormalizeEndpoint(Conf.Sync.WebDAV.Endpoint)
|
Conf.Sync.WebDAV.Endpoint = util.NormalizeEndpoint(Conf.Sync.WebDAV.Endpoint)
|
||||||
Conf.Sync.WebDAV.Timeout = util.NormalizeTimeout(Conf.Sync.WebDAV.Timeout)
|
Conf.Sync.WebDAV.Timeout = util.NormalizeTimeout(Conf.Sync.WebDAV.Timeout)
|
||||||
Conf.Sync.WebDAV.CheckURL = util.NormalizeCheckURL(Conf.Sync.WebDAV.CheckURL)
|
|
||||||
if "" == Conf.Sync.WebDAV.CheckURL {
|
|
||||||
Conf.Sync.WebDAV.CheckURL = conf.NewSyncProviderCheckURL()
|
|
||||||
}
|
|
||||||
|
|
||||||
if nil == Conf.Api {
|
if nil == Conf.Api {
|
||||||
Conf.Api = conf.NewAPI()
|
Conf.Api = conf.NewAPI()
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ func SyncDataDownload() {
|
||||||
}
|
}
|
||||||
|
|
||||||
util.BroadcastByType("main", "syncing", 0, Conf.Language(81), nil)
|
util.BroadcastByType("main", "syncing", 0, Conf.Language(81), nil)
|
||||||
if !util.IsOnline() { // 这个操作比较耗时,所以要先推送 syncing 事件后再判断网络,这样才能给用户更即时的反馈
|
if !isProviderOnline() { // 这个操作比较耗时,所以要先推送 syncing 事件后再判断网络,这样才能给用户更即时的反馈
|
||||||
util.BroadcastByType("main", "syncing", 2, Conf.Language(28), nil)
|
util.BroadcastByType("main", "syncing", 2, Conf.Language(28), nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -82,7 +82,7 @@ func SyncDataUpload() {
|
||||||
}
|
}
|
||||||
|
|
||||||
util.BroadcastByType("main", "syncing", 0, Conf.Language(81), nil)
|
util.BroadcastByType("main", "syncing", 0, Conf.Language(81), nil)
|
||||||
if !util.IsOnline() { // 这个操作比较耗时,所以要先推送 syncing 事件后再判断网络,这样才能给用户更即时的反馈
|
if !isProviderOnline() { // 这个操作比较耗时,所以要先推送 syncing 事件后再判断网络,这样才能给用户更即时的反馈
|
||||||
util.BroadcastByType("main", "syncing", 2, Conf.Language(28), nil)
|
util.BroadcastByType("main", "syncing", 2, Conf.Language(28), nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -136,7 +136,7 @@ func BootSyncData() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !util.IsOnline() {
|
if !isProviderOnline() {
|
||||||
BootSyncSucc = 1
|
BootSyncSucc = 1
|
||||||
util.PushErrMsg(Conf.Language(28), 7000)
|
util.PushErrMsg(Conf.Language(28), 7000)
|
||||||
return
|
return
|
||||||
|
|
@ -182,7 +182,7 @@ func syncData(boot, exit, byHand bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
util.BroadcastByType("main", "syncing", 0, Conf.Language(81), nil)
|
util.BroadcastByType("main", "syncing", 0, Conf.Language(81), nil)
|
||||||
if !util.IsOnline() { // 这个操作比较耗时,所以要先推送 syncing 事件后再判断网络,这样才能给用户更即时的反馈
|
if !isProviderOnline() { // 这个操作比较耗时,所以要先推送 syncing 事件后再判断网络,这样才能给用户更即时的反馈
|
||||||
util.BroadcastByType("main", "syncing", 2, Conf.Language(28), nil)
|
util.BroadcastByType("main", "syncing", 2, Conf.Language(28), nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -365,10 +365,6 @@ func SetSyncProviderS3(s3 *conf.S3) (err error) {
|
||||||
s3.Bucket = strings.TrimSpace(s3.Bucket)
|
s3.Bucket = strings.TrimSpace(s3.Bucket)
|
||||||
s3.Region = strings.TrimSpace(s3.Region)
|
s3.Region = strings.TrimSpace(s3.Region)
|
||||||
s3.Timeout = util.NormalizeTimeout(s3.Timeout)
|
s3.Timeout = util.NormalizeTimeout(s3.Timeout)
|
||||||
s3.CheckURL = strings.TrimSpace(s3.CheckURL)
|
|
||||||
if "" == s3.CheckURL {
|
|
||||||
s3.CheckURL = conf.NewSyncProviderCheckURL()
|
|
||||||
}
|
|
||||||
|
|
||||||
Conf.Sync.S3 = s3
|
Conf.Sync.S3 = s3
|
||||||
Conf.Save()
|
Conf.Save()
|
||||||
|
|
@ -388,10 +384,6 @@ func SetSyncProviderWebDAV(webdav *conf.WebDAV) (err error) {
|
||||||
webdav.Username = strings.TrimSpace(webdav.Username)
|
webdav.Username = strings.TrimSpace(webdav.Username)
|
||||||
webdav.Password = strings.TrimSpace(webdav.Password)
|
webdav.Password = strings.TrimSpace(webdav.Password)
|
||||||
webdav.Timeout = util.NormalizeTimeout(webdav.Timeout)
|
webdav.Timeout = util.NormalizeTimeout(webdav.Timeout)
|
||||||
webdav.CheckURL = strings.TrimSpace(webdav.CheckURL)
|
|
||||||
if "" == webdav.CheckURL {
|
|
||||||
webdav.CheckURL = conf.NewSyncProviderCheckURL()
|
|
||||||
}
|
|
||||||
|
|
||||||
Conf.Sync.WebDAV = webdav
|
Conf.Sync.WebDAV = webdav
|
||||||
Conf.Save()
|
Conf.Save()
|
||||||
|
|
@ -573,3 +565,16 @@ func IncSync() {
|
||||||
func planSyncAfter(d time.Duration) {
|
func planSyncAfter(d time.Duration) {
|
||||||
syncPlanTime = time.Now().Add(d)
|
syncPlanTime = time.Now().Add(d)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isProviderOnline() bool {
|
||||||
|
switch Conf.Sync.Provider {
|
||||||
|
case conf.ProviderSiYuan:
|
||||||
|
return util.IsOnline(util.SiYuanSyncServer)
|
||||||
|
case conf.ProviderS3:
|
||||||
|
return util.IsOnline(Conf.Sync.S3.Endpoint)
|
||||||
|
case conf.ProviderWebDAV:
|
||||||
|
return util.IsOnline(Conf.Sync.WebDAV.Endpoint)
|
||||||
|
default:
|
||||||
|
return util.IsOnline("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,21 +31,36 @@ import (
|
||||||
"github.com/siyuan-note/logging"
|
"github.com/siyuan-note/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
func IsOnline() (ret bool) {
|
func IsOnline(checkURL string) bool {
|
||||||
c := req.C().SetTimeout(1 * time.Second)
|
if "" == checkURL {
|
||||||
resp, err := c.R().Head("https://www.baidu.com")
|
if isOnline("https://www.baidu.com") {
|
||||||
if nil != err {
|
return true
|
||||||
resp, err = c.R().Head("https://icanhazip.com")
|
|
||||||
if nil != err {
|
|
||||||
resp, err = c.R().Head("https://api.ipify.org")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isOnline("https://icanhazip.com") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if isOnline("https://api.ipify.org") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
logging.LogWarnf("network is offline")
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nil == err && nil != resp && nil != resp.Response
|
if isOnline(checkURL) {
|
||||||
if !ret {
|
return true
|
||||||
logging.LogWarnf("network is offline: %v", err)
|
|
||||||
}
|
}
|
||||||
return
|
|
||||||
|
logging.LogWarnf("network is offline [checkURL=%s]", checkURL)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func isOnline(checkURL string) bool {
|
||||||
|
c := req.C().SetTimeout(1 * time.Second)
|
||||||
|
_, err := c.R().Head("https://www.baidu.com")
|
||||||
|
return nil == err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRemoteAddr(session *melody.Session) string {
|
func GetRemoteAddr(session *melody.Session) string {
|
||||||
|
|
|
||||||
|
|
@ -156,20 +156,6 @@ func NormalizeEndpoint(endpoint string) string {
|
||||||
return endpoint
|
return endpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
func NormalizeCheckURL(checkURL string) string {
|
|
||||||
checkURL = strings.TrimSpace(checkURL)
|
|
||||||
if "" == checkURL {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
if !strings.HasPrefix(checkURL, "http://") && !strings.HasPrefix(checkURL, "https://") {
|
|
||||||
checkURL = "http://" + checkURL
|
|
||||||
}
|
|
||||||
if !IsValidURL(checkURL) {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return checkURL
|
|
||||||
}
|
|
||||||
|
|
||||||
func FilterMoveDocFromPaths(fromPaths []string, toPath string) (ret []string) {
|
func FilterMoveDocFromPaths(fromPaths []string, toPath string) (ret []string) {
|
||||||
tmp := FilterSelfChildDocs(fromPaths)
|
tmp := FilterSelfChildDocs(fromPaths)
|
||||||
for _, fromPath := range tmp {
|
for _, fromPath := range tmp {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue