3), 99) === 3, 'clamp high when count is known'); $outside = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'hustoj-cw-out-' . bin2hex(random_bytes(4)); cw_assert(mkdir($outside), 'create outside dir'); $secret = $outside . DIRECTORY_SEPARATOR . 'secret.pptx'; cw_assert(copy($fixture, $secret), 'copy secret pptx outside root'); cw_assert(!courseware_inside_root(realpath($secret), realpath($tmp)), 'outside realpath is rejected'); $escape = $tmp . DIRECTORY_SEPARATOR . 'escape.pptx'; $link_ok = @symlink($secret, $escape); if ($link_ok) { cw_assert(courseware_build_deck('escape') === null, 'out-of-root symlink is rejected'); } else { fwrite(STDOUT, "SKIP symlink escape test (cannot create symlink)\n"); } $rel_link = $tmp . DIRECTORY_SEPARATOR . 'relescape.pptx'; $rel_ok = @symlink('..' . DIRECTORY_SEPARATOR . basename($outside) . DIRECTORY_SEPARATOR . 'secret.pptx', $rel_link); if (!$rel_ok) { $rel_ok = @symlink(realpath($secret), $rel_link); } if ($rel_ok) { cw_assert(courseware_build_deck('relescape') === null, 'relative out-of-root symlink is rejected'); } else { fwrite(STDOUT, "SKIP relative symlink test (cannot create symlink)\n"); } unset($GLOBALS['_courseware_root']); $example = courseware_build_deck('示例课件'); cw_assert($example !== null, 'example pptx is present in default root'); cw_assert($example['filename'] === '示例课件.pptx', 'example uses actual filename'); cw_assert($example['url'] === 'courseware-file.php?deck=' . rawurlencode('示例课件'), 'example url uses file endpoint'); cw_assert(!array_key_exists('page_count', $example), 'example does not fake page count'); cw_rmdir_tree($tmp); cw_rmdir_tree($outside); fwrite(STDOUT, "OK courseware_test.php\n");