123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- use strict;
- use warnings;
- use Getopt::Std;
- my %opt; getopts('m:a:e:u:c:p:g', \%opt);
- my %passwords;
- if ($opt{'p'} && open(P,$opt{'p'})) {
- while (<P>) {
- chomp; my($realm,$user,$pass) = split /:/,$_,2;
- $passwords{$realm}= [ $user, $pass ];
- }
- close P;
- }
- package PmWikiAgent;
- use base qw(LWP::UserAgent);
- use Term::ReadKey;
- our $Author;
- sub set_author { shift; $Author = shift; }
- sub new {
- my $self = LWP::UserAgent::new(@_);
- $self->agent("pmwikiedit");
- return $self;
- }
- our $Password;
- sub get_basic_credentials
- {
- my($self, $realm) = @_;
- return ($passwords{$realm}[0],$passwords{$realm}[1]) if $passwords{$realm};
- print "Enter username/password for $realm\n";
- print "Username [$Author]: "; chomp(my $author = <STDIN>);
- $author = $Author if $author eq '';
- if ($Password) { print "Press ENTER to use the same password as before\n"; }
- print "Password: ";
- ReadMode('noecho'); chomp(my $password = <STDIN>); ReadMode('restore');
- print "\n";
- if ($password eq '') { $password = $Password; }
- else { $Password = $password; }
- savepass($realm,$author,$password) if $opt{'g'};
- return ($author, $password);
- }
- use Fcntl ':flock';
- sub savepass {
- return unless $opt{'p'};
- my ($realm,$user,$pass) = @_;
- $passwords{$realm} = [ $user, $pass ];
- return unless open(P,">",$opt{'p'});
- flock(P,LOCK_EX);
- for (sort keys %passwords) { print P join(":",$_,@{$passwords{$_}}),"\n"; }
- close P;
- }
- package main;
- use HTTP::Cookies;
- use File::Temp qw(tempfile);
- my $DefaultWikiUrl = 'http://www.pmichaud.com/wiki/';
- my $DefaultWikiPage = 'Main/WikiSandbox';
- my $DefaultWikiEditor = 'vi';
- my $DefaultWikiAuthor = 'pmwikieditor';
- my %urlmap;
- my $mapfile = $opt{'m'} || "$ENV{'HOME'}/.pmwe.map";
- if (open(MAP, $mapfile)) {
- while (<MAP>) { my ($n,$url) = split; $urlmap{$n} = $url; }
- close MAP;
- }
- my $cookiefile = $opt{'c'} || "$ENV{'HOME'}/.pmwe.cookies";
- my $jar = HTTP::Cookies->new(file => $cookiefile, autosave => 1);
- $jar->scan(sub { $DefaultWikiAuthor = $_[2] if $_[1] eq 'author'; });
- my $wikipage = shift || $DefaultWikiPage;
- my $editor = $opt{'e'} || $ENV{'EDITOR'} || $DefaultWikiEditor;
- my $author = $opt{'a'} || $ENV{'WikiAuthor'} || $DefaultWikiAuthor;
- my $wikiurl = $opt{'u'} || shift || $DefaultWikiUrl;
- my $pageurl;
- if ($wikipage =~ /^http/) {
- $pageurl = $wikipage;
- if ($wikipage =~ /pagename/)
- { ($wikipage) = $pageurl =~ /pagename=([^&]+)/; }
- else { ($wikipage) = $pageurl =~ m!(\w+/\w+)$!; }
- } else {
- $wikiurl = $urlmap{$1} if $wikipage=~s/^(\w+):// && $urlmap{$1};
- if (not exists $urlmap{$1}) { die "There exists no map for $1\n"; }
- $wikipage =~ tr!/!.!;
- $wikipage .= ".$wikipage" unless $wikipage =~ /\./;
- $wikiurl ||= $DefaultWikiUrl;
- $wikiurl .= '/' unless $wikiurl =~ m!/$!;
- $pageurl = "$wikiurl$wikipage";
- }
- my $sep = ($pageurl =~ /\?/) ? '&' : '?';
- my $ua = PmWikiAgent->new; $ua->set_author($author); $ua->cookie_jar($jar);
- my $req = HTTP::Request->new('GET', "$pageurl${sep}action=source");
- my $outfile = (tempfile(UNLINK => 1))[1];
- my $res = $ua->request($req,$outfile);
- my $mtime0 = (stat($outfile))[9];
- system("$editor $outfile");
- my $mtime1 = (stat($outfile))[9];
- $mtime0 == $mtime1 && die "content unchanged.\n";
- open(OUTFILE, $outfile) or die;
- $res = $ua->post($pageurl, [
- action => 'post',
- pagename => $wikipage,
- text => do { local $/; <OUTFILE> },
- author => $author
- ]);
- close OUTFILE;
- $res->is_error && die "Unable to save content!\n".$res->as_string."\n";
|