Skip to content

Commit

Permalink
Merge e7e5e33 into 5d7b19f
Browse files Browse the repository at this point in the history
  • Loading branch information
georgehrke committed Sep 19, 2016
2 parents 5d7b19f + e7e5e33 commit 7cb0239
Show file tree
Hide file tree
Showing 21 changed files with 1,136 additions and 42 deletions.
12 changes: 11 additions & 1 deletion appinfo/application.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,25 @@ public function __construct($params=[]) {
$request = $c->query('Request');
$userSession = $c->getServer()->getUserSession();
$config = $c->getServer()->getConfig();
$mailer = $c->getServer()->getMailer();
$l10n = $c->getServer()->getL10N($c->query('AppName'));
$defaults = new \OCP\Defaults();

return new Controller\ViewController($c->getAppName(), $request, $userSession, $config);
return new Controller\ViewController($c->getAppName(), $request, $userSession, $config, $mailer, $l10n, $defaults);
});
$container->registerService('ProxyController', function(IAppContainer $c) {
$request = $c->query('Request');
$client = $c->getServer()->getHTTPClientService();

return new Controller\ProxyController($c->getAppName(), $request, $client);
});
$container->registerService('PublicController', function(IAppContainer $c) {
$request = $c->query('Request');
$userSession = $c->getServer()->getUserSession();
$config = $c->getServer()->getConfig();

return new Controller\PublicController($c->getAppName(), $request, $userSession, $config);
});
}

/**
Expand Down
5 changes: 5 additions & 0 deletions appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
'routes' => [
//Main view
['name' => 'view#index', 'url' => '/', 'verb' => 'GET'],
['name' => 'view#public_index', 'url' => '/public/{calendarid}', 'verb' => 'GET'],
// Tools
['name' => 'view#sendEmailPublicLink', 'url' => '/v1/public/sendmail', 'verb' => 'POST'],
//Timezones
['name' => 'view#get_timezone', 'url' => '/v1/timezones/{id}', 'verb' => 'GET'],
['name' => 'view#get_timezone_with_region', 'url' => '/v1/timezones/{region}/{city}', 'verb' => 'GET'],
Expand All @@ -37,5 +40,7 @@
['name' => 'contact#searchLocation', 'url' => '/v1/autocompletion/location', 'verb' => 'GET'],

['name' => 'proxy#proxy', 'url' => '/v1/proxy', 'verb' => 'GET'],
// Public
['name' => 'public#index', 'url' => '/public/{calendarid}', 'verb' => 'GET'],
]
];
123 changes: 121 additions & 2 deletions controller/viewcontroller.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,18 @@
namespace OCA\Calendar\Controller;

use OC\AppFramework\Http;
use OC\L10N\L10N;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\DataDisplayResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Defaults;
use OCP\IConfig;
use OCP\IRequest;
use OCP\IUserSession;
use OCP\Mail\IMailer;

class ViewController extends Controller {

Expand All @@ -44,17 +49,38 @@ class ViewController extends Controller {
*/
private $userSession;

/**
* @var IMailer
*/
private $mailer;

/**
* @var L10N
*/
private $l10n;

/**
* @var Defaults
*/
private $defaults;

/**
* @param string $appName
* @param IRequest $request an instance of the request
* @param IUserSession $userSession
* @param IConfig $config
* @param IMailer $mailer
* @param L10N $l10N
* @param Defaults $defaults
*/
public function __construct($appName, IRequest $request,
IUserSession $userSession, IConfig $config) {
IUserSession $userSession, IConfig $config, IMailer $mailer, L10N $l10N, Defaults $defaults) {
parent::__construct($appName, $request);
$this->config = $config;
$this->userSession = $userSession;
$this->mailer = $mailer;
$this->l10n = $l10N;
$this->defaults = $defaults;
}

/**
Expand Down Expand Up @@ -93,14 +119,50 @@ public function index() {
'weekNumbers' => $weekNumbers,
'supportsClass' => $supportsClass,
'defaultColor' => $defaultColor,
'isPublic' => false,
]);
}

/**
* @PublicPage
* @NoCSRFRequired
*
* @return TemplateResponse
*/
public function publicIndex() {
$runningOn = $this->config->getSystemValue('version');
$runningOnServer91OrLater = version_compare($runningOn, '9.1', '>=');

$supportsClass = $runningOnServer91OrLater;
$assetPipelineBroken = !$runningOnServer91OrLater;

$isAssetPipelineEnabled = $this->config->getSystemValue('asset-pipeline.enabled', false);
if ($isAssetPipelineEnabled && $assetPipelineBroken) {
return new TemplateResponse('calendar', 'main-asset-pipeline-unsupported');
}

$appVersion = $this->config->getAppValue($this->appName, 'installed_version');

$response = new TemplateResponse('calendar', 'main', [
'appVersion' => $appVersion,
'defaultView' => 'month',
'emailAddress' => '',
'supportsClass' => $supportsClass,
'isPublic' => true,
], 'public');
$response->addHeader('X-Frame-Options', 'ALLOW');
$csp = new ContentSecurityPolicy();
$csp->addAllowedScriptDomain('*');
$response->setContentSecurityPolicy($csp);

return $response;
}

/**
* @NoAdminRequired
*
* @param string $id
* @return DataDisplayResponse
* @return NotFoundResponse|DataDisplayResponse
*/
public function getTimezone($id) {
if (!in_array($id, $this->getTimezoneList())) {
Expand All @@ -117,6 +179,8 @@ public function getTimezone($id) {

/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*
* @param $region
* @param $city
Expand All @@ -129,6 +193,8 @@ public function getTimezoneWithRegion($region, $city) {

/**
* @NoAdminRequired
* @PublicPage
* @NoCSRFRequired
*
* @param $region
* @param $subregion
Expand All @@ -152,4 +218,57 @@ private function getTimezoneList() {
return (substr($file, -4) === '.ics');
}));
}

/**
* @param string $to
* @param string $url
* @param string $name
* @return JSONResponse
* @NoAdminRequired
*/
public function sendEmailPublicLink($to, $url, $name) {

$user = $this->userSession->getUser();
$username = $user->getDisplayName();

$subject = $this->l10n->t('%s has published the calendar "%s"', [$username, $name]);

$emailTemplate = new TemplateResponse('calendar', 'mail.publication', ['subject' => $subject, 'username' => $username, 'calendarname' => $name, 'calendarurl' => $url, 'defaults' => $this->defaults], 'public');
$body = $emailTemplate->render();

return $this->sendEmail($to, $subject, $body, true);
}

/**
* @param string $target
* @param string $subject
* @param string $body
* @param boolean $useHTML
* @return JSONResponse
*
* TODO : This should be moved to a Tools class
*
*/
private function sendEmail($target, $subject, $body, $useHTML = false) {
if (!$this->mailer->validateMailAddress($target)) {
return new JSONResponse([], Http::STATUS_BAD_REQUEST);
}

$sendFromDomain = $this->config->getSystemValue('mail_domain', 'domain.org');
$sendFromAddress = $this->config->getSystemValue('mail_from_address', 'owncloud');
$sendFrom = $sendFromAddress . '@' . $sendFromDomain;

$message = $this->mailer->createMessage();
$message->setSubject($subject);
$message->setFrom([$sendFrom => 'ownCloud Notifier']);
$message->setTo([$target => 'Recipient']);
if ($useHTML) {
$message->setHtmlBody($body);
} else {
$message->setPlainBody($body);
}
$this->mailer->send($message);

return new JSONResponse([], Http::STATUS_OK);
}
}
104 changes: 101 additions & 3 deletions css/app/calendarlist.css
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,8 @@
width: 80px;
}

#app-navigation .app-navigation-list-item .calendarCheckbox {
#app-navigation .app-navigation-list-item .calendarCheckbox,
#publicinformationscontainer .calendarCheckbox {
position: absolute;
margin-left: 17px;
margin-top: 16px;
Expand Down Expand Up @@ -129,7 +130,7 @@
opacity: .7 !important;
}

#app-navigation .app-navigation-list-item .utils .action:hover span {
#app-navigation .app-navigation-list-item .utils .action span:hover {
opacity: 1;
}

Expand All @@ -153,7 +154,7 @@
}

#app-navigation .app-navigation-list-item > a.calendar-list-cut-name {
padding: 0 106px 0 44px !important;
padding: 0 107px 0 44px !important;
}

#app-navigation .app-navigation-list-item .editfieldset {
Expand Down Expand Up @@ -304,6 +305,103 @@
height: 44px;
}

/* Public */

#app-navigation .davbuttons {
width: 100%;
height: 44px;
}

#app-navigation .davbuttons .button {
font-weight: normal;
padding: 8px;
width: 48%;
}

#app-navigation .davbuttons .button.first {
margin-left: 5px;
-webkit-border-radius: 3px 0 0 3px;
-ms-border-radius: 3px 0 0 3px;
border-radius: 3px 0 0 3px;
}

#app-navigation .davbuttons .button.last {
margin-left: -8px;
-webkit-border-radius: 0 3px 3px 0;
-moz-border-radius: 0 3px 3px 0;
-ms-border-radius: 0 3px 3px 0;
border-radius: 0 3px 3px 0;
}

.public-calendar-name {
font-size: 20px;
padding: 5px;
border-radius: 5px;
margin: 5px auto;
}

input.public-linkinput {
width: 94%;
margin: 6px auto;
}

#publicinformationscontainer .displayname {
padding-left: 44px !important;
}

#publicinformationscontainer .calendarCheckbox {
cursor: default;
margin-top: 5px;
}

.public-ics-download {
width: 100%;
display: block;
height: 25px;
font-weight: 300;
font-size: 14px;
cursor: pointer;
z-index: 10;
padding: 7px 0 0;
text-align: center;
background-color: rgba(240, 240, 240, .9);
border: 1px solid rgba(240, 240, 240, .9);
background-position: 5%;
border-radius: 3px;
margin: 7px auto;
}

.integration-code {
width: 93%;
height: 100px;
margin: 5px auto;
}

.public-left-side {
margin: 100px 10px auto;
}

/* Publishing */
.publishing {
margin: auto 10px;
}

.publication-tools {
cursor: pointer;
margin: 5px auto auto 5px;
}

input.mailerInput {
width: 77%;
}

.mailerInput + button {
height: 32px;
margin-right: 0;
width: 32px;
vertical-align: bottom;
}

/* Calendar Sharing */
input.shareeInput {
width: 89%;
Expand Down
Loading

0 comments on commit 7cb0239

Please sign in to comment.