{"thread":{"id":"30614","subject":"credential-helpers + remote-helper, starting point?","startedAt":"2012-05-24T15:14:35Z","lastAt":"2012-05-25T20:35:44Z","messageCount":9,"participants":["roucherj","Jeff King","Matthieu Moy","Junio C Hamano"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"192082","messageId":"b13df32797edbe8f71c796dbb4dc06a5@telesun.imag.fr","threadId":"30614","inReplyTo":null,"subject":"credential-helpers + remote-helper, starting point?","fromName":"roucherj","fromEmail":"roucherj@telesun.imag.fr","sentAt":"2012-05-24T15:14:35Z","receivedAt":"2012-05-24T15:14:35Z","isPatch":false,"sender":{"key":"roucherj@telesun.imag.fr","avatar":null},"body":"Hello,\n\nI want to know if anyone can help me with git-credential-helpers we are \ntrying to use git-credential-helpers in the git-mediawiki (implemented \nas a remote-helper).\nWe need to ask for the login/pass of the wiki and it would be nice if \nwe can use credential-helpers to manage this credentials.\n\nAnyone can send me a starting point, like a url with the documentation \nof git-credential-helpers?\nTo see how we can import credential-helpers for used with mediawiki.\n"},{"id":"192094","messageId":"20120524182110.GE3161@sigill.intra.peff.net","threadId":"30614","inReplyTo":"b13df32797edbe8f71c796dbb4dc06a5@telesun.imag.fr","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-05-24T18:21:10Z","receivedAt":"2012-05-24T18:21:10Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, May 24, 2012 at 05:14:35PM +0200, roucherj wrote:\n\n> I want to know if anyone can help me with git-credential-helpers we\n> are trying to use git-credential-helpers in the git-mediawiki\n> (implemented as a remote-helper).\n> We need to ask for the login/pass of the wiki and it would be nice if\n> we can use credential-helpers to manage this credentials.\n\nYeah, I think it makes sense to use the credential-helpers.\n\n> Anyone can send me a starting point, like a url with the\n> documentation of git-credential-helpers?\n\nTry:\n\n  https://github.com/git/git/blob/master/Documentation/technical/api-credentials.txt\n\nBut that is the C API, and I assume you are building on the existing\nmediawiki helper that is written in perl. So I think what you really\nwant is a \"git credential\" command that will let scripts hook into the\ncredential API. Something like:\n\n  $ git credential get https://example.com\n  username=bob\n  password=secret\n\n  $ cat <<\\EOF | git credential store https://example.com\n  username=bob\n  password=secret\n  EOF\n\n  $ cat <<\\EOF | git credential erase https://example.com\n  username=bob\n  password=secret\n  EOF\n\nI had planned eventually to do something like this for git-svn, but\nrealized that it was more sane to just let svn library handle the\ncredential storage.\n\nDo you guys want to try writing \"git credential\" as above? It might be a\nfun side project, but I know you are also on a limited timeframe for\nyour project. I can work on it if you don't have time.\n\n-Peff\n"},{"id":"192101","messageId":"vpq7gw1z8rb.fsf@bauges.imag.fr","threadId":"30614","inReplyTo":"20120524182110.GE3161@sigill.intra.peff.net","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2012-05-24T19:20:08Z","receivedAt":"2012-05-24T19:20:08Z","isPatch":false,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Jeff King <peff@peff.net> writes:\n\n>   https://github.com/git/git/blob/master/Documentation/technical/api-credentials.txt\n\nI just re-read that document (I had a quick glance only before), and\nstarted to understand. I think the document really lacks the \"big\npicture\". I took time to understand whether the API was to call\ncredential helpers, or to write a new one. Actually, there are two\n\"API\": the C one, and the specification of what may flow on the pipe\nbetween the two processes.\n\nPerhaps something like this should be added:\n\nSubject: [PATCH] credential-helper documentation: show the big picture first\n\n---\n Documentation/technical/api-credentials.txt |   47 +++++++++++++++++++++++++--\n 1 file changed, 44 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/technical/api-credentials.txt b/Documentation/technical/api-credentials.txt\nindex 21ca6a2..5a872c0 100644\n--- a/Documentation/technical/api-credentials.txt\n+++ b/Documentation/technical/api-credentials.txt\n@@ -6,8 +6,40 @@ password credentials from the user (even though credentials in the wider\n world can take many forms, in this document the word \"credential\" always\n refers to a username and password pair).\n \n+When a function in Git or one of its remote-helpers needs to obtain\n+credentials (either by asking the user or by fetching from a store),\n+it can call the functions in the C API. These functions will fork a\n+new process, and communicate with it by passing command-line arguments\n+and then communicating through a pipe (see 'Credential Helpers'\n+below). The credential helper process will be in charge of actually\n+prompting the user and/or storing and fetching the credentials.\n+\n+For example, the execution of a command connecting to an HTTP server\n+and using the credential helper \"cache\" will have the following\n+structure:\n+\n+------------\n++-----+ -----> +-----------------+\n+| git |  pipe  | git remote-http | --- to HTTP server --->\n++-----+ <----- +-----------------+\n+                    ^      |\n+                    | pipe |\n+                    |      v\n+             +----------------------+\n+             | git credential-cache |\n+             +----------------------+\n+------------\n+\n+git remote-http will take care of contacting the HTTP server, do the\n+actual authentication and see if it's accepted by the server. The\n+credential helper will deal with the credential store (which can be\n+done by contacting a keyring daemon) and the prompting if needed.\n+\n+C API\n+-----\n+\n Data Structures\n----------------\n+~~~~~~~~~~~~~~~\n \n `struct credential`::\n \n@@ -28,7 +60,7 @@ This struct should always be initialized with `CREDENTIAL_INIT` or\n \n \n Functions\n----------\n+~~~~~~~~~\n \n `credential_init`::\n \n@@ -72,7 +104,7 @@ Functions\n \tParse a URL into broken-down credential fields.\n \n Example\n--------\n+~~~~~~~\n \n The example below shows how the functions of the credential API could be\n used to login to a fictitious \"foo\" service on a remote host:\n@@ -130,6 +162,9 @@ int foo_login(struct foo_connection *f)\n Credential Helpers\n ------------------\n \n+Choosing the credential helper command\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n Credential helpers are programs executed by git to fetch or save\n credentials from and to long-term storage (where \"long-term\" is simply\n longer than a single git process; e.g., credentials may be stored\n@@ -176,6 +211,9 @@ users by naming their program \"git-credential-$NAME\", and putting it in\n the $PATH or $GIT_EXEC_PATH during installation, which will allow a user\n to enable it with `git config credential.helper $NAME`.\n \n+Credential helper command-line arguments\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n When a helper is executed, it will have one \"operation\" argument\n appended to its command line, which is one of:\n \n@@ -191,6 +229,9 @@ appended to its command line, which is one of:\n \n \tRemove a matching credential, if any, from the helper's storage.\n \n+Credential helper protocol\n+~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n The details of the credential will be provided on the helper's stdin\n stream. The credential is split into a set of named attributes.\n Attributes are provided to the helper, one per line. Each attribute is\n-- \n1.7.10.363.g7fcd3d.dirty\n\nAlso, shouldn't the documentation about choosing the command name be\nmoved to git-config.txt, to document credential.helper? It really seems\nto be a user documentation, not a technical one meant for Git\ndevelopers.\n\n> But that is the C API, and I assume you are building on the existing\n> mediawiki helper that is written in perl.\n\nRight.\n\n> So I think what you really want is a \"git credential\" command that\n> will let scripts hook into the credential API. Something like:\n>\n>   $ git credential get https://example.com\n>   username=bob\n>   password=secret\n> [...]\n\nThis is almost already done by test-credential.c indeed. But that's\nprobably the simplest way to expose the C API to a perl program.\n\n> Do you guys want to try writing \"git credential\" as above? It might be a\n> fun side project, but I know you are also on a limited timeframe for\n> your project. I can work on it if you don't have time.\n\nI leave it up to the students.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"192103","messageId":"20120524200122.GA18936@sigill.intra.peff.net","threadId":"30614","inReplyTo":"vpq7gw1z8rb.fsf@bauges.imag.fr","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-05-24T20:01:22Z","receivedAt":"2012-05-24T20:01:22Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, May 24, 2012 at 09:20:08PM +0200, Matthieu Moy wrote:\n\n> Jeff King <peff@peff.net> writes:\n> \n> >   https://github.com/git/git/blob/master/Documentation/technical/api-credentials.txt\n> \n> I just re-read that document (I had a quick glance only before), and\n> started to understand. I think the document really lacks the \"big\n> picture\". I took time to understand whether the API was to call\n> credential helpers, or to write a new one. Actually, there are two\n> \"API\": the C one, and the specification of what may flow on the pipe\n> between the two processes.\n\nRight. There are really two audiences for this document: people who are\nwriting git code that wants to use credentials, and people who want to\nwrite a helper. And it probably makes sense to say that up front, and\npoint people to the right section.\n\n> diff --git a/Documentation/technical/api-credentials.txt b/Documentation/technical/api-credentials.txt\n> index 21ca6a2..5a872c0 100644\n> --- a/Documentation/technical/api-credentials.txt\n> +++ b/Documentation/technical/api-credentials.txt\n> @@ -6,8 +6,40 @@ password credentials from the user (even though credentials in the wider\n>  world can take many forms, in this document the word \"credential\" always\n>  refers to a username and password pair).\n>  \n> +When a function in Git or one of its remote-helpers needs to obtain\n> +credentials (either by asking the user or by fetching from a store),\n> +it can call the functions in the C API. These functions will fork a\n> +new process, and communicate with it by passing command-line arguments\n> +and then communicating through a pipe (see 'Credential Helpers'\n> +below).\n\nWe might or might not fork a new process. It depends on which helpers\nare defined.\n\n> The credential helper process will be in charge of actually\n> +prompting the user and/or storing and fetching the credentials.\n\nThat's not exactly true; the C credential code will actually prompt the\nuser if no helper provides it (in early versions, the helpers were\nresponsible for prompting, but that is no longer the case).\n\n> +For example, the execution of a command connecting to an HTTP server\n> +and using the credential helper \"cache\" will have the following\n> +structure:\n> +\n> +------------\n> ++-----+ -----> +-----------------+\n> +| git |  pipe  | git remote-http | --- to HTTP server --->\n> ++-----+ <----- +-----------------+\n> +                    ^      |\n> +                    | pipe |\n> +                    |      v\n> +             +----------------------+\n> +             | git credential-cache |\n> +             +----------------------+\n> +------------\n> +\n> +git remote-http will take care of contacting the HTTP server, do the\n> +actual authentication and see if it's accepted by the server. The\n> +credential helper will deal with the credential store (which can be\n> +done by contacting a keyring daemon) and the prompting if needed.\n\nI feel like adding remote-helpers into the mix just makes the situation\nmore complex (and necessitates the diagram). I also don't want to get\ntoo much into \"how it works inside\" and would rather stay at the level\nof \"here's how you use it\".\n\nWhat do you think of the patch below? It tries to route the reader to\nthe most useful spot, and it would naturally extend to mentioning a \"git\ncredential\" command when one exists (which would be separately\ndocumented in git-credential.txt).\n\n---\ndiff --git a/Documentation/technical/api-credentials.txt b/Documentation/technical/api-credentials.txt\nindex 21ca6a2..f6fa203 100644\n--- a/Documentation/technical/api-credentials.txt\n+++ b/Documentation/technical/api-credentials.txt\n@@ -6,8 +6,27 @@ password credentials from the user (even though credentials in the wider\n world can take many forms, in this document the word \"credential\" always\n refers to a username and password pair).\n \n+This document describes two interfaces: the C API that the credential\n+subsystem provides to the rest of git, and the protocol that git uses to\n+communicate with system-specific \"credential helpers\". If you are\n+writing git code that wants to look up or prompt for credentials, see\n+the section \"C API\" below. If you want to write your own helper, see\n+the section on \"Credential Helpers\" below.\n+\n+\n+C API\n+-----\n+\n+The credential C API is meant to be called by git code which needs to\n+acquire or store a credential. It is centered around an object\n+representing a single credential and provides three basic operations:\n+fill (acquire credentials by calling helpers and/or prompting the user),\n+approve (mark a credential as successfully used so that it can be stored\n+for later use), and reject (mark a credential as unsuccessful so that it\n+can be erased from any persistent storage).\n+\n Data Structures\n----------------\n+~~~~~~~~~~~~~~~\n \n `struct credential`::\n \n@@ -28,7 +47,7 @@ This struct should always be initialized with `CREDENTIAL_INIT` or\n \n \n Functions\n----------\n+~~~~~~~~~\n \n `credential_init`::\n \n@@ -72,7 +91,7 @@ Functions\n \tParse a URL into broken-down credential fields.\n \n Example\n--------\n+~~~~~~~\n \n The example below shows how the functions of the credential API could be\n used to login to a fictitious \"foo\" service on a remote host:\n"},{"id":"192108","messageId":"vpq8vghxr9w.fsf@bauges.imag.fr","threadId":"30614","inReplyTo":"20120524200122.GA18936@sigill.intra.peff.net","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2012-05-24T20:23:07Z","receivedAt":"2012-05-24T20:23:07Z","isPatch":false,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Jeff King <peff@peff.net> writes:\n\n>> +When a function in Git or one of its remote-helpers needs to obtain\n>> +credentials (either by asking the user or by fetching from a store),\n>> +it can call the functions in the C API. These functions will fork a\n>> +new process, and communicate with it by passing command-line arguments\n>> +and then communicating through a pipe (see 'Credential Helpers'\n>> +below).\n>\n> We might or might not fork a new process. It depends on which helpers\n> are defined.\n\nOK, so s/will fork/may fork/ may be more appropriate.\n\n>> +For example, the execution of a command connecting to an HTTP server\n>> +and using the credential helper \"cache\" will have the following\n>> +structure:\n>> +\n>> +------------\n>> ++-----+ -----> +-----------------+\n>> +| git |  pipe  | git remote-http | --- to HTTP server --->\n>> ++-----+ <----- +-----------------+\n>> +                    ^      |\n>> +                    | pipe |\n>> +                    |      v\n>> +             +----------------------+\n>> +             | git credential-cache |\n>> +             +----------------------+\n>> +------------\n>> +\n>> +git remote-http will take care of contacting the HTTP server, do the\n>> +actual authentication and see if it's accepted by the server. The\n>> +credential helper will deal with the credential store (which can be\n>> +done by contacting a keyring daemon) and the prompting if needed.\n>\n> I feel like adding remote-helpers into the mix just makes the situation\n> more complex (and necessitates the diagram).\n\nThe helper is not strictly needed, but that seems to be a common\nsituation, so I thought describing the common case made sense.\n\nI think it's important to show the difference between the actual\nauthentication process (e.g. HTTP) and the credential helper. I took\ntime to understand the example later:\n\n\tcredential_fill(&c);\n        /* [...] */\n\tstatus = send_foo_login(f, c.username, c.password);\n\tswitch (status) {\n\nthen I understood that send_foo_login was the one doing the actual\nauthentication, and that further calls to the credential API was needed\nto say how it went. Making explicit the fact that the Git code talks\nboth the helper and the server on which we are authenticating would have\nhelped me to understand at least.\n\nI think mentionning the fact that a credential helper may connect to a\nkeyring daemon was important also. I first read some discussions about\ncredential helpers thinking that we would have to re-implement the\nstoring mechanism, and really understood what it was all about when I\nsaw patches for KDE support for example.\n\nOther than that, I do like your wording. If it was just me, I'd take\nyour introduction, but keep my example + diagram.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"192129","messageId":"7vtxz5ut84.fsf@alter.siamese.dyndns.org","threadId":"30614","inReplyTo":"20120524200122.GA18936@sigill.intra.peff.net","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2012-05-24T22:09:15Z","receivedAt":"2012-05-24T22:09:15Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> On Thu, May 24, 2012 at 09:20:08PM +0200, Matthieu Moy wrote:\n>\n>> +------------\n>> ++-----+ -----> +-----------------+\n>> +| git |  pipe  | git remote-http | --- to HTTP server --->\n>> ++-----+ <----- +-----------------+\n>> +                    ^      |\n>> +                    | pipe |\n>> +                    |      v\n>> +             +----------------------+\n>> +             | git credential-cache |\n>> +             +----------------------+\n>> +------------\n>> +\n>> +git remote-http will take care of contacting the HTTP server, do the\n>> +actual authentication and see if it's accepted by the server. The\n>> +credential helper will deal with the credential store (which can be\n>> +done by contacting a keyring daemon) and the prompting if needed.\n>\n> I feel like adding remote-helpers into the mix just makes the situation\n> more complex (and necessitates the diagram).\n\nI would also prefer to see an example _without_ the remote helper, but at\nthe same time it still helps to have an illustration.\n\n> +This document describes two interfaces: the C API that the credential\n> +subsystem provides to the rest of git, and the protocol that git uses to\n> +communicate with system-specific \"credential helpers\". If you are\n> +writing git code that wants to look up or prompt for credentials, see\n\nDon't you \"prompt\" yourself?  The above sounds as if you are delegating\nboth looking up and prompting to the helper.\n\n> +the section \"C API\" below. If you want to write your own helper, see\n> +the section on \"Credential Helpers\" below.\n\nNice.\n"},{"id":"192157","messageId":"vpqfwaotye9.fsf@bauges.imag.fr","threadId":"30614","inReplyTo":"7vtxz5ut84.fsf@alter.siamese.dyndns.org","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2012-05-25T09:15:10Z","receivedAt":"2012-05-25T09:15:10Z","isPatch":false,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Jeff King <peff@peff.net> writes:\n>\n>> On Thu, May 24, 2012 at 09:20:08PM +0200, Matthieu Moy wrote:\n>>\n>> +This document describes two interfaces: the C API that the credential\n>> +subsystem provides to the rest of git, and the protocol that git uses to\n>> +communicate with system-specific \"credential helpers\". If you are\n>> +writing git code that wants to look up or prompt for credentials, see\n>\n> Don't you \"prompt\" yourself?  The above sounds as if you are delegating\n> both looking up and prompting to the helper.\n\nIt seems I misunderstood how it worked, indeed. I thought the prompting\ncould also be done by the helper (it seems sensible if you're going to\nuse your desktop's keyring to also allow the desktop's GUI for prompting\nfor example).\n\nLooking closely at the code, credential_fill either delegates fetching\ndata to the remote helper, or does the prompting. IOW, the prompting is\ndone behind the C API anyway, but most likely from credential.c than\nfrom the external helper. Is that understanding correct?\n\nThanks,\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"192162","messageId":"5edbcd2530e49e719129f799f8c78dd3@telesun.imag.fr","threadId":"30614","inReplyTo":"20120524182110.GE3161@sigill.intra.peff.net","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"roucherj","fromEmail":"roucherj@telesun.imag.fr","sentAt":"2012-05-25T13:28:39Z","receivedAt":"2012-05-25T13:28:39Z","isPatch":false,"sender":{"key":"roucherj@telesun.imag.fr","avatar":null},"body":"On Thu, 24 May 2012 14:21:10 -0400, Jeff King wrote:\n> On Thu, May 24, 2012 at 05:14:35PM +0200, roucherj wrote:\n>\n>> I want to know if anyone can help me with git-credential-helpers we\n>> are trying to use git-credential-helpers in the git-mediawiki\n>> (implemented as a remote-helper).\n>> We need to ask for the login/pass of the wiki and it would be nice \n>> if\n>> we can use credential-helpers to manage this credentials.\n>\n> Yeah, I think it makes sense to use the credential-helpers.\n>\n>> Anyone can send me a starting point, like a url with the\n>> documentation of git-credential-helpers?\n>\n> Try:\n>\n>\n> \n> https://github.com/git/git/blob/master/Documentation/technical/api-credentials.txt\n>\n> But that is the C API, and I assume you are building on the existing\n> mediawiki helper that is written in perl. So I think what you really\n> want is a \"git credential\" command that will let scripts hook into \n> the\n> credential API. Something like:\n>\n>   $ git credential get https://example.com\n>   username=bob\n>   password=secret\n>\n>   $ cat <<\\EOF | git credential store https://example.com\n>   username=bob\n>   password=secret\n>   EOF\n>\n>   $ cat <<\\EOF | git credential erase https://example.com\n>   username=bob\n>   password=secret\n>   EOF\n>\n> I had planned eventually to do something like this for git-svn, but\n> realized that it was more sane to just let svn library handle the\n> credential storage.\n>\n> Do you guys want to try writing \"git credential\" as above? It might \n> be a\n> fun side project, but I know you are also on a limited timeframe for\n> your project. I can work on it if you don't have time.\n>\n> -Peff\n\nJeff thanks you for helping me with use credentials-helpers with \ngit-remote\nI will try to code your proposed solution.\nmaking something like that:\n\n+-----+ -----> +----------------------+\n| git |  pipe  | git-remote-mediawiki |\n+-----+ <----- +----------------------+\n                      /\\      ||\n                      || pipe ||\n                      ||      \\/\n                  +----------------+ ----->  O\n                  | git-credential | <----- -|-\n                  +----------------+        / \\\n                      /\\      ||            User\n                      || pipe ||\n                      ||      \\/\n                  +-------------------------+\n                  | git-credentials-helpers |\n                  +-------------------------+\n"},{"id":"192207","messageId":"20120525203544.GA4297@sigill.intra.peff.net","threadId":"30614","inReplyTo":"5edbcd2530e49e719129f799f8c78dd3@telesun.imag.fr","subject":"Re: credential-helpers + remote-helper, starting point?","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-05-25T20:35:44Z","receivedAt":"2012-05-25T20:35:44Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, May 25, 2012 at 03:28:39PM +0200, roucherj wrote:\n\n> Jeff thanks you for helping me with use credentials-helpers with\n> git-remote\n> I will try to code your proposed solution.\n> making something like that:\n> \n> +-----+ -----> +----------------------+\n> | git |  pipe  | git-remote-mediawiki |\n> +-----+ <----- +----------------------+\n>                      /\\      ||\n>                      || pipe ||\n>                      ||      \\/\n>                  +----------------+ ----->  O\n>                  | git-credential | <----- -|-\n>                  +----------------+        / \\\n>                      /\\      ||            User\n>                      || pipe ||\n>                      ||      \\/\n>                  +-------------------------+\n>                  | git-credentials-helpers |\n>                  +-------------------------+\n\nExactly. Let me know if you run into any problems.\n\n-Peff\n"}]}