<?php /******************************************************************************* * Copyright (c) 2015, 2016 Eclipse Foundation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eric Poirier (Eclipse Foundation) - initial API and implementation * Christopher Guindon (Eclipse Foundation) *******************************************************************************/ require_once("webmaster.class.php"); class MailingLists extends Webmaster{ private $default_search_table_and_name = array(); private $default_search_options = array(); private $newsgroups = NULL; private $mailing_lists = NULL; private $search_results = NULL; private $date_range = "5"; public function __construct(App $App){ parent::__construct($App); if ($this->getFormName() === 'webmaster-mailinglists') { switch ($this->getState()) { case 'create': $this->_createMailingLists(); break; case 'delete': $this->_deleteItem(); break; case 'search': $this->getSearchResults(); break; case 'date-range': $this->_setDateRange(); break; } } } private function _setDateRange() { $range = filter_var($this->App->getHTTPParameter('date-range', 'POST'), FILTER_SANITIZE_STRING); if (!empty($range)) { $this->date_range = $range; } } /** * This function returns the word selected wheter or not * an option is selected. * This helps adding the Selected parameter to <option> tags * @return string * */ public function checkSelectedOption($title, $value) { if (!empty($title) && !empty($value)) { foreach ($this->default_search_options as $option){ if ($option['title'] == $title && $option['value'] == $value) { return "selected"; } } } } /** * Get Newsgroups */ public function getNewsgroups() { if (is_null($this->newsgroups)) { $this->_fetchMailingListsOrNewsgroups('newsgroups', $this->date_range); } return $this->newsgroups; } /** * Get HTML for mailing list table * * @param array $list * @param string $table */ public function getMailingListTable($list = array(), $table = '') { $html = ''; if ($this->_isValidTable($table) && !empty($list)) { ob_start(); include('tpl/mailinglists/mailinglists-table.tpl.php'); $html = ob_get_clean(); } return $html; } /** * Get Mailing lists. */ public function getMailingLists(){ if (is_null($this->mailing_lists)) { $this->_fetchMailingListsOrNewsgroups('mailing_lists', $this->date_range); } return $this->mailing_lists; } /** * This function returns the search results * * @return array * */ public function getSearchResults() { if (is_null($this->search_results)) { $this->_searchForItems(); } return $this->search_results; } /** * This function return a list of status * @return array * */ public function getStatusList() { return array( 'approve', 'wait', 'active', 'completed', 'pending' ); } /** * This function returns the appropriate column title for the specified table * * @param $table - either mailing_lists or newgroups * * @return string * */ public function getTableTitleName($table) { $name = 'group_name'; if ($table == 'mailing_lists') { $name = 'list_name'; } return $name; } /** * Get default_search_table_and_name value */ public function getDefaultSearchTableAndName(){ return $this->default_search_table_and_name; } /** * This function adds new mailing lists or newsgroups * */ private function _createMailingLists() { $table = filter_var($this->App->getHTTPParameter('create_table', 'POST'), FILTER_SANITIZE_STRING); if ($this->_isValidTable($table)) { $project = filter_var($this->App->getHTTPParameter('create_project', 'POST'), FILTER_SANITIZE_STRING); $name = filter_var($this->App->getHTTPParameter('create_name', 'POST'), FILTER_SANITIZE_STRING); $description = filter_var($this->App->getHTTPParameter('create_description', 'POST'), FILTER_SANITIZE_STRING); // Default Message type $msg_type = "success"; // Check for any empty values if (empty($project) || empty($name) || empty($description) || $this->_itemInTable($table, $name) === TRUE || !in_array(array('ProjectID' => $project), $this->getProjects())) { $msg_type = 'danger'; } if (empty($project)) { $this->App->setSystemMessage('create_mailinglist','You must select a project.', $msg_type); } if (!empty($project) && !in_array(array('ProjectID' => $project), $this->getProjects())) { $this->App->setSystemMessage('create_mailinglist','The selected project is not part of the projects list.', $msg_type); } if (empty($name)) { $this->App->setSystemMessage('create_mailinglist','You must enter a name.', $msg_type); } if (empty($description)) { $this->App->setSystemMessage('create_mailinglist','You must enter a description.', $msg_type); } if (!empty($name) && $this->_itemInTable($table, $name) === TRUE) { $this->App->setSystemMessage('create_mailinglist',$name.' already exists in the '.$table.' table.', $msg_type); } if ($msg_type != 'danger') { $sql = ""; switch ($table) { case "mailing_lists": $sql = "INSERT INTO mailing_lists (list_name,list_description,is_private,project_id,list_short_description,create_date,created_by) VALUES ( ".$this->App->returnQuotedString($this->App->sqlSanitize($name)).", ".$this->App->returnQuotedString($this->App->sqlSanitize($description)).", 0, ".$this->App->returnQuotedString($this->App->sqlSanitize($project)).", ".$this->App->returnQuotedString($this->App->sqlSanitize($description)).", NOW(), ".$this->App->returnQuotedString("PORTAL")." )"; break; case "newsgroups": $sql = "INSERT INTO newsgroups (group_name,project_id,group_description,create_date,created_by) VALUES ( ".$this->App->returnQuotedString($this->App->sqlSanitize($name)).", ".$this->App->returnQuotedString($this->App->sqlSanitize($project)).", ".$this->App->returnQuotedString($this->App->sqlSanitize($description)).", NOW(), ".$this->App->returnQuotedString("PORTAL")." )"; break; } $result = $this->App->eclipse_sql($sql); $msg = "You have successfully created a new <strong>" . ($table == 'mailing_lists' ? "Mailing List" : "Newsgroup") . "</strong> called <strong>" . $name . "</strong>."; $this->App->setSystemMessage('create_mailinglist',$msg, $msg_type); } } } /** * This function deletes an item from a specific table * */ private function _deleteItem() { $item = filter_var($this->App->getHTTPParameter('item_to_delete', 'POST'), FILTER_SANITIZE_STRING); $table = filter_var($this->App->getHTTPParameter('item_type', 'POST'), FILTER_SANITIZE_STRING); if ($this->_isValidTable($table) && $this->_itemInTable($table, $item) === TRUE) { $item_name = $this->getTableTitleName($table); $sql = "DELETE FROM " . $table . " WHERE ". $item_name ." = " . $this->App->returnQuotedString($this->App->sqlSanitize($item)); $delete = $this->App->eclipse_sql($sql); $msg = 'You have successfully deleted <strong>' . $item . '</strong> from the <strong>'. $table .'</strong> table.'; $this->App->setSystemMessage('delete_item', $msg, 'success'); } } /** * This function fetches mailing lists of newsgroups * * @param $table - This is the table name * @param $date - Number of days to limit the query * * @return array * */ private function _fetchMailingListsOrNewsgroups($table, $range) { $lists = array(); if ($this->_isValidTable($table)) { $name = $this->getTableTitleName($table); $sql = "SELECT ". $this->App->sqlSanitize($name) ." as name, create_date, project_id, provision_status FROM " . $this->App->sqlSanitize($table) . " WHERE is_deleted = 0 AND create_date BETWEEN NOW() - INTERVAL ". $this->App->sqlSanitize($range) ." DAY AND NOW() ORDER BY create_date DESC LIMIT 2000"; $result = $this->App->eclipse_sql($sql); while ($row = mysql_fetch_array($result)) { if (is_null($row['provision_status'])){ $row['provision_status'] = 'NULL'; } $lists[$row['provision_status']][] = $row; } } $this->{$table} = $lists; return $lists; } /** * This function validates a new entry by checking for any duplicates * * @param $table - string containing the name of the table * @param $entry_name - string containing the name of the new group / mailing list * * @return bool * */ private function _itemInTable($table, $item_name) { $sql = "SELECT * FROM " . $table; $result = $this->App->eclipse_sql($sql); while ($row = mysql_fetch_array($result)) { if (in_array($item_name, $row)) { return TRUE; } } return FALSE; } /** * This function searches through a specified table for items * @return array * */ private function _searchForItems() { $table = filter_var($this->App->getHTTPParameter('search_table', 'POST'), FILTER_SANITIZE_STRING); $search_results = array(); if (!empty($table) && $this->_isValidTable($table)) { $name = $this->getTableTitleName($table); $search_options = array(); $array_item = 0; // Building the $search_options array using a loop depending on the options inserted in the search for ($i = 1; $i <= 3; $i++) { $value = filter_var($this->App->getHTTPParameter('search_'.$i, 'POST'), FILTER_SANITIZE_STRING); if (!empty($value)) { switch ($i) { case 1: $title = "project_id"; break; case 2: $title = "provision_status"; break; case 3: $title = $name; break; } $search_options[$array_item] = array( "title" => $title, "value" => filter_var($this->App->getHTTPParameter('search_'.$i, 'POST'), FILTER_SANITIZE_STRING) ); $array_item++; } } $this->_setDefaultSearchFields($table, $search_options); // Build the SQL query depending on what options were inserted in the search $sql = "SELECT ". $name ." as name, create_date, project_id, provision_status FROM " . $table; foreach ($search_options as $key => $option) { if ($key == 0) { $sql_where = " WHERE "; } if ($key >= 1) { $sql_where = " AND "; } $sql .= $sql_where . $search_options[$key]['title'] . " = " . $this->App->returnQuotedString($this->App->sqlSanitize($search_options[$key]['value'])); } $sql .= " ORDER BY create_date DESC"; $result = $this->App->eclipse_sql($sql); while ($row = mysql_fetch_array($result)) { $row['table'] = $table; $search_results[] = $row; } if (empty($search_results)) { $search_results[0]['no_results'] = "No results were found."; } } $this->search_results = $search_results; return $search_results; } /** * This function sets the default search fields * */ private function _setDefaultSearchFields($table, $search_options) { $this->default_search_table_and_name = array('table' => $table); foreach ($search_options as $option) { if ($option['title'] == 'list_name' || $option['title'] == 'group_name') { $this->default_search_table_and_name['name'] = $option['value']; } } $this->default_search_options = $search_options; } /** * This function verifies if a certain tables is part of the accepted tables * @param $table - Specified table name * @return bool * */ private function _isValidTable($table) { $accepted_tables = array( 'mailing_lists', 'newsgroups' ); if (!empty($table) && in_array($table, $accepted_tables)) { return TRUE; } if (empty($table)) { $this->App->setSystemMessage('create_mailinglist','You must select a table between Mailing lists or a Newsgroups.', 'danger'); } return FALSE; } }