Merge branch 'jk/mediawiki-credential'
* jk/mediawiki-credential: mw-to-git: use git-credential's URL parser credential: convert "url" attribute into its parsed subparts mw-to-git: check blank credential attributes via length docs/credential: minor clarity fixups
This commit is contained in:
commit
9837911c13
@ -102,22 +102,20 @@ INPUT/OUTPUT FORMAT
|
|||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
`git credential` reads and/or writes (depending on the action used)
|
`git credential` reads and/or writes (depending on the action used)
|
||||||
credential information in its standard input/output. These information
|
credential information in its standard input/output. This information
|
||||||
can correspond either to keys for which `git credential` will obtain
|
can correspond either to keys for which `git credential` will obtain
|
||||||
the login/password information (e.g. host, protocol, path), or to the
|
the login/password information (e.g. host, protocol, path), or to the
|
||||||
actual credential data to be obtained (login/password).
|
actual credential data to be obtained (login/password).
|
||||||
|
|
||||||
The credential is split into a set of named attributes.
|
The credential is split into a set of named attributes, with one
|
||||||
Attributes are provided to the helper, one per line. Each attribute is
|
attribute per line. Each attribute is
|
||||||
specified by a key-value pair, separated by an `=` (equals) sign,
|
specified by a key-value pair, separated by an `=` (equals) sign,
|
||||||
followed by a newline. The key may contain any bytes except `=`,
|
followed by a newline. The key may contain any bytes except `=`,
|
||||||
newline, or NUL. The value may contain any bytes except newline or NUL.
|
newline, or NUL. The value may contain any bytes except newline or NUL.
|
||||||
In both cases, all bytes are treated as-is (i.e., there is no quoting,
|
In both cases, all bytes are treated as-is (i.e., there is no quoting,
|
||||||
and one cannot transmit a value with newline or NUL in it). The list of
|
and one cannot transmit a value with newline or NUL in it). The list of
|
||||||
attributes is terminated by a blank line or end-of-file.
|
attributes is terminated by a blank line or end-of-file.
|
||||||
Git will send the following attributes (but may not send all of
|
Git understands the following attributes:
|
||||||
them for a given credential; for example, a `host` attribute makes no
|
|
||||||
sense when dealing with a non-network protocol):
|
|
||||||
|
|
||||||
`protocol`::
|
`protocol`::
|
||||||
|
|
||||||
@ -142,3 +140,15 @@ sense when dealing with a non-network protocol):
|
|||||||
`password`::
|
`password`::
|
||||||
|
|
||||||
The credential's password, if we are asking it to be stored.
|
The credential's password, if we are asking it to be stored.
|
||||||
|
|
||||||
|
`url`::
|
||||||
|
|
||||||
|
When this special attribute is read by `git credential`, the
|
||||||
|
value is parsed as a URL and treated as if its constituent parts
|
||||||
|
were read (e.g., `url=https://example.com` would behave as if
|
||||||
|
`protocol=https` and `host=example.com` had been provided). This
|
||||||
|
can help callers avoid parsing URLs themselves. Note that any
|
||||||
|
components which are missing from the URL (e.g., there is no
|
||||||
|
username in the example above) will be set to empty; if you want
|
||||||
|
to provide a URL and override some attributes, provide the URL
|
||||||
|
attribute first, followed by any overrides.
|
||||||
|
@ -171,32 +171,6 @@ while (<STDIN>) {
|
|||||||
|
|
||||||
## credential API management (generic functions)
|
## credential API management (generic functions)
|
||||||
|
|
||||||
sub credential_from_url {
|
|
||||||
my $url = shift;
|
|
||||||
my $parsed = URI->new($url);
|
|
||||||
my %credential;
|
|
||||||
|
|
||||||
if ($parsed->scheme) {
|
|
||||||
$credential{protocol} = $parsed->scheme;
|
|
||||||
}
|
|
||||||
if ($parsed->host) {
|
|
||||||
$credential{host} = $parsed->host;
|
|
||||||
}
|
|
||||||
if ($parsed->path) {
|
|
||||||
$credential{path} = $parsed->path;
|
|
||||||
}
|
|
||||||
if ($parsed->userinfo) {
|
|
||||||
if ($parsed->userinfo =~ /([^:]*):(.*)/) {
|
|
||||||
$credential{username} = $1;
|
|
||||||
$credential{password} = $2;
|
|
||||||
} else {
|
|
||||||
$credential{username} = $parsed->userinfo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return %credential;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub credential_read {
|
sub credential_read {
|
||||||
my %credential;
|
my %credential;
|
||||||
my $reader = shift;
|
my $reader = shift;
|
||||||
@ -214,8 +188,10 @@ sub credential_read {
|
|||||||
sub credential_write {
|
sub credential_write {
|
||||||
my $credential = shift;
|
my $credential = shift;
|
||||||
my $writer = shift;
|
my $writer = shift;
|
||||||
|
# url overwrites other fields, so it must come first
|
||||||
|
print $writer "url=$credential->{url}\n" if exists $credential->{url};
|
||||||
while (my ($key, $value) = each(%$credential) ) {
|
while (my ($key, $value) = each(%$credential) ) {
|
||||||
if ($value) {
|
if (length $value && $key ne 'url') {
|
||||||
print $writer "$key=$value\n";
|
print $writer "$key=$value\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -254,7 +230,7 @@ sub mw_connect_maybe {
|
|||||||
$mediawiki = MediaWiki::API->new;
|
$mediawiki = MediaWiki::API->new;
|
||||||
$mediawiki->{config}->{api_url} = "$url/api.php";
|
$mediawiki->{config}->{api_url} = "$url/api.php";
|
||||||
if ($wiki_login) {
|
if ($wiki_login) {
|
||||||
my %credential = credential_from_url($url);
|
my %credential = (url => $url);
|
||||||
$credential{username} = $wiki_login;
|
$credential{username} = $wiki_login;
|
||||||
$credential{password} = $wiki_passwd;
|
$credential{password} = $wiki_passwd;
|
||||||
credential_run("fill", \%credential);
|
credential_run("fill", \%credential);
|
||||||
|
@ -172,6 +172,8 @@ int credential_read(struct credential *c, FILE *fp)
|
|||||||
} else if (!strcmp(key, "path")) {
|
} else if (!strcmp(key, "path")) {
|
||||||
free(c->path);
|
free(c->path);
|
||||||
c->path = xstrdup(value);
|
c->path = xstrdup(value);
|
||||||
|
} else if (!strcmp(key, "url")) {
|
||||||
|
credential_from_url(c, value);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Ignore other lines; we don't know what they mean, but
|
* Ignore other lines; we don't know what they mean, but
|
||||||
|
Loading…
Reference in New Issue
Block a user