| @@ -8,34 +8,34 @@ | ||
| 8 | 8 | */ | 
| 9 | 9 | class ShareToken extends DataObject | 
| 10 | 10 |  { | 
| 11 | - /** | |
| 12 | - * @var array | |
| 13 | - */ | |
| 14 | - private static $db = array( | |
| 15 | - 'Token' => 'Varchar(16)', | |
| 16 | - 'ValidForDays' => 'Int', | |
| 17 | - ); | |
| 11 | + /** | |
| 12 | + * @var array | |
| 13 | + */ | |
| 14 | + private static $db = array( | |
| 15 | + 'Token' => 'Varchar(16)', | |
| 16 | + 'ValidForDays' => 'Int', | |
| 17 | + ); | |
| 18 | 18 | |
| 19 | - /** | |
| 20 | - * @var array | |
| 21 | - */ | |
| 22 | - private static $has_one = array( | |
| 23 | - 'Page' => 'Page' | |
| 24 | - ); | |
| 19 | + /** | |
| 20 | + * @var array | |
| 21 | + */ | |
| 22 | + private static $has_one = array( | |
| 23 | + 'Page' => 'Page' | |
| 24 | + ); | |
| 25 | 25 | |
| 26 | - /** | |
| 27 | - * Determines whether the token is still valid (from days since it was created). | |
| 28 | - * | |
| 29 | - * @return bool | |
| 30 | - */ | |
| 31 | - public function isExpired() | |
| 32 | -    { | |
| 33 | - $createdSeconds = strtotime($this->Created); | |
| 26 | + /** | |
| 27 | + * Determines whether the token is still valid (from days since it was created). | |
| 28 | + * | |
| 29 | + * @return bool | |
| 30 | + */ | |
| 31 | + public function isExpired() | |
| 32 | +	{ | |
| 33 | + $createdSeconds = strtotime($this->Created); | |
| 34 | 34 | |
| 35 | - $validForSeconds = (int) $this->ValidForDays * 24 * 60 * 60; | |
| 35 | + $validForSeconds = (int) $this->ValidForDays * 24 * 60 * 60; | |
| 36 | 36 | |
| 37 | -        $nowSeconds = strtotime(SS_DateTime::now()->Format("Y-m-d H:i:s")); | |
| 37 | +		$nowSeconds = strtotime(SS_DateTime::now()->Format("Y-m-d H:i:s")); | |
| 38 | 38 | |
| 39 | - return ($createdSeconds + $validForSeconds) <= $nowSeconds; | |
| 40 | - } | |
| 39 | + return ($createdSeconds + $validForSeconds) <= $nowSeconds; | |
| 40 | + } | |
| 41 | 41 | } | 
| @@ -2,122 +2,122 @@ | ||
| 2 | 2 | |
| 3 | 3 | class ShareDraftController extends Controller | 
| 4 | 4 |  { | 
| 5 | - /** | |
| 6 | - * Controller for rendering draft pages. | |
| 7 | - * | |
| 8 | - * @config | |
| 9 | - * | |
| 10 | - * @var string | |
| 11 | - */ | |
| 12 | - private static $controller = 'Page_Controller'; | |
| 13 | - | |
| 14 | - /** | |
| 15 | - * @var array | |
| 16 | - */ | |
| 17 | - private static $allowed_actions = array( | |
| 18 | - 'preview' | |
| 19 | - ); | |
| 20 | - | |
| 21 | - /** | |
| 22 | - * @var array | |
| 23 | - */ | |
| 24 | - private static $url_handlers = array( | |
| 25 | - '$Key/$Token' => 'preview' | |
| 26 | - ); | |
| 27 | - | |
| 28 | - /** | |
| 29 | - * @param SS_HTTPRequest $request | |
| 30 | - * | |
| 31 | - * @return string|HTMLText | |
| 32 | - */ | |
| 33 | - public function preview(SS_HTTPRequest $request) | |
| 34 | -    { | |
| 35 | -        $key = $request->param('Key'); | |
| 36 | -        $token = $request->param('Token'); | |
| 37 | - | |
| 38 | - /** | |
| 39 | - * @var ShareToken $shareToken | |
| 40 | - */ | |
| 41 | -        $shareToken = ShareToken::get()->filter('token', $token)->first(); | |
| 42 | - | |
| 43 | -        if (!$shareToken) { | |
| 44 | - return $this->errorPage(); | |
| 45 | - } | |
| 46 | - | |
| 47 | - $page = Versioned::get_one_by_stage( | |
| 48 | - 'SiteTree', | |
| 49 | - 'Stage', | |
| 50 | -            sprintf('"SiteTree"."ID" = \'%d\'', $shareToken->PageID) | |
| 51 | - ); | |
| 52 | - | |
| 53 | -        $latest = Versioned::get_latest_version('SiteTree', $shareToken->PageID); | |
| 54 | - | |
| 55 | - $controller = $this->getControllerFor($page); | |
| 56 | - | |
| 57 | -        if (!$shareToken->isExpired() && $page->generateKey($shareToken->Token) === $key) { | |
| 58 | - Requirements::css(SHAREDRAFTCONTENT_DIR . '/css/top-bar.css'); | |
| 59 | - | |
| 60 | - // Temporarily un-secure the draft site and switch to draft | |
| 61 | -            $oldSecured = Session::get('unsecuredDraftSite'); | |
| 62 | - $oldMode = Versioned::get_reading_mode(); | |
| 63 | -            $restore = function () use ($oldSecured, $oldMode) { | |
| 64 | -                Session::set('unsecuredDraftSite', $oldSecured); | |
| 65 | - Versioned::set_reading_mode($oldMode); | |
| 66 | - }; | |
| 67 | - | |
| 68 | - // Process page inside an unsecured draft container | |
| 69 | -            try { | |
| 70 | -                Session::set('unsecuredDraftSite', true); | |
| 71 | -                Versioned::reading_stage('Stage'); | |
| 72 | - | |
| 73 | - // Create mock request; Simplify request to single top level reqest | |
| 74 | -                $pageRequest = new SS_HTTPRequest('GET', $page->URLSegment); | |
| 75 | -                $pageRequest->match('$URLSegment//$Action/$ID/$OtherID', true); | |
| 76 | - $rendered = $controller->handleRequest($pageRequest, $this->model); | |
| 77 | - | |
| 78 | - // Render draft heading | |
| 79 | - $data = new ArrayData(array( | |
| 80 | - 'Page' => $page, | |
| 81 | - 'Latest' => $latest, | |
| 82 | - )); | |
| 83 | -                $include = (string) $data->renderWith('Includes/TopBar'); | |
| 84 | -            } catch (Exception $ex) { | |
| 85 | - $restore(); | |
| 86 | - throw $ex; | |
| 87 | - } | |
| 88 | - $restore(); | |
| 89 | - | |
| 90 | -            return str_replace('</body>', $include . '</body>', (string) $rendered->getBody()); | |
| 91 | -        } else { | |
| 92 | - return $this->errorPage(); | |
| 93 | - } | |
| 94 | - } | |
| 95 | - | |
| 96 | - /** | |
| 97 | - * @return HTMLText | |
| 98 | - */ | |
| 99 | - protected function errorPage() | |
| 100 | -    { | |
| 101 | - Requirements::css(SHAREDRAFTCONTENT_DIR . '/css/error-page.css'); | |
| 102 | - | |
| 103 | -        return $this->renderWith('ShareDraftContentError'); | |
| 104 | - } | |
| 105 | - | |
| 106 | - /** | |
| 107 | - * @param mixed $page | |
| 108 | - * | |
| 109 | - * @return mixed | |
| 110 | - */ | |
| 111 | - protected function getControllerFor($page) | |
| 112 | -    { | |
| 113 | -        $config = Config::inst()->forClass('ShareDraftController'); | |
| 114 | - | |
| 115 | - $controller = $config->controller; | |
| 116 | - | |
| 117 | -        if (!$controller || !class_exists($controller)) { | |
| 118 | - return new ContentController($page); | |
| 119 | - } | |
| 120 | - | |
| 121 | - return new $controller($page); | |
| 122 | - } | |
| 5 | + /** | |
| 6 | + * Controller for rendering draft pages. | |
| 7 | + * | |
| 8 | + * @config | |
| 9 | + * | |
| 10 | + * @var string | |
| 11 | + */ | |
| 12 | + private static $controller = 'Page_Controller'; | |
| 13 | + | |
| 14 | + /** | |
| 15 | + * @var array | |
| 16 | + */ | |
| 17 | + private static $allowed_actions = array( | |
| 18 | + 'preview' | |
| 19 | + ); | |
| 20 | + | |
| 21 | + /** | |
| 22 | + * @var array | |
| 23 | + */ | |
| 24 | + private static $url_handlers = array( | |
| 25 | + '$Key/$Token' => 'preview' | |
| 26 | + ); | |
| 27 | + | |
| 28 | + /** | |
| 29 | + * @param SS_HTTPRequest $request | |
| 30 | + * | |
| 31 | + * @return string|HTMLText | |
| 32 | + */ | |
| 33 | + public function preview(SS_HTTPRequest $request) | |
| 34 | +	{ | |
| 35 | +		$key = $request->param('Key'); | |
| 36 | +		$token = $request->param('Token'); | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * @var ShareToken $shareToken | |
| 40 | + */ | |
| 41 | +		$shareToken = ShareToken::get()->filter('token', $token)->first(); | |
| 42 | + | |
| 43 | +		if (!$shareToken) { | |
| 44 | + return $this->errorPage(); | |
| 45 | + } | |
| 46 | + | |
| 47 | + $page = Versioned::get_one_by_stage( | |
| 48 | + 'SiteTree', | |
| 49 | + 'Stage', | |
| 50 | +			sprintf('"SiteTree"."ID" = \'%d\'', $shareToken->PageID) | |
| 51 | + ); | |
| 52 | + | |
| 53 | +		$latest = Versioned::get_latest_version('SiteTree', $shareToken->PageID); | |
| 54 | + | |
| 55 | + $controller = $this->getControllerFor($page); | |
| 56 | + | |
| 57 | +		if (!$shareToken->isExpired() && $page->generateKey($shareToken->Token) === $key) { | |
| 58 | + Requirements::css(SHAREDRAFTCONTENT_DIR . '/css/top-bar.css'); | |
| 59 | + | |
| 60 | + // Temporarily un-secure the draft site and switch to draft | |
| 61 | +			$oldSecured = Session::get('unsecuredDraftSite'); | |
| 62 | + $oldMode = Versioned::get_reading_mode(); | |
| 63 | +			$restore = function () use ($oldSecured, $oldMode) { | |
| 64 | +				Session::set('unsecuredDraftSite', $oldSecured); | |
| 65 | + Versioned::set_reading_mode($oldMode); | |
| 66 | + }; | |
| 67 | + | |
| 68 | + // Process page inside an unsecured draft container | |
| 69 | +			try { | |
| 70 | +				Session::set('unsecuredDraftSite', true); | |
| 71 | +				Versioned::reading_stage('Stage'); | |
| 72 | + | |
| 73 | + // Create mock request; Simplify request to single top level reqest | |
| 74 | +				$pageRequest = new SS_HTTPRequest('GET', $page->URLSegment); | |
| 75 | +				$pageRequest->match('$URLSegment//$Action/$ID/$OtherID', true); | |
| 76 | + $rendered = $controller->handleRequest($pageRequest, $this->model); | |
| 77 | + | |
| 78 | + // Render draft heading | |
| 79 | + $data = new ArrayData(array( | |
| 80 | + 'Page' => $page, | |
| 81 | + 'Latest' => $latest, | |
| 82 | + )); | |
| 83 | +				$include = (string) $data->renderWith('Includes/TopBar'); | |
| 84 | +			} catch (Exception $ex) { | |
| 85 | + $restore(); | |
| 86 | + throw $ex; | |
| 87 | + } | |
| 88 | + $restore(); | |
| 89 | + | |
| 90 | +			return str_replace('</body>', $include . '</body>', (string) $rendered->getBody()); | |
| 91 | +		} else { | |
| 92 | + return $this->errorPage(); | |
| 93 | + } | |
| 94 | + } | |
| 95 | + | |
| 96 | + /** | |
| 97 | + * @return HTMLText | |
| 98 | + */ | |
| 99 | + protected function errorPage() | |
| 100 | +	{ | |
| 101 | + Requirements::css(SHAREDRAFTCONTENT_DIR . '/css/error-page.css'); | |
| 102 | + | |
| 103 | +		return $this->renderWith('ShareDraftContentError'); | |
| 104 | + } | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * @param mixed $page | |
| 108 | + * | |
| 109 | + * @return mixed | |
| 110 | + */ | |
| 111 | + protected function getControllerFor($page) | |
| 112 | +	{ | |
| 113 | +		$config = Config::inst()->forClass('ShareDraftController'); | |
| 114 | + | |
| 115 | + $controller = $config->controller; | |
| 116 | + | |
| 117 | +		if (!$controller || !class_exists($controller)) { | |
| 118 | + return new ContentController($page); | |
| 119 | + } | |
| 120 | + | |
| 121 | + return new $controller($page); | |
| 122 | + } | |
| 123 | 123 | } | 
| @@ -60,7 +60,7 @@ | ||
| 60 | 60 | // Temporarily un-secure the draft site and switch to draft | 
| 61 | 61 |              $oldSecured = Session::get('unsecuredDraftSite'); | 
| 62 | 62 | $oldMode = Versioned::get_reading_mode(); | 
| 63 | -            $restore = function () use ($oldSecured, $oldMode) { | |
| 63 | +            $restore = function() use ($oldSecured, $oldMode) { | |
| 64 | 64 |                  Session::set('unsecuredDraftSite', $oldSecured); | 
| 65 | 65 | Versioned::set_reading_mode($oldMode); | 
| 66 | 66 | }; | 
| @@ -5,110 +5,110 @@ | ||
| 5 | 5 | */ | 
| 6 | 6 | class ShareDraftContentSiteTreeExtension extends DataExtension | 
| 7 | 7 |  { | 
| 8 | - /** | |
| 9 | - * The number of days a shared link should be valid for, before expiring. | |
| 10 | - * | |
| 11 | - * @config | |
| 12 | - * | |
| 13 | - * @var int | |
| 14 | - */ | |
| 15 | - private static $valid_for_days = 30; | |
| 16 | - | |
| 17 | - /** | |
| 18 | - * @var array | |
| 19 | - */ | |
| 20 | - private static $db = array( | |
| 21 | - 'ShareTokenSalt' => 'Varchar(16)', | |
| 22 | - ); | |
| 23 | - | |
| 24 | - /** | |
| 25 | - * @var array | |
| 26 | - */ | |
| 27 | - private static $has_many = array( | |
| 28 | - 'ShareTokens' => 'ShareToken', | |
| 29 | - ); | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * @var array | |
| 33 | - */ | |
| 34 | - private static $allowed_actions = array( | |
| 35 | - 'MakeShareDraftLink' | |
| 36 | - ); | |
| 37 | - | |
| 38 | - /** | |
| 39 | - * @return string | |
| 40 | - */ | |
| 41 | - public function ShareTokenLink() | |
| 42 | -    { | |
| 43 | - $shareToken = $this->getNewShareToken(); | |
| 44 | - | |
| 45 | - return Controller::join_links(Director::absoluteBaseURL(), 'preview', $this->generateKey($shareToken->Token), $shareToken->Token); | |
| 46 | - } | |
| 47 | - | |
| 48 | - /** | |
| 49 | - * @return ShareToken | |
| 50 | - */ | |
| 51 | - protected function getNewShareToken() | |
| 52 | -    { | |
| 53 | -        if (!$this->owner->ShareTokenSalt) { | |
| 54 | - $this->owner->ShareTokenSalt = $this->getNewToken(); | |
| 55 | - $this->owner->write(); | |
| 56 | - } | |
| 57 | - | |
| 58 | - $found = null; | |
| 59 | - $token = null; | |
| 60 | - $tries = 1; | |
| 61 | - $limit = 5; | |
| 62 | - | |
| 63 | -        while (!$found && ($tries++ < $limit)) { | |
| 64 | - $token = $this->getNewToken(); | |
| 65 | - | |
| 66 | - $found = ShareToken::get()->filter(array( | |
| 67 | - "Token" => $token, | |
| 68 | - "PageID" => $this->owner->ID, | |
| 69 | - ))->first(); | |
| 70 | - } | |
| 71 | - | |
| 72 | -        $config = Config::inst()->forClass('ShareDraftContentSiteTreeExtension'); | |
| 73 | - | |
| 74 | - $validForDays = $config->valid_for_days; | |
| 75 | - | |
| 76 | - $token = ShareToken::create(array( | |
| 77 | - "Token" => $token, | |
| 78 | - "ValidForDays" => $validForDays, | |
| 79 | - "PageID" => $this->owner->ID, | |
| 80 | - )); | |
| 81 | - | |
| 82 | - $token->write(); | |
| 83 | - | |
| 84 | - return $token; | |
| 85 | - } | |
| 86 | - | |
| 87 | - /** | |
| 88 | - * @return string | |
| 89 | - */ | |
| 90 | - protected function getNewToken() | |
| 91 | -    { | |
| 92 | - $generator = new RandomGenerator(); | |
| 93 | - | |
| 94 | -        return substr($generator->randomToken('sha256'), 0, 16); | |
| 95 | - } | |
| 96 | - | |
| 97 | - /** | |
| 98 | - * @param string $salt | |
| 99 | - * | |
| 100 | - * @return string | |
| 101 | - */ | |
| 102 | - public function generateKey($salt) | |
| 103 | -    { | |
| 104 | -        return hash_pbkdf2('sha256', $salt, $this->owner->SharedTokenSalt, 1000, 16); | |
| 105 | - } | |
| 106 | - | |
| 107 | - /** | |
| 108 | - * @return string | |
| 109 | - */ | |
| 110 | - public function getShareDraftLinkAction() | |
| 111 | -    { | |
| 112 | -        return $this->owner->Link('MakeShareDraftLink'); | |
| 113 | - } | |
| 8 | + /** | |
| 9 | + * The number of days a shared link should be valid for, before expiring. | |
| 10 | + * | |
| 11 | + * @config | |
| 12 | + * | |
| 13 | + * @var int | |
| 14 | + */ | |
| 15 | + private static $valid_for_days = 30; | |
| 16 | + | |
| 17 | + /** | |
| 18 | + * @var array | |
| 19 | + */ | |
| 20 | + private static $db = array( | |
| 21 | + 'ShareTokenSalt' => 'Varchar(16)', | |
| 22 | + ); | |
| 23 | + | |
| 24 | + /** | |
| 25 | + * @var array | |
| 26 | + */ | |
| 27 | + private static $has_many = array( | |
| 28 | + 'ShareTokens' => 'ShareToken', | |
| 29 | + ); | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * @var array | |
| 33 | + */ | |
| 34 | + private static $allowed_actions = array( | |
| 35 | + 'MakeShareDraftLink' | |
| 36 | + ); | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * @return string | |
| 40 | + */ | |
| 41 | + public function ShareTokenLink() | |
| 42 | +	{ | |
| 43 | + $shareToken = $this->getNewShareToken(); | |
| 44 | + | |
| 45 | + return Controller::join_links(Director::absoluteBaseURL(), 'preview', $this->generateKey($shareToken->Token), $shareToken->Token); | |
| 46 | + } | |
| 47 | + | |
| 48 | + /** | |
| 49 | + * @return ShareToken | |
| 50 | + */ | |
| 51 | + protected function getNewShareToken() | |
| 52 | +	{ | |
| 53 | +		if (!$this->owner->ShareTokenSalt) { | |
| 54 | + $this->owner->ShareTokenSalt = $this->getNewToken(); | |
| 55 | + $this->owner->write(); | |
| 56 | + } | |
| 57 | + | |
| 58 | + $found = null; | |
| 59 | + $token = null; | |
| 60 | + $tries = 1; | |
| 61 | + $limit = 5; | |
| 62 | + | |
| 63 | +		while (!$found && ($tries++ < $limit)) { | |
| 64 | + $token = $this->getNewToken(); | |
| 65 | + | |
| 66 | + $found = ShareToken::get()->filter(array( | |
| 67 | + "Token" => $token, | |
| 68 | + "PageID" => $this->owner->ID, | |
| 69 | + ))->first(); | |
| 70 | + } | |
| 71 | + | |
| 72 | +		$config = Config::inst()->forClass('ShareDraftContentSiteTreeExtension'); | |
| 73 | + | |
| 74 | + $validForDays = $config->valid_for_days; | |
| 75 | + | |
| 76 | + $token = ShareToken::create(array( | |
| 77 | + "Token" => $token, | |
| 78 | + "ValidForDays" => $validForDays, | |
| 79 | + "PageID" => $this->owner->ID, | |
| 80 | + )); | |
| 81 | + | |
| 82 | + $token->write(); | |
| 83 | + | |
| 84 | + return $token; | |
| 85 | + } | |
| 86 | + | |
| 87 | + /** | |
| 88 | + * @return string | |
| 89 | + */ | |
| 90 | + protected function getNewToken() | |
| 91 | +	{ | |
| 92 | + $generator = new RandomGenerator(); | |
| 93 | + | |
| 94 | +		return substr($generator->randomToken('sha256'), 0, 16); | |
| 95 | + } | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * @param string $salt | |
| 99 | + * | |
| 100 | + * @return string | |
| 101 | + */ | |
| 102 | + public function generateKey($salt) | |
| 103 | +	{ | |
| 104 | +		return hash_pbkdf2('sha256', $salt, $this->owner->SharedTokenSalt, 1000, 16); | |
| 105 | + } | |
| 106 | + | |
| 107 | + /** | |
| 108 | + * @return string | |
| 109 | + */ | |
| 110 | + public function getShareDraftLinkAction() | |
| 111 | +	{ | |
| 112 | +		return $this->owner->Link('MakeShareDraftLink'); | |
| 113 | + } | |
| 114 | 114 | } | 
| @@ -2,34 +2,34 @@ | ||
| 2 | 2 | |
| 3 | 3 | class ShareDraftContentControllerExtension extends Extension | 
| 4 | 4 |  { | 
| 5 | - /** | |
| 6 | - * @var array | |
| 7 | - */ | |
| 8 | - private static $allowed_actions = array( | |
| 9 | - 'MakeShareDraftLink', | |
| 10 | - ); | |
| 5 | + /** | |
| 6 | + * @var array | |
| 7 | + */ | |
| 8 | + private static $allowed_actions = array( | |
| 9 | + 'MakeShareDraftLink', | |
| 10 | + ); | |
| 11 | 11 | |
| 12 | - /** | |
| 13 | - * @return mixed | |
| 14 | - */ | |
| 15 | - public function MakeShareDraftLink() | |
| 16 | -    { | |
| 17 | -        if ($member = Member::currentUser()) { | |
| 18 | -            if ($this->owner->hasMethod('CurrentPage') && $this->owner->CurrentPage()->canEdit($member)) { | |
| 19 | - return $this->owner->CurrentPage()->ShareTokenLink(); | |
| 20 | -            } elseif ($this->owner->hasMethod('canEdit') && $this->owner->canEdit($member)) { | |
| 21 | - return $this->owner->ShareTokenLink(); | |
| 22 | - } | |
| 23 | - } | |
| 12 | + /** | |
| 13 | + * @return mixed | |
| 14 | + */ | |
| 15 | + public function MakeShareDraftLink() | |
| 16 | +	{ | |
| 17 | +		if ($member = Member::currentUser()) { | |
| 18 | +			if ($this->owner->hasMethod('CurrentPage') && $this->owner->CurrentPage()->canEdit($member)) { | |
| 19 | + return $this->owner->CurrentPage()->ShareTokenLink(); | |
| 20 | +			} elseif ($this->owner->hasMethod('canEdit') && $this->owner->canEdit($member)) { | |
| 21 | + return $this->owner->ShareTokenLink(); | |
| 22 | + } | |
| 23 | + } | |
| 24 | 24 | |
| 25 | - return Security::permissionFailure(); | |
| 26 | - } | |
| 25 | + return Security::permissionFailure(); | |
| 26 | + } | |
| 27 | 27 | |
| 28 | - /** | |
| 29 | - * @return string | |
| 30 | - */ | |
| 31 | - public function getShareDraftLinkAction() | |
| 32 | -    { | |
| 33 | -        return $this->owner->Link('MakeShareDraftLink'); | |
| 34 | - } | |
| 28 | + /** | |
| 29 | + * @return string | |
| 30 | + */ | |
| 31 | + public function getShareDraftLinkAction() | |
| 32 | +	{ | |
| 33 | +		return $this->owner->Link('MakeShareDraftLink'); | |
| 34 | + } | |
| 35 | 35 | } | 
| @@ -2,12 +2,12 @@ | ||
| 2 | 2 | |
| 3 | 3 | class ShareDraftContentRequirementsExtension extends DataExtension | 
| 4 | 4 |  { | 
| 5 | - /** | |
| 6 | - * @inheritdoc | |
| 7 | - */ | |
| 8 | - public function init() | |
| 9 | -    { | |
| 10 | - Requirements::css(SHAREDRAFTCONTENT_DIR . '/css/share-component.css'); | |
| 11 | - Requirements::javascript(SHAREDRAFTCONTENT_DIR . '/javascript/main.js'); | |
| 12 | - } | |
| 5 | + /** | |
| 6 | + * @inheritdoc | |
| 7 | + */ | |
| 8 | + public function init() | |
| 9 | +	{ | |
| 10 | + Requirements::css(SHAREDRAFTCONTENT_DIR . '/css/share-component.css'); | |
| 11 | + Requirements::javascript(SHAREDRAFTCONTENT_DIR . '/javascript/main.js'); | |
| 12 | + } | |
| 13 | 13 | } | 
| @@ -1,39 +1,39 @@ | ||
| 1 | 1 | <?php | 
| 2 | 2 | /** | 
| 3 | - * Remove expired share tokens. | |
| 4 | - * | |
| 5 | - * Action to remove all expired ShareTokens from the database. | |
| 6 | - * | |
| 7 | - * To run this action the user needs admin rights. | |
| 8 | - */ | |
| 3 | + * Remove expired share tokens. | |
| 4 | + * | |
| 5 | + * Action to remove all expired ShareTokens from the database. | |
| 6 | + * | |
| 7 | + * To run this action the user needs admin rights. | |
| 8 | + */ | |
| 9 | 9 | class RemoveExpiredShareTokens extends BuildTask | 
| 10 | 10 |  { | 
| 11 | 11 | |
| 12 | - protected $title = 'Remove expired share tokens'; | |
| 12 | + protected $title = 'Remove expired share tokens'; | |
| 13 | 13 | |
| 14 | - protected $description = 'Remove all expired ShareTokens from the database'; | |
| 14 | + protected $description = 'Remove all expired ShareTokens from the database'; | |
| 15 | 15 | |
| 16 | - public function init() | |
| 17 | -    { | |
| 18 | - parent::init(); | |
| 16 | + public function init() | |
| 17 | +	{ | |
| 18 | + parent::init(); | |
| 19 | 19 | |
| 20 | -        if (!Permission::check('ADMIN')) { | |
| 21 | - return Security::permissionFailure($this); | |
| 22 | - } | |
| 23 | - } | |
| 20 | +		if (!Permission::check('ADMIN')) { | |
| 21 | + return Security::permissionFailure($this); | |
| 22 | + } | |
| 23 | + } | |
| 24 | 24 | |
| 25 | - public function run($request) | |
| 26 | -    { | |
| 27 | - $shareTokens = ShareToken::get(); | |
| 28 | - $removeCount = 0; | |
| 25 | + public function run($request) | |
| 26 | +	{ | |
| 27 | + $shareTokens = ShareToken::get(); | |
| 28 | + $removeCount = 0; | |
| 29 | 29 | |
| 30 | -        foreach ($shareTokens as $token) { | |
| 31 | -            if ($token->isExpired()) { | |
| 32 | - $token->delete(); | |
| 33 | - $removeCount++; | |
| 34 | - } | |
| 35 | - } | |
| 30 | +		foreach ($shareTokens as $token) { | |
| 31 | +			if ($token->isExpired()) { | |
| 32 | + $token->delete(); | |
| 33 | + $removeCount++; | |
| 34 | + } | |
| 35 | + } | |
| 36 | 36 | |
| 37 | - echo "Removed $removeCount expired share tokens.\n"; | |
| 38 | - } | |
| 37 | + echo "Removed $removeCount expired share tokens.\n"; | |
| 38 | + } | |
| 39 | 39 | } | 
| @@ -7,83 +7,83 @@ | ||
| 7 | 7 | */ | 
| 8 | 8 | class ShareDraftContentSiteTreeExtensionTest extends FunctionalTest | 
| 9 | 9 |  { | 
| 10 | - /** | |
| 11 | - * @var string | |
| 12 | - */ | |
| 13 | - public static $fixture_file = 'sharedraftcontent/tests/ShareDraftContentSiteTreeExtensionTest.yml'; | |
| 10 | + /** | |
| 11 | + * @var string | |
| 12 | + */ | |
| 13 | + public static $fixture_file = 'sharedraftcontent/tests/ShareDraftContentSiteTreeExtensionTest.yml'; | |
| 14 | 14 | |
| 15 | - public function testShareTokenLink() | |
| 16 | -    { | |
| 17 | - /** | |
| 18 | - * First we check if both pages generate new ShareTokenSalt values. Then we check that | |
| 19 | - * these values are not the same. | |
| 20 | - */ | |
| 15 | + public function testShareTokenLink() | |
| 16 | +	{ | |
| 17 | + /** | |
| 18 | + * First we check if both pages generate new ShareTokenSalt values. Then we check that | |
| 19 | + * these values are not the same. | |
| 20 | + */ | |
| 21 | 21 | |
| 22 | - require_once(__DIR__ . "/../_config.php"); | |
| 22 | + require_once(__DIR__ . "/../_config.php"); | |
| 23 | 23 | |
| 24 | -        Page::add_extension('ShareDraftContentSiteTreeExtension'); | |
| 24 | +		Page::add_extension('ShareDraftContentSiteTreeExtension'); | |
| 25 | 25 | |
| 26 | - /** | |
| 27 | - * @var Page $firstSharedPage | |
| 28 | - */ | |
| 29 | -        $firstSharedPage = $this->objFromFixture('Page', 'FirstSharedPage'); | |
| 26 | + /** | |
| 27 | + * @var Page $firstSharedPage | |
| 28 | + */ | |
| 29 | +		$firstSharedPage = $this->objFromFixture('Page', 'FirstSharedPage'); | |
| 30 | 30 | |
| 31 | - $firstShareLink = $firstSharedPage->ShareTokenLink(); | |
| 31 | + $firstShareLink = $firstSharedPage->ShareTokenLink(); | |
| 32 | 32 | |
| 33 | - $this->assertNotEmpty($firstSharedPage->ShareTokenSalt); | |
| 33 | + $this->assertNotEmpty($firstSharedPage->ShareTokenSalt); | |
| 34 | 34 | |
| 35 | - /** | |
| 36 | - * @var page $secondSharedPage | |
| 37 | - */ | |
| 38 | -        $secondSharedPage = $this->objFromFixture('Page', 'SecondSharedPage'); | |
| 35 | + /** | |
| 36 | + * @var page $secondSharedPage | |
| 37 | + */ | |
| 38 | +		$secondSharedPage = $this->objFromFixture('Page', 'SecondSharedPage'); | |
| 39 | 39 | |
| 40 | - $secondShareLink = $secondSharedPage->ShareTokenLink(); | |
| 40 | + $secondShareLink = $secondSharedPage->ShareTokenLink(); | |
| 41 | 41 | |
| 42 | - $this->assertNotEmpty($secondSharedPage->ShareTokenSalt); | |
| 42 | + $this->assertNotEmpty($secondSharedPage->ShareTokenSalt); | |
| 43 | 43 | |
| 44 | - $this->assertNotEquals($firstShareLink, $secondShareLink); | |
| 44 | + $this->assertNotEquals($firstShareLink, $secondShareLink); | |
| 45 | 45 | |
| 46 | - /** | |
| 47 | - * Then we get the underlying token and send a preview request. With a valid key and token, | |
| 48 | - * this will return a draft page. With an invalid key or token, this will return an expired | |
| 49 | - * link page. | |
| 50 | - */ | |
| 46 | + /** | |
| 47 | + * Then we get the underlying token and send a preview request. With a valid key and token, | |
| 48 | + * this will return a draft page. With an invalid key or token, this will return an expired | |
| 49 | + * link page. | |
| 50 | + */ | |
| 51 | 51 | |
| 52 | - $firstSharedPageToken = $firstSharedPage->ShareTokens()->first(); | |
| 52 | + $firstSharedPageToken = $firstSharedPage->ShareTokens()->first(); | |
| 53 | 53 | |
| 54 | - $this->assertNotEmpty($firstSharedPageToken); | |
| 54 | + $this->assertNotEmpty($firstSharedPageToken); | |
| 55 | 55 | |
| 56 | -        $parts = explode('/', $firstShareLink); | |
| 56 | +		$parts = explode('/', $firstShareLink); | |
| 57 | 57 | |
| 58 | - $token = array_pop($parts); | |
| 59 | - $key = array_pop($parts); | |
| 58 | + $token = array_pop($parts); | |
| 59 | + $key = array_pop($parts); | |
| 60 | 60 | |
| 61 | - $this->assertEquals($token, $firstSharedPageToken->Token); | |
| 61 | + $this->assertEquals($token, $firstSharedPageToken->Token); | |
| 62 | 62 | |
| 63 | -        $request = new SS_HTTPRequest('GET', $firstShareLink); | |
| 63 | +		$request = new SS_HTTPRequest('GET', $firstShareLink); | |
| 64 | 64 | |
| 65 | - $request->setRouteParams(array( | |
| 66 | - 'Token' => $token, | |
| 67 | - 'Key' => $key, | |
| 68 | - )); | |
| 65 | + $request->setRouteParams(array( | |
| 66 | + 'Token' => $token, | |
| 67 | + 'Key' => $key, | |
| 68 | + )); | |
| 69 | 69 | |
| 70 | - $controller = new ShareDraftController($firstSharedPage); | |
| 70 | + $controller = new ShareDraftController($firstSharedPage); | |
| 71 | 71 | |
| 72 | - $response = $controller->preview($request); | |
| 72 | + $response = $controller->preview($request); | |
| 73 | 73 | |
| 74 | -        $this->assertContains('share-draft-content-message', $response); | |
| 74 | +		$this->assertContains('share-draft-content-message', $response); | |
| 75 | 75 | |
| 76 | -        $request = new SS_HTTPRequest('GET', $firstShareLink); | |
| 76 | +		$request = new SS_HTTPRequest('GET', $firstShareLink); | |
| 77 | 77 | |
| 78 | - $request->setRouteParams(array( | |
| 79 | - 'Token' => $token, | |
| 80 | - 'Key' => '', | |
| 81 | - )); | |
| 78 | + $request->setRouteParams(array( | |
| 79 | + 'Token' => $token, | |
| 80 | + 'Key' => '', | |
| 81 | + )); | |
| 82 | 82 | |
| 83 | - $controller = new ShareDraftController($firstSharedPage); | |
| 83 | + $controller = new ShareDraftController($firstSharedPage); | |
| 84 | 84 | |
| 85 | - $response = $controller->preview($request); | |
| 85 | + $response = $controller->preview($request); | |
| 86 | 86 | |
| 87 | -        $this->assertContains('share-draft-error-page', $response); | |
| 88 | - } | |
| 87 | +		$this->assertContains('share-draft-error-page', $response); | |
| 88 | + } | |
| 89 | 89 | } | 
| @@ -7,27 +7,27 @@ | ||
| 7 | 7 | */ | 
| 8 | 8 | class ShareTokenTest extends FunctionalTest | 
| 9 | 9 |  { | 
| 10 | - /** | |
| 11 | - * @var string | |
| 12 | - */ | |
| 13 | - public static $fixture_file = 'sharedraftcontent/tests/ShareTokenTest.yml'; | |
| 10 | + /** | |
| 11 | + * @var string | |
| 12 | + */ | |
| 13 | + public static $fixture_file = 'sharedraftcontent/tests/ShareTokenTest.yml'; | |
| 14 | 14 | |
| 15 | - public function testValidForDays() | |
| 16 | -    { | |
| 17 | -        SS_Datetime::set_mock_now('2015-03-15 00:00:00'); | |
| 15 | + public function testValidForDays() | |
| 16 | +	{ | |
| 17 | +		SS_Datetime::set_mock_now('2015-03-15 00:00:00'); | |
| 18 | 18 | |
| 19 | - /** | |
| 20 | - * @var ShareToken $validToken | |
| 21 | - */ | |
| 22 | -        $validToken = $this->objFromFixture('ShareToken', 'ValidToken'); | |
| 19 | + /** | |
| 20 | + * @var ShareToken $validToken | |
| 21 | + */ | |
| 22 | +		$validToken = $this->objFromFixture('ShareToken', 'ValidToken'); | |
| 23 | 23 | |
| 24 | - $this->assertFalse($validToken->isExpired()); | |
| 24 | + $this->assertFalse($validToken->isExpired()); | |
| 25 | 25 | |
| 26 | - /** | |
| 27 | - * @var ShareToken $invalidToken | |
| 28 | - */ | |
| 29 | -        $invalidToken = $this->objFromFixture('ShareToken', 'InvalidToken'); | |
| 26 | + /** | |
| 27 | + * @var ShareToken $invalidToken | |
| 28 | + */ | |
| 29 | +		$invalidToken = $this->objFromFixture('ShareToken', 'InvalidToken'); | |
| 30 | 30 | |
| 31 | - $this->assertTrue($invalidToken->isExpired()); | |
| 32 | - } | |
| 31 | + $this->assertTrue($invalidToken->isExpired()); | |
| 32 | + } | |
| 33 | 33 | } |