дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-09 03:05:40 +02:00
feat(git): remember HTTPS credentials in the app secret store (#321)
Git no longer asks for the HTTPS user name and password on every fetch, pull and push. The password prompt offers "Remember for this host"; the credential is saved in the app's secret store (next to the saved SSH passwords, never in git's global configuration) only after the git command that used it succeeds, and a stored credential the server rejects is forgotten so the next command asks again. Settings › Version Control › Git lists saved credentials and forgets them. Each git child gets its own id, passed to the askpass helper, so concurrent commands never save or forget each other's credentials. ide-vcs reports command completion through an observer installed at start-up instead of depending on ide-ssh. Credentials are keyed by scheme, host and port, and only git's authentication errors (Authentication failed, HTTP 401/403 responses, invalid username or password) forget a stored credential. Fixes #272 Co-authored-by: a-rookie-of-C-language <[email protected]>
Цей коміт міститься в:
1 джерело
2c10b63f76
коміт
e85ffa2ae8
17 files changed
+666
-34
No files matched your search
@@ -7,26 +7,26 @@ describe("askpass queue", () => {
|
||||
beforeEach(() => useAskpass.setState({ queue: [] }));
|
||||
|
||||
it("queues prompts in arrival order, once each", () => {
|
||||
enqueueAskpass({ id: 1, prompt: "Password:", kind: "secret" });
|
||||
enqueueAskpass({ id: 2, prompt: "Continue connecting (yes/no)?", kind: "confirm" });
|
||||
enqueueAskpass({ id: 1, prompt: "Password:", kind: "secret" });
|
||||
enqueueAskpass({ id: 1, prompt: "Password:", kind: "secret", remember: false });
|
||||
enqueueAskpass({ id: 2, prompt: "Continue connecting (yes/no)?", kind: "confirm", remember: false });
|
||||
enqueueAskpass({ id: 1, prompt: "Password:", kind: "secret", remember: false });
|
||||
expect(useAskpass.getState().queue.map((p) => p.id)).toEqual([1, 2]);
|
||||
});
|
||||
|
||||
it("drops a prompt answered elsewhere", () => {
|
||||
enqueueAskpass({ id: 1, prompt: "a", kind: "text" });
|
||||
enqueueAskpass({ id: 2, prompt: "b", kind: "text" });
|
||||
enqueueAskpass({ id: 1, prompt: "a", kind: "text", remember: false });
|
||||
enqueueAskpass({ id: 2, prompt: "b", kind: "text", remember: false });
|
||||
dropAskpass(1);
|
||||
dropAskpass(9);
|
||||
expect(useAskpass.getState().queue.map((p) => p.id)).toEqual([2]);
|
||||
});
|
||||
|
||||
it("answers the backend and shows the next prompt", () => {
|
||||
const send = vi.fn((_id: number, _answer: string | null) => Promise.resolve());
|
||||
enqueueAskpass({ id: 1, prompt: "a", kind: "secret" });
|
||||
enqueueAskpass({ id: 2, prompt: "b", kind: "secret" });
|
||||
answerAskpass(1, "hunter2", send);
|
||||
expect(send).toHaveBeenCalledWith(1, "hunter2");
|
||||
const send = vi.fn((_id: number, _answer: string | null, _remember: boolean) => Promise.resolve());
|
||||
enqueueAskpass({ id: 1, prompt: "a", kind: "secret", remember: true });
|
||||
enqueueAskpass({ id: 2, prompt: "b", kind: "secret", remember: false });
|
||||
answerAskpass({ id: 1, prompt: "a", kind: "secret", remember: true }, "hunter2", true, send);
|
||||
expect(send).toHaveBeenCalledWith(1, "hunter2", true);
|
||||
expect(useAskpass.getState().queue.map((p) => p.id)).toEqual([2]);
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Заблокувати користувача