'', 'author' => '', 'version' => 0, 'current_version' => 0, 'root' => '', 'root_writable' => false, 'permissions' => null, 'parent' => null, 'priority' => 1000, 'standalone_config' => false, 'support' => '', 'section' => '', 'tags' => '', 'details' => '', 'sshot' => '', 'score' => 0, 'type' => null, 'require' => [], 'settings' => [], 'repository' => '', 'dc_min' => 0 ], # Module's values $module, # Clean up values [ 'id' => $id, 'sid' => self::sanitizeString($id), 'label' => $label, 'name' => $name, 'sname' => self::sanitizeString($name) ] ); } # taken from lib.moduleslist.php public static function sanitizeString($str) { return preg_replace('/[^A-Za-z0-9\@\#+_-]/', '', strtolower($str)); } public static function parseFilePattern($id, $module, $file_pattern) { $module = self::sanitizeModule($id, $module); return text::tidyURL(str_replace( [ '%type%', '%id%', '%version%', '%author%' ], [ $module['type'], $module['id'], $module['version'], $module['author'] ], $file_pattern )); } public static function generateXML($id, $module, $file_pattern) { if (!is_array($module) || empty($module)) { return false; } $module = self::sanitizeModule($id, $module); self::$notice = []; self::$failed = []; $xml = ['']; # id if (empty($module['id'])) { self::$failed[] = 'unknow module'; } $xml[] = sprintf('', html::escapeHTML($module['id'])); # name if (empty($module['name'])) { self::$failed[] = 'no module name set in _define.php'; } $xml[] = sprintf('%s', html::escapeHTML($module['name'])); # version if (empty($module['version'])) { self::$failed[] = 'no module version set in _define.php'; } $xml[] = sprintf('%s', html::escapeHTML($module['version'])); # author if (empty($module['author'])) { self::$failed[] = 'no module author set in _define.php'; } $xml[] = sprintf('%s', html::escapeHTML($module['author'])); # desc if (empty($module['desc'])) { self::$failed[] = 'no module description set in _define.php'; } $xml[] = sprintf('%s', html::escapeHTML($module['desc'])); # repository if (empty($module['repository'])) { self::$failed[] = 'no repository set in _define.php'; } # file $file_pattern = self::parseFilePattern($id, $module, $file_pattern); if (empty($file_pattern)) { self::$failed[] = 'no zip file pattern set in Tweak Store configuration'; } $xml[] = sprintf('%s', html::escapeHTML($file_pattern)); # dc_min if (empty($module['dc_min'])) { self::$notice[] = 'no minimum dotclear version'; } $xml[] = sprintf('%s', html::escapeHTML($module['dc_min'])); # details if (empty($module['details'])) { self::$notice[] = 'no details URL'; } $xml[] = sprintf('%s', html::escapeHTML($module['details'])); # section $xml[] = sprintf('%s', html::escapeHTML($module['section'])); # support if (empty($module['support'])) { self::$notice[] = 'no support URL'; } $xml[] = sprintf('%s', html::escapeHTML($module['support'])); $xml[] = ''; $xml[] = ''; return implode("\n", $xml); } public static function writeXML($id, $module, $file_pattern) { self::$failed = []; if (!$module['root_writable']) { return false; } $content = self::generateXML($id, $module, $file_pattern); if (!empty(self::$failed)) { return false; } try { files::putContent($module['root'] . '/dcstore.xml', $content); } catch(Exception $e) { self::$failed[] = $e->getMessage(); return false; } return true; } }