{"record":{"id":"431612eff3089f21","repo":"wavetermdev/waveterm","slug":"peer-not-authenticated","errorCode":null,"errorMessage":"peer not authenticated","messagePattern":"peer not authenticated","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/jobmanager/mainserverconn.go","lineNumber":109,"sourceCode":"\t\treturn err\n\t}\n\n\tWshCmdJobManager.SetAttachedClient(msc)\n\treturn nil\n}\n\nfunc (msc *MainServerConn) StartJobCommand(ctx context.Context, data wshrpc.CommandStartJobData) (*wshrpc.CommandStartJobRtnData, error) {\n\tlog.Printf(\"StartJobCommand: received command=%s args=%v\", data.Cmd, data.Args)\n\tif !msc.PeerAuthenticated.Load() {\n\t\tlog.Printf(\"StartJobCommand: not authenticated\")\n\t\treturn nil, fmt.Errorf(\"not authenticated\")\n\t}\n\treturn WshCmdJobManager.StartJob(msc, data)\n}\n\nfunc (msc *MainServerConn) JobPrepareConnectCommand(ctx context.Context, data wshrpc.CommandJobPrepareConnectData) (*wshrpc.CommandJobConnectRtnData, error) {\n\tif !msc.PeerAuthenticated.Load() {\n\t\treturn nil, fmt.Errorf(\"peer not authenticated\")\n\t}\n\tif !msc.SelfAuthenticated.Load() {\n\t\treturn nil, fmt.Errorf(\"not authenticated to server\")\n\t}\n\treturn WshCmdJobManager.PrepareConnect(msc, data)\n}\n\nfunc (msc *MainServerConn) JobStartStreamCommand(ctx context.Context, data wshrpc.CommandJobStartStreamData) error {\n\tif !msc.PeerAuthenticated.Load() {\n\t\treturn fmt.Errorf(\"not authenticated\")\n\t}\n\treturn WshCmdJobManager.StartStream(msc)\n}\n\nfunc (msc *MainServerConn) JobInputCommand(ctx context.Context, data wshrpc.CommandJobInputData) error {\n\tif !msc.PeerAuthenticated.Load() {\n\t\treturn fmt.Errorf(\"not authenticated\")\n\t}","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/jobmanager/mainserverconn.go#L91-L127","documentation":"JobPrepareConnectCommand performs two auth checks; this first one fails when PeerAuthenticated is false, meaning the remote peer never validated its JobAccessToken with this job manager. The command is rejected before any connection preparation occurs.","triggerScenarios":"Invoking JobPrepareConnectCommand on a MainServerConn where PeerAuthenticated.Load() == false — no successful AuthenticateToJobManagerCommand call in this session.","commonSituations":"New connections used directly for PrepareConnect without the auth handshake, authentication rejected earlier, or state lost after job-manager restart.","solutions":["Run the AuthenticateToJobManagerCommand handshake first and confirm it returns nil.","Check job-manager logs for the earlier auth failure reason (token/claims/JobId) and fix the root cause.","Re-establish the connection and perform auth before PrepareConnect."],"exampleFix":"// before\nconn.JobPrepareConnectCommand(ctx, prepData) // fails: peer not authenticated\n// after\nif err := conn.AuthenticateToJobManagerCommand(ctx, authData); err != nil {\n    return err\n}\nrtn, err := conn.JobPrepareConnectCommand(ctx, prepData)","handlingStrategy":"try-catch","validationCode":"if !conn.peerAuthenticated() {\n    return fmt.Errorf(\"run AuthenticateToJobManagerCommand before PrepareConnect\")\n}","typeGuard":null,"tryCatchPattern":"rtn, err := conn.JobPrepareConnectCommand(ctx, data)\nif err != nil {\n    if err.Error() == \"peer not authenticated\" {\n        if authErr := conn.AuthenticateToJobManagerCommand(ctx, authData); authErr != nil {\n            return authErr\n        }\n        rtn, err = conn.JobPrepareConnectCommand(ctx, data)\n    }\n    if err != nil { return err }\n}","preventionTips":["Sequence: connect -> AuthenticateToJobManagerCommand -> PrepareConnect","Fail fast locally when auth state flags are false","Check job-manager logs for the original auth rejection reason"],"tags":["authentication","rpc","jobmanager","authorization"],"backgroundTag":"not-authenticated","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}