Skip to content

Commit 1d12d88

Browse files
authored
Merge pull request #6233 from LibreSign/backport/6231/stable32
[stable32] feat: signing order visual diagram
2 parents c3f6a14 + a131751 commit 1d12d88

20 files changed

Lines changed: 738 additions & 46 deletions

File tree

lib/Controller/PageController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public function index(): TemplateResponse {
9595

9696
$this->provideSignerSignatues();
9797
$this->initialState->provideInitialState('identify_methods', $this->identifyMethodService->getIdentifyMethodsSettings());
98-
$this->initialState->provideInitialState('signature_flow', $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', \OCA\Libresign\Enum\SignatureFlow::PARALLEL->value));
98+
$this->initialState->provideInitialState('signature_flow', $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', \OCA\Libresign\Enum\SignatureFlow::NONE->value));
9999
$this->initialState->provideInitialState('legal_information', $this->appConfig->getValueString(Application::APP_ID, 'legal_information'));
100100

101101
Util::addScript(Application::APP_ID, 'libresign-main');

lib/Controller/RequestSignatureController.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ public function request(
136136
* @param LibresignVisibleElement[]|null $visibleElements Visible elements on document
137137
* @param LibresignNewFile|array<empty>|null $file File object.
138138
* @param integer|null $status Numeric code of status * 0 - no signers * 1 - signed * 2 - pending
139+
* @param string|null $signatureFlow Signature flow mode: 'parallel' or 'ordered_numeric'. If not provided, uses global configuration
139140
* @return DataResponse<Http::STATUS_OK, array{message: string, data: LibresignValidateFile}, array{}>|DataResponse<Http::STATUS_UNPROCESSABLE_ENTITY, array{message?: string, action?: integer, errors?: list<array{message: string, title?: string}>}, array{}>
140141
*
141142
* 200: OK
@@ -145,15 +146,23 @@ public function request(
145146
#[NoCSRFRequired]
146147
#[RequireManager]
147148
#[ApiRoute(verb: 'PATCH', url: '/api/{apiVersion}/request-signature', requirements: ['apiVersion' => '(v1)'])]
148-
public function updateSign(?array $users = [], ?string $uuid = null, ?array $visibleElements = null, ?array $file = [], ?int $status = null): DataResponse {
149+
public function updateSign(
150+
?array $users = [],
151+
?string $uuid = null,
152+
?array $visibleElements = null,
153+
?array $file = [],
154+
?int $status = null,
155+
?string $signatureFlow = null,
156+
): DataResponse {
149157
$user = $this->userSession->getUser();
150158
$data = [
151159
'uuid' => $uuid,
152160
'file' => $file,
153161
'users' => $users,
154162
'userManager' => $user,
155163
'status' => $status,
156-
'visibleElements' => $visibleElements
164+
'visibleElements' => $visibleElements,
165+
'signatureFlow' => $signatureFlow,
157166
];
158167
try {
159168
$this->validateHelper->validateExistingFile($data);

lib/Db/File.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class File extends Entity {
5757
protected ?string $callback = null;
5858
protected ?array $metadata = null;
5959
protected int $modificationStatus = 0;
60-
protected int $signatureFlow = SignatureFlow::NUMERIC_PARALLEL;
60+
protected int $signatureFlow = SignatureFlow::NUMERIC_NONE;
6161
protected int $docmdpLevel = 0;
6262
public const STATUS_NOT_LIBRESIGN_FILE = -1;
6363
public const STATUS_DRAFT = 0;

lib/Enum/SignatureFlow.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,25 @@
1313
* Signature flow modes
1414
*/
1515
enum SignatureFlow: string {
16+
case NONE = 'none';
1617
case PARALLEL = 'parallel';
1718
case ORDERED_NUMERIC = 'ordered_numeric';
1819

20+
public const NUMERIC_NONE = 0;
1921
public const NUMERIC_PARALLEL = 1;
2022
public const NUMERIC_ORDERED_NUMERIC = 2;
2123

2224
public function toNumeric(): int {
2325
return match($this) {
26+
self::NONE => self::NUMERIC_NONE,
2427
self::PARALLEL => self::NUMERIC_PARALLEL,
2528
self::ORDERED_NUMERIC => self::NUMERIC_ORDERED_NUMERIC,
2629
};
2730
}
2831

2932
public static function fromNumeric(int $value): self {
3033
return match($value) {
34+
self::NUMERIC_NONE => self::NONE,
3135
self::NUMERIC_PARALLEL => self::PARALLEL,
3236
self::NUMERIC_ORDERED_NUMERIC => self::ORDERED_NUMERIC,
3337
default => throw new \ValueError("Invalid numeric value for SignatureFlow: $value"),

lib/Files/TemplateLoader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public function handle(Event $event): void {
5959

6060
$this->initialState->provideInitialState(
6161
'signature_flow',
62-
$this->appConfig->getValueString(Application::APP_ID, 'signature_flow', \OCA\Libresign\Enum\SignatureFlow::PARALLEL->value)
62+
$this->appConfig->getValueString(Application::APP_ID, 'signature_flow', \OCA\Libresign\Enum\SignatureFlow::NONE->value)
6363
);
6464

6565
try {

lib/Handler/CertificateEngine/AEngineHandler.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,8 @@ private function initializePkiConfigPath(): string {
356356
}
357357
$pkiDirName = $this->caIdentifierService->generatePkiDirectoryName($caId);
358358
$dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/');
359-
$instanceId = $this->config->getSystemValue('instanceid');
360-
$pkiPath = $dataDir . '/appdata_' . $instanceId . '/libresign/' . $pkiDirName;
359+
$systemInstanceId = $this->config->getSystemValue('instanceid');
360+
$pkiPath = $dataDir . '/appdata_' . $systemInstanceId . '/libresign/' . $pkiDirName;
361361

362362
if (!is_dir($pkiPath)) {
363363
$this->createDirectoryWithCorrectOwnership($pkiPath);

lib/Migration/Version15000Date20251209000000.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
6262
if (!$tableFile->hasColumn('signature_flow')) {
6363
$tableFile->addColumn('signature_flow', Types::SMALLINT, [
6464
'notnull' => true,
65-
'default' => SignatureFlow::NUMERIC_PARALLEL,
66-
'comment' => 'Signature flow mode: 1=parallel, 2=ordered_numeric',
65+
'default' => SignatureFlow::NUMERIC_NONE,
66+
'comment' => 'Signature flow mode: 0=none (no admin enforcement), 1=parallel, 2=ordered_numeric',
6767
]);
6868
}
6969
}

lib/Service/RequestSignatureService.php

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public function save(array $data): FileEntity {
7979
public function saveFile(array $data): FileEntity {
8080
if (!empty($data['uuid'])) {
8181
$file = $this->fileMapper->getByUuid($data['uuid']);
82+
$this->updateSignatureFlowIfAllowed($file, $data);
8283
return $this->fileStatusService->updateFileStatusIfUpgrade($file, $data['status'] ?? 0);
8384
}
8485
$fileId = null;
@@ -90,6 +91,7 @@ public function saveFile(array $data): FileEntity {
9091
if (!is_null($fileId)) {
9192
try {
9293
$file = $this->fileMapper->getByFileId($fileId);
94+
$this->updateSignatureFlowIfAllowed($file, $data);
9395
return $this->fileStatusService->updateFileStatusIfUpgrade($file, $data['status'] ?? 0);
9496
} catch (\Throwable) {
9597
}
@@ -118,27 +120,45 @@ public function saveFile(array $data): FileEntity {
118120
$file->setStatus(FileEntity::STATUS_ABLE_TO_SIGN);
119121
}
120122

121-
if (isset($data['signatureFlow']) && is_string($data['signatureFlow'])) {
122-
try {
123-
$signatureFlow = \OCA\Libresign\Enum\SignatureFlow::from($data['signatureFlow']);
124-
$file->setSignatureFlowEnum($signatureFlow);
125-
} catch (\ValueError) {
126-
$this->setSignatureFlowFromGlobalConfig($file);
127-
}
128-
} else {
129-
$this->setSignatureFlowFromGlobalConfig($file);
130-
}
131-
123+
$this->setSignatureFlow($file, $data);
132124
$this->setDocMdpLevelFromGlobalConfig($file);
133125

134126
$this->fileMapper->insert($file);
135127
return $file;
136128
}
137129

138-
private function setSignatureFlowFromGlobalConfig(FileEntity $file): void {
139-
$globalFlowValue = $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', SignatureFlow::PARALLEL->value);
140-
$globalFlow = SignatureFlow::from($globalFlowValue);
141-
$file->setSignatureFlowEnum($globalFlow);
130+
private function updateSignatureFlowIfAllowed(FileEntity $file, array $data): void {
131+
$adminFlow = $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', SignatureFlow::NONE->value);
132+
$adminForcedConfig = $adminFlow !== SignatureFlow::NONE->value;
133+
134+
if ($adminForcedConfig) {
135+
$adminFlowEnum = SignatureFlow::from($adminFlow);
136+
if ($file->getSignatureFlowEnum() !== $adminFlowEnum) {
137+
$file->setSignatureFlowEnum($adminFlowEnum);
138+
$this->fileMapper->update($file);
139+
}
140+
return;
141+
}
142+
143+
if (isset($data['signatureFlow']) && !empty($data['signatureFlow'])) {
144+
$newFlow = SignatureFlow::from($data['signatureFlow']);
145+
if ($file->getSignatureFlowEnum() !== $newFlow) {
146+
$file->setSignatureFlowEnum($newFlow);
147+
$this->fileMapper->update($file);
148+
}
149+
}
150+
}
151+
152+
private function setSignatureFlow(FileEntity $file, array $data): void {
153+
$adminFlow = $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', SignatureFlow::NONE->value);
154+
155+
if (isset($data['signatureFlow']) && !empty($data['signatureFlow'])) {
156+
$file->setSignatureFlowEnum(SignatureFlow::from($data['signatureFlow']));
157+
} elseif ($adminFlow !== SignatureFlow::NONE->value) {
158+
$file->setSignatureFlowEnum(SignatureFlow::from($adminFlow));
159+
} else {
160+
$file->setSignatureFlowEnum(SignatureFlow::NONE);
161+
}
142162
}
143163

144164
private function setDocMdpLevelFromGlobalConfig(FileEntity $file): void {

lib/Settings/Admin.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public function getForm(): TemplateResponse {
7878
$this->initialState->provideInitialState('tsa_username', $this->appConfig->getValueString(Application::APP_ID, 'tsa_username', ''));
7979
$this->initialState->provideInitialState('tsa_password', $this->appConfig->getValueString(Application::APP_ID, 'tsa_password', self::PASSWORD_PLACEHOLDER));
8080
$this->initialState->provideInitialState('docmdp_config', $this->docMdpConfigService->getConfig());
81-
$this->initialState->provideInitialState('signature_flow', $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', ''));
81+
$this->initialState->provideInitialState('signature_flow', $this->appConfig->getValueString(Application::APP_ID, 'signature_flow', \OCA\Libresign\Enum\SignatureFlow::NONE->value));
8282
return new TemplateResponse(Application::APP_ID, 'admin_settings');
8383
}
8484

openapi-full.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6679,6 +6679,11 @@
66796679
"format": "int64",
66806680
"nullable": true,
66816681
"description": "Numeric code of status * 0 - no signers * 1 - signed * 2 - pending"
6682+
},
6683+
"signatureFlow": {
6684+
"type": "string",
6685+
"nullable": true,
6686+
"description": "Signature flow mode: 'parallel' or 'ordered_numeric'. If not provided, uses global configuration"
66826687
}
66836688
}
66846689
}

0 commit comments

Comments
 (0)