30) { $taskFiles = glob(app_task_dir() . DIRECTORY_SEPARATOR . '*.json') ?: []; sort($taskFiles, SORT_STRING); if ($taskFiles === []) { fwrite(STDOUT, "Nothing to do.\n"); break; } $taskFilename = $taskFiles[0]; $modified = filemtime($taskFilename); if ($modified !== false && $modified + $minimumTaskAge > time()) { sleep(min(5, max(1, ($modified + $minimumTaskAge) - time()))); continue; } $task = json_decode((string)file_get_contents($taskFilename), true); if (!is_array($task) || !is_array($task['requests'] ?? null) || !filter_var($task['email'] ?? '', FILTER_VALIDATE_EMAIL)) { error_log('Invalid task quarantined: ' . basename($taskFilename)); @rename($taskFilename, $taskFilename . '.invalid'); continue; } if (!preg_match('/^[a-f0-9]{32}$/', (string)($task['downloadToken'] ?? ''))) { $task['downloadToken'] = bin2hex(random_bytes(16)); // Preserve partially generated exports from the previous public-download layout. $legacyCsv = __DIR__ . DIRECTORY_SEPARATOR . 'download' . DIRECTORY_SEPARATOR . pathinfo($taskFilename, PATHINFO_FILENAME) . '.csv'; if (is_file($legacyCsv)) { @rename($legacyCsv, app_download_path($task['downloadToken'])); } if (!saveTask($taskFilename, $task)) { error_log('Could not migrate legacy task metadata.'); break; } } $csvFile = app_download_path((string)$task['downloadToken']); if ($task['requests'] !== []) { $nextOffset = doRequest($task['requests'][0], $csvFile, (string)$username, (string)$password); if ($nextOffset === null) { fwrite(STDOUT, "Temporary API error; task retained for retry.\n"); break; } if ($nextOffset !== false) { $task['requests'][0]['offset'] = $nextOffset; } else { array_shift($task['requests']); } if (!saveTask($taskFilename, $task)) { error_log('Could not save task progress.'); break; } continue; } if (!is_file($csvFile)) { $emptyFile = fopen($csvFile, 'x'); if ($emptyFile !== false) { fputcsv($emptyFile, ['name', 'careOf', 'street', 'houseNumber', 'swissZipCode', 'city', 'uid', 'legalSeat', 'legalForm', 'status', 'sogcDate', 'deletionDate'], ',', '"', '\\'); fclose($emptyFile); @chmod($csvFile, 0600); } } if (sendEmail((string)$task['email'], (string)$task['downloadToken'], $smtpPassword)) { unlink($taskFilename); fwrite(STDOUT, 'Completed ' . basename($taskFilename) . ".\n"); } else { fwrite(STDOUT, "Email delivery failed; task retained for retry.\n"); break; } } } finally { flock($executorLock, LOCK_UN); fclose($executorLock); }