{"record":{"id":"561623fb52b0e8e0","repo":"siyuan-note/siyuan","slug":"conf-language-31-localized-cloud-auth-failure-me","errorCode":null,"errorMessage":"Conf.Language(31) (localized cloud auth failure message)","messagePattern":"Conf\\.Language\\(31\\) \\(localized cloud auth failure message\\)","errorType":"http","errorClass":null,"httpStatus":401,"severity":"error","filePath":"kernel/model/assets.go","lineNumber":1487,"sourceCode":"\t\t\tutil.PushUpdateMsg(msgId, msg, 3000)\n\t\t}\n\n\t\trequestResult := gulu.Ret.NewResult()\n\t\trequest := httpclient.NewCloudFileRequest2m()\n\t\tresp, reqErr := request.\n\t\t\tSetSuccessResult(requestResult).\n\t\t\tSetFile(\"file[]\", absAsset).\n\t\t\tSetCookies(&http.Cookie{Name: \"symphony\", Value: uploadToken}).\n\t\t\tSetHeader(\"meta-type\", metaType).\n\t\t\tSetHeader(\"biz-type\", bizType).\n\t\t\tPost(util.GetCloudServer() + \"/apis/siyuan/upload?ver=\" + util.Ver)\n\t\tif nil != reqErr {\n\t\t\tlogging.LogErrorf(\"upload assets failed: %s\", reqErr)\n\t\t\treturn count, ErrFailedToConnectCloudServer\n\t\t}\n\n\t\tif 401 == resp.StatusCode {\n\t\t\terr = errors.New(Conf.Language(31))\n\t\t\treturn\n\t\t}\n\n\t\tif 0 != requestResult.Code {\n\t\t\tlogging.LogErrorf(\"upload assets failed: %s\", requestResult.Msg)\n\t\t\terr = fmt.Errorf(Conf.Language(94), requestResult.Msg)\n\t\t\treturn\n\t\t}\n\n\t\tabsAsset = filepath.ToSlash(absAsset)\n\t\trelAsset := absAsset[strings.Index(absAsset, \"assets/\"):]\n\t\tcompletedUploadAssets = append(completedUploadAssets, relAsset)\n\t\tlogging.LogInfof(\"uploaded asset [%s]\", relAsset)\n\t\tcount++\n\t}\n\n\tif !ignorePushMsg {\n\t\tutil.PushClearMsg(msgId)","sourceCodeStart":1469,"sourceCodeEnd":1505,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/model/assets.go#L1469-L1505","documentation":"During cloud asset upload (uploadAssets), if the cloud server responds with HTTP 401 Unauthorized, the function sets err to Conf.Language(31), the localized \"cloud authentication failed\" message, and returns. This means the stored cloud credentials/token are no longer accepted by the SiYuan cloud service.","triggerScenarios":"Uploading assets to SiYuan cloud (uploadAssets / sync-related asset upload) while the cloud API returns 401 — expired or revoked cloud session, wrong account, or a stale token after password change. The returned error message is then propagated to the client (surfaces as `err` to callers like the electron layer).","commonSituations":"Subscription expired; user changed cloud password on another device; token invalidated by server; clock skew making tokens appear expired; long-lived session cut off by server-side session cleanup.","solutions":["Open Settings - Account and re-login to SiYuan cloud to refresh the authentication token.","Verify the subscription/account status on the cloud service (check expiry, password changes).","If a proxy/VPN is intercepting requests, disable it so requests reach the real cloud endpoint.","Check system clock correctness; a wrong clock can invalidate authentication."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await fetchPost('/api/asset/uploadCloud', {...});\n} catch (e) {\n  if (isCloudAuthError(e)) {\n    // prompt re-login to SiYuan cloud (Settings - Account) before retrying\n    await promptRelogin();\n  }\n}","preventionTips":["Keep your cloud subscription active and re-login after password changes","Check the account panel's login state before bulk cloud uploads","Avoid proxies/VPNs that alter cloud requests","Keep the system clock accurate (NTP)"],"tags":["cloud","authentication","http-401","upload"],"backgroundTag":"authentication-required","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}