<?php
/**
+ * FusionForge miscellaneous utils
*
- * utils.php - Misc utils common to all aspects of the site
+ * Copyright 1999-2001, VA Linux Systems, Inc.
+ * Copyright 2009, Roland Mas
*
- * SourceForge: Breaking Down the Barriers to Open Source Development
- * Copyright 1999-2001 (c) VA Linux Systems
- * http://sourceforge.net
+ * This file is part of FusionForge.
*
- * @version $Id$
+ * FusionForge 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 2 of the License,
+ * or (at your option) any later version.
+ *
+ * FusionForge 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 FusionForge; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/**
+ * is_utf8($string) - utf-8 detection
+ *
+ * From http://www.php.net/manual/en/function.mb-detect-encoding.php#85294
+ */
+function is_utf8($str) {
+ $c=0; $b=0;
+ $bits=0;
+ $len=strlen($str);
+ for($i=0; $i<$len; $i++){
+ $c=ord($str[$i]);
+ if($c > 128){
+ if(($c >= 254)) return false;
+ elseif($c >= 252) $bits=6;
+ elseif($c >= 248) $bits=5;
+ elseif($c >= 240) $bits=4;
+ elseif($c >= 224) $bits=3;
+ elseif($c >= 192) $bits=2;
+ else return false;
+ if(($i+$bits) > $len) return false;
+ while($bits > 1){
+ $i++;
+ $b=ord($str[$i]);
+ if($b < 128 || $b > 191) return false;
+ $bits--;
+ }
+ }
+ }
+ return true;
+}
+
+/**
+ * removeCRLF() - remove any Carriage Return-Line Feed from a string.
+ * That function is useful to remove the possibility of a CRLF Injection when sending mail
+ * All the data that we will send should be passed through that function
*
+ * @param string The string that we want to empty from any CRLF
*/
+function util_remove_CRLF($str) {
+ return strtr($str, "\015\012", ' ');
+}
/**
* util_check_fileupload() - determines if a filename is appropriate for upload
*
- * @param string The name of the file being uploaded
+ * @param array The uploaded file as returned by getUploadedFile()
*/
function util_check_fileupload($filename) {
- /* Empty file is a valid file.
- This is because this function should be called
- unconditionally at the top of submit action processing
- and many forms have optional file upload. */
- if ($filename == 'none' || $filename == '') {
- return true;
- }
+ /* Empty file is a valid file.
+ This is because this function should be called
+ unconditionally at the top of submit action processing
+ and many forms have optional file upload. */
+ if ($filename == 'none' || $filename == '') {
+ return true;
+ }
- /* This should be enough... */
- if (!is_uploaded_file($filename)) {
- return false;
- }
- /* This should be enough... */
- if (!is_uploaded_file($filename)) {
- return false;
- }
- /* ... but we'd rather be paranoic */
+ /* This should be enough... */
+ if (!is_uploaded_file($filename)) {
+ return false;
+ }
+ /* ... but we'd rather be paranoic */
if (strstr($filename, '..')) {
return false;
}
if (!file_exists($filename)) {
return false;
}
- if (dirname($filename) != '/tmp') {
+ if ((dirname($filename) != '/tmp') &&
+ (dirname($filename) != "/var/tmp")) {
return false;
}
return true;
}
/**
- * util_send_mail() - Send email
+ * util_check_url() - determines if given URL is valid.
+ *
+ * Currently, test is very basic, only the protocol is
+ * checked, allowed values are: http, https, ftp.
+ *
+ * @param string The URL
+ * @return boolean true if valid, false if not valid.
+ */
+function util_check_url($url) {
+ return (preg_match('/^(http|https|ftp):\/\//', $url) > 0);
+}
+
+/**
+ * util_send_message() - Send email
* This function should be used in place of the PHP mail() function
*
* @param string The email recipients address
* @param string The body of the email message
* @param string The optional email sender address. Defaults to 'noreply@'
* @param string The addresses to blind-carbon-copy this message
+ * @param string The optional email sender name. Defaults to ''
+ * @param boolean Whether to send plain text or html email
*
*/
-function util_send_mail($to,$subject,$body,$from='',$BCC='') {
+function util_send_message($to,$subject,$body,$from='',$BCC='',$sendername='',$extra_headers='',$send_html_email=false) {
+ global $sys_bcc_all_email_address,$sys_sendmail_path;
+
if (!$to) {
- $to='noreply@'.$GLOBALS['sys_default_domain'];
+ $to='noreply@'.forge_get_config('web_host');
}
if (!$from) {
- $from='noreply@'.$GLOBALS['sys_default_domain'];
+ $from='noreply@'.forge_get_config('web_host');
+ }
+
+
+ $charset = _('UTF-8');
+ if (!$charset) {
+ $charset = 'UTF-8';
+ }
+
+ $body2 = '';
+ if ($extra_headers) {
+ $body2 .= $extra_headers."\n";
+ }
+ $body2 .= "To: $to".
+ "\nFrom: ".util_encode_mailaddr($from,$sendername,$charset);
+ if (!empty($sys_bcc_all_email_address)) {
+ $BCC.=",$sys_bcc_all_email_address";
+ }
+ if(!empty($BCC)) {
+ $body2 .= "\nBCC: $BCC";
+ }
+ $send_html_email?$type="html":$type="plain";
+ $body2 .= "\n".util_encode_mimeheader("Subject", $subject, $charset).
+ "\nContent-type: text/$type; charset=$charset".
+ "\n\n".
+ util_convert_body($body, $charset);
+
+ if (!$sys_sendmail_path){
+ $sys_sendmail_path="/usr/sbin/sendmail";
+ }
+
+ $handle = popen($sys_sendmail_path." -f'$from' -t -i", 'w');
+ fwrite ($handle, $body2);
+ pclose($handle);
+}
+
+/**
+ * util_encode_mailaddr() - Encode email address to MIME format
+ *
+ * @param string The email address
+ * @param string The email's owner name
+ * @param string The converting charset
+ *
+ */
+function util_encode_mailaddr($email,$name,$charset) {
+ if (function_exists('mb_convert_encoding') && trim($name) != "") {
+ $name = "=?".$charset."?B?".
+ base64_encode(mb_convert_encoding(
+ $name,$charset,"UTF-8")).
+ "?=";
+ }
+
+ return $name." <".$email."> ";
+}
+
+/**
+ * util_encode_mimeheader() - Encode mimeheader
+ *
+ * @param string The name of the header (e.g. "Subject")
+ * @param string The email subject
+ * @param string The converting charset (like ISO-2022-JP)
+ * @return string The MIME encoded subject
+ *
+ */
+function util_encode_mimeheader($headername,$str,$charset) {
+ if (function_exists('mb_internal_encoding') &&
+ function_exists('mb_encode_mimeheader')) {
+ $x = mb_internal_encoding();
+ mb_internal_encoding("UTF-8");
+ $y = mb_encode_mimeheader($headername . ": " . $str,
+ $charset, "Q");
+ mb_internal_encoding($x);
+ return $y;
+ }
+
+ if (!function_exists('mb_convert_encoding')) {
+ return $headername . ": " . $str;
}
- $body = "To: $to".
- "\nFrom: $from".
- "\nBCC: $BCC".
- "\nSubject: $subject".
- "\n\n$body";
- exec ("/bin/echo \"". util_prep_string_for_sendmail($body) ."\" | /usr/sbin/sendmail -f$from -t -i >& /dev/null &");
+ return $headername . ": " . "=?".$charset."?B?".
+ base64_encode(mb_convert_encoding(
+ $str,$charset,"UTF-8")).
+ "?=";
+}
+
+/**
+ * util_convert_body() - Convert body of the email message
+ *
+ * @param string The body of the email message
+ * @param string The charset of the email message
+ * @return string The converted body of the email message
+ *
+ */
+function util_convert_body($str,$charset) {
+ if (!function_exists('mb_convert_encoding') || $charset == 'UTF-8') {
+ return $str;
+ }
+
+ return mb_convert_encoding($str,$charset,"UTF-8");
+}
+
+function util_send_jabber($to,$subject,$body) {
+ if (!$GLOBALS['sys_use_jabber']) {
+ return;
+ }
+ $JABBER = new Jabber();
+ if (!$JABBER->Connect()) {
+ echo '<br />Unable to connect';
+ return false;
+ }
+ //$JABBER->SendAuth();
+ //$JABBER->AccountRegistration();
+ if (!$JABBER->SendAuth()) {
+ echo '<br />Auth Failure';
+ $JABBER->Disconnect();
+ return false;
+ //or die("Couldn't authenticate!");
+ }
+ $JABBER->SendPresence(NULL, NULL, "online");
+
+ $body=htmlspecialchars($body);
+ $to_arr=explode(',',$to);
+ for ($i=0; $i<count($to_arr); $i++) {
+ if ($to_arr[$i]) {
+ //echo '<br />Sending Jabbers To: '.$to_arr[$i];
+ if (!$JABBER->SendMessage($to_arr[$i], "normal", NULL, array("body" => $body,"subject"=>$subject))) {
+ echo '<br />Error Sending to '.$to_arr[$i];
+ }
+ }
+ }
+
+ $JABBER->CruiseControl(2);
+ $JABBER->Disconnect();
}
/**
*
*/
function util_prep_string_for_sendmail($body) {
- //$body=str_replace("\\","\\\\",$body);
- $body=str_replace("`","\\`",$body);
+ /*$body=str_replace("`","\\`",$body);
$body=str_replace("\"","\\\"",$body);
- $body=str_replace("\$","\\\$",$body);
+ $body=str_replace("\$","\\\$",$body);*/
+ $body = escapeshellarg($body);
return $body;
}
+/**
+ * util_handle_message() - a convenience wrapper which sends messages
+ * to either a jabber account or email account or both, depending on
+ * user preferences
+ *
+ * @param array array of user_id's from the user table
+ * @param string subject of the message
+ * @param string the message body
+ * @param string a comma-separated list of email address
+ * @param string a comma-separated list of jabber address
+ * @param string From header
+ */
+function util_handle_message($id_arr,$subject,$body,$extra_emails='',$extra_jabbers='',$from='') {
+ $address=array();
+
+ if (count($id_arr) < 1) {
+
+ } else {
+ $res = db_query_params ('SELECT user_id,jabber_address,email,jabber_only FROM users WHERE user_id = ANY ($1)',
+ array (db_int_array_to_any_clause ($id_arr))) ;
+ $rows = db_numrows($res) ;
+
+ for ($i=0; $i<$rows; $i++) {
+ if (db_result($res, $i, 'user_id') == 100) {
+ // Do not send messages to "Nobody"
+ continue;
+ }
+ //
+ // Build arrays of the jabber address
+ //
+ if (db_result($res,$i,'jabber_address')) {
+ $address['jabber_address'][]=db_result($res,$i,'jabber_address');
+ if (db_result($res,$i,'jabber_only') != 1) {
+ $address['email'][]=db_result($res,$i,'email');
+ }
+ } else {
+ $address['email'][]=db_result($res,$i,'email');
+ }
+ }
+ if (isset ($address['email']) && count($address['email']) > 0) {
+ $extra_emails=implode($address['email'],',').',' . $extra_emails;
+ }
+ if (isset ($address['jabber_address']) && count($address['jabber_address']) > 0) {
+ $extra_jabbers=implode($address['jabber_address'],',').','.$extra_jabbers;
+ }
+ }
+ if ($extra_emails) {
+ util_send_message('',$subject,$body,$from,$extra_emails);
+ }
+ if ($extra_jabbers) {
+ util_send_jabber($extra_jabbers,$subject,$body);
+ }
+}
+
/**
* util_unconvert_htmlspecialchars() - Unconverts a string converted with htmlspecialchars()
* This function requires PHP 4.0.3 or greater
if (strlen($string) < 1) {
return '';
} else {
- //$trans = get_html_translation_table(HTMLENTITIES, ENT_QUOTES);
- $trans = get_html_translation_table(HTML_ENTITIES);
+ //$trans = get_html_translation_table(HTMLENTITIES, ENT_QUOTES);
+ $trans = get_html_translation_table(HTML_ENTITIES);
$trans = array_flip ($trans);
$str = strtr ($string, $trans);
return $str;
* @resturns An array
*
*/
-function util_result_column_to_array($result, $col=0) {
+function &util_result_column_to_array($result, $col=0) {
/*
Takes a result set and turns the optional column into
an array
return $arr;
}
-/**
- * resutl_column_to_array() - DEPRECATED; DO NOT USE!
- *
- * @param int The result set ID
- * @param int The column
- * @see util_result_column_to_array()
- * @deprecated
- *
- */
-function result_column_to_array($result, $col=0) {
- /*
- backwards compatibility
- */
- return util_result_column_to_array($result, $col);
-}
-
/**
* util_wrap_find_space() - Find the first space in a string
*
- * @param string The string in which to find the space
+ * @param string The string in which to find the space (must be UTF8!)
* @param int The number of characters to wrap - Default is 80
* @returns The position of the first space
*
$start=$wrap-5;
$try=1;
$found=false;
-
+
while (!$found) {
//find the first space starting at $start
$pos=@strpos($string,' ',$start);
-
+
//if that space is too far over, go back and start more to the left
if (($pos > ($wrap+5)) || !$pos) {
$try++;
$start=($wrap-($try*5));
//if we've gotten so far left , just truncate the line
- if ($start<=10) {
+ if ($start<=20) {
+ while ($wrap >= 1) {
+ $code = ord(substr($string,$wrap,1));
+ if ($code <= 0x7F ||
+ $code >= 0xC0) {
+ //Here is single byte character
+ //or head of multi byte character
+ return $wrap;
+ }
+ //Do not break multi byte character
+ $wrap--;
+ }
return $wrap;
- }
+ }
$found=false;
} else {
$found=true;
- }
- }
-
+ }
+ }
+
return $pos;
}
*/
function util_line_wrap ($text, $wrap = 80, $break = "\n") {
$paras = explode("\n", $text);
-
+
$result = array();
$i = 0;
while ($i < count($paras)) {
$i++;
} else {
$pos=util_wrap_find_space($paras[$i],$wrap);
-
+
$result[] = substr($paras[$i], 0, $pos);
-
+
$new = trim(substr($paras[$i], $pos, strlen($paras[$i]) - $pos));
if ($new != '') {
$paras[$i] = $new;
$pos=util_wrap_find_space($paras[$i],$wrap);
} else {
$i++;
- }
- }
- }
+ }
+ }
+ }
return implode($break, $result);
}
*
*/
function util_make_links ($data='') {
- if(empty($data)) { return $data; }
-
+ if(empty($data)) {
+ return $data;
+ }
$lines = split("\n",$data);
+ $newText = "";
while ( list ($key,$line) = each ($lines)) {
- // When we come here, we usually have form input
- // encoded in entities. Our aim is to NOT include
- // angle brackets in the URL
- // (RFC2396; http://www.w3.org/Addressing/URL/5.1_Wrappers.html)
+ // When we come here, we usually have form input
+ // encoded in entities. Our aim is to NOT include
+ // angle brackets in the URL
+ // (RFC2396; http://www.w3.org/Addressing/URL/5.1_Wrappers.html)
$line = str_replace('>', "\1", $line);
$line = eregi_replace("([ \t]|^)www\."," http://www.",$line);
- $text = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "<a href=\"\\1://\\2\\3\" target=\"_blank\" target=\"_new\">\\1://\\2\\3</a>", $line);
- $text = eregi_replace("(([a-z0-9_]|\\-|\\.)+@([^[:space:]]*)([[:alnum:]-]))", "<a href=\"mailto:\\1\" target=\"_new\">\\1</a>", $text);
+ $text = eregi_replace("([[:alnum:]]+)://([^[:space:]<\1]*)([[:alnum:]#?/&=])", "<a href=\"\\1://\\2\\3\" target=\"_new\">\\1://\\2\\3</a>", $line);
+ $text = eregi_replace("([[:space:]]|^)(([a-z0-9_]|\\-|\\.)+@([^[:space:]]*)([[:alnum:]-]))", "\\1<a href=\"mailto:\\2\" target=\"_new\">\\2</a>", $text);
$text = str_replace("\1", '>', $text);
$newText .= $text;
}
*
*/
function show_priority_colors_key() {
+ echo '<p /><strong> '._('Priority Colors').':</strong><br />
- echo '<P><B>Priority Colors:</B><BR>
-
- <TABLE BORDER=0><TR>';
+ <table border="0"><tr>';
- for ($i=1; $i<10; $i++) {
+ for ($i=1; $i<6; $i++) {
echo '
- <TD BGCOLOR="'.get_priority_color($i).'">'.$i.'</TD>';
+ <td class="priority'.$i.'">'.$i.'</td>';
}
echo '</tr></table>';
}
* @param int Number of options to be in the array
* @param string The name of the checkboxes
* @param array An array of boxes to be pre-checked
- *
+ *
*/
function utils_buildcheckboxarray($options,$name,$checked_array) {
$option_count=count($options);
for ($i=1; $i<=$option_count; $i++) {
echo '
- <BR><INPUT type="checkbox" name="'.$name.'" value="'.$i.'"';
+ <br /><input type="checkbox" name="'.$name.'" value="'.$i.'"';
for ($j=0; $j<$checked_count; $j++) {
if ($i == $checked_array[$j]) {
- echo ' CHECKED';
+ echo ' checked';
}
}
echo '> '.$options[$i];
}
}
+/**
+ * utils_requiredField() - Adds the required field marker
+ *
+ * @return a string holding the HTML to mark a required field
+ */
+function utils_requiredField() {
+ return '<span class="requiredfield">*</span>';
+}
+
/**
* GraphResult() - Takes a database result set and builds a graph.
* The first column should be the name, and the second column should be the values
* Be sure to include HTL_Graphs.php before using this function
- *
+ *
* @author Tim Perdue tperdue@valinux.com
* @param int The databse result set ID
* @param string The title of the graph
- *
+ *
*/
Function GraphResult($result,$title) {
$rows=db_numrows($result);
/**
* GraphIt() - Build a graph
- *
+ *
* @author Tim Perdue tperdue@valinux.com
* @param array An array of names
* @param array An array of values
$title_arr=array();
$title_arr[]=$title;
- echo html_build_list_table_top ($title_arr);
- echo '<TR><TD>';
+ echo $GLOBALS['HTML']->listTableTop ($title_arr);
+ echo '<tr><td>';
/*
Create an associate array to pass in. I leave most of it blank
*/
html_graph($name_string,$value_string,$bars,$vals);
echo '
- </TD></TR></TABLE>
+ </td></tr>
<!-- end outer graph table -->';
+ echo $GLOBALS['HTML']->listTableBottom();
}
/**
* ShowResultSet() - Show a generic result set
* Very simple, plain way to show a generic result set
*
- * @param int The result set ID
- * @param string The title of the result set
- * @param bool The option to turn URL's into links
- *
+ * @param int The result set ID
+ * @param string The title of the result set
+ * @param bool The option to turn URL's into links
+ * @param bool The option to display headers
+ * @param array The db field name -> label mapping
+ * @param array Don't display these cols
+ *
*/
-Function ShowResultSet($result,$title="Untitled",$linkify=false) {
+function ShowResultSet($result,$title='',$linkify=false,$displayHeaders=true,$headerMapping=array(), $excludedCols=array()) {
global $group_id,$HTML;
- if ($result) {
+ if($result) {
$rows = db_numrows($result);
$cols = db_numfields($result);
- echo '
- <TABLE BORDER="0" WIDTH="100%">';
-
- /* Create the title */
-
- echo '
- <TR BGCOLOR="'.$HTML->COLOR_HTMLBOX_TITLE.'">
- <TD COLSPAN="'.$cols.'"><B><FONT COLOR="'. $HTML->FONTCOLOR_HTMLBOX_TITLE .'">'.$title.'</B></TD></TR>';
+ echo '<table border="0" width="100%">';
/* Create the headers */
- echo '
- <tr>';
+ $headersCellData = array();
+ $colsToKeep = array();
for ($i=0; $i < $cols; $i++) {
- echo '<td><B>'.db_fieldname($result, $i).'</B></TD>';
+ $fieldName = db_fieldname($result, $i);
+ if(in_array($fieldName, $excludedCols)) {
+ continue;
+ }
+ $colsToKeep[] = $i;
+ if(isset($headerMapping[$fieldName])) {
+ if(is_array($headerMapping[$fieldName])) {
+ $headersCellData[] = $headerMapping[$fieldName];
+ } else {
+ $headersCellData[] = array($headerMapping[$fieldName]);
+ }
+ }
+ else {
+ $headersCellData[] = array($fieldName);
+ }
+ }
+
+ /* Create the title */
+ if(strlen($title) > 0) {
+ $titleCellData = array();
+ $titleCellData[] = array($title, 'colspan="'.count($headersCellData).'"');
+ echo $HTML->multiTableRow('', $titleCellData, TRUE);
+ }
+
+ /* Display the headers */
+ if($displayHeaders) {
+ echo $HTML->multiTableRow('', $headersCellData, TRUE);
}
- echo '</tr>';
/* Create the rows */
- for ($j = 0; $j < $rows; $j++) {
- echo '<TR BGCOLOR="'. html_get_alt_row_color($j) .'">';
+ for ($j = 0; $j < $rows; $j++) {
+ echo '<tr '. $HTML->boxGetAltRowStyle($j) . '>';
for ($i = 0; $i < $cols; $i++) {
- if ($linkify && $i == 0) {
- $link = '<A HREF="'.$PHP_SELF.'?';
- $linkend = '</A>';
- if ($linkify == "bug_cat") {
- $link .= 'group_id='.$group_id.'&bug_cat_mod=y&bug_cat_id='.db_result($result, $j, 'bug_category_id').'">';
- } else if($linkify == "bug_group") {
- $link .= 'group_id='.$group_id.'&bug_group_mod=y&bug_group_id='.db_result($result, $j, 'bug_group_id').'">';
- } else if($linkify == "patch_cat") {
- $link .= 'group_id='.$group_id.'&patch_cat_mod=y&patch_cat_id='.db_result($result, $j, 'patch_category_id').'">';
- } else if($linkify == "support_cat") {
- $link .= 'group_id='.$group_id.'&support_cat_mod=y&support_cat_id='.db_result($result, $j, 'support_category_id').'">';
- } else if($linkify == "pm_project") {
- $link .= 'group_id='.$group_id.'&project_cat_mod=y&project_cat_id='.db_result($result, $j, 'group_project_id').'">';
+ if(in_array($i, $colsToKeep)) {
+ if ($linkify && $i == 0) {
+ $link = '<a href="'.getStringFromServer('PHP_SELF').'?';
+ $linkend = '</a>';
+ if ($linkify == "bug_cat") {
+ $link .= 'group_id='.$group_id.'&bug_cat_mod=y&bug_cat_id='.db_result($result, $j, 'bug_category_id').'">';
+ } else if($linkify == "bug_group") {
+ $link .= 'group_id='.$group_id.'&bug_group_mod=y&bug_group_id='.db_result($result, $j, 'bug_group_id').'">';
+ } else if($linkify == "patch_cat") {
+ $link .= 'group_id='.$group_id.'&patch_cat_mod=y&patch_cat_id='.db_result($result, $j, 'patch_category_id').'">';
+ } else if($linkify == "support_cat") {
+ $link .= 'group_id='.$group_id.'&support_cat_mod=y&support_cat_id='.db_result($result, $j, 'support_category_id').'">';
+ } else if($linkify == "pm_project") {
+ $link .= 'group_id='.$group_id.'&project_cat_mod=y&project_cat_id='.db_result($result, $j, 'group_project_id').'">';
+ } else {
+ $link = $linkend = '';
+ }
} else {
$link = $linkend = '';
}
- } else {
- $link = $linkend = '';
+ echo '<td>'.$link . db_result($result, $j, $i) . $linkend.'</td>';
}
- echo '<td>'.$link . db_result($result, $j, $i) . $linkend.'</td>';
}
echo '</tr>';
}
*
*/
function validate_email ($address) {
- return (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $address));
+ return (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $address) !== false);
}
+/**
+ * validate_emails() - Validate a list of e-mail addresses
+ *
+ * @param string E-mail list
+ * @param char Separator
+ * @returns array Array of invalid e-mail addresses (if empty, all addresses are OK)
+*/
+function validate_emails ($addresses, $separator=',') {
+ if (strlen($addresses) == 0) return array();
+
+ $emails = explode($separator, $addresses);
+ $ret = array();
+
+ if (is_array($emails)) {
+ foreach ($emails as $email) {
+ $email = trim($email); // This is done so we can validate lists like "a@b.com, c@d.com"
+ if (!validate_email($email)) $ret[] = $email;
+ }
+ }
+ return $ret;
+}
+
+
+
/**
* util_is_valid_filename() - Verifies whether a file has a valid filename
*
*
*/
function util_is_valid_filename ($file) {
- if (ereg("[]~`! ~@#\"$%^,&*();=|[{}<>?/]",$file)) {
+ //bad char test
+ $invalidchars = eregi_replace("[-A-Z0-9+_\. ]","",$file);
+
+ if (!empty($invalidchars)) {
return false;
} else {
if (strstr($file,'..')) {
/**
* valid_hostname() - Validates a hostname string to make sure it doesn't contain invalid characters
- *
+ *
* @param string The optional hostname string
* @returns true on success/false on failur
*
}
+
+/**
+ * human_readable_bytes() - Translates an integer representing bytes to a human-readable format.
+ *
+ * Format file size in a human-readable way
+ * such as "xx Megabytes" or "xx Mo"
+ *
+ * @author Andrea Paleni <andreaSPAMLESS_AT_SPAMLESScriticalbit.com>
+ * @version 1.0
+ * @param int bytes is the size
+ * @param bool base10 enable base 10 representation, otherwise
+ * default base 2 is used
+ * @param int round number of fractional digits
+ * @param array labels strings associated to each 2^10 or
+ * 10^3(base10==true) multiple of base units
+ */
+function human_readable_bytes ($bytes, $base10=false, $round=0, $labels=array(' bytes', ' KB', ' MB', ' GB')) {
+ if ($bytes <= 0 || !is_array($labels) || (count($labels) <= 0)) {
+ return null;
+ }
+ $step = $base10 ? 3 : 10;
+ $base = $base10 ? 10 : 2;
+ $log = (int)(log10($bytes)/log10($base));
+ krsort($labels);
+ foreach ($labels as $p=>$lab) {
+ $pow = $p * $step;
+ if ($log < $pow) {
+ continue;
+ }
+ if ($lab == " MB" or $lab == " GB") {
+ $round = 2;
+ }
+ $text = round($bytes/pow($base,$pow),$round).$lab;
+ break;
+ }
+ return $text;
+}
+
+/**
+ * ls - lists a specified directory and returns an array of files
+ * @param string the path of the directory to list
+ * @param boolean whether to filter out directories and illegal filenames
+ * @return array array of file names.
+ */
+function &ls($dir,$filter=false) {
+ exec('ls -c1 '.$dir,$out);
+ if ($filter) {
+ for ($i=0; $i<count($out); $i++) {
+ if (util_is_valid_filename($out[$i]) && is_file($dir.'/'.$out[$i])) {
+ $filtered[]=$out[$i];
+ }
+ }
+ return $filtered;
+ } else {
+ return $out;
+ }
+}
+
+/**
+ * readfile_chunked() - replacement for readfile
+ *
+ * @param string The file path
+ * @param bool Whether to return bytes served or just a bool
+ *
+ */
+function readfile_chunked($filename, $returnBytes=true) {
+ $chunksize = 1*(1024*1024); // 1MB chunks
+ $buffer = '';
+ $byteCounter = 0;
+
+ $handle = fopen($filename, 'rb');
+ if ($handle === false) {
+ return false;
+ }
+
+ ob_start () ;
+ while (!feof($handle)) {
+ $buffer = fread($handle, $chunksize);
+ echo $buffer;
+ ob_flush() ;
+ flush () ;
+ if ($returnBytes) {
+ $byteCounter += strlen($buffer);
+ }
+ }
+ ob_end_flush () ;
+ $status = fclose($handle);
+ if ($returnBytes && $status) {
+ return $byteCounter; // return num. bytes delivered like readfile() does.
+ }
+ return $status;
+}
+
+/**
+ * util_is_root_dir() - Checks if a directory points to the root dir
+ * @param string Directory
+ * @return bool
+ */
+function util_is_root_dir($dir) {
+ return !preg_match('/[^\\/]/',$dir);
+}
+
+/**
+ * util_strip_accents() - Remove accents from given text.
+ * @param string Text
+ * @return string
+ */
+function util_strip_accents($text) {
+ $find = utf8_decode($text);
+ $find = strtr($find,
+ utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'),
+ 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
+ return utf8_encode($find);
+}
+
+/**
+ * Constructs the forge's URL prefix out of $GLOBALS['sys_urlprefix']
+ *
+ * @return string
+ */
+function normalized_urlprefix () {
+ $prefix = $GLOBALS['sys_urlprefix'] ;
+ $prefix = ereg_replace ("^/", "", $prefix) ;
+ $prefix = ereg_replace ("/$", "", $prefix) ;
+ $prefix = "/$prefix/" ;
+ if ($prefix == '//')
+ $prefix = '/' ;
+ return $prefix ;
+}
+
+/**
+ * Construct full URL from a relative path
+ *
+ * @param string $path
+ * @return string URL
+ */
+function util_make_url ($path) {
+ if ($GLOBALS['sys_use_ssl'])
+ $url = "https://" ;
+ else
+ $url = "http://" ;
+
+ $url .= forge_get_config('web_host') ;
+ $url .= util_make_uri ($path) ;
+ return $url ;
+}
+
+/**
+ * Construct proper (relative) URI (prepending prefix)
+ *
+ * @param string $path
+ * @return string URI
+ */
+function util_make_uri ($path) {
+ $path = ereg_replace ("^/", "", $path) ;
+ $uri = normalized_urlprefix () ;
+ $uri .= $path ;
+ return $uri ;
+}
+
+function util_make_link ($path, $text, $extra_params=false, $absolute=false) {
+ $ep = '' ;
+ if (is_array($extra_params)) {
+ foreach ($extra_params as $key => $value) {
+ $ep .= "$key=\"$value\" ";
+ }
+ }
+ if ($absolute) {
+ return '<a ' . $ep . 'href="' . $path . '">' . $text . '</a>' ;
+ } else {
+ return '<a ' . $ep . 'href="' . util_make_url ($path) . '">' . $text . '</a>' ;
+ }
+}
+
+/**
+ * Create an HTML link to a user's profile page
+ *
+ * @param string $username
+ * @param int $user_id
+ * @param string $text
+ * @return string
+ */
+function util_make_link_u ($username, $user_id,$text) {
+ return '<a href="' . util_make_url_u ($username, $user_id) . '">' . $text . '</a>' ;
+}
+
+/**
+ * Create URL for user's profile page
+ *
+ * @param string $username
+ * @param int $user_id
+ * @return string URL
+ */
+function util_make_url_u ($username, $user_id) {
+ if (isset ($GLOBALS['sys_noforcetype']) && $GLOBALS['sys_noforcetype']) {
+ return util_make_url ("/developer/?user_id=$user_id");
+ } else {
+ return util_make_url ("/users/$username/");
+ }
+}
+
+/**
+ * Create a HTML link to a project's page
+ * @param string $groupame
+ * @param int $group_id
+ * @param string $text
+ * @return string
+ */
+function util_make_link_g ($groupame, $group_id,$text) {
+ return '<a href="' . util_make_url_g ($groupame, $group_id) . '">' . $text . '</a>' ;
+}
+
+/**
+ * Create URL for a project's page
+ *
+ * @param string $groupame
+ * @param int $group_id
+ * @return string
+ */
+function util_make_url_g ($groupame, $group_id) {
+ if (isset ($GLOBALS['sys_noforcetype']) && $GLOBALS['sys_noforcetype']) {
+ return util_make_url ("/project/?group_id=$group_id");
+ } else {
+ return util_make_url ("/projects/$groupame/");
+ }
+}
+
+function util_ensure_value_in_set ($value, $set) {
+ if (in_array ($value, $set)) {
+ return $value ;
+ } else {
+ return $set[0] ;
+ }
+}
+
+function check_email_available($group, $email, &$response) {
+ // Check if a mailing list with same name already exists
+ $mlFactory = new MailingListFactory($group);
+ if (!$mlFactory || !is_object($mlFactory) || $mlFactory->isError()) {
+ $response .= $mlFactory->getErrorMessage();
+ return false;
+ }
+ $mlArray =& $mlFactory->getMailingLists();
+ if ($mlFactory->isError()) {
+ $response .= $mlFactory->getErrorMessage();
+ return false;
+ }
+ for ($j = 0; $j < count($mlArray); $j++) {
+ $currentList =& $mlArray[$j];
+ if ($email == $currentList->getName()) {
+ $response .= _('Error: a mailing list with the same email address already exists.');
+ return false;
+ }
+ }
+
+ // Check if a forum with same name already exists
+ $ff = new ForumFactory($group);
+ if (!$ff || !is_object($ff) || $ff->isError()) {
+ $response .= $ff->getErrorMessage();
+ return false;
+ }
+ $farr =& $ff->getForums();
+ $prefix = $group->getUnixName() . '-';
+ for ($j = 0; $j < count($farr); $j++) {
+ if (is_object($farr[$j])) {
+ if ($email == $prefix . $farr[$j]->getName()) {
+ $response .= _('Error: a forum with the same email address already exists.');
+ return false;
+ }
+ }
+ }
+
+ // Email is available
+ return true;
+}
+
+// array_replace_recursive only appeared in PHP 5.3.0
+if (!function_exists('array_replace_recursive')) {
+ function array_replace_recursive ($a1, $a2) {
+ $result = $a1 ;
+
+ if (!is_array ($a2)) {
+ return $a2 ;
+ }
+
+ foreach ($a2 as $k => $v) {
+ if (!is_array ($v) ||
+ !isset ($result[$k]) || !is_array ($result[$k])) {
+ $result[$k] = $v ;
+ }
+
+ $result[$k] = array_replace_recursive ($result[$k],
+ $v) ;
+ }
+
+ return $result ;
+ }
+}
+
+// Local Variables:
+// mode: php
+// c-file-style: "bsd"
+// End:
+
?>