Dvogel hallowelt has uploaded a new change for review.
https://gerrit.wikimedia.org/r/263056
Change subject: Flexiskin: New RL implementation
......................................................................
Flexiskin: New RL implementation
Due to path traversal issues the resource loader implementation was
reworked.
Change-Id: I7657985030d2fdb2d1fa8da322febef373557bc2
---
M Flexiskin/Flexiskin.class.php
M Flexiskin/Flexiskin.setup.php
M Flexiskin/includes/FlexiskinApi.class.php
M Flexiskin/includes/FlexiskinFormatter.class.php
A Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinModule.php
A Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinPreviewModule.php
6 files changed, 158 insertions(+), 224 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BlueSpiceExtensions
refs/changes/56/263056/1
diff --git a/Flexiskin/Flexiskin.class.php b/Flexiskin/Flexiskin.class.php
index e4f8912..c64a061 100644
--- a/Flexiskin/Flexiskin.class.php
+++ b/Flexiskin/Flexiskin.class.php
@@ -52,8 +52,7 @@
EXTINFO::VERSION => 'default',
EXTINFO::STATUS => 'default',
EXTINFO::PACKAGE => 'default',
- EXTINFO::URL =>
'https://help.bluespice.com/index.php/FlexiSkin',
- EXTINFO::DEPS => array( 'bluespice' => '2.22.0' )
+ EXTINFO::URL =>
'https://help.bluespice.com/index.php/FlexiSkin'
);
$this->mExtensionKey = 'MW::Flexiskin';
@@ -67,94 +66,15 @@
}
/**
- * Initialization of ArticleInfo extension
+ * Initialization of Flexiskin extension
*/
public function initExt() {
wfProfileIn( 'BS::' . __METHOD__ );
+
BsConfig::registerVar( 'MW::Flexiskin::Active', "default",
BsConfig::LEVEL_PUBLIC | BsConfig::TYPE_STRING |
BsConfig::USE_PLUGIN_FOR_PREFS, 'bs-flexiskin-pref-active', 'select' );
- BsConfig::registerVar( 'MW::Flexiskin::Logo', "",
BsConfig::LEVEL_PUBLIC | BsConfig::TYPE_STRING |
BsConfig::USE_PLUGIN_FOR_PREFS, 'bs-flexiskin-pref-logo', 'text' );
-
- $sFlexiskin = $this->getRequest()->getVal( 'flexiskin', '' );
- if( $this->getRequest()->getSessionData( "sPreviewSkin" ) !==
NULL){
- $sPreviewSkin = $this->getRequest()->getSessionData(
"sPreviewSkin" );
- } else {
- $sPreviewSkin = FALSE;
- }
-
- $oResponse = $this->getRequest()->response();
- $oRequest = $this->getRequest();
- //this statemenet is just for setting the cookie, this is why
we need to do some checks here
- //check if the request comes via index.php, flexiskin is set in
query and if you are in view mode (block some ajax requests)
-
- $sPreview = false;
- $sFlexiskin = $sFlexiskin == '' ? $sPreviewSkin : $sFlexiskin;
- if ( strpos( wfGetScriptUrl(), "index.php" ) !== false &&
$sFlexiskin !== "" && $oRequest->getVal( 'action', 'view' ) === 'view' ) {
- $bIsTemp = (bool) $oRequest->getBool( 'preview', false
);
- //is it in preview mode?
- //set the session
- if ( $bIsTemp ) {
- $this->getRequest()->setSessionData(
"sPreviewSkin", $sFlexiskin );
- $sPreviewSkin = $sFlexiskin;
- //or just unset it
- } else {
- $this->getRequest()->setSessionData(
"sPreviewSkin", NULL );
- $sPreviewSkin = false;
- }
- }
- $sFlexiskin = $sFlexiskin == '' ? $sPreviewSkin : $sFlexiskin;
- if ( $sFlexiskin != "" || BsConfig::get(
'MW::Flexiskin::Active' ) != '' || $sPreviewSkin ) {
- $sId = $sFlexiskin != '' ? $sFlexiskin : BsConfig::get(
'MW::Flexiskin::Active' );
- if ( $sId != "default" || $sPreviewSkin !== false ) {
- $this->addCssFile( $sId, $sPreviewSkin !==
false );
- if ( $sPreviewSkin ) {
- //reset resource loader cache for
preview
- global $wgResourceLoaderMaxage;
- $wgResourceLoaderMaxage = array (
- 'versioned' => array ( 'server'
=> 1, 'client' => 1 ),
- 'unversioned' => array (
'server' => 1, 'client' => 1 ),
- );
- }
- }
- }
$this->mCore->registerPermission( 'flexiskinedit', array(),
array( 'type' => 'global' ) );
+
wfProfileOut('BS::' . __METHOD__);
- }
-
- /**
- * Replaces the BlueSpiceSkin screen.less file with the one specified
by the parameters
- * @global string $wgResourceModules
- * @param string $sFlexiskinId
- * @param int $bIsTemp
- * @return boolean true of replaced correctly, otherwise false
- */
- public function addCssFile( $sFlexiskinId, $bIsTemp = false ) {
- global $wgResourceModules;
- global $wgScriptPath;
-
- $sPreviewTimestamp = $this->getRequest()->getSessionData(
'PreviewTimestamp' );
- $oStatus = BsFileSystemHelper::ensureDataDirectory(
"flexiskin/" . $sFlexiskinId );
- if ( !$oStatus->isGood() ) {
- return false;
- }
-
- $sFilePath = BsFileSystemHelper::getDataPath("flexiskin/" .
$sFlexiskinId);
- $sFilePath .= "/screen" . ($bIsTemp ? '.' . $sPreviewTimestamp
. '.tmp' : '') . ".less";
- $sFilePath = str_replace($wgScriptPath, "..", $sFilePath);
-
- if ( !isset( $wgResourceModules['skins.bluespiceskin'] ) ||
- !isset(
$wgResourceModules['skins.bluespiceskin']['styles'] ) ) {
- return false;
- }
- foreach ( $wgResourceModules['skins.bluespiceskin']['styles']
as $iIndex => $sStylePath ) {
- //check if element ends with "screen.less"
- if ( strpos( $sStylePath, "screen.less", strlen(
$sStylePath ) - strlen( "screen.less" ) ) === false ) {
- continue;
- }
-
$wgResourceModules['skins.bluespiceskin']['styles'][$iIndex] = $sFilePath;
-
- return true;
- }
- return false;
}
public function getForm() {
@@ -168,12 +88,15 @@
}
$api = new ApiMain(
- new DerivativeRequest(
- $this->getRequest(), array(
- 'action' => 'flexiskin',
- 'type' => 'get'
- ), false
- ), true
+ new DerivativeRequest(
+ $this->getRequest(),
+ array(
+ 'action' => 'flexiskin',
+ 'type' => 'get'
+ ),
+ false
+ ),
+ true
);
$oResult = $api->execute();
$aData = $api->getResultData();
@@ -213,38 +136,7 @@
if ( !$bReturn ) {
return array();
}
- return FormatJson::encode($aConfig);
- }
-
- public static function generateScreenFile($bIsTmp = false){
- $sPreviewTimestamp =
RequestContext::getMain()->getRequest()->getSessionData( 'PreviewTimestamp' );
- $aScreenFile = array();
- $aScreenFile[] = "@import
'../../../../skins/BlueSpiceSkin/resources/variables.less';";
- $aScreenFile[] = "@import 'variables.".($bIsTmp ?
$sPreviewTimestamp . ".tmp." : "")."less';";
- $aScreenFile[] = "@import
'../../../../skins/BlueSpiceSkin/resources/screen.layout.less';";
- $aScreenFile[] = "@import
'../../../../skins/BlueSpiceSkin/resources/components.less';";
- return implode("\n", $aScreenFile);
- }
-
- public static function generateStyleFile( $aConfigs ) {
- $aFile = array();
- if ( !is_array( $aConfigs ) ) {
- $aConfigs = FormatJson::decode( $aConfigs );
- }
- $aFile[] = '@bs-skin-path:
"../../../../skins/BlueSpiceSkin/resources/";';
- $sNewId = self::getFlexiskinIdFromConfig($aConfigs);
- foreach ( $aConfigs as $aConfig ) {
- $func = "FlexiskinFormatter::format_" . $aConfig->id;
- $bReturn = wfRunHooks( "BSFlexiskinGenerateStyleFile",
array( &$func, &$aConfig ) );
-
- if ( $bReturn === true && is_callable( $func ) ) {
- $aFile[] = call_user_func_array( $func, array(
$aConfig, $sNewId) );
- }
- else{
- wfDebug("BS::Flexiskin method " . $func . "
could not be called.");
- }
- }
- return implode( " \n", $aFile );
+ return FormatJson::encode($aConfig, true);
}
public static function getFlexiskinIdFromConfig($aConfig){
@@ -259,49 +151,40 @@
}
/**
- * Modifies the logo on runtime
- * @param SkinTemplate $sktemplate
- * @param BaseTemplate $tpl
- * @return boolean Always true to keep hook running
+ *
+ * @param OutputPage $out
+ * @return boolean
*/
- public static function onSkinTemplateOutputPageBeforeExec(
&$sktemplate, &$tpl ) {
- $sFlexiskin = $sktemplate->getRequest()->getVal( 'flexiskin' );
- if ( $sFlexiskin || BsConfig::get( 'MW::Flexiskin::Active' ) !=
'' ) {
- $sId = $sFlexiskin != '' ? $sFlexiskin : BsConfig::get(
'MW::Flexiskin::Active' );
- if ( $sId != "default" ) {
- $bPreview = $sktemplate->getRequest()->getVal(
'preview', false );
- $api = new ApiMain(
- new DerivativeRequest(
-
$sktemplate->getRequest(),
- array(
- 'action' =>
'flexiskin',
- 'type' => 'get',
- 'mode' =>
'config',
- 'id' => $sId,
- 'preview' =>
$bPreview
- ),
- false
- ),
- true
- );
- $api->execute();
- $aResult = $api->getResultData();
- $oResult = FormatJson::decode(
$aResult['flexiskin'] );
- if ($oResult->success === false){
- return true;
- }
- $aConfig = FormatJson::decode($oResult->config);
- $sLogo = BsConfig::get("MW::Flexiskin::Logo");
- if ( $sLogo == "" ) {
- return true;
- }
- $sPath = BS_DATA_PATH . "/flexiskin/" . $sId .
"/images/";
- $tpl->set( 'logopath', $sPath . $sLogo );
- return true;
- }
- return true;
+ public static function onBeforePageDisplay( &$out ) {
+ $inPreviewMode = $out->getRequest()->getBool('preview');
+
+ if( $inPreviewMode && $out->getRequest()->getVal( 'flexiskin' )
!== null ) {
+ $out->getRequest()->setSessionData('flexiskin',
$out->getRequest()->getVal( 'flexiskin' ) );
+ $out->addModuleStyles(
'ext.bluespice.flexiskin.skin.preview' );
}
+ else {
+ $out->addModuleStyles(
Flexiskin::generateDynamicModuleStyleName() );
+ }
+
return true;
}
+ /**
+ *
+ * @param ResourceLoader $resourceLoader
+ * @return boolean
+ */
+ public static function onResourceLoaderRegisterModules(
&$resourceLoader ) {
+ $resourceLoader->register(
+ Flexiskin::generateDynamicModuleStyleName(),
+ array(
+ 'class' => 'FlexiskinResourceLoaderModule'
+ )
+ );
+ return true;
+ }
+
+ public static function generateDynamicModuleStyleName(){
+ return 'ext.bluespice.flexiskin.skin.' . BsConfig::get(
'MW::Flexiskin::Active' );
+ }
}
diff --git a/Flexiskin/Flexiskin.setup.php b/Flexiskin/Flexiskin.setup.php
index bd77a38..c928efc 100644
--- a/Flexiskin/Flexiskin.setup.php
+++ b/Flexiskin/Flexiskin.setup.php
@@ -2,14 +2,23 @@
BsExtensionManager::registerExtension( 'Flexiskin', BsRUNLEVEL::FULL |
BsRUNLEVEL::REMOTE );
-$wgMessagesDirs['Flexiskin'] = __DIR__ . '/i18n';
+$GLOBALS['wgAutoloadClasses']['Flexiskin'] = __DIR__ . '/Flexiskin.class.php';
+$wgHooks['BeforePageDisplay'][] = "Flexiskin::onBeforePageDisplay";
+$wgHooks['ResourceLoaderRegisterModules'][] =
"Flexiskin::onResourceLoaderRegisterModules";
+
+$wgMessagesDirs['Flexiskin'] = __DIR__ . '/i18n';
$wgExtensionMessagesFiles['Flexiskin'] = __DIR__ .
'/languages/Flexiskin.i18n.php';
$wgExtensionMessagesFiles['FlexiskinAlias'] = __DIR__ .
'/languages/Flexiskin.alias.php';
-$GLOBALS['wgAutoloadClasses']['Flexiskin'] = __DIR__ . '/Flexiskin.class.php';
+$wgAutoloadClasses['FlexiskinApi'] = __DIR__ .
'/includes/FlexiskinApi.class.php';
+$wgAutoloadClasses['FlexiskinFormatter'] = __DIR__ .
'/includes/FlexiskinFormatter.class.php';
+$wgAutoloadClasses['FlexiskinResourceLoaderModule'] = __DIR__ .
'/includes/resourceloader/ResourceLoaderFlexiskinModule.php';
+$wgAutoloadClasses['FlexiskinPreviewResourceLoaderModule'] = __DIR__ .
'/includes/resourceloader/ResourceLoaderFlexiskinPreviewModule.php';
-$wgHooks['SkinTemplateOutputPageBeforeExec'][] =
"Flexiskin::onSkinTemplateOutputPageBeforeExec";
+$wgResourceModules['ext.bluespice.flexiskin.skin.preview'] = array(
+ 'class' => 'FlexiskinPreviewResourceLoaderModule'
+);
$wgResourceModules['ext.bluespice.flexiskin'] = array(
'scripts' => array(
@@ -55,9 +64,7 @@
'remoteBasePath' => &$GLOBALS['wgScriptPath']
);
-$wgAutoloadClasses['FlexiskinApi'] = __DIR__ .
'/includes/FlexiskinApi.class.php';
$wgAPIModules['flexiskin'] = 'FlexiskinApi';
-$wgAutoloadClasses['FlexiskinFormatter'] = __DIR__ .
'/includes/FlexiskinFormatter.class.php';
$wgEditPageFrameOptions = "SAMEORIGIN";
diff --git a/Flexiskin/includes/FlexiskinApi.class.php
b/Flexiskin/includes/FlexiskinApi.class.php
index 15e8d00..2f1a173 100644
--- a/Flexiskin/includes/FlexiskinApi.class.php
+++ b/Flexiskin/includes/FlexiskinApi.class.php
@@ -70,7 +70,7 @@
$sOldId = $this->getMain()->getVal( 'id' );
$aConfigs = FormatJson::decode( $aData );
$sNewId = Flexiskin::getFlexiskinIdFromConfig( $aConfigs );
- $aFile = Flexiskin::generateStyleFile( $aConfigs );
+
$sFlexiskinPath = BsFileSystemHelper::getDataDirectory(
'flexiskin' ) . DS;
//check if skin already exists
if ( $sOldId != $sNewId && is_dir( $sFlexiskinPath . DS .
$sNewId ) && file_exists( $sFlexiskinPath . DS . $sNewId . DS . "conf.json" ) )
{
@@ -89,14 +89,14 @@
}
}
BsFileSystemHelper::ensureDataDirectory($sFlexiskinPath . DS .
$sNewId);
- $oStatus = BsFileSystemHelper::saveToDataDirectory(
"variables.less", $aFile, "flexiskin" . DS . $sNewId );
+ $oStatus = BsFileSystemHelper::saveToDataDirectory(
"conf.json", FormatJson::encode( $aConfigs, true ), "flexiskin" . DS . $sNewId
);
if ( !$oStatus->isGood() ) {
return FormatJson::encode( array(
'success' => false,
'msg' => wfMessage(
"bs-flexiskin-api-error-save", $this->getErrorMessage( $oStatus ) )->plain()
) );
}
- $oStatus = BsFileSystemHelper::saveToDataDirectory(
"conf.json", $aData, "flexiskin" . DS . $sNewId );
+ $oStatus = BsFileSystemHelper::saveToDataDirectory(
"conf.tmp.json", FormatJson::encode( $aConfigs, true ), "flexiskin" . DS .
$sNewId );
if ( !$oStatus->isGood() ) {
return FormatJson::encode( array(
'success' => false,
@@ -106,7 +106,7 @@
return FormatJson::encode( array(
'success' => true,
'id' => $sNewId,
- 'src' => $wgScriptPath . "/index.php?flexiskin=" .
$sNewId )
+ 'src' => $wgScriptPath . "/index.php?flexiskin=" .
$sNewId . "&preview=true" )
);
}
@@ -118,41 +118,17 @@
public function savePreview() {
global $wgScriptPath;
- $sPreviewTimestamp = $this->getRequest()->getSessionData(
'PreviewTimestamp' );
-
- $sId = $this->getMain()->getVal( 'id', '' );
- if ( $sId == "" ) {
- return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( 'bs-flexiskin-api-error-missing-param', 'id' )->plain() ) );
- }
- $delVariablesStatus = BsFileSystemHelper::deleteFile(
"variables." . $sPreviewTimestamp . ".tmp.less", "flexiskin" . DS . $sId );
- $delConfStatus = BsFileSystemHelper::deleteFile( "conf." .
$sPreviewTimestamp . ".tmp.json", "flexiskin" . DS . $sId );
- $delScreenStatus = BsFileSystemHelper::deleteFile( "screen." .
$sPreviewTimestamp . ".tmp.less", "flexiskin" . DS . $sId );
-
- $sPreviewTimestamp = time();
- $this->getRequest()->setSessionData( 'PreviewTimestamp',
$sPreviewTimestamp );
-
$sId = $this->getMain()->getVal( 'id', '' );
if ( $sId == "" ) {
return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( 'bs-flexiskin-api-error-missing-param', 'id' )->plain() ) );
}
$aData = $this->getMain()->getVal( 'data', array() );
$aConfigs = FormatJson::decode( $aData );
- $aFile = Flexiskin::generateStyleFile( $aConfigs );
- $sScreen = Flexiskin::generateScreenFile( true );
- $oStatus = BsFileSystemHelper::saveToDataDirectory(
"variables." . $sPreviewTimestamp . ".tmp.less", $aFile, "flexiskin" . DS .
$sId );
+ $oStatus = BsFileSystemHelper::saveToDataDirectory(
"conf.tmp.json", FormatJson::encode( $aConfigs, true ), "flexiskin" . DS . $sId
);
if ( !$oStatus->isGood() ) {
return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-api-error-save-preview",
$this->getErrorMessage( $oStatus ) )->plain() ) );
}
- $oStatus = BsFileSystemHelper::saveToDataDirectory( "conf." .
$sPreviewTimestamp . ".tmp.json", $aData, "flexiskin" . DS . $sId );
- if ( !$oStatus->isGood() ) {
- return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-api-error-save-preview",
$this->getErrorMessage( $oStatus ) )->plain() ) );
- }
- $oStatus = BsFileSystemHelper::saveToDataDirectory( "screen." .
$sPreviewTimestamp . ".tmp.less", $sScreen, "flexiskin" . DS . $sId );
- if ( !$oStatus->isGood() ) {
- return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-api-error-save-preview",
$this->getErrorMessage( $oStatus ) )->plain() ) );
- }
- //tbd: check if this is usefull
RequestContext::getMain()->getTitle()->invalidateCache();
return FormatJson::encode( array( 'success' => true, 'src' =>
$wgScriptPath . "/index.php?flexiskin=" . $sId . "&preview=true" ) );
}
@@ -184,11 +160,8 @@
* @return Status The status object
*/
public function getConfigFromId( $sId, $bPreview = false ) {
-
- $sPreviewTimestamp =
$this->getRequest()->getSessionData('PreviewTimestamp');
-
if ( $bPreview ) {
- $oStatus = BsFileSystemHelper::getFileContent( "conf."
. $sPreviewTimestamp . ".tmp.json", "flexiskin" . DS . $sId );
+ $oStatus = BsFileSystemHelper::getFileContent(
"conf.tmp.json", "flexiskin" . DS . $sId );
} else {
$oStatus = BsFileSystemHelper::getFileContent(
"conf.json", "flexiskin" . DS . $sId );
}
@@ -267,17 +240,9 @@
return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( 'bs-flexiskin-error-fail-add-skin', $this->getErrorMessage(
$oStatus ) )->plain() ) );
}
if ( $oData->template != 'default' ) {
- $oStatus = BsFileSystemHelper::copyFile(
'variables.less', "flexiskin" . DS . $oData->template, "flexiskin" . DS . md5(
$sId ) );
$oStatus = BsFileSystemHelper::copyFolder( "images",
"flexiskin" . DS . $oData->template, "flexiskin" . DS . md5( $sId ) );
- } else {
- $oStatus = BsFileSystemHelper::saveToDataDirectory(
'variables.less', Flexiskin::generateStyleFile( $sConfigFile ), "flexiskin" .
DS . md5( $sId ) );
}
- $oStatus =
BsFileSystemHelper::saveToDataDirectory('screen.less',
Flexiskin::generateScreenFile(), "flexiskin" . DS . md5($sId));
- $oStatus = BsFileSystemHelper::saveToDataDirectory('screen.' .
$sPreviewTimestamp . '.tmp.less', Flexiskin::generateScreenFile(true),
"flexiskin" . DS . md5($sId));
- //tbd: check 1st, 2nd and 3rd status
- if ( !$oStatus->isGood() ) {
- return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( 'bs-flexiskin-error-fail-add-skin', $this->getErrorMessage(
$oStatus ) )->plain() ) );
- }
+
BsFileSystemHelper::ensureDataDirectory( "flexiskin" . DS .
md5( $sId ) . DS . "images" );
return FormatJson::encode( array( 'success' => true ) );
}
@@ -301,25 +266,15 @@
public function resetFlexiskin() {
global $wgScriptPath;
- $sPreviewTimestamp = $this->getRequest()->getSessionData(
'PreviewTimestamp' );
- //$this->getRequest()->setSessionData("sPreviewSkin", NULL);
-
$sId = $this->getMain()->getVal( 'id', '' );
if ( $sId == "" ) {
return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( 'bs-flexiskin-api-error-missing-param', 'id' )->plain() ) );
}
- $oStatus = BsFileSystemHelper::deleteFile( "variables." .
$sPreviewTimestamp . ".tmp.less", "flexiskin" . DS . $sId );
+ $oStatus = BsFileSystemHelper::deleteFile( "conf.tmp.json",
"flexiskin" . DS . $sId );
if ( !$oStatus->isGood() ) {
return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-reset-error", $this->getErrorMessage(
$oStatus ) )->plain() ) );
}
- $oStatus = BsFileSystemHelper::deleteFile( "conf." .
$sPreviewTimestamp . ".tmp.json", "flexiskin" . DS . $sId );
- if ( !$oStatus->isGood() ) {
- return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-reset-error", $this->getErrorMessage(
$oStatus ) )->plain() ) );
- }
- $oStatus = BsFileSystemHelper::deleteFile( "screen." .
$sPreviewTimestamp . ".tmp.less", "flexiskin" . DS . $sId );
- if ( !$oStatus->isGood() ) {
- return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-reset-error", $this->getErrorMessage(
$oStatus ) )->plain() ) );
- }
+
$oResult = FormatJson::decode( $this->getConfig( $sId ) );
if ( !$oResult->success ) {
return FormatJson::encode( array( 'success' => false,
'msg' => wfMessage( "bs-flexiskin-reset-error", $oResult->msg )->plain() ) );
diff --git a/Flexiskin/includes/FlexiskinFormatter.class.php
b/Flexiskin/includes/FlexiskinFormatter.class.php
index 8c9d92d..324ff92 100644
--- a/Flexiskin/includes/FlexiskinFormatter.class.php
+++ b/Flexiskin/includes/FlexiskinFormatter.class.php
@@ -11,7 +11,15 @@
$aReturn[] = "body{background-color:#" .
$aConfig->customBackgroundColor . " !important;}";
}
if ( isset( $aConfig->backgroundImage ) &&
$aConfig->backgroundImage != "" ) {
- $aReturn[] = "body{background-image:url('images/" .
$aConfig->backgroundImage . "') !important;}";
+ $oStatus = BsFileSystemHelper::getFileContent(
$aConfig->backgroundImage, 'flexiskin'.DS.$sNewId.DS.'images' );
+ if( $oStatus->isGood() ){
+ $sFileExtension = ( new SplFileInfo(
$aConfig->backgroundImage ) )->getExtension();
+ $sMime =
MimeMagic::singleton()->guessTypesForExtension( $sFileExtension );
+ $aReturn[] =
"body{background-image:url('data:$sMime;base64," . base64_encode(
$oStatus->getValue() ) . "') !important;}";
+ }
+ else{
+ $aReturn[] = "body{background-image:none
!important;}";
+ }
}
else {
$sPath =
RequestContext::getMain()->getSkin()->getSkinStylePath(
"resources/images/desktop/bg-lo.png" );
@@ -24,8 +32,17 @@
public static function format_header( $aConfig, $sNewId ) {
$aReturn = array();
- BsConfig::set("MW::Flexiskin::Logo", $aConfig->logo);
- BsConfig::saveSettings();
+ if ( isset( $aConfig->logo ) && $aConfig->logo != "" ) {
+ $oStatus = BsFileSystemHelper::getFileContent(
$aConfig->logo, 'flexiskin'.DS.$sNewId.DS.'images' );
+ if( $oStatus->isGood() ){
+ $sFileExtension = ( new SplFileInfo(
$aConfig->logo ) )->getExtension();
+ $sMime =
MimeMagic::singleton()->guessTypesForExtension( $sFileExtension );
+ $aReturn[] = "#bs-logo >
a{background-image:url('data:$sMime;base64," . base64_encode(
$oStatus->getValue() ) . "') !important;}";
+ }
+ else{
+ $aReturn[] = "#bs-logo >
a{background-image:none !important;}";
+ }
+ }
wfRunHooks( "BSFlexiskinFormatterHeader", array( &$aConfig,
&$aReturn ) );
return implode( " \n", $aReturn );
}
diff --git
a/Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinModule.php
b/Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinModule.php
new file mode 100644
index 0000000..cf6fa82
--- /dev/null
+++ b/Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinModule.php
@@ -0,0 +1,46 @@
+<?php
+
+class FlexiskinResourceLoaderModule extends ResourceLoaderFileModule {
+ public function __construct($options = array(), $localBasePath = null,
$remoteBasePath = null) {
+ parent::__construct($options, $localBasePath, $remoteBasePath);
+ }
+
+ public function getStyles(\ResourceLoaderContext $context) {
+ $sFlexiSkinId = BsConfig::get( 'MW::Flexiskin::Active' );
+
+ $oStatus = BsFileSystemHelper::getFileContent(
+ $this->makeSourceFileName(),
+ "flexiskin" . DS . $this->makeFlexiSkinID( $context )
+ );
+
+ if( !$oStatus->isGood() ){
+ return;
+ }
+ $aConfJson = FormatJson::decode($oStatus->getValue());
+ $aConfigs = array();
+ foreach ( $aConfJson as $aConfig ) {
+ switch ($aConfig->id){
+ case "general":
+ $aConfigs[] =
FlexiskinFormatter::format_general($aConfig, $sFlexiSkinId);
+ break;
+ case "header":
+ $aConfigs[] =
FlexiskinFormatter::format_header($aConfig, $sFlexiSkinId);
+ break;
+ case "position":
+ $aConfigs[] =
FlexiskinFormatter::format_position($aConfig, $sFlexiSkinId);
+ break;
+ default:
+ break;
+ }
+ }
+ return array( implode( "\n", $aConfigs ) );
+ }
+
+ public function makeSourceFileName() {
+ return 'conf.json';
+ }
+
+ public function makeFlexiSkinID( $context ) {
+ return BsConfig::get( 'MW::Flexiskin::Active' );
+ }
+}
diff --git
a/Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinPreviewModule.php
b/Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinPreviewModule.php
new file mode 100644
index 0000000..70ceedf
--- /dev/null
+++ b/Flexiskin/includes/resourceloader/ResourceLoaderFlexiskinPreviewModule.php
@@ -0,0 +1,26 @@
+<?php
+
+class FlexiskinPreviewResourceLoaderModule extends
FlexiskinResourceLoaderModule {
+
+
+ /**
+ *
+ * @param ResourceLoaderContext $context
+ * @return type
+ */
+ public function makeFlexiSkinID( $context ) {
+ return $context->getRequest()->getSessionData('flexiskin');
+ }
+
+ public function makeSourceFileName() {
+ return 'conf.tmp.json';
+ }
+
+ public function getModifiedTime(\ResourceLoaderContext $context) {
+ return time();
+ }
+
+ public function getGroup() {
+ return 'user';
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/263056
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7657985030d2fdb2d1fa8da322febef373557bc2
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/BlueSpiceExtensions
Gerrit-Branch: REL1_23
Gerrit-Owner: Dvogel hallowelt <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits