Preparing to support wildcard domains.

This commit is contained in:
RainLoop Team 2014-02-07 20:12:43 +04:00
parent c811fdf545
commit 126b55b2d5
4 changed files with 126 additions and 44 deletions

View file

@ -14,11 +14,14 @@ class Helper
/** /**
* @param string $sString * @param string $sString
* @param string $sWildcardValues * @param string $sWildcardValues
* @param string $sFoundedValue = ''
* *
* @return bool * @return bool
*/ */
static public function ValidateWildcardValues($sString, $sWildcardValues) static public function ValidateWildcardValues($sString, $sWildcardValues, &$sFoundedValue = '')
{ {
$sFoundedValue = '';
$sString = \trim($sString); $sString = \trim($sString);
if ('' === $sString) if ('' === $sString)
{ {
@ -26,11 +29,17 @@ class Helper
} }
$sWildcardValues = \trim($sWildcardValues); $sWildcardValues = \trim($sWildcardValues);
if ('' === $sWildcardValues || '*' === $sWildcardValues) if ('' === $sWildcardValues)
{ {
return true; return true;
} }
if ('*' === $sWildcardValues)
{
$sFoundedValue = '*';
return true;
}
$sWildcardValues = \preg_replace('/[*]+/', '*', \preg_replace('/[\s,;]+/', ' ', $sWildcardValues)); $sWildcardValues = \preg_replace('/[*]+/', '*', \preg_replace('/[\s,;]+/', ' ', $sWildcardValues));
$aWildcardValues = \explode(' ', $sWildcardValues); $aWildcardValues = \explode(' ', $sWildcardValues);
@ -40,6 +49,7 @@ class Helper
{ {
if ($sString === $sItem) if ($sString === $sItem)
{ {
$sFoundedValue = $sItem;
return true; return true;
} }
} }
@ -52,6 +62,7 @@ class Helper
if (\preg_match('/'.\implode('.*', $aItem).'/', $sString)) if (\preg_match('/'.\implode('.*', $aItem).'/', $sString))
{ {
$sFoundedValue = $sItem;
return true; return true;
} }
} }

View file

@ -41,8 +41,7 @@ class Domain extends \RainLoop\Providers\AbstractProvider
*/ */
public function Load($sName, $bDefaultOnNull = false) public function Load($sName, $bDefaultOnNull = false)
{ {
$oDomain = $this->oDriver->Load($sName); return $this->oDriver->Load($sName, $bDefaultOnNull);
return $oDomain ? $oDomain : ($bDefaultOnNull ? $this->oDriver->Load('default') : null);
} }
/** /**

View file

@ -16,7 +16,28 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
*/ */
public function __construct($sDomainPath) public function __construct($sDomainPath)
{ {
$this->sDomainPath = rtrim(trim($sDomainPath), '\\/'); $this->sDomainPath = \rtrim(\trim($sDomainPath), '\\/');
}
/**
* @param string $sName
* @param bool $bBack = false
*
* @return string
*/
public function codeFileName($sName, $bBack = false)
{
if ($bBack && 'default' === $sName)
{
return '*';
}
else if (!$bBack && '*' === $sName)
{
return 'default';
}
$sName = \strtolower($sName);
return $bBack ? \str_replace('_wildcard_', '*', $sName) : \str_replace('*', '_wildcard_', $sName);
} }
/** /**
@ -28,16 +49,16 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
public function Disable($sName, $bDisable) public function Disable($sName, $bDisable)
{ {
$sFile = ''; $sFile = '';
if (file_exists($this->sDomainPath.'/disabled')) if (\file_exists($this->sDomainPath.'/disabled'))
{ {
$sFile = @file_get_contents($this->sDomainPath.'/disabled'); $sFile = @\file_get_contents($this->sDomainPath.'/disabled');
} }
$aResult = array(); $aResult = array();
$aNames = explode(',', $sFile); $aNames = \explode(',', $sFile);
if ($bDisable) if ($bDisable)
{ {
array_push($aNames, $sName); \array_push($aNames, $sName);
$aResult = $aNames; $aResult = $aNames;
} }
else else
@ -51,36 +72,71 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
} }
} }
$aResult = array_unique($aResult); $aResult = \array_unique($aResult);
return false !== file_put_contents($this->sDomainPath.'/disabled', trim(implode(',', $aResult), ', ')); return false !== \file_put_contents($this->sDomainPath.'/disabled', \trim(\implode(',', $aResult), ', '));
} }
/** /**
* @param string $sName * @param string $sName
* @param bool $bFindWithWildCard = false
* *
* @return \RainLoop\Domain | null * @return \RainLoop\Domain | null
*/ */
public function Load($sName) public function Load($sName, $bFindWithWildCard = false)
{ {
$mResult = null; $mResult = null;
$sName = strtolower($sName); $sName = \strtolower($sName);
if (file_exists($this->sDomainPath.'/'.$sName.'.ini')) $sRealFileName = $this->codeFileName($sName);
if (\file_exists($this->sDomainPath.'/'.$sRealFileName.'.ini'))
{ {
$mResult = \RainLoop\Domain::NewInstanceFromDomainConfigArray( $mResult = \RainLoop\Domain::NewInstanceFromDomainConfigArray(
$sName, @parse_ini_file($this->sDomainPath.'/'.$sName.'.ini')); $sName, @\parse_ini_file($this->sDomainPath.'/'.$sRealFileName.'.ini'));
if ($mResult instanceof \RainLoop\Domain) if ($mResult instanceof \RainLoop\Domain)
{ {
if (file_exists($this->sDomainPath.'/disabled')) if (\file_exists($this->sDomainPath.'/disabled'))
{ {
$sDisabled = @file_get_contents($this->sDomainPath.'/disabled'); $sDisabled = @\file_get_contents($this->sDomainPath.'/disabled');
if (false !== $sDisabled && 0 < strlen($sDisabled)) if (false !== $sDisabled && 0 < \strlen($sDisabled))
{ {
$mResult->SetDisabled(false !== strpos(strtolower(','.$sDisabled.','), strtolower(','.$sName.','))); $mResult->SetDisabled(false !== \strpos(strtolower(','.$sDisabled.','), \strtolower(','.$sName.',')));
} }
} }
} }
} }
else if ($bFindWithWildCard)
{
// TODO
// $sNames = '';
// $aNames = array();
//
// $aList = \glob($this->sDomainPath.'/*.ini');
// foreach ($aList as $sFile)
// {
// $sName = \strtolower(\substr(\basename($sFile), 0, -4));
// if ('default' === $sName || false !== strpos($sName, '_wildcard_'))
// {
// $aNames[] = $this->codeFileName($sName, true);
// }
// }
//
// if (0 < \count($aNames))
// {
// \rsort($sNames, SORT_STRING);
// $sNames = \implode(' ', $aNames);
// }
//
// if (0 < \strlen($sNames))
// {
// $sFoundedValue = '';
// if (\RainLoop\Plugins\Helper::ValidateWildcardValues($sName, $sNames, $sFoundedValue) && 0 < \strlen($sFoundedValue))
// {
// $mResult = $this->Load($sFoundedValue, false);
// }
// }
$mResult = $this->Load('default', false);
}
return $mResult; return $mResult;
} }
@ -92,8 +148,11 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
*/ */
public function Save(\RainLoop\Domain $oDomain) public function Save(\RainLoop\Domain $oDomain)
{ {
$mResult = file_put_contents($this->sDomainPath.'/'.strtolower($oDomain->Name()).'.ini', $oDomain->ToIniString()); $sName = \strtolower($oDomain->Name());
return is_int($mResult) && 0 < $mResult; $sRealFileName = $this->codeFileName($sName);
$mResult = \file_put_contents($this->sDomainPath.'/'.$sRealFileName.'.ini', $oDomain->ToIniString());
return \is_int($mResult) && 0 < $mResult;
} }
/** /**
@ -104,10 +163,17 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
public function Delete($sName) public function Delete($sName)
{ {
$bResult = true; $bResult = true;
$sName = strtolower($sName); $sName = \strtolower($sName);
if (0 < strlen($sName) && file_exists($this->sDomainPath.'/'.$sName.'.ini')) $sRealFileName = $this->codeFileName($sName);
if (0 < \strlen($sName) && \file_exists($this->sDomainPath.'/'.$sRealFileName.'.ini'))
{ {
$bResult = unlink($this->sDomainPath.'/'.$sName.'.ini'); $bResult = \unlink($this->sDomainPath.'/'.$sRealFileName.'.ini');
}
if ($bResult)
{
$this->Disable($sName, false);
} }
return $bResult; return $bResult;
@ -116,45 +182,54 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
/** /**
* @param int $iOffset * @param int $iOffset
* @param int $iLimit = 20 * @param int $iLimit = 20
* @param string $sSearch = ''
* *
* @return array * @return array
*/ */
public function GetList($iOffset, $iLimit = 20, $sSearch = '') public function GetList($iOffset, $iLimit = 20)
{ {
$aResult = array(); $aResult = array();
$aList = glob($this->sDomainPath.'/*.ini'); $aWildCards = array();
$aList = \glob($this->sDomainPath.'/*.ini');
$sSearch = strtolower($sSearch);
foreach ($aList as $sFile) foreach ($aList as $sFile)
{ {
$sName = strtolower(substr(basename($sFile), 0, -4)); $sName = \strtolower(\substr(\basename($sFile), 0, -4));
if (0 === strlen($sSearch) || false !== strpos($sName, $sSearch)) $sName = $this->codeFileName($sName, true);
if (false === \strpos($sName, '*'))
{ {
$aResult[] = $sName; $aResult[] = $sName;
} }
else
{
$aWildCards[] = $sName;
} }
}
\sort($aResult, SORT_STRING);
\rsort($aWildCards, SORT_STRING);
$aResult = \array_merge($aResult, $aWildCards);
$iOffset = (0 > $iOffset) ? 0 : $iOffset; $iOffset = (0 > $iOffset) ? 0 : $iOffset;
$iLimit = (0 > $iLimit) ? 0 : ((999 < $iLimit) ? 999 : $iLimit); $iLimit = (0 > $iLimit) ? 0 : ((999 < $iLimit) ? 999 : $iLimit);
$aResult = array_slice($aResult, $iOffset, $iLimit); $aResult = \array_slice($aResult, $iOffset, $iLimit);
$aDisabledNames = array(); $aDisabledNames = array();
if (0 < count($aResult) && file_exists($this->sDomainPath.'/disabled')) if (0 < \count($aResult) && \file_exists($this->sDomainPath.'/disabled'))
{ {
$sDisabled = @file_get_contents($this->sDomainPath.'/disabled'); $sDisabled = @\file_get_contents($this->sDomainPath.'/disabled');
if (false !== $sDisabled && 0 < strlen($sDisabled)) if (false !== $sDisabled && 0 < strlen($sDisabled))
{ {
$aDisabledNames = explode(',', strtolower($sDisabled)); $aDisabledNames = \explode(',', strtolower($sDisabled));
$aDisabledNames = array_unique($aDisabledNames); $aDisabledNames = \array_unique($aDisabledNames);
} }
} }
$aReturn = array(); $aReturn = array();
foreach ($aResult as $sName) foreach ($aResult as $sName)
{ {
$aReturn[$sName] = !in_array(strtolower($sName), $aDisabledNames); $aReturn[$sName] = !\in_array(\strtolower($sName), $aDisabledNames);
} }
return $aReturn; return $aReturn;
@ -165,8 +240,8 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
* *
* @return int * @return int
*/ */
public function Count($sSearch = '') public function Count()
{ {
return count($this->GetList(0, 999, $sSearch)); return \count($this->GetList(0, 999));
} }
} }

View file

@ -37,16 +37,13 @@ interface DomainAdminInterface extends DomainInterface
/** /**
* @param int $iOffset * @param int $iOffset
* @param int $iLimit = 20 * @param int $iLimit = 20
* @param string $sSearch = ''
* *
* @return array * @return array
*/ */
public function GetList($iOffset, $iLimit = 20, $sSearch = ''); public function GetList($iOffset, $iLimit = 20);
/** /**
* @param string $sSearch = ''
*
* @return int * @return int
*/ */
public function Count($sSearch = ''); public function Count();
} }