for more details. * * Copyright 2007-2009 Rejo Zenger * Copyright 2010-2014 Poweradmin Development Team * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * Toolkit functions * * @package Poweradmin * @copyright 2007-2010 Rejo Zenger * @copyright 2010-2014 Poweradmin Development Team * @license http://opensource.org/licenses/GPL-3.0 GPL */ // Fix for Strict Standards: Non-static method PEAR::setErrorHandling() should not be called statically // TODO: remove after PEAR::MDB2 replacement with PDO ini_set('error_reporting', E_ALL & ~ (E_NOTICE | E_STRICT)); // TODO: display elapsed time and memory consumption, // used to check improvements in refactored version $display_stats = false; if ($display_stats) include('inc/benchmark.php'); ob_start(); require_once("error.inc.php"); if (!function_exists('session_start')) die(error('You have to install PHP session extension!')); if (!function_exists('_')) die(error('You have to install PHP gettext extension!')); if (!function_exists('mcrypt_encrypt')) die(error('You have to install PHP mcrypt extension!')); session_start(); include_once("config-me.inc.php"); if (!@include_once("config.inc.php")) { error(_('You have to create a config.inc.php!')); } /* * *********** * Constants * * *********** */ if (isset($_GET["start"])) { define('ROWSTART', (($_GET["start"] - 1) * $iface_rowamount)); } else { /** Starting row */ define('ROWSTART', 0); } if (isset($_GET["letter"])) { define('LETTERSTART', $_GET["letter"]); $_SESSION["letter"] = $_GET["letter"]; } elseif (isset($_SESSION["letter"])) { define('LETTERSTART', $_SESSION["letter"]); } else { /** Starting letter */ define('LETTERSTART', "a"); } if (isset($_GET["zone_sort_by"]) && preg_match("/^[a-z_]+$/", $_GET["zone_sort_by"])) { define('ZONE_SORT_BY', $_GET["zone_sort_by"]); $_SESSION["zone_sort_by"] = $_GET["zone_sort_by"]; } elseif (isset($_POST["zone_sort_by"]) && preg_match("/^[a-z_]+$/", $_POST["zone_sort_by"])) { define('ZONE_SORT_BY', $_POST["zone_sort_by"]); $_SESSION["zone_sort_by"] = $_POST["zone_sort_by"]; } elseif (isset($_SESSION["zone_sort_by"])) { define('ZONE_SORT_BY', $_SESSION["zone_sort_by"]); } else { /** Field to sort zone by */ define('ZONE_SORT_BY', "name"); } if (isset($_SESSION["userlang"])) { $iface_lang = $_SESSION["userlang"]; } if (isset($_GET["record_sort_by"]) && preg_match("/^[a-z_]+$/", $_GET["record_sort_by"])) { define('RECORD_SORT_BY', $_GET["record_sort_by"]); $_SESSION["record_sort_by"] = $_GET["record_sort_by"]; } elseif (isset($_POST["record_sort_by"]) && preg_match("/^[a-z_]+$/", $_POST["record_sort_by"])) { define('RECORD_SORT_BY', $_POST["record_sort_by"]); $_SESSION["record_sort_by"] = $_POST["record_sort_by"]; } elseif (isset($_SESSION["record_sort_by"])) { define('RECORD_SORT_BY', $_SESSION["record_sort_by"]); } else { /** Record to sort zone by */ define('RECORD_SORT_BY', "name"); } $valid_tlds = array("ac", "academy", "actor", "ad", "ae", "aero", "af", "ag", "agency", "ai", "al", "am", "an", "ao", "aq", "ar", "arpa", "as", "asia", "at", "au", "aw", "ax", "az", "ba", "bar", "bargains", "bb", "bd", "be", "berlin", "best", "bf", "bg", "bh", "bi", "bid", "bike", "biz", "bj", "blue", "bm", "bn", "bo", "boutique", "br", "bs", "bt", "build", "builders", "buzz", "bv", "bw", "by", "bz", "ca", "cab", "camera", "camp", "cards", "careers", "cat", "catering", "cc", "cd", "center", "ceo", "cf", "cg", "ch", "cheap", "christmas", "ci", "ck", "cl", "cleaning", "clothing", "club", "cm", "cn", "co", "codes", "coffee", "com", "community", "company", "computer", "condos", "construction", "contractors", "cool", "coop", "cr", "cruises", "cu", "cv", "cw", "cx", "cy", "cz", "dance", "dating", "de", "democrat", "diamonds", "directory", "dj", "dk", "dm", "do", "domains", "dz", "ec", "edu", "education", "ee", "eg", "email", "enterprises", "equipment", "er", "es", "estate", "et", "eu", "events", "expert", "exposed", "farm", "fi", "fish", "fj", "fk", "flights", "florist", "fm", "fo", "foundation", "fr", "futbol", "ga", "gallery", "gb", "gd", "ge", "gf", "gg", "gh", "gi", "gift", "gl", "glass", "gm", "gn", "gov", "gp", "gq", "gr", "graphics", "gs", "gt", "gu", "guitars", "guru", "gw", "gy", "hk", "hm", "hn", "holdings", "holiday", "house", "hr", "ht", "hu", "id", "ie", "il", "im", "immobilien", "in", "industries", "info", "institute", "int", "international", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jobs", "jp", "kaufen", "ke", "kg", "kh", "ki", "kim", "kitchen", "kiwi", "km", "kn", "koeln", "kp", "kr", "kred", "kw", "ky", "kz", "la", "land", "lb", "lc", "li", "lighting", "limo", "link", "lk", "lr", "ls", "lt", "lu", "luxury", "lv", "ly", "ma", "maison", "management", "mango", "marketing", "mc", "md", "me", "menu", "mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo", "mobi", "moda", "monash", "mp", "mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx", "my", "mz", "na", "nagoya", "name", "nc", "ne", "net", "neustar", "nf", "ng", "ni", "ninja", "nl", "no", "np", "nr", "nu", "nz", "okinawa", "om", "onl", "org", "pa", "partners", "parts", "pe", "pf", "pg", "ph", "photo", "photography", "photos", "pics", "pink", "pk", "pl", "plumbing", "pm", "pn", "post", "pr", "pro", "productions", "properties", "ps", "pt", "pub", "pw", "py", "qa", "qpon", "re", "recipes", "red", "rentals", "repair", "report", "reviews", "rich", "ro", "rs", "ru", "ruhr", "rw", "sa", "sb", "sc", "sd", "se", "sexy", "sg", "sh", "shiksha", "shoes", "si", "singles", "sj", "sk", "sl", "sm", "sn", "so", "social", "solar", "solutions", "sr", "st", "su", "supplies", "supply", "support", "sv", "sx", "sy", "systems", "sz", "tattoo", "tc", "td", "technology", "tel", "tf", "tg", "th", "tienda", "tips", "tj", "tk", "tl", "tm", "tn", "to", "today", "tokyo", "tools", "tp", "tr", "training", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "uno", "us", "uy", "uz", "va", "vacations", "vc", "ve", "ventures", "vg", "vi", "viajes", "villas", "vision", "vn", "vote", "voting", "voto", "voyage", "vu", "wang", "watch", "wed", "wf", "wien", "wiki", "works", "ws", "xn--3bst00m", "xn--3ds443g", "xn--3e0b707e", "xn--45brj9c", "xn--55qw42g", "xn--55qx5d", "xn--6frz82g", "xn--6qq986b3xl", "xn--80ao21a", "xn--80asehdb", "xn--80aswg", "xn--90a3ac", "xn--c1avg", "xn--cg4bki", "xn--clchc0ea0b2g2a9gcd", "xn--d1acj3b", "xn--fiq228c5hs", "xn--fiq64b", "xn--fiqs8s", "xn--fiqz9s", "xn--fpcrj9c3d", "xn--fzc2c9e2c", "xn--gecrj9c", "xn--h2brj9c", "xn--i1b6b1a6a2e", "xn--io0a7i", "xn--j1amh", "xn--j6w193g", "xn--kprw13d", "xn--kpry57d", "xn--l1acc", "xn--lgbbat1ad8j", "xn--mgb9awbf", "xn--mgba3a4f16a", "xn--mgbaam7a8h", "xn--mgbab2bd", "xn--mgbayh7gpa", "xn--mgbbh1a71e", "xn--mgbc0a9azcg", "xn--mgberp4a5d4ar", "xn--mgbx4cd0ab", "xn--ngbc5azd", "xn--nqv7f", "xn--nqv7fs00ema", "xn--o3cw4h", "xn--ogbpf8fl", "xn--p1ai", "xn--pgbs0dh", "xn--q9jyb4c", "xn--s9brj9c", "xn--unup4y", "xn--wgbh1c", "xn--wgbl6a", "xn--xkc2al3hye2a", "xn--xkc2dl3a5ee0h", "xn--yfro4i67o", "xn--ygbi2ammx", "xn--zfr164b", "xxx", "xyz", "ye", "yt", "za", "zm", "zone", "zw"); // Special TLDs for testing and documentation purposes // http://tools.ietf.org/html/rfc2606#section-2 array_push($valid_tlds, 'test', 'example', 'invalid', 'localhost'); /* Database connection */ require_once("database.inc.php"); // Generates $db variable to access database. // Array of the available zone types $server_types = array("MASTER", "SLAVE", "NATIVE"); // $rtypes - array of possible record types $rtypes = array( 'A', 'AAAA', 'AFSDB', 'CERT', 'CNAME', 'DHCID', 'DLV', 'DNSKEY', 'DS', 'EUI48', 'EUI64', 'HINFO', 'IPSECKEY', 'KEY', 'KX', 'LOC', 'MINFO', 'MR', 'MX', 'NAPTR', 'NS', 'NSEC', 'NSEC3', 'NSEC3PARAM', 'OPT', 'PTR', 'RKEY', 'RP', 'RRSIG', 'SOA', 'SPF', 'SRV', 'SSHFP', 'TLSA', 'TSIG', 'TXT', 'WKS', ); // If fancy records is enabled, extend this field. if ($dns_fancy) { $rtypes[] = 'URL'; $rtypes[] = 'MBOXFW'; $rtypes[] = 'CURL'; } /* * *********** * Includes * * *********** */ require_once("i18n.inc.php"); require_once("auth.inc.php"); require_once("users.inc.php"); require_once("dns.inc.php"); require_once("record.inc.php"); require_once("dnssec.inc.php"); require_once("templates.inc.php"); $db = dbConnect(); doAuthenticate(); /* * *********** * Functions * * *********** */ /** Print paging menu * * Display the page option: [ < ][ 1 ] .. [ 8 ][ 9 ][ 10 ][ 11 ][ 12 ][ 13 ][ 14 ][ 15 ][ 16 ] .. [ 34 ][ > ] * * @param int $amount Total number of items * @param int $rowamount Per page number of items * @param int $id Page specific ID (Zone ID, Template ID, etc) * * @return null */ function show_pages($amount, $rowamount, $id = '') { if ($amount > $rowamount) { $num = 8; $poutput = ''; $lastpage = ceil($amount / $rowamount); $startpage = 1; if (!isset($_GET["start"])) $_GET["start"] = 1; $start = $_GET["start"]; if ($lastpage > $num & $start > ($num / 2)) { $startpage = ($start - ($num / 2)); } echo _('Show page') . ":
"; if ($lastpage > $num & $start > 1) { $poutput .= ' 2) $poutput .= ' .. '; } for ($i = $startpage; $i <= min(($startpage + $num), $lastpage); $i++) { if ($start == $i) { $poutput .= '[ ' . $i . ' ]'; } elseif ($i != $lastpage & $i != 1) { $poutput .= ' $num & $start < $lastpage) { $poutput .= '"; $letter = "[[:digit:]]"; if ($letterstart == "1") { echo "[ 0-9 ] "; } elseif (zone_letter_start($letter, $userid)) { echo "[ 0-9 ] "; } else { echo "[ 0-9 ] "; } foreach (range('a', 'z') as $letter) { if ($letter == $letterstart) { echo "[ " . $letter . " ] "; } elseif (zone_letter_start($letter, $userid)) { echo "[ " . $letter . " ] "; } else { echo "[ " . $letter . " ] "; } } if ($letterstart == '_') { echo "[ _ ] "; } elseif (zone_letter_start('_', $userid)) { echo "[ _ ] "; } else { echo "[ _ ] "; } if ($letterstart == 'all') { echo "[ Show all ]"; } else { echo "[ Show all ] "; } } /** Check if any zones start with letter * * @param string $letter Starting Letter * @param boolean $userid unknown usage * * @return int 1 if rows found, 0 otherwise */ function zone_letter_start($letter, $userid = true) { global $db; global $sql_regexp; $query = "SELECT domains.id AS domain_id, zones.owner, domains.name AS domainname FROM domains LEFT JOIN zones ON domains.id=zones.domain_id WHERE substring(domains.name,1,1) " . $sql_regexp . " " . $db->quote("^" . $letter, 'text'); $db->setLimit(1); $result = $db->queryOne($query); return ($result ? 1 : 0); } /** Print success message (toolkit.inc) * * @param string $msg Success message * * @return null */ function success($msg) { if ($msg) { echo "
" . $msg . "
\n"; } else { echo "
" . _('Something has been successfully performed. What exactly, however, will remain a mystery.') . "
\n"; } } /** Print message * * Something has been done nicely, display a message and a back button. * * @param string $msg Message * * @return null */ function message($msg) { include_once("header.inc.php"); ?>



<<

" . _('Inactive') . ""; } elseif ($res == '1') { return "" . _('Active') . ""; } } /** Validate email address string * * @param string $address email address string * * @return boolean true if valid, false otherwise */ function is_valid_email($address) { $fields = preg_split("/@/", $address, 2); if ((!preg_match("/^[0-9a-z]([-_.]?[0-9a-z])*$/i", $fields[0])) || (!isset($fields[1]) || $fields[1] == '' || !is_valid_hostname_fqdn($fields[1], 0))) { return false; } return true; } /** Validate numeric string * * @param string $string number * * @return boolean true if number, false otherwise */ function v_num($string) { if (!preg_match("/^[0-9]+$/i", $string)) { return false; } else { return true; } } /** Debug print * * @param string $var debug statement * * @return null */ function debug_print($var) { echo "
\n";
    if (is_array($var)) {
        print_r($var);
    } else {
        echo $var;
    }
    echo "
\n"; } /** Set timezone (required for PHP5) * * Set timezone to configured tz or UTC it not set * * @return null */ function set_timezone() { global $timezone; if (function_exists('date_default_timezone_set')) { if (isset($timezone)) { date_default_timezone_set($timezone); } else if (!ini_get('date.timezone')) { date_default_timezone_set('UTC'); } } } /** Generate random salt for encryption * * @param int $len salt length (default=5) * * @return string salt string */ function generate_salt($len = 5) { $valid_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@#$%^*()_-!'; $valid_len = strlen($valid_characters) - 1; $salt = ""; for ($i = 0; $i < $len; $i++) { $salt .= $valid_characters[rand(0, $valid_len)]; } return $salt; } /** Extract salt from password * * @param string $password salted password * * @return string salt */ function extract_salt($password) { return substr(strchr($password, ':'), 1); } /** Generate salted password * * @param string $salt salt * @param string $pass password * * @return string salted password */ function mix_salt($salt, $pass) { return md5($salt . $pass) . ':' . $salt; } /** Generate random salt and salted password * * @param string $pass password * * @return salted password */ function gen_mix_salt($pass) { $salt = generate_salt(); return mix_salt($salt, $pass); } function do_log($syslog_message,$priority){ global $syslog_use, $syslog_ident, $syslog_facility; if ($syslog_use) { openlog($syslog_ident, LOG_PERROR, $syslog_facility); syslog($priority, $syslog_message); closelog(); } } function log_error($syslog_message) { do_log($syslog_message,LOG_ERR); } function log_warn($syslog_message) { do_log($syslog_message,LOG_WARNING); } function log_notice($syslog_message) { do_log($syslog_message,LOG_NOTICE); } function log_info($syslog_message) { do_log($syslog_message,LOG_INFO); }