diff options
Diffstat (limited to 'lib/VNDB/Handler/VNEdit.pm')
-rw-r--r-- | lib/VNDB/Handler/VNEdit.pm | 119 |
1 files changed, 51 insertions, 68 deletions
diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm index b93c544d..82f7e169 100644 --- a/lib/VNDB/Handler/VNEdit.pm +++ b/lib/VNDB/Handler/VNEdit.pm @@ -3,11 +3,11 @@ package VNDB::Handler::VNEdit; use strict; use warnings; -use YAWF ':html', ':xml'; +use TUWF ':html', ':xml'; use VNDB::Func; -YAWF::register( +TUWF::register( qr{v(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit|/new)} => \&edit, qr{xml/vn\.xml} => \&vnxml, @@ -19,7 +19,7 @@ sub edit { my($self, $vid, $rev) = @_; my $v = $vid && $self->dbVNGet(id => $vid, what => 'extended screenshots relations anime changes', $rev ? (rev => $rev) : ())->[0]; - return 404 if $vid && !$v->{id}; + return $self->resNotFound if $vid && !$v->{id}; $rev = undef if !$vid || $v->{cid} == $v->{latest}; return $self->htmlDenied if !$self->authCan('edit') @@ -38,23 +38,23 @@ sub edit { if($self->reqMethod eq 'POST') { return if !$self->authCheckCode; $frm = $self->formValidate( - { name => 'title', maxlength => 250 }, - { name => 'original', required => 0, maxlength => 250, default => '' }, - { name => 'alias', required => 0, maxlength => 500, default => '' }, - { name => 'desc', required => 0, default => '', maxlength => 10240 }, - { name => 'length', required => 0, default => 0, enum => $self->{vn_lengths} }, - { name => 'l_wp', required => 0, default => '', maxlength => 150 }, - { name => 'l_encubed', required => 0, default => '', maxlength => 100 }, - { name => 'l_renai', required => 0, default => '', maxlength => 100 }, - { name => 'l_vnn', required => 0, default => $b4{l_vnn}||0, template => 'int' }, - { name => 'anime', required => 0, default => '' }, - { name => 'previmage', required => 0, default => 0, template => 'int' }, - { name => 'img_nsfw', required => 0, default => 0 }, - { name => 'vnrelations', required => 0, default => '', maxlength => 5000 }, - { name => 'screenshots', required => 0, default => '', maxlength => 1000 }, - { name => 'editsum', required => 0, maxlength => 5000 }, - { name => 'ihid', required => 0 }, - { name => 'ilock', required => 0 }, + { post => 'title', maxlength => 250 }, + { post => 'original', required => 0, maxlength => 250, default => '' }, + { post => 'alias', required => 0, maxlength => 500, default => '' }, + { post => 'desc', required => 0, default => '', maxlength => 10240 }, + { post => 'length', required => 0, default => 0, enum => $self->{vn_lengths} }, + { post => 'l_wp', required => 0, default => '', maxlength => 150 }, + { post => 'l_encubed', required => 0, default => '', maxlength => 100 }, + { post => 'l_renai', required => 0, default => '', maxlength => 100 }, + { post => 'l_vnn', required => 0, default => $b4{l_vnn}||0, template => 'int' }, + { post => 'anime', required => 0, default => '' }, + { post => 'previmage', required => 0, default => 0, template => 'int' }, + { post => 'img_nsfw', required => 0, default => 0 }, + { post => 'vnrelations', required => 0, default => '', maxlength => 5000 }, + { post => 'screenshots', required => 0, default => '', maxlength => 1000 }, + { post => 'editsum', required => 0, maxlength => 5000 }, + { post => 'ihid', required => 0 }, + { post => 'ilock', required => 0 }, ); push @{$frm->{_err}}, 'badeditsum' if !$frm->{editsum} || lc($frm->{editsum}) eq lc($frm->{desc}); @@ -86,7 +86,7 @@ sub edit { # nothing changed? just redirect return $self->resRedirect("/v$vid", 'post') - if $vid && !$self->reqUploadFileName('img') && $image == $v->{image} + if $vid && !$self->reqPost('img') && $image == $v->{image} && !grep $frm->{$_} ne $b4{$_}, keys %b4; # perform the edit/add @@ -123,31 +123,19 @@ sub edit { sub _uploadimage { my($self, $v, $frm) = @_; - return $v ? $frm->{previmage} : 0 if $frm->{_err} || !$self->reqUploadFileName('img'); + return $v ? $frm->{previmage} : 0 if $frm->{_err} || !$self->reqPost('img'); - # save to temporary location - my $tmp = sprintf '%s/static/cv/00/tmp.%d.jpg', $VNDB::ROOT, $$*int(rand(1000)+1); - $self->reqSaveUpload('img', $tmp); + # perform some elementary checks + my $imgdata = $self->reqUploadRaw('img'); + $frm->{_err} = [ 'noimage' ] if $imgdata !~ /^(\xff\xd8|\x89\x50)/; # JPG or PNG headers + $frm->{_err} = [ 'toolarge' ] if length($imgdata) > 512*1024; + return undef if $frm->{_err}; - # perform some checks - my $l; - open(my $T, '<:raw:bytes', $tmp) || die $1; - read $T, $l, 2; - close($T); - - $frm->{_err} = [ 'noimage' ] if $l ne pack('H*', 'ffd8') && $l ne pack('H*', '8950'); - $frm->{_err} = [ 'toolarge' ] if -s $tmp > 512*1024; - - if($frm->{_err}) { - unlink $tmp; - return undef; - } - - # get image ID and move it to the correct location + # get image ID and save it, to be processed by Multi my $imgid = $self->dbVNImageId; - my $new = sprintf '%s/static/cv/%02d/%d.jpg', $VNDB::ROOT, $imgid%100, $imgid; - rename $tmp, $new or die $!; - chmod 0666, $new; + my $fn = sprintf '%s/static/cv/%02d/%d.jpg', $VNDB::ROOT, $imgid%100, $imgid; + $self->reqSaveUpload('img', $fn); + chmod 0666, $fn; return -1*$imgid; } @@ -187,14 +175,15 @@ sub _form { h2 mt '_vnedit_image_upload'; input type => 'file', class => 'text', name => 'img', id => 'img'; - p mt('_vnedit_image_upload_msg')."\n\n\n"; + p mt('_vnedit_image_upload_msg'); + br; br; br; h2 mt '_vnedit_image_nsfw'; input type => 'checkbox', class => 'checkbox', id => 'img_nsfw', name => 'img_nsfw', $frm->{img_nsfw} ? (checked => 'checked') : (); label class => 'checkbox', for => 'img_nsfw', mt '_vnedit_image_nsfw_check'; p mt '_vnedit_image_nsfw_msg'; - end; + end 'div'; }], ], @@ -229,7 +218,7 @@ sub _form { a href => '#', mt '_vnedit_rel_addbut'; end; end; - end; + end 'table'; }], ], @@ -292,8 +281,8 @@ sub _updreverse { sub vnxml { my $self = shift; - my $q = $self->formValidate({ name => 'q', maxlength => 500 }); - return 404 if $q->{_err}; + my $q = $self->formValidate({ get => 'q', maxlength => 500 }); + return $self->resNotFound if $q->{_err}; $q = $q->{q}; my($list, $np) = $self->dbVNGet( @@ -321,9 +310,9 @@ sub scrxml { # fetch information about screenshots if($self->reqMethod ne 'POST') { my $ids = $self->formValidate( - { name => 'id', required => 1, template => 'int', multi => 1 } + { get => 'id', required => 1, template => 'int', multi => 1 } ); - return 404 if $ids->{_err}; + return $self->resNotFound if $ids->{_err}; my $r = $self->dbScreenshotGet($ids->{id}); xml; @@ -334,28 +323,22 @@ sub scrxml { } # upload new screenshot - my $num = $self->formValidate({name => 'upload', template => 'int'}); - return 404 if $num->{_err}; - my $tmp = sprintf '%s/static/sf/00/tmp.%d.jpg', $VNDB::ROOT, $$*int(rand(1000)+1); - $self->reqSaveUpload("scr_upl_file_$num->{upload}", $tmp); + my $num = $self->formValidate({get => 'upload', template => 'int'}); + return $self->resNotFound if $num->{_err}; + my $param = "scr_upl_file_$num->{upload}"; + # check for simple errors my $id = 0; - $id = -2 if !-s $tmp; - if(!$id) { - my $l; - open(my $T, '<:raw:bytes', $tmp) || die $1; - read $T, $l, 2; - close($T); - $id = -1 if $l ne pack('H*', 'ffd8') && $l ne pack('H*', '8950'); - } + my $imgdata = $self->reqUploadRaw($param); + $id = -2 if !$imgdata; + $id = -1 if !$id && $imgdata !~ /^(\xff\xd8|\x89\x50)/; # JPG or PNG headers - if($id) { - unlink $tmp; - } else { + # no error? save and let Multi process it + if(!$id) { $id = $self->dbScreenshotAdd; - my $new = sprintf '%s/static/sf/%02d/%d.jpg', $VNDB::ROOT, $id%100, $id; - rename $tmp, $new or die $!; - chmod 0666, $new; + my $fn = sprintf '%s/static/sf/%02d/%d.jpg', $VNDB::ROOT, $id%100, $id; + $self->reqSaveUpload($param, $fn); + chmod 0666, $fn; } xml; |