[PATCH_v1] add git credential login to remote mediawiki
From: Javier Roucher <jroucher@gmail.com>
This path uses git credential to store the login/password of the mediawiki.
Signed-off-by: Pavel Volek <Pavel.Volek@ensimag.imag.fr>
Signed-off-by: NGUYEN Kim Thuat <Kim-Thuat.Nguyen@ensimag.imag.fr>
Signed-off-by: ROUCHER IGLESIAS Javier <roucherj@ensimag.imag.fr>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
contrib/mw-to-git/git-remote-mediawiki | 107 +++++++++++++++++++++++++++++----
1 file changed, 95 insertions(+), 12 deletions(-)
diff --git a/contrib/mw-to-git/git-remote-mediawiki b/contrib/mw-to-git/git-remote-mediawiki
index c18bfa1..4b14d78 100755
--- a/contrib/mw-to-git/git-remote-mediawiki
+++ b/contrib/mw-to-git/git-remote-mediawiki
@@ -152,28 +152,111 @@ while (<STDIN>) {
########################## Functions ##############################
# MediaWiki API instance, created lazily.
+sub run_credential {
+ my $cre_protocol = "";
+ my $cre_host = "";
+ my $cre_path = "";
+ my $msg = "";
+ my $result = "";
+ my $op=$_[0];
+ if (scalar(@_) == 2) {
+ if ($_[1] eq ("store" || "cache")) {
+ run_git("config credential.helper \'$_[1]\'");
+ } else {
+ print STDERR "ERROR: run_credential (fill|approve|reject) [store|cache]\n";
+ exit 1;
+ }
+ }
+ my $parsed = URI->new($url);
+ $cre_protocol = $parsed->scheme;
+ $cre_host = $parsed->host;
+ $cre_path = $parsed->path;
+
+ if ($wiki_login ne "") {
+ $msg .= "username=$wiki_login\n";
+ }
+ if ($wiki_passwd ne "") {
+ $msg .= "password=$wiki_passwd\n";
+ }
+ if ($cre_protocol ne "") {
+ $msg .= "protocol=$cre_protocol\n";
+ }
+ if ($cre_host ne "") {
+ $msg .= "host=$cre_host\n";
+ }
+ if ($cre_path ne "") {
+ $msg .= "path=$cre_path\n";
+ }
+
+ $msg .= "\n";
+
+ my $key;
+ my $value;
+ my $Prog = "git credential $op";
+ open2(*Reader, *Writer, $Prog);
+ print Writer $msg;
+ close (Writer);
+
+ if ($op eq "fill") {
+ while (<Reader>) {
+ my ($key, $value) = /([^=]*)=(.*)/;
+ # error if key undef
+ if (not defined $key) {
+ print STDERR "ERROR reciving reponse git credential fill\n";
+ exit 1;
+ }
+ if ($key eq "username") {
+ $wiki_login = $value;
+ }
+ if ($key eq "password") {
+ $wiki_passwd = $value;
+ }
+ }
+ } else {
+ while (<Reader>) {
+ print STDERR "\nERROR while running git credential $op:\n$_";
+ }
+ }
+}
+
my $mediawiki;
+sub ask_login {
+ run_credential("fill","store");
+
+ if (!$mediawiki->login( {
+ lgname => $wiki_login,
+ lgpassword => $wiki_passwd,
+ lgdomain => $wiki_domain,
+ } )) {
+ print STDERR "Failed to log in mediawiki user \"$wiki_login\" on $url\n";
+ print STDERR "URL:$wiki_domain $url\n";
+ print STDERR "(error " .
+ $mediawiki->{error}->{code} . ': ' .
+ $mediawiki->{error}->{details} . ")\n";
+ run_credential("reject");
+ # exit 1;
+ } else {
+ print STDERR "Logged in with user \"$wiki_login\".\n";
+ run_credential("approve");
+ }
+}
+
sub mw_connect_maybe {
+
if ($mediawiki) {
return;
}
$mediawiki = MediaWiki::API->new;
$mediawiki->{config}->{api_url} = "$url/api.php";
if ($wiki_login) {
- if (!$mediawiki->login({
- lgname => $wiki_login,
- lgpassword => $wiki_passwd,
- lgdomain => $wiki_domain,
- })) {
- print STDERR "Failed to log in mediawiki user \"$wiki_login\" on $url\n";
- print STDERR "(error " .
- $mediawiki->{error}->{code} . ': ' .
- $mediawiki->{error}->{details} . ")\n";
- exit 1;
- } else {
- print STDERR "Logged in with user \"$wiki_login\".\n";
+ if (!$wiki_passwd) {
+ #user knows, password not.
+ ask_login();
}
+ } else {
+ #user or password not knows
+ ask_login();
}
}
--
1.7.11.rc2.9.ge2c5c96.dirty