Revision 6e56204d
Von Jan Büren vor mehr als 13 Jahren hinzugefügt
SL/Common.pm | ||
---|---|---|
13 | 13 |
|
14 | 14 |
use Time::HiRes qw(gettimeofday); |
15 | 15 |
use Data::Dumper; |
16 |
use File::Copy; |
|
17 | 16 |
|
18 | 17 |
use SL::DBUtils; |
19 | 18 |
|
... | ... | |
331 | 330 |
$main::lxdebug->leave_sub(); |
332 | 331 |
} |
333 | 332 |
|
334 |
# |
|
335 |
# Legt ein entsprechendes Webdav-Verzeichnis an, falls |
|
336 |
# Webdav als Option konfiguriert ist |
|
337 |
# |
|
338 | 333 |
sub webdav_folder { |
339 | 334 |
$main::lxdebug->enter_sub(); |
340 | 335 |
|
... | ... | |
343 | 338 |
return $main::lxdebug->leave_sub() |
344 | 339 |
unless ($::lx_office_conf{features}->{webdav} && $form->{id}); |
345 | 340 |
|
346 |
my $path = get_webdav_folder($form); # ausgelagert, wg. D.R.Y.
|
|
341 |
my ($path, $number);
|
|
347 | 342 |
|
348 | 343 |
$form->{WEBDAV} = []; |
349 | 344 |
|
350 |
return $main::lxdebug->leave_sub() unless ($path); |
|
345 |
if ($form->{type} eq "sales_quotation") { |
|
346 |
($path, $number) = ("angebote", $form->{quonumber}); |
|
347 |
} elsif ($form->{type} eq "sales_order") { |
|
348 |
($path, $number) = ("bestellungen", $form->{ordnumber}); |
|
349 |
} elsif ($form->{type} eq "request_quotation") { |
|
350 |
($path, $number) = ("anfragen", $form->{quonumber}); |
|
351 |
} elsif ($form->{type} eq "purchase_order") { |
|
352 |
($path, $number) = ("lieferantenbestellungen", $form->{ordnumber}); |
|
353 |
} elsif ($form->{type} eq "sales_delivery_order") { |
|
354 |
($path, $number) = ("verkaufslieferscheine", $form->{donumber}); |
|
355 |
} elsif ($form->{type} eq "purchase_delivery_order") { |
|
356 |
($path, $number) = ("einkaufslieferscheine", $form->{donumber}); |
|
357 |
} elsif ($form->{type} eq "credit_note") { |
|
358 |
($path, $number) = ("gutschriften", $form->{invnumber}); |
|
359 |
} elsif ($form->{vc} eq "customer") { |
|
360 |
($path, $number) = ("rechnungen", $form->{invnumber}); |
|
361 |
} else { |
|
362 |
($path, $number) = ("einkaufsrechnungen", $form->{invnumber}); |
|
363 |
} |
|
364 |
|
|
365 |
return $main::lxdebug->leave_sub() unless ($path && $number); |
|
366 |
|
|
367 |
$number =~ s|[/\\]|_|g; |
|
368 |
|
|
369 |
$path = "webdav/${path}/${number}"; |
|
351 | 370 |
|
352 | 371 |
if (!-d $path) { |
353 | 372 |
mkdir_with_parents($path); |
... | ... | |
554 | 573 |
} |
555 | 574 |
} |
556 | 575 |
|
557 |
# |
|
558 |
# Diese Routine baut aus dem Masken-Typ und der |
|
559 |
# Beleg-Nummer, das entsprechende Webdav-Verzeichnis zusammen |
|
560 |
# Nimmt leider noch die ganze Form entgegen und den if-elsif-Block |
|
561 |
# sollte man schöner "dispatchen" |
|
562 |
# Ergänzung 6.5.2011, den else-Zweig defensiver gestaltet und mit |
|
563 |
# -1 als n.i.O. Rückgabewert versehen |
|
564 |
# |
|
565 |
sub get_webdav_folder { |
|
566 |
$main::lxdebug->enter_sub(); |
|
567 |
|
|
568 |
my ($form) = @_; |
|
569 |
|
|
570 |
# TODO Ergänzung um check_params |
|
571 |
|
|
572 |
my ($path, $number); |
|
573 |
|
|
574 |
|
|
575 |
if ($form->{type} eq "sales_quotation") { |
|
576 |
($path, $number) = ("angebote", $form->{quonumber}); |
|
577 |
} elsif ($form->{type} eq "sales_order") { |
|
578 |
($path, $number) = ("bestellungen", $form->{ordnumber}); |
|
579 |
} elsif ($form->{type} eq "request_quotation") { |
|
580 |
($path, $number) = ("anfragen", $form->{quonumber}); |
|
581 |
} elsif ($form->{type} eq "purchase_order") { |
|
582 |
($path, $number) = ("lieferantenbestellungen", $form->{ordnumber}); |
|
583 |
} elsif ($form->{type} eq "sales_delivery_order") { |
|
584 |
($path, $number) = ("verkaufslieferscheine", $form->{donumber}); |
|
585 |
} elsif ($form->{type} eq "purchase_delivery_order") { |
|
586 |
($path, $number) = ("einkaufslieferscheine", $form->{donumber}); |
|
587 |
} elsif ($form->{type} eq "credit_note") { |
|
588 |
($path, $number) = ("gutschriften", $form->{invnumber}); |
|
589 |
} elsif ($form->{vc} eq "customer") { |
|
590 |
($path, $number) = ("rechnungen", $form->{invnumber}); |
|
591 |
} elsif ($form->{vc} eq "vendor") { |
|
592 |
($path, $number) = ("einkaufsrechnungen", $form->{invnumber}); |
|
593 |
} else { |
|
594 |
# wir befinden uns nicht in einer belegmaske |
|
595 |
# scheinbar wird diese routine auch bspw. bei waren |
|
596 |
# aufgerufen - naja, steuerung über Form.pm halt ... |
|
597 |
$main::lxdebug->leave_sub(); |
|
598 |
return undef; |
|
599 |
} |
|
600 |
|
|
601 |
return $main::lxdebug->leave_sub() unless ($path && $number); |
|
602 |
|
|
603 |
$number =~ s|[/\\]|_|g; |
|
604 |
|
|
605 |
$path = "webdav/${path}/${number}"; |
|
606 |
|
|
607 |
$main::lxdebug->leave_sub(); |
|
608 |
|
|
609 |
return $path; |
|
610 |
|
|
611 |
} |
|
612 |
|
|
613 |
# |
|
614 |
# Falls Webdav aktiviert ist, auch den generierten Beleg in das |
|
615 |
# Webdav-Verzeichnis kopieren |
|
616 |
# |
|
617 |
# |
|
618 |
sub copy_file_to_webdav_folder { |
|
619 |
$main::lxdebug->enter_sub(); |
|
620 |
|
|
621 |
my ($form) = @_; |
|
622 |
# leider die ganze form |
|
623 |
# da get_webdav_folder die auch noch benötigt |
|
624 |
# aber hier ein paar checks: |
|
625 |
# OFFEN: check_params kann ich ja nicht eine |
|
626 |
# abgespeckte $form übergeben, oder? |
|
627 |
$form->{type} = ''; |
|
628 |
foreach my $item (qw(tmpdir tmpfile type)){ |
|
629 |
if (!$form->{$item}){ # wahr, bei undef oder '' |
|
630 |
$main::lxdebug->message(0, 'Missing parameter'); |
|
631 |
$main::form->error($main::locale->text("Missing parameter for webdav file copy")); |
|
632 |
} |
|
633 |
} |
|
634 |
|
|
635 |
# Den Webdav-Ordner ÜBER exakt denselben Mechanismus wie beim |
|
636 |
# Anlegen bestimmen |
|
637 |
# leider ist das auch das Kriterium, ob überhaupt ein "Anlegen" |
|
638 |
# erlaubt ist |
|
639 |
my $webdav_folder = get_webdav_folder($form); |
|
640 |
|
|
641 |
# hier auch nochmal prüfen |
|
642 |
if (! $webdav_folder){ |
|
643 |
$main::lxdebug->leave_sub(); |
|
644 |
return undef; # s.o. erstmal so ... |
|
645 |
$main::form->error($main::locale->text("Cannot check correct webdav folder")); |
|
646 |
} |
|
647 |
|
|
648 |
if(!copy(join('/', $form->{tmpdir}, $form->{tmpfile}), join('/', $form->{cwd}, $webdav_folder))){ |
|
649 |
my $j = join('/', $form->{tmpdir}, $form->{tmpfile}); |
|
650 |
my $k = join('/', $form->{cwd}, $webdav_folder); |
|
651 |
$main::lxdebug->message(0, "Copy file from $j to $k failed"); |
|
652 |
$main::form->error($main::locale->text("Copy file from #1 to #2 failed", $j, $k)); |
|
653 |
} |
|
654 |
|
|
655 |
$main::lxdebug->leave_sub(); |
|
656 |
} |
|
657 |
|
|
658 | 576 |
1; |
Auch abrufbar als: Unified diff
Revert "Webdav-Komponente: Das Erstellen des Verzeichnisses ausgelagert. Ferner den Beleg auch in das Webdav-Verzeichnis kopieren."
This reverts commit 4cb3ecfd6f144901ed89dae7acafdf1c124c53f4.
Svens Anmerkungen:
Ich denke anders, wie immer.
- schonwieder deutsche Kommentare grrr
- return $main::lxdebug->leave_sub() unless ($path); <- solche kontrukte liefern 1
zurück (ich hab das irgendwann mal auf definiert 1 gesetzt nachdem vorher alles
mögliche bei rauskommen konnte). Wenn dann benutz lieber sowas:
$::lxdebug->leave_sub && return unless $path;
- copy_file_to_webdav_folder setzt $form->{type} auf '' und stirbt anschliessend
auf die Bedingung !$form->{type}. Das soll wahrscheinlich nicht so sein oder?
- Nicht jede print Operation hat tmpfiles. Im schlimmsten Fall hast Du damit n
directory traversal eingebaut, das musst Du unbedingt dreifach prüfen und nicht
einfach aus form holen. Sonst schreibt einer einfach tmpdir=/etc&&tmpfile=passwd
in die URL.
Und zu Deinem ursprünglichen Problem: Ich vermute das liegt an der Positionierung
in parse_template. Die Funktion ist ziemlich destruktiv geschrieben, die macht
halt form kaputt um was druckbares zu produzieren. Lass Dir mal form dunpen, ich
vermute dass da schon irgendwas kaputt ist. Die Fehlermeldung funktioniert in der
Konsole einwandfrei.