{"record":{"id":"96b6cb87e12407eb","repo":"siyuan-note/siyuan","slug":"conf-language-194","errorCode":null,"errorMessage":"Conf.Language(194)","messagePattern":"Conf\\.Language\\(194\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/sync.go","lineNumber":590,"sourceCode":"\ts3.SecretKey = strings.TrimSpace(s3.SecretKey)\n\ts3.Bucket = strings.TrimSpace(s3.Bucket)\n\ts3.Region = strings.TrimSpace(s3.Region)\n\ts3.Timeout = util.NormalizeTimeout(s3.Timeout)\n\ts3.ConcurrentReqs = util.NormalizeConcurrentReqs(s3.ConcurrentReqs, conf.ProviderS3)\n\n\tConf.Sync.S3 = s3\n\tConf.Save()\n\trefreshLANSyncManager()\n\treturn\n}\n\nfunc SetSyncProviderWebDAV(webdav *conf.WebDAV) (err error) {\n\twebdav.Endpoint = strings.TrimSpace(webdav.Endpoint)\n\twebdav.Endpoint = util.NormalizeEndpoint(webdav.Endpoint)\n\n\t// 不支持配置坚果云 WebDAV 进行同步 https://github.com/siyuan-note/siyuan/issues/7657\n\tif strings.Contains(strings.ToLower(webdav.Endpoint), \"dav.jianguoyun.com\") {\n\t\terr = errors.New(Conf.Language(194))\n\t\treturn\n\t}\n\n\twebdav.Username = strings.TrimSpace(webdav.Username)\n\twebdav.Password = strings.TrimSpace(webdav.Password)\n\twebdav.Timeout = util.NormalizeTimeout(webdav.Timeout)\n\twebdav.ConcurrentReqs = util.NormalizeConcurrentReqs(webdav.ConcurrentReqs, conf.ProviderWebDAV)\n\n\tConf.Sync.WebDAV = webdav\n\tConf.Save()\n\trefreshLANSyncManager()\n\treturn\n}\n\nfunc SetSyncProviderLocal(local *conf.Local) (err error) {\n\tlocal.Endpoint = strings.TrimSpace(local.Endpoint)\n\tlocal.Endpoint = util.NormalizeLocalPath(local.Endpoint)\n","sourceCodeStart":572,"sourceCodeEnd":608,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/model/sync.go#L572-L608","documentation":"SetSyncProviderWebDAV rejects endpoints containing 'dav.jianguoyun.com' with Conf.Language(194), which links to Nutstore's API restrictions. SiYuan's sync engine hits Nutstore's rate/interface limits and breaks, so the kernel explicitly blocks configuring Nutstore WebDAV as a sync provider (issue #7657).","triggerScenarios":"POST /api/sync/setSyncProviderWebDAV (Settings - Cloud - WebDAV) with an endpoint URL containing dav.jianguoyun.com in any case. The check is case-insensitive substring match on the endpoint.","commonSituations":"User pastes their Nutstore WebDAV URL expecting it to work like other WebDAV providers. Migrating from a tool that supported Nutstore. Subdomain variants like https://dav.jianguoyun.com/dav/.","solutions":["Use a different WebDAV provider (Nextcloud, ownCloud, a self-hosted server, etc.).","If you must use Nutstore, switch the sync provider to S3 or Local (Nutstore also offers an S3-compatible interface in some plans) - but WebDAV is intentionally blocked.","Re-read the linked Nutstore restriction doc to understand why WebDAV sync is unsupported."],"exampleFix":"// before\nwebdav.Endpoint = \"https://dav.jianguoyun.com/dav/\" // -> error 194\n// after: use a supported WebDAV server\nwebdav.Endpoint = \"https://my.nextcloud.example/remote.php/dav/files/me/\"","handlingStrategy":"validation","validationCode":"// TypeScript: block Nutstore WebDAV in the UI before submit\nif (/dav\\.jianguoyun\\.com/i.test(endpoint)) {\n  throw new Error('Nutstore WebDAV is not supported for sync; choose another WebDAV server');\n}","typeGuard":"// TypeScript\nconst isSupportedWebDAV = (url: string): boolean =>\n  !/dav\\.jianguoyun\\.com/i.test(url);","tryCatchPattern":null,"preventionTips":["Show a UI warning the moment the user types a Nutstore WebDAV URL.","Offer alternative WebDAV providers in the setup docs.","Keep the check case-insensitive on both client and server."],"tags":["sync","webdav","nutstore","cloud","i18n","kernel","validation"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}