ThemeFoldersService
extends BcThemeFileService
in package
implements
ThemeFoldersServiceInterface
uses
BcContainerTrait
ThemeFoldersService
Table of Contents
Interfaces
- ThemeFoldersServiceInterface
- ThemeFoldersServiceInterface
Methods
- batch() : bool
- 一括処理
- copy() : ThemeFolder|false
- コピー
- copyToTheme() : array<string|int, mixed>|false|string|array<string|int, string>
- 現在のテーマにフォルダをコピー
- create() : ThemeFolderForm
- 作成
- delete() : bool
- 削除
- get() : ThemeFolder
- 単一データ取得
- getBaseDir() : string
- テーマ/プラグインの当該テンプレートタイプのベースディレクトリを取得する
- getForm() : ThemeFolderForm
- フォームフォルダを取得する
- getFullpath() : string
- fullpathを作成
- getIndex() : array<string|int, mixed>
- 一覧データ取得
- getNamesByFullpath() : array<string|int, mixed>|bool
- 複数のフルパスからフォルダ名、ファイル名を取得する
- getNew() : ThemeFolder
- テーマフォルダの初期データを取得する
- getService() : array<string|int, mixed>|mixed|object
- Get Service
- hasService() : bool
- Has Service
- update() : ThemeFolderForm
- 編集
- assertWithinPluginsDir() : void
- 読み出し対象のパスがプラグイン配置ルート(App::path('plugins'))配下に収まっているか検証する
- assertWithinSourceDir() : void
- コピー元のパスが、コピー元テーマ/プラグインの当該タイプのディレクトリ配下に収まっているか検証する
- assertWithinThemeDir() : void
- 指定したパスがテーマディレクトリ配下に収まっているか検証する
Methods
batch()
一括処理
public
batch(string $method, array<string|int, mixed> $paths) : bool
Parameters
- $method : string
- $paths : array<string|int, mixed>
Tags
Return values
boolcopy()
コピー
public
copy(string $fullpath) : ThemeFolder|false
Parameters
- $fullpath : string
Tags
Return values
ThemeFolder|falsecopyToTheme()
現在のテーマにフォルダをコピー
public
copyToTheme(array<string|int, mixed> $params) : array<string|int, mixed>|false|string|array<string|int, string>
Parameters
- $params : array<string|int, mixed>
Tags
Return values
array<string|int, mixed>|false|string|array<string|int, string>create()
作成
public
create(array<string|int, mixed> $postData) : ThemeFolderForm
Parameters
- $postData : array<string|int, mixed>
Tags
Return values
ThemeFolderFormdelete()
削除
public
delete(string $fullpath) : bool
Parameters
- $fullpath : string
Tags
Return values
boolget()
単一データ取得
public
get(string $file) : ThemeFolder
Parameters
- $file : string
Tags
Return values
ThemeFoldergetBaseDir()
テーマ/プラグインの当該テンプレートタイプのベースディレクトリを取得する
public
getBaseDir(string $theme, string $plugin, string $type) : string
Admin web 経路(ThemeFilesController::parseArgs)が fullpath を組み立てる規則と同じ。 type が etc の場合はテンプレートディレクトリ直下(type ディレクトリを挟まない)。
Parameters
- $theme : string
-
テーマ名(コピー元の場合はプラグイン名のこともある)
- $plugin : string
-
プラグイン名(空の場合はテーマ自身)
- $type : string
-
テンプレートタイプ
Tags
Return values
string —末尾に DS を含むベースディレクトリ
getForm()
フォームフォルダを取得する
public
getForm(array<string|int, mixed> $data) : ThemeFolderForm
Parameters
- $data : array<string|int, mixed>
Tags
Return values
ThemeFolderFormgetFullpath()
fullpathを作成
public
getFullpath(string $theme, string $plugin, string $type, string $path) : string
Parameters
- $theme : string
- $plugin : string
- $type : string
- $path : string
Tags
Return values
stringgetIndex()
一覧データ取得
public
getIndex(array<string|int, mixed> $params) : array<string|int, mixed>
Parameters
- $params : array<string|int, mixed>
Tags
Return values
array<string|int, mixed>getNamesByFullpath()
複数のフルパスからフォルダ名、ファイル名を取得する
public
getNamesByFullpath(array<string|int, mixed> $paths) : array<string|int, mixed>|bool
Parameters
- $paths : array<string|int, mixed>
Tags
Return values
array<string|int, mixed>|boolgetNew()
テーマフォルダの初期データを取得する
public
getNew(string $file) : ThemeFolder
Parameters
- $file : string
Tags
Return values
ThemeFoldergetService()
Get Service
public
getService(mixed $service) : array<string|int, mixed>|mixed|object
Parameters
- $service : mixed
Tags
Return values
array<string|int, mixed>|mixed|objecthasService()
Has Service
public
hasService(mixed $service) : bool
Parameters
- $service : mixed
Tags
Return values
boolupdate()
編集
public
update(array<string|int, mixed> $postData) : ThemeFolderForm
Parameters
- $postData : array<string|int, mixed>
Tags
Return values
ThemeFolderFormassertWithinPluginsDir()
読み出し対象のパスがプラグイン配置ルート(App::path('plugins'))配下に収まっているか検証する
protected
assertWithinPluginsDir(string $path) : void
パストラバーサル対策(GHSA-rqr8-gmx5-xvrr): 読み出し処理(ThemeFilesService::get() / ThemeFoldersService::get())でも境界を検証し、 config/ などテーマ・プラグイン外のファイルを読み出せないようにする。 管理画面ではテーマに加えてプラグイン自体のテンプレートも参照するため、 書き込み用の assertWithinThemeDir() より広いプラグイン配置ルートを境界とする。 配下でなければ BcException を投げる。
Parameters
- $path : string
-
検証対象のパス(ファイル or ディレクトリ)
Tags
assertWithinSourceDir()
コピー元のパスが、コピー元テーマ/プラグインの当該タイプのディレクトリ配下に収まっているか検証する
protected
assertWithinSourceDir(array<string|int, mixed> $params) : void
copyToTheme() のコピー元 $params['fullpath'] は Admin web 経路では parseArgs() が
URL から .. を除去せずに組み立てるため、任意のファイル/ディレクトリをカレントテーマの
webroot 配下へコピーして公開 URL から取得できてしまう。コピー元も境界を検証する。
Parameters
- $params : array<string|int, mixed>
-
theme / plugin / type / fullpath を含む配列
Tags
assertWithinThemeDir()
指定したパスがテーマディレクトリ配下に収まっているか検証する
protected
assertWithinThemeDir(string $path[, string|null $theme = null ]) : void
パストラバーサル対策(GHSA-2pj4-v76f-wjvx)の最終防衛線。 Admin web 経路の create()/update() はリクエストの fullpath を直接書き込み先に使い getFullpath() の境界チェックを通らないため、実際の書き込み sink でも テーマディレクトリ配下であることを必ず検証する。配下でなければ BcException を投げる。
許可する境界は次のとおり。
- $theme を指定した場合: そのテーマのディレクトリ配下のみ
- 未指定の場合: インストール済みの全テーマ(Theme / AdminTheme)のディレクトリ配下
以前は App::path('plugins') 配下(plugins/ と vendor/baserproject/ 全体)を許可していたため、
fullpath に .. を含めることで編集中のテーマ以外(コアプラグイン等)へ書き込めた。
テーマ以外のプラグインディレクトリは書き込み先として許可しない。
書き込み処理(ThemeFileForm::_execute / copy)は rawurldecode() を 1 回かけた値を使うため、 生の値に加えて 1 回デコードした値も検査する(GHSA-q7g3-qwrc-mp89)
Parameters
- $path : string
-
検証対象のパス(ファイル or ディレクトリ)
- $theme : string|null = null
-
書き込み先として許可するテーマ名(省略時は全テーマ)