From b499b81784e502e480dd114bb1fc130f498ab224 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 25 Dec 2006 21:41:04 +0100 Subject: [PATCH 01/16] No need to dberror out when we are using RaiseError. --- perl/Sesse/pr0n/WebDAV.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl/Sesse/pr0n/WebDAV.pm b/perl/Sesse/pr0n/WebDAV.pm index cfaa0ec..aecd9fd 100644 --- a/perl/Sesse/pr0n/WebDAV.pm +++ b/perl/Sesse/pr0n/WebDAV.pm @@ -500,7 +500,7 @@ EOF if ($@) { # Some error occurred, rollback and bomb out $dbh->rollback; - dberror($r, "Transaction aborted because $@"); + error($r, "Transaction aborted because $@"); unlink($fname); } } -- 2.39.2 From af53beceb86781f1caa593218e72a4cc0dcc2262 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 25 Dec 2006 22:11:05 +0100 Subject: [PATCH 02/16] Last round of typos, I hope. --- perl/Sesse/pr0n/Rotate.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perl/Sesse/pr0n/Rotate.pm b/perl/Sesse/pr0n/Rotate.pm index e6d4614..59103e7 100644 --- a/perl/Sesse/pr0n/Rotate.pm +++ b/perl/Sesse/pr0n/Rotate.pm @@ -37,7 +37,7 @@ sub handler { if ($rotval == 90 || $rotval == 270) { my $q = $dbh->do('UPDATE images SET height=width,width=height WHERE id=?', undef, $id) or dberror($r, "Size clear of $id failed"); - $dbh->do('UPDATE events SET last_update=CURRENT_TIMESTAMP WHERE event=( SELECT event FROM images WHERE id=? )', + $dbh->do('UPDATE events SET last_update=CURRENT_TIMESTAMP WHERE id=( SELECT event FROM images WHERE id=? )', undef, $id) or dberror($r, "Cache invalidation at $id failed"); } @@ -46,7 +46,7 @@ sub handler { { eval { - $dbh->do('UPDATE events SET last_update=CURRENT_TIMESTAMP WHERE event=( SELECT event FROM images WHERE id=? )', + $dbh->do('UPDATE events SET last_update=CURRENT_TIMESTAMP WHERE id=( SELECT event FROM images WHERE id=? )', undef, $id); $dbh->do('INSERT INTO deleted_images SELECT * FROM images WHERE id=?', undef, $id); -- 2.39.2 From 408224e33918eb1837057c790798c9b3083b3e6a Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 25 Dec 2006 23:26:32 +0100 Subject: [PATCH 03/16] Use semicolon instead of ampersand to separate arguments. --- perl/Sesse/pr0n/Common.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl/Sesse/pr0n/Common.pm b/perl/Sesse/pr0n/Common.pm index 4ddc0da..3ab1c6b 100644 --- a/perl/Sesse/pr0n/Common.pm +++ b/perl/Sesse/pr0n/Common.pm @@ -128,7 +128,7 @@ sub get_query_string { next unless defined($value); next if (defined($defparam->{$key}) && $value == $defparam->{$key}); - $str .= ($first) ? "?" : '&'; + $str .= ($first) ? "?" : ';'; $str .= "$key=$value"; $first = 0; } -- 2.39.2 From f88b9aecc1e5bbad92bbac45ce3d159bfad65035 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 25 Dec 2006 23:27:04 +0100 Subject: [PATCH 04/16] Bump version number again. --- perl/Sesse/pr0n/Common.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl/Sesse/pr0n/Common.pm b/perl/Sesse/pr0n/Common.pm index 3ab1c6b..95c7363 100644 --- a/perl/Sesse/pr0n/Common.pm +++ b/perl/Sesse/pr0n/Common.pm @@ -32,7 +32,7 @@ BEGIN { require Sesse::pr0n::Config_local; }; - $VERSION = "v2.11"; + $VERSION = "v2.12"; @ISA = qw(Exporter); @EXPORT = qw(&error &dberror); %EXPORT_TAGS = qw(); -- 2.39.2 From 9c7c9c9f57b9f5a04c66aec40f5e3f6368d70434 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 26 Dec 2006 16:56:57 +0100 Subject: [PATCH 05/16] Update the version number in the FAQ. --- files/faq.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/faq.html b/files/faq.html index 39c03a4..0e62ebe 100644 --- a/files/faq.html +++ b/files/faq.html @@ -138,7 +138,7 @@ on IRC as Sesse on EFnet, IRCnet, Freenode or OFTC.


- -- 2.39.2 From 675db3ce4a65a4e75374eb2db2092955ee6c65eb Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 26 Dec 2006 16:58:14 +0100 Subject: [PATCH 06/16] Revert the default for the processing/scaling, except for events that contain NEF files; it's really annoying in the long run, and breaks with a long-standing pr0n principle. --- perl/Sesse/pr0n/Index.pm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/perl/Sesse/pr0n/Index.pm b/perl/Sesse/pr0n/Index.pm index 6e1d237..e85ab6e 100644 --- a/perl/Sesse/pr0n/Index.pm +++ b/perl/Sesse/pr0n/Index.pm @@ -34,8 +34,8 @@ sub handler { my %defsettings = ( thumbxres => 80, thumbyres => 64, - xres => undef, - yres => undef, + xres => -1, + yres => -1, start => 1, num => -1, all => 1, @@ -45,6 +45,11 @@ sub handler { fullscreen => 0, ); + # Any NEF files => default to processing + my $ref = $dbh->selectrow_hashref('SELECT * FROM images WHERE event=? AND LOWER(filename) LIKE \'%.nef\' LIMIT 1', + undef, $event) + and $defsettings{'xres'} = $defsettings{'yres'} = undef; + # Reduce the front page load when in overload mode. if (Sesse::pr0n::Overload::is_in_overload($r)) { $defsettings{'num'} = 100; -- 2.39.2 From 38fd1954ea4ae45f54f8ab2bbe869fc953320021 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 2 Jan 2007 21:08:14 +0100 Subject: [PATCH 07/16] Fix a warning. --- perl/Sesse/pr0n/Index.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl/Sesse/pr0n/Index.pm b/perl/Sesse/pr0n/Index.pm index e85ab6e..de0e3bf 100644 --- a/perl/Sesse/pr0n/Index.pm +++ b/perl/Sesse/pr0n/Index.pm @@ -82,7 +82,7 @@ sub handler { $num = undef; } - my $ref = $dbh->selectrow_hashref('SELECT name,date,EXTRACT(EPOCH FROM last_update) AS last_update FROM events WHERE id=? AND vhost=?', + $ref = $dbh->selectrow_hashref('SELECT name,date,EXTRACT(EPOCH FROM last_update) AS last_update FROM events WHERE id=? AND vhost=?', undef, $event, $r->get_server_name) or error($r, "Could not find event $event", 404, "File not found"); -- 2.39.2 From df65583c7e3ee71e48e8ac3d822a3c1b2d2426cc Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 2 Jan 2007 21:31:06 +0100 Subject: [PATCH 08/16] Add a webmaster link to bilder.knatten.com. --- templates/bilder.knatten.com/footer | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/bilder.knatten.com/footer b/templates/bilder.knatten.com/footer index 533b320..6ab5f80 100644 --- a/templates/bilder.knatten.com/footer +++ b/templates/bilder.knatten.com/footer @@ -1,7 +1,8 @@
+ Alle bilder er opphavsrettslig beskyttet og tilhører personen som tok det. + Spørsmål? Kontakt webmaster@svurr.com!

-- 2.39.2 From 9e55351cd6b7618026477ab7d0d674af6cc8322a Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 2 Jan 2007 21:31:49 +0100 Subject: [PATCH 09/16] Allow file uploads via POST (from Windows XP's file uploading wizard; the client code will come soon). --- perl/Sesse/pr0n/Common.pm | 1 + perl/Sesse/pr0n/WebDAV.pm | 112 +++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 1 deletion(-) diff --git a/perl/Sesse/pr0n/Common.pm b/perl/Sesse/pr0n/Common.pm index 95c7363..2079d6a 100644 --- a/perl/Sesse/pr0n/Common.pm +++ b/perl/Sesse/pr0n/Common.pm @@ -12,6 +12,7 @@ use Apache2::Log; use ModPerl::Util; use Carp; +use Encode; use DBI; use DBD::Pg; use Image::Magick; diff --git a/perl/Sesse/pr0n/WebDAV.pm b/perl/Sesse/pr0n/WebDAV.pm index aecd9fd..6d116d0 100644 --- a/perl/Sesse/pr0n/WebDAV.pm +++ b/perl/Sesse/pr0n/WebDAV.pm @@ -5,6 +5,8 @@ use warnings; use Sesse::pr0n::Common qw(error dberror); use Digest::SHA1; use MIME::Base64; +use Apache2::Request; +use Apache2::Upload; sub handler { my $r = shift; @@ -522,7 +524,115 @@ EOF return Apache2::Const::OK; } + + # Used by the XP publishing wizard -- largely the same as the code above + # but vastly simplified. Should we refactor? + if ($r->method eq "POST") { + my $apr = Apache2::Request->new($r); + my $client_size = $apr->param('size'); + my $event = $apr->param('event'); + + my $file = $apr->upload('image'); + my $filename = $file->filename(); + if ($client_size != $file->size()) { + $r->content_type('text/plain; charset="utf-8"'); + $r->status(403); + $r->print("Client-size resizing detected; refusing automatically"); + + $r->log->info("Client-size resized upload of $event/$filename detected"); + return Apache2::Const::OK; + } + + # Ugh, Windows XP seems to be sending this in... something that's not UTF-8, at least + my $takenby_given; + eval { + $takenby_given = Encode::decode("utf-8", $apr->param('takenby'), Encode::FB_CROAK); + }; + if ($@) { + $takenby_given = Encode::decode("iso8859-1", $apr->param('takenby')); + } + + if (defined($takenby_given) && $takenby_given !~ /^\s*$/ && $takenby_given !~ /[<>&]/ && length($takenby_given) <= 100) { + $takenby = $takenby_given; + } + + # Remove evil characters + if ($filename =~ /[^a-zA-Z0-9._-]/) { + $filename =~ tr/a-zA-Z0-9.-/_/c; + } + + # Get the new ID + my $ref = $dbh->selectrow_hashref("SELECT NEXTVAL('imageid_seq') AS id;"); + my $newid = $ref->{'id'}; + if (!defined($newid)) { + dberror($r, "Couldn't get new ID"); + } + + # Autorename if we need to + { + my $ref = $dbh->selectrow_hashref("SELECT COUNT(*) AS numfiles FROM images WHERE event=? AND filename=?", + undef, $event, $filename) + or dberror($r, "Couldn't check for existing files"); + if ($ref->{'numfiles'} > 0) { + $r->log->info("Renaming $filename to $newid.jpeg"); + $filename = "$newid.jpeg"; + } + } + + { + # Enable transactions and error raising temporarily + local $dbh->{AutoCommit} = 0; + local $dbh->{RaiseError} = 1; + my $fname; + # Try to insert this new file + eval { + $dbh->do('INSERT INTO images (id,event,uploadedby,takenby,filename) VALUES (?,?,?,?,?);', + undef, $newid, $event, $user, $takenby, $filename); + $dbh->do('UPDATE events SET last_update=CURRENT_TIMESTAMP WHERE id=?', + undef, $event); + + # Now save the file to disk + $fname = Sesse::pr0n::Common::get_disk_location($r, $newid); + open NEWFILE, ">$fname" + or die "$fname: $!"; + + my $buf; + $file->slurp($buf); + print NEWFILE $buf or die "write($fname): $!"; + close NEWFILE or die "close($fname): $!"; + + # Orient stuff correctly + system("/usr/bin/exifautotran", $fname) == 0 + or die "/usr/bin/exifautotran: $!"; + + # Make cache while we're at it. + Sesse::pr0n::Common::ensure_cached($r, $filename, $newid, -1, -1, 1, 80, 64, 320, 256, -1, -1); + + # OK, we got this far, commit + $dbh->commit; + + $r->log->notice("Successfully wrote $event/$filename to $fname"); + }; + if ($@) { + # Some error occurred, rollback and bomb out + $dbh->rollback; + error($r, "Transaction aborted because $@"); + unlink($fname); + + $r->content_type('text/plain; charset="utf-8"'); + $r->status(500); + $r->print("Error: $@"); + } + } + + $r->content_type('text/plain; charset="utf-8"'); + $r->status(201); + $r->print("OK"); + + return Apache2::Const::OK; + } + # Yes, we fake locks. :-) if ($r->method eq "LOCK") { if ($r->uri !~ m#^/webdav/upload/([a-zA-Z0-9-]+)/(autorename/)?([a-zA-Z0-9._-]+)$#) { @@ -601,7 +711,7 @@ EOF $r->print("Sorry, you do not have access to that feature."); return Apache2::Const::OK; } - + $r->content_type('text/plain; charset=utf-8'); $r->log->error("unknown method " . $r->method); $r->status(500); -- 2.39.2 From 437c5df6373cbf14cdaaa927655abe06f78b6d27 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 2 Jan 2007 23:15:14 +0100 Subject: [PATCH 10/16] Add the client code for the WinXP wizard. --- files/pr0n.ico | Bin 0 -> 4286 bytes files/wizard.css | 24 +++ files/wizard.js | 163 ++++++++++++++++++ perl/Sesse/pr0n/Registry.pm | 31 ++++ perl/Sesse/pr0n/Wizard.pm | 45 +++++ perl/Sesse/pr0n/pr0n.pm | 9 + .../bilder.knatten.com/wizard-description | 1 + templates/default/wizard-description | 1 + templates/default/wizard-footer | 54 ++++++ templates/default/wizard-header | 22 +++ 10 files changed, 350 insertions(+) create mode 100644 files/pr0n.ico create mode 100644 files/wizard.css create mode 100644 files/wizard.js create mode 100644 perl/Sesse/pr0n/Registry.pm create mode 100644 perl/Sesse/pr0n/Wizard.pm create mode 100644 templates/bilder.knatten.com/wizard-description create mode 100644 templates/default/wizard-description create mode 100644 templates/default/wizard-footer create mode 100644 templates/default/wizard-header diff --git a/files/pr0n.ico b/files/pr0n.ico new file mode 100644 index 0000000000000000000000000000000000000000..e45b5788c5c59627c47212412157bda69795568c GIT binary patch literal 4286 zcmZQzU<5)11qKkwutI==L5zWcK?8_^LJST-3=+o${{R2aFp9BLxgXa4{9=a&m5;q)Gl|8eC@ zWbu2sg8x6CUPX3XQEETPEg(1icyNX+H&DZVkQ<)%f}#O?9g9z#TK0q7Ku%hqrv2Zp z?j|`5KzfkV6EYiDxFM@SW{=uGyuu$;zM-c9kQj2DBeThge^8!5HUpUrDpy`DO#A<4 zO*yz62C+e6$ZC+;D4X>9lgKawD*ONcA2SJ&]/) || date.length > 100) { + valid = false; + } + if (desc.match(/^\s*$/) || desc.match(/[<>&]/) || desc.length > 100) { + valid = false; + } + } + + // enable/disable the "existing event" form + form.existingevent.disabled = disable_existingevent; + + var extexts = getElementsByClass(document, 'existingeventtext', '*'); + for (i = 0; i < extexts.length; ++i) { + extexts[i].style.color = disable_existingevent ? 'gray' : ''; + } + + // enable/disable the "new event" form + form.neweventid.disabled = disable_newevent; + form.neweventdate.disabled = disable_newevent; + form.neweventdesc.disabled = disable_newevent; + + var netexts = getElementsByClass(document, 'neweventtext', '*'); + for (i = 0; i < netexts.length; ++i) { + netexts[i].style.color = disable_newevent ? 'gray' : ''; + } + + // and finally, the "who" form + var disable_who; + if (form.me.checked) { + disable_who = true; + } else { + disable_who = false; + + var who = form.other.value; + if (who.match(/^\s*$/) || who.match(/[<>&]/) || who.length > 100) { + valid = false; + } + } + + form.other.disabled = disable_who; + + var whotexts = getElementsByClass(document, 'whotext', '*'); + for (i = 0; i < whotexts.length; ++i) { + whotexts[i].style.color = disable_who ? 'gray' : ''; + } + + + window.external.SetWizardButtons(true, valid, false); +} + +function getElementsByClass(node,searchClass,tag) { + var classElements = new Array(); + var els = node.getElementsByTagName(tag); + var elsLen = els.length; + for (i = 0, j = 0; i < elsLen; i++) { + if (els[i].className == searchClass) { + classElements[j] = els[i]; + j++; + } + } + return classElements; +} + +somethingchanged(); diff --git a/perl/Sesse/pr0n/Registry.pm b/perl/Sesse/pr0n/Registry.pm new file mode 100644 index 0000000..14b5b14 --- /dev/null +++ b/perl/Sesse/pr0n/Registry.pm @@ -0,0 +1,31 @@ +# Not related to Apache2::Registry; generates a .reg file for Windows XP to import. + +package Sesse::pr0n::Registry; +use strict; +use warnings; + +use Sesse::pr0n::Common qw(error dberror); +use Apache2::Request; + +sub handler { + my $r = shift; + my $dbh = Sesse::pr0n::Common::get_dbh(); + my $vhost = $r->get_server_name; + chomp (my $desc = Sesse::pr0n::Templates::fetch_template($r, 'wizard-description')); + + $r->content_type("application/octet-stream"); + $r->headers_out->add('Content-disposition' => 'attachment; filename="' . $vhost . '.reg"'); + + $r->print("Windows Registry Editor Version 5.00\r\n\r\n"); + $r->print("[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Currentversion\\Explorer\\PublishingWizard\\PublishingWizard\\Providers\\$vhost]\r\n"); + $r->print("\"Icon\"=\"http://$vhost/pr0n.ico\"\r\n"); + $r->print("\"DisplayName\"=\"$vhost\"\r\n"); + $r->print("\"Description\"=\"$desc\"\r\n"); + $r->print("\"HREF\"=\"http://$vhost/wizard\"\r\n"); + + return Apache2::Const::OK; +} + +1; + + diff --git a/perl/Sesse/pr0n/Wizard.pm b/perl/Sesse/pr0n/Wizard.pm new file mode 100644 index 0000000..929b7db --- /dev/null +++ b/perl/Sesse/pr0n/Wizard.pm @@ -0,0 +1,45 @@ +package Sesse::pr0n::Wizard; +use strict; +use warnings; + +use Sesse::pr0n::Common qw(error dberror); +use Apache2::Request; + +sub handler { + my $r = shift; + my $apr = Apache2::Request->new($r); + my $dbh = Sesse::pr0n::Common::get_dbh(); + + # Internal? (Ugly?) + if ($r->get_server_name =~ /internal/ || $r->get_server_name =~ /skoyen\.bilder\.knatten\.com/) { + my $user = Sesse::pr0n::Common::check_access($r); + if (!defined($user)) { + return Apache2::Const::OK; + } + } + + # Find events + my $q = $dbh->prepare('SELECT id,date,name FROM events e JOIN last_picture_cache c ON e.id=c.event WHERE vhost=? ORDER BY last_picture DESC') + or dberror($r, "Couldn't list events"); + $q->execute($r->get_server_name) + or dberror($r, "Couldn't get events"); + + $r->content_type('text/html; charset=utf-8'); + $r->print(Sesse::pr0n::Templates::fetch_template($r, 'wizard-header')); + + while (my $ref = $q->fetchrow_hashref()) { + my $id = $ref->{'id'}; + my $date = $ref->{'date'}; + my $name = $ref->{'name'}; + + $r->print(" \n"); + } + + $r->print(Sesse::pr0n::Templates::fetch_template($r, 'wizard-footer')); + + return Apache2::Const::OK; +} + +1; + + diff --git a/perl/Sesse/pr0n/pr0n.pm b/perl/Sesse/pr0n/pr0n.pm index 0175c95..55e64de 100644 --- a/perl/Sesse/pr0n/pr0n.pm +++ b/perl/Sesse/pr0n/pr0n.pm @@ -6,6 +6,8 @@ use Sesse::pr0n::Rotate; use Sesse::pr0n::Select; use Sesse::pr0n::WebDAV; use Sesse::pr0n::NewEvent; +use Sesse::pr0n::Registry; +use Sesse::pr0n::Wizard; package Sesse::pr0n::pr0n; use strict; @@ -27,6 +29,9 @@ sub handler { $uri eq '/previous.png' || $uri eq '/next.png' || $uri eq '/close.png' || + $uri eq '/wizard.js' || + $uri eq '/wizard.css' || + $uri eq '/pr0n.ico' || $uri =~ m#^/usage/([a-zA-Z0-9_.]+)$#) { $uri =~ s#^/##; my $fname = Sesse::pr0n::Common::get_base($r) . 'files/' . $uri; @@ -58,6 +63,10 @@ sub handler { return Sesse::pr0n::Select::handler($r); } elsif ($uri =~ m#^/newevent$#) { return Sesse::pr0n::NewEvent::handler($r); + } elsif ($uri =~ m#^/registry$#) { + return Sesse::pr0n::Registry::handler($r); + } elsif ($uri =~ m#^/wizard$#) { + return Sesse::pr0n::Wizard::handler($r); } elsif ($uri =~ m#^/[a-zA-Z0-9-]+/?$#) { return Sesse::pr0n::Index::handler($r); } elsif ($uri =~ m#^/[a-zA-Z0-9-]+/(\d+x\d+/|original/)?(nobox/)?[a-zA-Z0-9._-]+$#) { diff --git a/templates/bilder.knatten.com/wizard-description b/templates/bilder.knatten.com/wizard-description new file mode 100644 index 0000000..b9e4980 --- /dev/null +++ b/templates/bilder.knatten.com/wizard-description @@ -0,0 +1 @@ +Bilder fra SVURR-arrangementer diff --git a/templates/default/wizard-description b/templates/default/wizard-description new file mode 100644 index 0000000..19244c0 --- /dev/null +++ b/templates/default/wizard-description @@ -0,0 +1 @@ +Personal image gallery diff --git a/templates/default/wizard-footer b/templates/default/wizard-footer new file mode 100644 index 0000000..7cb875e --- /dev/null +++ b/templates/default/wizard-footer @@ -0,0 +1,54 @@ + + + + + + + + + + + ID: +   (e.g. "revy03"; a-zA-Z0-9 and - only, no spaces) + + + + Date: +   (e.g. "27.-31. desember 2003") + + + + Description: +   (e.g. "NyttÃ¥rsrevyen 2003") + + + +

Who took these images?

+ + + + + + + + + + + + + + + + + +
Who:
+ +

After pressing Next, be sure to turn OFF image + resizing; otherwise, you will get an error.

+ + + + + + + diff --git a/templates/default/wizard-header b/templates/default/wizard-header new file mode 100644 index 0000000..a50cc30 --- /dev/null +++ b/templates/default/wizard-header @@ -0,0 +1,22 @@ + + + XP Publish Wizard + + + +
+

What event do you want to upload to?

+ + + + + + + + + +
+ +
Select one: +