Skip to content

Commit 06c9ff3

Browse files
authored
Merge pull request #7390 from LibreSign/backport/7389/stable32
[stable32] fix: extract file descriptor when items have nested 'file' key (#7343)
2 parents d671ce7 + 9be680d commit 06c9ff3

2 files changed

Lines changed: 65 additions & 1 deletion

File tree

lib/Service/RequestSignatureService.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ private function processFileData(array $fileData, ?IUser $userManager, array $se
220220
$sourceNode = $this->fileService->getNodeFromData([
221221
'userManager' => $userManager,
222222
'name' => $name,
223-
'file' => $fileData,
223+
'file' => $fileData['file'] ?? $fileData,
224224
'settings' => $settings,
225225
]);
226226
}

tests/php/Unit/Service/RequestSignatureServiceTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
use OCA\Libresign\Service\SignRequest\StatusService;
3838
use OCA\Libresign\Service\SignRequest\StatusUpdatePolicy;
3939
use OCP\EventDispatcher\IEventDispatcher;
40+
use OCP\Files\Folder;
4041
use OCP\Files\IMimeTypeDetector;
4142
use OCP\Http\Client\IClient;
4243
use OCP\Http\Client\IClientService;
@@ -769,4 +770,67 @@ public function testOrderedFlowRespectsSigningOrderWhenFileIsAbleToSign(): void
769770
'Second signer in ordered flow should remain DRAFT until first signs'
770771
);
771772
}
773+
774+
/**
775+
* Regression test for issue #7343.
776+
*
777+
* processFileData() must extract the inner `file` descriptor
778+
* and pass it to FileService::getNodeFromData(), not the whole
779+
* item (which would create a double-nested `file.file.path`
780+
* and trigger "No file source provided").
781+
*/
782+
public function testSaveEnvelopeExtractsFileDescriptorFromNestedFilesArrayItems(): void {
783+
$service = $this->getService(['saveFile']);
784+
785+
$envelope = new \OCA\Libresign\Db\File();
786+
$envelope->setId(10);
787+
788+
$folder = $this->createMock(Folder::class);
789+
$folder->method('getId')->willReturn(99);
790+
791+
$nodeA = $this->createMock(\OCP\Files\Node::class);
792+
$nodeB = $this->createMock(\OCP\Files\Node::class);
793+
794+
$childA = new \OCA\Libresign\Db\File();
795+
$childA->setId(11);
796+
$childB = new \OCA\Libresign\Db\File();
797+
$childB->setId(12);
798+
799+
$this->user->method('getUID')->willReturn('testuser');
800+
$this->envelopeService->method('validateEnvelopeConstraints');
801+
$this->envelopeService->method('createEnvelope')->willReturn($envelope);
802+
$this->envelopeService->method('getEnvelopeFolder')->willReturn($folder);
803+
$this->envelopeService->method('addFileToEnvelope')->willReturn(new \OCA\Libresign\Db\File());
804+
805+
// KEY assertion: getNodeFromData must receive the inner file descriptor,
806+
// not the doubled-nested wrapper { file: { path }, name }.
807+
$this->fileService->expects($this->exactly(2))
808+
->method('getNodeFromData')
809+
->with($this->callback(function (array $data): bool {
810+
return isset($data['file']['path']) && !isset($data['file']['file']);
811+
}))
812+
->willReturnOnConsecutiveCalls($nodeA, $nodeB);
813+
814+
$this->envelopeFileRelocator->method('ensureFileInEnvelopeFolder')
815+
->willReturnOnConsecutiveCalls($nodeA, $nodeB);
816+
817+
$service->method('saveFile')->willReturnOnConsecutiveCalls($childA, $childB);
818+
819+
$result = $service->saveEnvelope([
820+
'files' => [
821+
['file' => ['path' => '/A/file1.pdf'], 'name' => 'file1'],
822+
['file' => ['path' => '/B/file2.pdf'], 'name' => 'file2'],
823+
],
824+
'name' => 'My Envelope',
825+
'userManager' => $this->user,
826+
'settings' => [],
827+
'signers' => [],
828+
'status' => \OCA\Libresign\Enum\FileStatus::DRAFT->value,
829+
'visibleElements' => [],
830+
'signatureFlow' => null,
831+
]);
832+
833+
$this->assertSame($envelope, $result['envelope']);
834+
$this->assertCount(2, $result['files']);
835+
}
772836
}

0 commit comments

Comments
 (0)