public function manage(string $cabinName = '')
{
if (!$this->isSuperUser()) {
// Admins only!
\Airship\redirect($this->airship_cabin_prefix);
}
if (!\in_array($cabinName, $this->getCabinNamespaces())) {
// Invalid cabin name
\Airship\redirect($this->airship_cabin_prefix . '/cabins');
}
$this->setTemplateExtraData($cabinName);
if (!$this->ensureCabinLinkExists($cabinName)) {
\Airship\json_response(['error' => 'Could not create symlink']);
}
$cabin = \Airship\loadJSON(ROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'cabins.json');
// Apply the cabin's input filter:
$filterName = '\\Airship\\Cabin\\' . $cabinName . '\\ConfigFilter';
if (\class_exists($filterName)) {
$filter = new $filterName();
} else {
$filter = (new GeneralFilterContainer())->addFilter('content_security_policy', new ArrayFilter());
}
$post = $this->post($filter);
if (!empty($post)) {
if ($this->saveSettings($cabinName, $cabin, $post)) {
\Airship\redirect($this->airship_cabin_prefix . '/cabins/manage/' . $cabinName);
}
}
$settings = [];
foreach ($cabin as $path => $data) {
if ($data['name'] === $cabinName) {
$settings['cabin'] = $data;
$settings['cabin']['path'] = $path;
break;
}
}
if (empty($settings['cabin'])) {
// Cabin not found
\Airship\redirect($this->airship_cabin_prefix);
}
$settings['content_security_policy'] = $this->loadJSONConfigFile($cabinName, 'content_security_policy.json');
$settings['cabin_extra'] = \Airship\loadJSON(ROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'Cabin' . DIRECTORY_SEPARATOR . $cabinName . DIRECTORY_SEPARATOR . 'config.json');
$gadgets = ROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'Cabin' . DIRECTORY_SEPARATOR . $cabinName . DIRECTORY_SEPARATOR . 'gadgets.json';
if (!\file_exists($gadgets)) {
\file_put_contents($gadgets, '[]');
}
$settings['gadgets'] = \Airship\loadJSON($gadgets);
$settings['motifs'] = $this->getCabinsMotifs($cabinName);
$settings['twig_vars'] = \Airship\loadJSON(ROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'Cabin' . DIRECTORY_SEPARATOR . $cabinName . DIRECTORY_SEPARATOR . 'twig_vars.json');
$this->lens('cabin_manage', ['name' => $cabinName, 'config' => $settings]);
}