Inserite le mail di gestione utenti ed amministratori con task annessi;
Inserito stile per commenti e form commenti; Inseriti articoli home e lato destro delle pagine in base alle visualizzazioni; Bugfix vari;
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<?php
|
||||
require_once(dirname(__FILE__). "/../load.php");
|
||||
|
||||
$tasks = array("NewsletterCheckTask");
|
||||
$tasks = array("NewsletterCheckTask","DeleteOldPasswordResetRequestsTask");
|
||||
|
||||
if (sizeof($tasks)>0){
|
||||
foreach ($tasks as $taskName){
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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.<br/><br/>";
|
||||
$tmp->body.= "Se non hai effettuato nessuna richiesta, semplicemente ignora questo messaggio.<br/><br/>";
|
||||
$tmp->body.= "Clicka sul seguente link per generare una nuova password.<br/><br/>";
|
||||
$tmp->body.='<a href="'.$confirmLink.'">'.$confirmLink.'</a>';
|
||||
|
||||
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.<br/><br/>";
|
||||
$tmp->body.='<a href="'.$confirmLink.'">'.$confirmLink.'</a>';
|
||||
|
||||
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.<br/><br/>";
|
||||
$tmp->body.= "Se non hai effettuato nessuna richiesta, semplicemente ignora questo messaggio.<br/><br/>";
|
||||
$tmp->body.= "Clicka sul seguente link per generare una nuova password.<br/><br/>";
|
||||
$tmp->body.='<a href="'.$confirmLink.'">'.$confirmLink.'</a>';
|
||||
|
||||
return new MailModel($tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
class PasswordRecoveryRequestModel extends Model{
|
||||
|
||||
public function __construct($saveableObject = null){
|
||||
parent::__construct($saveableObject);
|
||||
|
||||
if (!$this->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";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
|
||||
class DeleteOldPasswordResetRequestsTask extends Task {
|
||||
public static function getName(){
|
||||
return "deleteOldPasswordRequests";
|
||||
}
|
||||
|
||||
public static function getLabel(){
|
||||
return "Cancella le richieste di reset password scadute";
|
||||
}
|
||||
|
||||
public static function execute(){
|
||||
$requests = GlobalVariables::get("dao")->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
class GenerateAdminPasswordRecoveryMailTask extends Task {
|
||||
public static function getName(){
|
||||
return "generateAdminPasswordRecovery";
|
||||
}
|
||||
|
||||
public static function getLabel(){
|
||||
return "Genera email di recupero password per gli amministratori";
|
||||
}
|
||||
|
||||
public static function execute(){
|
||||
$requests = GlobalVariables::get("dao")->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
|
||||
class GenerateUserActivationMailTask extends Task {
|
||||
public static function getName(){
|
||||
return "generateUserActivation";
|
||||
}
|
||||
|
||||
public static function getLabel(){
|
||||
return "Genera email di attivazione utenti";
|
||||
}
|
||||
|
||||
public static function execute(){
|
||||
$users = GlobalVariables::get("dao")->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
|
||||
class GenerateUserPasswordRecoveryMailTask extends Task {
|
||||
public static function getName(){
|
||||
return "generateUserPasswordRecovery";
|
||||
}
|
||||
|
||||
public static function getLabel(){
|
||||
return "Genera email di recupero password per gli utenti";
|
||||
}
|
||||
|
||||
public static function execute(){
|
||||
$requests = GlobalVariables::get("dao")->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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");
|
||||
?>
|
||||
@@ -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");
|
||||
|
||||
@@ -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")
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
require_once(dirname(__FILE__)."/../load.php");
|
||||
|
||||
GUIHandler::generateHtmlHeaders(array(),true);
|
||||
|
||||
HTMLHelper::generateAdminHead();
|
||||
|
||||
try{
|
||||
$changed = false;
|
||||
if (!array_key_exists("req",$_GET) || strcmp("req", "")==0 || !array_key_exists("u",$_GET) || strcmp("u", "")==0){
|
||||
GUIHandler::redirect("admin/login.php");
|
||||
}
|
||||
$requestCode = $_GET['req'];
|
||||
$adminId = $_GET['u'];
|
||||
|
||||
$admin = GlobalVariables::get("dao")->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("<br/>");
|
||||
}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){
|
||||
?>
|
||||
<div>
|
||||
La password è stata modificata con successo.
|
||||
<div class="formBtns">
|
||||
<a href="login.php" >Login</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div>
|
||||
<?php
|
||||
if(strcmp($error, "")!=0){
|
||||
echo '<div style="font-size: 16px; color:red;">'.$error.'</div>';
|
||||
}
|
||||
?>
|
||||
<form id="adminConfirmForm" method="POST" action="">
|
||||
<input type="hidden" name="action" value="" />
|
||||
<div>
|
||||
<span class="label">Password</span>
|
||||
<input type="password" name="password" value="" />
|
||||
</div>
|
||||
<div>
|
||||
<span class="label">Conferma Password</span>
|
||||
<input type="password" name="password_confirm" value="" />
|
||||
</div>
|
||||
</form>
|
||||
<div class="formBtns">
|
||||
<a href="#" id="adminConfirmForm_salva" >Conferma</a>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(event){
|
||||
$("#adminConfirmForm_salva").click(function(event){
|
||||
$("form#adminConfirmForm input[type=hidden][name=action]").val("change");
|
||||
$("form#adminConfirmForm").submit();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
require_once(dirname(__FILE__)."/../load.php");
|
||||
|
||||
GUIHandler::generateHtmlHeaders(array(),true);
|
||||
|
||||
if (!AdminLoginManager::isLogged()){
|
||||
GUIHandler::redirect("admin/login.php");
|
||||
}
|
||||
else if (!AdminLoginManager::getLogged()->hasRole(AdminModel::ADMIN_TYPE_SUPERADMIN)){
|
||||
GUIHandler::redirect("admin/index.php");
|
||||
}
|
||||
|
||||
MenuGenerator::generateMenu();
|
||||
|
||||
HTMLHelper::generateAdminHead();
|
||||
|
||||
$id = PostHandler::get("id");
|
||||
if (is_null($id) || strcmp("", $id)==0){
|
||||
GUIHandler::redirect("admin/listAmministratori.php");
|
||||
}
|
||||
|
||||
$giornalista = GlobalVariables::get("dao")->getFirst("AdminModel",array("id"=>$id));
|
||||
if (is_null($giornalista)){
|
||||
GUIHandler::redirect("admin/listAmministratori.php");
|
||||
}
|
||||
|
||||
$confirm = PostHandler::get("confirm");
|
||||
if (!is_null($confirm) && strcmp("", $confirm)!=0){
|
||||
if (strcmp("true", $confirm)==0){
|
||||
$oldOne = GlobalVariables::get("dao")->getFirst("PasswordRecoveryRequestModel",array("target.class"=>"AdminModel","target.id"=>$giornalista->id));
|
||||
if (!is_null($oldOne)){
|
||||
GlobalVariables::get("dao")->delete($oldOne);
|
||||
}
|
||||
$request = PasswordRecoveryRequestModel::fromModel($giornalista);
|
||||
GlobalVariables::get("dao")->save($request);
|
||||
}
|
||||
GUIHandler::redirect("admin/listAmministratori.php");
|
||||
}
|
||||
|
||||
?>
|
||||
<div>
|
||||
<?php
|
||||
echo "Inviare una mail per il reset della password all'amministratore ".$giornalista->nome." ".$giornalista->cognome."?";
|
||||
?>
|
||||
<form id="giornalistaResetPassForm" method="POST" action="">
|
||||
<input type="hidden" name="confirm" value="" />
|
||||
<input type="hidden" name="id" value="<?php echo $id;?>" />
|
||||
</form>
|
||||
<a href="#" id="giornalistaResetPassForm_confirm" >Conferma</a>
|
||||
<a href="#" id="giornalistaResetPassForm_cancel" >Annulla</a>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(event){
|
||||
$("#giornalistaResetPassForm_confirm").click(function(event){
|
||||
$("form#giornalistaResetPassForm input[type=hidden][name=confirm]").val("true");
|
||||
$("form#giornalistaResetPassForm").submit();
|
||||
});
|
||||
$("#giornalistaResetPassForm_cancel").click(function(event){
|
||||
$("form#giornalistaResetPassForm input[type=hidden][name=confirm]").val("false");
|
||||
$("form#giornalistaResetPassForm").submit();
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
@@ -49,10 +49,12 @@ try{
|
||||
if (strcmp($validation, "accept")==0){
|
||||
$commento->status = CommentoModel::STATUS_ACCEPTED;
|
||||
GlobalVariables::get("dao")->save($commento);
|
||||
GUIHandler::redirect("admin/unacceptedCommenti.php");
|
||||
}
|
||||
else if (strcmp($validation, "reject")==0){
|
||||
$commento->status = CommentoModel::STATUS_REJECTED;
|
||||
GlobalVariables::get("dao")->save($commento);
|
||||
GUIHandler::redirect("admin/unacceptedCommenti.php");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+26
-15
@@ -80,7 +80,7 @@ try {
|
||||
// var_dump($articolo->sondaggio);
|
||||
}
|
||||
|
||||
if(array_key_exists("sendCommento", $_POST) && strcmp($_POST["sendCommento"] ,"Send")==0){
|
||||
if(array_key_exists("sendCommento", $_POST) && strcmp($_POST["sendCommento"] ,"Invia")==0){
|
||||
if(UserLoginManager::isLogged()){
|
||||
$saveable = new stdClass();
|
||||
|
||||
@@ -191,6 +191,12 @@ GUIHandler::generateHtmlHeaders(array("additionalHeaders"=>$additionalHeaders));
|
||||
</div>
|
||||
<?php }?>
|
||||
<div class="commentiContainer">
|
||||
<div class="commentiLabelContainer">
|
||||
<div class="commentiLabel">
|
||||
Commenti dei nostri lettori
|
||||
</div>
|
||||
<hr style="color:#ddd;">
|
||||
</div>
|
||||
<?php if(sizeof($commenti)>0){
|
||||
?>
|
||||
<div class="oldCommentiContainer">
|
||||
@@ -201,8 +207,7 @@ GUIHandler::generateHtmlHeaders(array("additionalHeaders"=>$additionalHeaders));
|
||||
<div class="commentoTitle"><?php echo $oldCommento->titolo;?></div>
|
||||
<div class="commentoTesto"><?php echo $oldCommento->testo;?></div>
|
||||
<div class="userInfo">
|
||||
<div class="userCommento"><span ><?php echo $utonto->nome." ".$utonto->cognome;?></span></div>
|
||||
<div class="dataCommento"><?php echo date("d/m/Y",$oldCommento->date->sec)?></div>
|
||||
<div class="userCommento">Inviato da <span class="user" ><?php echo $utonto->nome." ".$utonto->cognome;?></span> il <span class="data"><?php echo date("d/m/Y",$oldCommento->date->sec)?></span></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php }
|
||||
@@ -210,26 +215,32 @@ GUIHandler::generateHtmlHeaders(array("additionalHeaders"=>$additionalHeaders));
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
echo '<hr style="color:#ddd;">';
|
||||
if($sendComment){
|
||||
?>
|
||||
<div class="commentoInviato">Il tuo commento è stato inviato alla redazione ed è in attesa di essere accettato.</div>
|
||||
<div class="commento commentoInviato">Il tuo commento è stato inviato alla redazione ed è in attesa di essere accettato.</div>
|
||||
<?php }
|
||||
if(UserLoginManager::isLogged()){
|
||||
else if(UserLoginManager::isLogged()){
|
||||
?>
|
||||
<div id="commentoArea" class="newCommento">
|
||||
<form method="POST" id="commentoForm">
|
||||
<div class="newTitle">Titolo commento:</div>
|
||||
<textarea name="titolo" rows="2" cols="30"></textarea>
|
||||
<div>Commento:</div>
|
||||
<textarea name="commento"rows="5" cols="80"></textarea>
|
||||
<input type="hidden" name="id" value="<?php echo $articolo->id;?>" />
|
||||
<input type="submit" name="sendCommento" value="Send" />
|
||||
</form>
|
||||
<div id="commentoArea" class="commento">
|
||||
<div class="commentoTitle">
|
||||
Aggiungi il tuo commento per questa notizia
|
||||
</div>
|
||||
<div>
|
||||
<form method="POST" id="commentoForm">
|
||||
<input name="titolo" type="text" placeholder="Titolo del commento"/>
|
||||
<textarea name="commento" placeholder="Il tuo commento" rows="5" cols="80"></textarea>
|
||||
<input type="hidden" name="id" value="<?php echo $articolo->id;?>" />
|
||||
<div class="sendBtnDiv">
|
||||
<input type="submit" name="sendCommento" value="Invia" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php }
|
||||
else{
|
||||
?>
|
||||
<div class="noLogin">Effettua il <a href="#loginLink">login</a> per commentare o se non hai ancora un account <a href="#regButton">registrati</a></div>
|
||||
<div class="commento noLogin">Per commentare questa notizia <a href="#loginLink">accedi</a> all'applicazione o <a href="#regButton">registrati</a> se non hai ancora un account </div>
|
||||
<?php }
|
||||
|
||||
?>
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
require_once(dirname(__FILE__)."/load.php");
|
||||
|
||||
GUIHandler::generateHtmlHeaders();
|
||||
|
||||
try{
|
||||
if (!array_key_exists("regcode",$_GET) || strcmp("regcode", "")==0 || !array_key_exists("email",$_GET) || strcmp("email", "")==0){
|
||||
GUIHandler::redirect("index.php");
|
||||
}
|
||||
$regCode = $_GET['regcode'];
|
||||
$email = $_GET['email'];
|
||||
|
||||
if (!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/",$email)){
|
||||
GUIHandler::redirect("index.php");
|
||||
}
|
||||
|
||||
$user = GlobalVariables::get("dao")->getFirst("UserModel",array("id"=>$regCode,"email"=>$email,"active"=>false));
|
||||
|
||||
if (is_null($user)){
|
||||
GUIHandler::redirect("index.php");
|
||||
}
|
||||
|
||||
$user->active = true;
|
||||
GlobalVariables::get("dao")->save($user);
|
||||
|
||||
}catch(GUIException $ex){
|
||||
$error = $ex->getMessageMerged("<br/>");
|
||||
}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.";
|
||||
}
|
||||
?>
|
||||
<div style="width:1000px;margin-left:auto;margin-right:auto;">
|
||||
<?php
|
||||
GUIHandler::generateHeadPublic();
|
||||
GUIHandler::generateMenu();
|
||||
?>
|
||||
<div>
|
||||
<div class="passwordChange">
|
||||
<div class="title" style="text-align:center;">
|
||||
Il tuo account è stato attivato con successo
|
||||
</div>
|
||||
<div class="formBtns">
|
||||
<a href="index.php" >Home</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
GUIHandler::generateFooter();
|
||||
?>
|
||||
</div>
|
||||
+13
-2
@@ -73,10 +73,21 @@ try {
|
||||
$ristorantiNews = array_map(function($ele){$ele->testo = strip_tags($ele->testo);$ele->sottotitolo = strip_tags($ele->sottotitolo); return $ele; }, $ristorantiNews);
|
||||
}
|
||||
|
||||
$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);
|
||||
}
|
||||
if (sizeof($lastsNews)>0){
|
||||
$lastsNews = array_map(function($ele){$ele->testo = strip_tags($ele->testo);$ele->sottotitolo = strip_tags($ele->sottotitolo); return $ele; }, $lastsNews);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,15 @@ try {
|
||||
}
|
||||
else {
|
||||
$sent = true;
|
||||
$mail = FDN_MailHelper::getUserPasswordResetMail($user);
|
||||
|
||||
$oldOne = GlobalVariables::get("dao")->getFirst("PasswordRecoveryRequestModel",array("target.class"=>"UserModel","target.id"=>$user->id));
|
||||
if (!is_null($oldOne)){
|
||||
GlobalVariables::get("dao")->delete($oldOne);
|
||||
}
|
||||
$request = PasswordRecoveryRequestModel::fromModel($user);
|
||||
GlobalVariables::get("dao")->save($request);
|
||||
|
||||
// $mail = FDN_MailHelper::getUserPasswordResetMail($user);
|
||||
// GlobalVariables::get("dao")->save($mail);
|
||||
}
|
||||
|
||||
@@ -32,15 +40,22 @@ try {
|
||||
$msg = $ex->getMessage();
|
||||
$err = true;
|
||||
}catch (Exception $exec){
|
||||
$msg = LogModel::fromException($exec);
|
||||
GlobalVariables::get("dao")->save($msg);
|
||||
$model = LogModel::fromException($exec);
|
||||
GlobalVariables::get("dao")->save($model);
|
||||
$msg = "Si è verificato un errore inatteso durante l'operazione. Se il problema persiste contattaci comunicandoci il seguente codice <b>" . $model->getCode() . "</b>";
|
||||
}
|
||||
|
||||
if ($sent){
|
||||
?>
|
||||
<div style="padding:2em;">A breve riceverai una email per modificare la password!</div>
|
||||
|
||||
<?php
|
||||
if (strcmp("", $msg)!=0){
|
||||
?>
|
||||
<div style="color:red; text-align:center;"><?php echo $msg;?></div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div style="padding:2em;">A breve riceverai una email per modificare la password!</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Riccardo Di Dato
|
||||
Creation Date: 17/mar/2016
|
||||
*/
|
||||
|
||||
require_once(dirname(__FILE__)."/load.php");
|
||||
|
||||
GUIHandler::generateHtmlHeaders();
|
||||
|
||||
try{
|
||||
$changed = false;
|
||||
if (!array_key_exists("req",$_GET) || strcmp("req", "")==0 || !array_key_exists("u",$_GET) || strcmp("u", "")==0){
|
||||
GUIHandler::redirect("index.php");
|
||||
}
|
||||
$requestCode = $_GET['req'];
|
||||
$userId = $_GET['u'];
|
||||
|
||||
$user = GlobalVariables::get("dao")->getFirst("UserModel",array("id"=>$userId));
|
||||
if (is_null($user)){
|
||||
GUIHandler::redirect("index.php");
|
||||
}
|
||||
$request = GlobalVariables::get("dao")->getFirst("PasswordRecoveryRequestModel",array("id"=>$requestCode,"target.id"=>$userId,"target.class"=>"UserModel"));
|
||||
if (is_null($request)){
|
||||
GUIHandler::redirect("index.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");
|
||||
}
|
||||
$user->password = sha1($pass);
|
||||
|
||||
if ($err){
|
||||
throw $exc;
|
||||
}
|
||||
|
||||
GlobalVariables::get("dao")->delete($request);
|
||||
GlobalVariables::get("dao")->save($user);
|
||||
$changed = true;
|
||||
}
|
||||
}
|
||||
}catch(GUIException $ex){
|
||||
$error = $ex->getMessageMerged("<br/>");
|
||||
}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.";
|
||||
}
|
||||
?>
|
||||
<div style="width:1000px;margin-left:auto;margin-right:auto;">
|
||||
<?php
|
||||
GUIHandler::generateHeadPublic();
|
||||
GUIHandler::generateMenu();
|
||||
if ($changed){
|
||||
?>
|
||||
<div class="passwordChange">
|
||||
<div class="title" style="text-align:center;">
|
||||
La password è stata modificata con successo.
|
||||
</div>
|
||||
<div class="formBtns">
|
||||
<a href="index.php" >Home</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="passwordChange">
|
||||
<div class="title">
|
||||
Inserire la nuova password da utilizzare per utilizzare l'applicazione
|
||||
</div>
|
||||
<?php
|
||||
if(strcmp($error, "")!=0){
|
||||
echo '<div style="font-size: 16px; color:red;">'.$error.'</div>';
|
||||
}
|
||||
?>
|
||||
<form id="passwordChangeForm" method="POST" action="">
|
||||
<input type="hidden" name="action" value="" />
|
||||
<div class="row">
|
||||
<span class="label">Password</span>
|
||||
<input type="password" name="password" value="" />
|
||||
</div>
|
||||
<div class="row">
|
||||
<span class="label">Conferma Password</span>
|
||||
<input type="password" name="password_confirm" value="" />
|
||||
</div>
|
||||
</form>
|
||||
<div class="formBtns">
|
||||
<a href="#" id="passwordChangeForm_salva" >Conferma</a>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(event){
|
||||
$("#passwordChangeForm_salva").click(function(event){
|
||||
$("form#passwordChangeForm input[type=hidden][name=action]").val("change");
|
||||
$("form#passwordChangeForm").submit();
|
||||
});
|
||||
|
||||
$("form#passwordChangeForm input[type=password][name=password_confirm]").keypress(function(event) {
|
||||
if (event.which==13){
|
||||
$('#passwordChangeForm_salva').click();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
GUIHandler::generateFooter();
|
||||
?>
|
||||
</div>
|
||||
+63
-10
@@ -178,7 +178,7 @@ display: inline-block;
|
||||
.ansaTesto > p{margin:0px;text-align:justify;}
|
||||
|
||||
|
||||
.socialBarAnsa{margin-top:3px;border:solid #d6d6d6 1px;border-left:0px;border-right:0px;border-top:0px;padding-left:10px;}
|
||||
.socialBarAnsa{margin-top:3px;border:solid #d6d6d6 1px;border-left:0px;border-right:0px;border-top:0px;padding-left:20px;}
|
||||
.socialBarAnsa > a{margin-right:3px;display:inline-block;}
|
||||
.socialBarAnsa > a > div{display:inline-block;width:22px;height:22px;background-repeat:no-repeat;background-position:center;}
|
||||
|
||||
@@ -352,14 +352,30 @@ display: inline-block;
|
||||
.carosImage > img {vertical-align:middle; }
|
||||
|
||||
.commentiContainer{padding:5px;}
|
||||
.oldCommentiContainer{border-radius:10px;margin:5px 0px;}
|
||||
.commento{border:solid #ddd 1px;border-radius:10px;padding:5px;margin:5px 0px;}
|
||||
.userCommento{/* display:inline-block; */}
|
||||
.userCommento span {color:#5847c1;}
|
||||
.userInfo{text-align:right;padding:5px;}
|
||||
.dataCommento{font-size:14px;}
|
||||
|
||||
.oldCommentiContainer{margin:5px 0px; padding-left: 30px;}
|
||||
.commento{border: 4px solid #CFCFCF;border-radius: 15px;padding: 12px 5px 5px 20px;margin: 5px 0px;background-color: #e6e6e6;}
|
||||
.commentoTitle{font-weight:bold;}
|
||||
.commentoTesto{padding:2px 5px;}
|
||||
.commentoTesto{padding: 5px 26px;text-align: justify;}
|
||||
|
||||
.commentiLabel{display: inline-block;background-color: #cfdbe9;padding: 10px 20px;border-radius: 10px;font-style: italic;color: #222;font-weight: bold;font-size: 11pt;}
|
||||
|
||||
.userCommento{/* display:inline-block; */}
|
||||
/* .userCommento span {color:#5847c1;} */
|
||||
.userInfo{text-align: right;padding: 0 26px 3px;font-size: 9pt;font-style: italic;}
|
||||
.dataCommento{font-size:14px;}
|
||||
.userInfo .user{font-weight:bold;}
|
||||
|
||||
.commento form{width:100%;}
|
||||
.commento input[type="text"]{width: 90%;padding: 5px 10px;font-weight: bold;}
|
||||
.commento textarea{margin-left:5%;width:85%;padding: 5px 10px;resize:none;font-size: 11pt;}
|
||||
.commento form .sendBtnDiv{text-align: right;padding-right: 6%;}
|
||||
.commento form .sendBtnDiv input{padding:5px 20px;}
|
||||
.commento.noLogin{font-size: 14pt;padding-bottom: 15px;background-color: rgb(252, 252, 198);}
|
||||
.commento.noLogin a {color:#1C89C3; font-weight:bold;}
|
||||
|
||||
#commentoArea{background-color:#E0F6E5;}
|
||||
#commentoArea .commentoTitle{font-size: 10pt;padding: 0px 0px 10px;text-align: center;font-style: italic;}
|
||||
|
||||
.newCommento{padding:10px 5px;}
|
||||
.newCommento div{padding:5px 0px;}
|
||||
@@ -381,9 +397,9 @@ display: inline-block;
|
||||
.summaryRightBar{width:370px;padding:5px;vertical-align:top;display:inline-block;}
|
||||
.rightBarContainer{width:100%;height:100%;}
|
||||
|
||||
.commentoInviato, .noLogin{padding:10px;border:solid #C0C0C0 2px;margin:5px;border-radius:10px;}
|
||||
.commentoInviato{padding:10px;border:solid #C0C0C0 2px;margin:5px;border-radius:10px;}
|
||||
|
||||
.commentoInviato{color:green;text-align:center;}
|
||||
.noLogin a {color:#68A2C1;}
|
||||
|
||||
.newCommento textarea{resize:none;}
|
||||
|
||||
@@ -410,3 +426,40 @@ display: inline-block;
|
||||
|
||||
|
||||
.contattiRedazione{text-align:center;font-size:23px;padding:10px 5px;}
|
||||
|
||||
|
||||
/*
|
||||
Password Recovery
|
||||
*/
|
||||
.passwordChange{padding:20px 80px;
|
||||
background: rgb(206,236,244); /* Old browsers */
|
||||
background: -moz-linear-gradient(top, rgba(206,236,244,1) 65%, rgba(135,220,242,1) 100%); /* FF3.6-15 */
|
||||
background: -webkit-linear-gradient(top, rgba(206,236,244,1) 65%,rgba(135,220,242,1) 100%); /* Chrome10-25,Safari5.1-6 */
|
||||
background: linear-gradient(to bottom, rgba(206,236,244,1) 65%,rgba(135,220,242,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ceecf4', endColorstr='#87dcf2',GradientType=0 ); /* IE6-9 */
|
||||
}
|
||||
|
||||
.passwordChange .title{padding:0 0 25px; color:#444;}
|
||||
.passwordChange .row{padding:3px 0;}
|
||||
.passwordChange span.label{display: inline-block;text-align: right;padding-right: 5px;text-transform: uppercase;font-size: 10pt;width: 300px;color: rgb(68, 68, 68);font-weight: bold;}
|
||||
.passwordChange .row input{padding:9px 6px;}
|
||||
|
||||
.passwordChange div.formBtns{padding: 15px 0px 0px 370px;}
|
||||
|
||||
.passwordChange div.formBtns a{background: rgb(115,216,245); /* Old browsers */
|
||||
background: -moz-linear-gradient(top, rgba(115,216,245,1) 53%, rgba(66,196,239,1) 100%); /* FF3.6-15 */
|
||||
background: -webkit-linear-gradient(top, rgba(115,216,245,1) 53%,rgba(66,196,239,1) 100%); /* Chrome10-25,Safari5.1-6 */
|
||||
background: linear-gradient(to bottom, rgba(115,216,245,1) 53%,rgba(66,196,239,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#73d8f5', endColorstr='#42c4ef',GradientType=0 ); /* IE6-9 */
|
||||
padding: 5px 20px;
|
||||
border-radius: 2px 2px 2px 2px;
|
||||
color: rgb(0, 133, 185);
|
||||
font-weight: bold;
|
||||
box-shadow: 0px 0px 2px 0px;
|
||||
text-transform: uppercase;
|
||||
font-size: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user