diff --git a/private/crontab/core.hourly.php b/private/crontab/core.hourly.php
index b55c335..f283a68 100644
--- a/private/crontab/core.hourly.php
+++ b/private/crontab/core.hourly.php
@@ -2,7 +2,7 @@
0){
foreach ($tasks as $taskName){
diff --git a/private/crontab/core.minute.php b/private/crontab/core.minute.php
index 5d5b7cf..e69dddb 100644
--- a/private/crontab/core.minute.php
+++ b/private/crontab/core.minute.php
@@ -7,7 +7,13 @@ Creation Date: 12/gen/2016
require_once(dirname(__FILE__). "/../load.php");
-$tasks = array("MailSendTask","GenerateAdminActivationMailTask");
+$tasks = array(
+ "GenerateAdminActivationMailTask",
+ "GenerateUserActivationMailTask",
+ "GenerateAdminPasswordRecoveryMailTask",
+ "GenerateUserPasswordRecoveryMailTask",
+ "MailSendTask",
+);
if (sizeof($tasks)>0){
foreach ($tasks as $taskName){
diff --git a/private/lib/FDN_MailHelper.php b/private/lib/FDN_MailHelper.php
index 21c374e..7bf777c 100644
--- a/private/lib/FDN_MailHelper.php
+++ b/private/lib/FDN_MailHelper.php
@@ -11,6 +11,7 @@ class FDN_MailHelper {
$tmp = new stdClass();
$tmp->from = $config->emails->postmaster;
+ $tmp->fromName = "I Fatti di Napoli - Automailer";
$tmp->recipient = $admin->email;
$tmp->subject = "Attivazione account I Fatti di Napoli";
@@ -22,16 +23,63 @@ class FDN_MailHelper {
return new MailModel($tmp);
}
- public static function getAdminPasswordResetMail($admin){
+ public static function getAdminPasswordResetMail(PasswordRecoveryRequestModel $request){
+ $config = GlobalVariables::get("config");
+ $user = GlobalVariables::get("dao")->getFirst($request->target->class,array("id"=>$request->target->id));
+
+ $tmp = new stdClass();
+ $tmp->from = $config->emails->postmaster;
+ $tmp->fromName = "I Fatti di Napoli - Automailer";
+ $tmp->recipient = $user->email;
+ $tmp->subject = "I Fatti di Napoli - Recupero password";
+
+ $confirmLink = GUIHandler::getBaseUrl()."admin/passwordRecovery.php?req=".$request->id."&u=".$request->target->id;
+
+ $tmp->body = "Hai ricevuto questo messaggio perchè hai effettuato una richiesta di recupero password dal nostro sito.
";
+ $tmp->body.= "Se non hai effettuato nessuna richiesta, semplicemente ignora questo messaggio.
";
+ $tmp->body.= "Clicka sul seguente link per generare una nuova password.
";
+ $tmp->body.=''.$confirmLink.'';
+
+ return new MailModel($tmp);
}
public static function getUserConfirmMail($user){
-
+ $config = GlobalVariables::get("config");
+
+ $tmp = new stdClass();
+ $tmp->from = $config->emails->postmaster;
+ $tmp->fromName = "I Fatti di Napoli - Automailer";
+ $tmp->recipient = $user->email;
+ $tmp->subject = "Attivazione account I Fatti di Napoli";
+
+ $confirmLink = GUIHandler::getBaseUrl()."confirmUser.php?regcode=".$user->id."&email=".$user->email;
+
+ $tmp->body = "Per attivare il tuo account clicka sul link riportato in seguito o copialo e incollalo nel tuo browser.
";
+ $tmp->body.=''.$confirmLink.'';
+
+ return new MailModel($tmp);
}
- public static function getUserPasswordResetMail($user){
+ public static function getUserPasswordResetMail(PasswordRecoveryRequestModel $request){
+ $config = GlobalVariables::get("config");
+ $user = GlobalVariables::get("dao")->getFirst($request->target->class,array("id"=>$request->target->id));
+
+ $tmp = new stdClass();
+ $tmp->from = $config->emails->postmaster;
+ $tmp->fromName = "I Fatti di Napoli - Automailer";
+ $tmp->recipient = $user->email;
+ $tmp->subject = "I Fatti di Napoli - Recupero password";
+
+ $confirmLink = GUIHandler::getBaseUrl()."passwordRecovery.php?req=".$request->id."&u=".$request->target->id;
+
+ $tmp->body = "Hai ricevuto questo messaggio perchè hai effettuato una richiesta di recupero password dal nostro sito.
";
+ $tmp->body.= "Se non hai effettuato nessuna richiesta, semplicemente ignora questo messaggio.
";
+ $tmp->body.= "Clicka sul seguente link per generare una nuova password.
";
+ $tmp->body.=''.$confirmLink.'';
+
+ return new MailModel($tmp);
}
}
diff --git a/private/lib/PipelineHelper.php b/private/lib/PipelineHelper.php
index 29e4172..2e953b3 100644
--- a/private/lib/PipelineHelper.php
+++ b/private/lib/PipelineHelper.php
@@ -161,6 +161,43 @@ class PipelineHelper {
return $rval;
}
+ /**
+ * Il risultato di questa pipeline restituisce un oggetto con _id.banner contenente l'id del banner e visualizzazioni contenente il numero
+ * di visualizzazioni per oggi ordinati in modo crescente per visualizzazioni
+ * @param unknown $position
+ * @return multitype:multitype:multitype:number multitype:multitype:unknown number multitype:MongoDate multitype:multitype:multitype:number multitype:multitype:string
+ */
+ public static function getMostViewedOfLastDays($startDate,$limit = 5){
+ $rval = array(
+ array(
+ '$match'=>array(
+ 'statType'=>StatisticModel::STAT_TYPE_NOTIZIA,
+ 'date'=>array(
+ '$gte'=>new MongoDate($startDate)
+ )
+ )
+ ),
+ array(
+ '$group'=>array(
+ "_id"=>array(
+ 'notizia'=>'$content.notizia',
+ ),
+ "visualizzazioni"=>array(
+ '$sum'=>1
+ )
+ )
+ ),
+ array(
+ '$sort'=>array(
+ "visualizzazioni"=>-1
+ )
+ ),
+ array(
+ '$limit'=>$limit
+ )
+ );
+ return $rval;
+ }
}
diff --git a/private/lib/dao/lib.inclusion.php b/private/lib/dao/lib.inclusion.php
index a989814..c7981cb 100644
--- a/private/lib/dao/lib.inclusion.php
+++ b/private/lib/dao/lib.inclusion.php
@@ -37,6 +37,8 @@ require_once(dirname(__FILE__)."/models/BannerModel.php");
require_once(dirname(__FILE__)."/models/CBSQueueModel.php");
+require_once(dirname(__FILE__)."/models/PasswordRecoveryRequestModel.php");
+
$dao = new GenericDao($database->dbName,$database->connectionString);
GlobalVariables::set("dao", $dao);
diff --git a/private/lib/dao/models/PasswordRecoveryRequestModel.php b/private/lib/dao/models/PasswordRecoveryRequestModel.php
new file mode 100644
index 0000000..984d276
--- /dev/null
+++ b/private/lib/dao/models/PasswordRecoveryRequestModel.php
@@ -0,0 +1,52 @@
+hasProperty("target")){
+ throw new CoreException("Missing parameter 'target' while calling PasswordRecoveryRequestModel::__construct()");
+ }
+
+ if (!array_key_exists("class", $this->target)){
+ throw new CoreException("Missing parameter 'target.class' while calling PasswordRecoveryRequestModel::__construct()");
+ }
+
+ if (!array_key_exists("id", $this->target)){
+ throw new CoreException("Missing parameter 'target.id' while calling PasswordRecoveryRequestModel::__construct()");
+ }
+
+ if (!$this->hasProperty("date")){
+ $this->date = new MongoDate();
+ }
+
+ if (!$this->hasProperty("sent")){
+ $this->sent = false;
+ }
+ }
+
+ public static function fromModel(Model $model){
+ $buildObj = new stdClass();
+ if ($model instanceof UserModel || $model instanceof AdminModel ){
+ $buildObj->target = array();
+ $buildObj->target["class"] = get_class($model);
+ $buildObj->target["id"] = $model->id;
+
+ return new self($buildObj);
+ }
+ else {
+ throw new CoreException("Impossible to build a PasswordRecoveryRequestModel from a model of class '".get_class($model)."' in PasswordRecoveryRequestModel::fromModel()");
+ }
+ }
+
+ public static function getCollectionName(){
+ return "passwordRecovery";
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/private/lib/gui/GUIHandler.php b/private/lib/gui/GUIHandler.php
index ad0375f..a483675 100644
--- a/private/lib/gui/GUIHandler.php
+++ b/private/lib/gui/GUIHandler.php
@@ -320,10 +320,27 @@ class GUIHandler {
public static function generateRightBannerBlock(){
+ $stats = GlobalVariables::get("dao")->aggregate("StatisticModel",PipelineHelper::getMostViewedOfLastDays(strtotime("-7 days"),5));
+ $idArray = array_map(function ($ele){ return new MongoId($ele["_id"]["notizia"]);}, $stats);
+
$lastsNews = GlobalVariables::get("dao")->query("NotiziaModel",
- array("status"=>NotiziaModel::STATUS_ACCEPTED),
- array("sort"=>array("about.data"=>-1),"limit"=>5)
+ array("status"=>NotiziaModel::STATUS_ACCEPTED,"_id"=>array('$in'=>$idArray)),
+ array("sort"=>array("about.data"=>-1))
);
+
+ if (sizeof($lastsNews)<5){
+ $missing = 5-sizeof($lastsNews);
+ $add = GlobalVariables::get("dao")->query("NotiziaModel",
+ array("status"=>NotiziaModel::STATUS_ACCEPTED,"_id"=>array('$nin'=>$idArray)),
+ array("sort"=>array("about.data"=>-1),"limit"=>$missing)
+ );
+ $lastsNews = array_merge($lastsNews,$add);
+ }
+
+// $lastsNews = GlobalVariables::get("dao")->query("NotiziaModel",
+// array("status"=>NotiziaModel::STATUS_ACCEPTED),
+// array("sort"=>array("about.data"=>-1),"limit"=>5)
+// );
if (sizeof($lastsNews)>0){
$lastsNews = array_map(function($ele){$ele->testo = strip_tags($ele->testo);$ele->sottotitolo = strip_tags($ele->sottotitolo); return $ele; }, $lastsNews);
}
diff --git a/private/lib/task/DeleteOldPasswordResetRequestsTask.php b/private/lib/task/DeleteOldPasswordResetRequestsTask.php
new file mode 100644
index 0000000..641bcbd
--- /dev/null
+++ b/private/lib/task/DeleteOldPasswordResetRequestsTask.php
@@ -0,0 +1,27 @@
+query("PasswordRecoveryRequestModel",array("date"=>array( '$lte'=>new MongoDate( strtotime("-10 minutes") ) ) ) ,array("limit"=>10));
+ if(sizeof($requests)>0){
+ foreach ($requests as $request){
+ GlobalVariables::get("dao")->delete($request);
+ }
+ }
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/private/lib/task/GenerateAdminPasswordRecoveryMailTask.php b/private/lib/task/GenerateAdminPasswordRecoveryMailTask.php
new file mode 100644
index 0000000..43b5fbd
--- /dev/null
+++ b/private/lib/task/GenerateAdminPasswordRecoveryMailTask.php
@@ -0,0 +1,30 @@
+query("PasswordRecoveryRequestModel",array("sent"=>false,"target.class"=>"AdminModel"),array("limit"=>10));
+ if(sizeof($requests)>0){
+ foreach ($requests as $request){
+ $mail = FDN_MailHelper::getAdminPasswordResetMail($request);
+ GlobalVariables::get("dao")->save($mail);
+ $request->sent = true;
+ GlobalVariables::get("dao")->save($request);
+ }
+ }
+ }
+}
+
+
+?>
\ No newline at end of file
diff --git a/private/lib/task/GenerateUserActivationMailTask.php b/private/lib/task/GenerateUserActivationMailTask.php
new file mode 100644
index 0000000..6c57da4
--- /dev/null
+++ b/private/lib/task/GenerateUserActivationMailTask.php
@@ -0,0 +1,30 @@
+query("UserModel",array("activationSent"=>false),array("limit"=>10));
+ if(sizeof($users)>0){
+ foreach ($users as $user){
+ $mail = FDN_MailHelper::getUserConfirmMail($user);
+ GlobalVariables::get("dao")->save($mail);
+ $user->activationSent = true;
+ GlobalVariables::get("dao")->save($user);
+ }
+ }
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/private/lib/task/GenerateUserPasswordRecoveryMailTask.php b/private/lib/task/GenerateUserPasswordRecoveryMailTask.php
new file mode 100644
index 0000000..90e1a03
--- /dev/null
+++ b/private/lib/task/GenerateUserPasswordRecoveryMailTask.php
@@ -0,0 +1,30 @@
+query("PasswordRecoveryRequestModel",array("sent"=>false,"target.class"=>"UserModel"),array("limit"=>10));
+ if(sizeof($requests)>0){
+ foreach ($requests as $request){
+ $mail = FDN_MailHelper::getUserPasswordResetMail($request);
+ GlobalVariables::get("dao")->save($mail);
+ $request->sent = true;
+ GlobalVariables::get("dao")->save($request);
+ }
+ }
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/private/lib/task/lib.inclusion.php b/private/lib/task/lib.inclusion.php
index 98ad145..8d9157b 100644
--- a/private/lib/task/lib.inclusion.php
+++ b/private/lib/task/lib.inclusion.php
@@ -12,4 +12,11 @@ require_once(dirname(__FILE__)."/NewsletterCheckTask.php");
require_once(dirname(__FILE__)."/SendBackupTask.php");
require_once(dirname(__FILE__)."/GenerateAdminActivationMailTask.php");
+
+require_once(dirname(__FILE__)."/GenerateUserPasswordRecoveryMailTask.php");
+require_once(dirname(__FILE__)."/GenerateAdminPasswordRecoveryMailTask.php");
+
+require_once(dirname(__FILE__)."/DeleteOldPasswordResetRequestsTask.php");
+
+require_once(dirname(__FILE__)."/GenerateUserActivationMailTask.php");
?>
\ No newline at end of file
diff --git a/public/admin/editConfig.php b/public/admin/editConfig.php
index 9134764..a4242d4 100644
--- a/public/admin/editConfig.php
+++ b/public/admin/editConfig.php
@@ -20,7 +20,16 @@ MenuGenerator::generateMenu();
HTMLHelper::generateAdminHead();
-$taskList = array("MailSendTask","NewsletterCheckTask","SendBackupTask","GenerateAdminActivationMailTask");
+$taskList = array(
+ "MailSendTask",
+ "NewsletterCheckTask",
+ "SendBackupTask",
+ "GenerateAdminActivationMailTask",
+ "GenerateUserPasswordRecoveryMailTask",
+ "GenerateAdminPasswordRecoveryMailTask",
+ "DeleteOldPasswordResetRequestsTask",
+ "GenerateUserActivationMailTask"
+);
$saved = false;
$action = PostHandler::get("action");
diff --git a/public/admin/listGiornalisti.php b/public/admin/listGiornalisti.php
index 380b427..f785920 100644
--- a/public/admin/listGiornalisti.php
+++ b/public/admin/listGiornalisti.php
@@ -26,6 +26,7 @@ $columns = array(
$buttons = array(
array("icon"=>"icon-medium-blue icon-editmed","page"=>"editGiornalisti.php"),
+ array("icon"=>"icon-medium-blue icon-lockmed","page"=>"resetPassword.php"),
array("icon"=>"icon-medium-blue icon-remove","page"=>"deleteGiornalisti.php")
);
diff --git a/public/admin/passwordRecovery.php b/public/admin/passwordRecovery.php
new file mode 100644
index 0000000..1cf7146
--- /dev/null
+++ b/public/admin/passwordRecovery.php
@@ -0,0 +1,108 @@
+getFirst("AdminModel",array("id"=>$adminId));
+ if (is_null($admin)){
+ GUIHandler::redirect("admin/login.php");
+ }
+ $request = GlobalVariables::get("dao")->getFirst("PasswordRecoveryRequestModel",array("id"=>$requestCode,"target.id"=>$adminId,"target.class"=>"AdminModel"));
+ if (is_null($request)){
+ GUIHandler::redirect("admin/login.php");
+ }
+
+ $action = PostHandler::get("action");
+ if (!is_null($action) && strcmp("", $action)!=0){
+ if (strcmp("change", $action)==0){
+ $err = false;
+ $exc = new GUIException(array());
+
+ // Validate Password
+ $pass = trim(PostHandler::get("password"));
+ if (strcmp($pass,"")==0){
+ $err = true;
+ $exc->addMessage("Inserire una nuova password");
+ }
+ if (strcmp($pass,PostHandler::get("password_confirm"))!=0){
+ $err = true;
+ $exc->addMessage("Le password inserite non coincidono");
+ }
+ $admin->password = sha1($pass);
+
+ if ($err){
+ throw $exc;
+ }
+
+ GlobalVariables::get("dao")->delete($request);
+ GlobalVariables::get("dao")->save($admin);
+ $changed = true;
+ GUIHandler::redirect("admin/login.php");
+ }
+ }
+}catch(GUIException $ex){
+ $error = $ex->getMessageMerged("
");
+}catch (Exception $exec){
+ LoggingFacilityManager::getLogger("gui")->log(LoggingFacility::$LEVEL_ERROR, $exec->getMessage());
+ $error = "Si è verificato un errore inaspettato durante l'esecuzione della pagina. Se l'errore persiste contattare il supporto tecnico.";
+}
+
+if ($changed){
+ ?>
+
+