Changeset 21 in subversion


Ignore:
Timestamp:
Oct 7, 2005 10:17:08 AM (8 years ago)
Author:
roundcube
Message:

Several bugfixes and feature improvements

Location:
trunk/roundcubemail
Files:
3 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/CHANGELOG

    r20 r21  
    2727 
    2828 
    29 2005/10/04 
     292005/10/09 
    3030---------- 
    31 - Added French, Italian, Spanish, Danish translation 
     31- Added French, Italian, Spanish, Danish, Dutch translation 
     32- Clearified license (Bug #1305966) 
    3233- Fixed PHP warnings (Bug #1299403) 
    3334- Fixed english translation bug #1295406 
    3435- Fixed bug #1290833: Last character of email not seen 
     36- Fixed bug #1292199 when creating new user 
     37- Allow more borwsers (Bug #1285101) 
    3538- Added setting for showing pretty dates 
    3639- Added support for SQLite database 
     
    3841- Also add attachments when forwarding a message 
    3942- Show nested mailboxes hieracically 
     43- Enable IMAPS by host 
  • trunk/roundcubemail/INSTALL

    r16 r21  
    77   - /temp 
    88   - /logs 
    9 3. Rename the files config/*.inc.php.dist to config/*.inc.php 
    10 4. Modify the files in config/* to suit your local environment 
    11 5. Create database tables using the queries in file 'SQL/*.initial.sql' 
    12    Rename tables if you like, but make shure the names are also changed in config/db.inc.php 
    13 6. Done! 
     93. Create a new database and a database user for RoundCube 
     104. Create database tables using the queries in file 'SQL/*.initial.sql' 
     115. Rename the files config/*.inc.php.dist to config/*.inc.php 
     126. Modify the files in config/* to suit your local environment 
     137. Done! 
     14 
     15 
     16UPGRADING 
     17========= 
     18If you already have a previous version of RoundCube installed, 
     19please refer to the instructions in UPGRADING guide. 
    1420 
    1521 
     
    2329   - error_reporting E_ALL & ~E_NOTICE (or lower) 
    2430   - file_uploads on (for attachment upload features) 
    25 * A MySQL or Postgres database engine 
     31* A MySQL or PostgreSQL database engine or the SQLite extension for PHP 
    2632* A database with permission to create tables 
    2733 
  • trunk/roundcubemail/SQL/mysql.initial.sql

    r13 r21  
    7272  `created` datetime NOT NULL default '0000-00-00 00:00:00', 
    7373  `changed` datetime NOT NULL default '0000-00-00 00:00:00', 
     74  `ip` VARCHAR(15) NOT NULL default '', 
    7475  `vars` text NOT NULL, 
    7576  PRIMARY KEY  (`sess_id`) 
     
    8586  `user_id` int(10) unsigned NOT NULL auto_increment, 
    8687  `username` varchar(128) NOT NULL default '', 
    87   `mail_host` varchar(255) NOT NULL default '', 
     88  `mail_host` varchar(128) NOT NULL default '', 
     89  `alias` varchar(128) NOT NULL default '', 
    8890  `created` datetime NOT NULL default '0000-00-00 00:00:00', 
    8991  `last_login` datetime NOT NULL default '0000-00-00 00:00:00', 
  • trunk/roundcubemail/SQL/postgres.initial.sql

    r13 r21  
    148148    username character varying(128) DEFAULT ''::character varying NOT NULL, 
    149149    mail_host character varying(128) DEFAULT ''::character varying NOT NULL, 
     150    alias character varying(128) DEFAULT ''::character varying NOT NULL, 
    150151    created timestamp with time zone DEFAULT now() NOT NULL, 
    151152    last_login timestamp with time zone DEFAULT now() NOT NULL, 
  • trunk/roundcubemail/UPGRADING

    r11 r21  
    1010---------------------------------------- 
    1111- replace all files in folder /program/ 
     12- rund SQL queries in order to update the database 
    1213- add these line to /config/main.inc.php 
    1314  $rcmail_config['trash_mbox'] = 'Trash'; 
     
    1617  $rcmail_config['prettydate'] = TRUE; 
    1718  $rcmail_config['smtp_port'] = 25; 
     19  $rcmail_config['default_port'] = 143; 
     20- replace database properties (db_type, db_host, db_user, db_pass, $d_name) 
     21  in /config/db.inc.php with the following line: 
     22  $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail'; 
    1823 
    1924 
     
    2126---------------------------------------- 
    2227- replace all files in folder /program/ 
     28- rund SQL queries in order to update the database 
    2329- add these line to /config/main.inc.php 
    2430  $rcmail_config['prettydate'] = TRUE; 
    2531  $rcmail_config['smtp_port'] = 25; 
     32  $rcmail_config['default_port'] = 143; 
     33- replace database properties (db_type, db_host, db_user, db_pass, $d_name) 
     34  in /config/db.inc.php with the following line: 
     35  $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail'; 
     36   
  • trunk/roundcubemail/config/db.inc.php.dist

    r16 r21  
    1616 
    1717// PEAR database DSN for read/write operations 
    18 //format is db_provider://user:password@host/databse 
     18// format is db_provider://user:password@host/databse 
     19// currentyl suported db_providers: mysql, sqlite, pgsql 
    1920 
    2021$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail'; 
     22// sqlite example: 'sqlite://./sqlite.db?mode=0646'; 
    2123 
    2224// PEAR database DSN for read only operations (if empty write database will be used) 
    2325// userful for database replication 
    24  
    2526$rcmail_config['db_dsnr'] = ''; 
    2627 
  • trunk/roundcubemail/config/main.inc.php.dist

    r19 r21  
    2929// the mail host chosen to perform the log-in 
    3030// leave blank to show a textbox at login, give a list of hosts 
    31 // to display a pulldown menu or set one host as string 
     31// to display a pulldown menu or set one host as string. 
     32// To use SSL connection, enter ssl://hostname:993 
    3233$rcmail_config['default_host'] = ''; 
     34 
     35// TCP port used for IMAP connections 
     36$rcmail_config['default_port'] = 143; 
    3337 
    3438// use this host for sending mails. 
  • trunk/roundcubemail/index.php

    r20 r21  
    4949 
    5050// set environment first 
    51 ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'program'.PATH_SEPARATOR.'program/lib'); 
     51ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.$INSTALL_PATH.PATH_SEPARATOR.'program'.PATH_SEPARATOR.'program/lib'); 
    5252ini_set('session.name', 'sessid'); 
    5353ini_set('session.use_cookies', 1); 
     54ini_set('error_reporting', E_ALL&~E_NOTICE); 
    5455//ini_set('session.save_path', $INSTALL_PATH.'session'); 
    5556 
     
    7475$_framed = (!empty($_GET['_framed']) || !empty($_POST['_framed'])); 
    7576 
     77if (!empty($_GET['_remote'])) 
     78  $REMOTE_REQUEST = TRUE; 
     79 
     80 
    7681// start session with requested task 
    7782rcmail_startup($_task); 
     
    137142  if ($_auth !== $sess_auth || $_auth != rcmail_auth_hash($_SESSION['client_id'], $_SESSION['auth_time'])) 
    138143    { 
    139     show_message('sessionerror', 'error'); 
     144    $message = show_message('sessionerror', 'error'); 
    140145    rcmail_kill_session(); 
    141146    } 
     
    157162// not logged in -> set task to 'login 
    158163if (empty($_SESSION['user_id'])) 
     164  { 
     165  if ($REMOTE_REQUEST) 
     166    { 
     167    $message .= "setTimeout(\"location.href='\"+this.env.comm_path+\"'\", 2000);"; 
     168    rcube_remote_response($message); 
     169    } 
     170   
    159171  $_task = 'login'; 
     172  } 
    160173 
    161174 
  • trunk/roundcubemail/program/include/main.inc

    r20 r21  
    5656  // prepare DB connection 
    5757  $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr']); 
     58  $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql'; 
    5859 
    5960  // we can use the database for storing session data 
    60   if (is_object($DB)) 
     61  if (is_object($DB) && $DB->db_provider!='sqlite') 
    6162    include_once('include/session.inc'); 
    6263 
     
    233234  { 
    234235  global $CONFIG, $IMAP, $DB, $sess_user_lang; 
     236  $user_id = NULL; 
    235237   
    236238  if (!$host) 
    237239    $host = $CONFIG['default_host']; 
    238240 
     241  // query if user already registered 
     242  $sql_result = $DB->query(sprintf("SELECT user_id, username, language, preferences 
     243                                    FROM   %s 
     244                                    WHERE  mail_host='%s' AND (username='%s' OR alias='%s')", 
     245                                   get_table_name('users'), 
     246                                   addslashes($host), 
     247                                   addslashes($user), 
     248                                   addslashes($user))); 
     249 
     250  // user already registered -> overwrite username 
     251  if ($sql_arr = $DB->fetch_assoc($sql_result)) 
     252    { 
     253    $user_id = $sql_arr['user_id']; 
     254    $user = $sql_arr['username']; 
     255    } 
     256 
     257  // parse $host URL 
     258  $a_host = parse_url($host); 
     259  if ($a_host['host']) 
     260    { 
     261    $host = $a_host['host']; 
     262    $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE; 
     263    $imap_port = isset($a_host['post']) ? $a_host['post'] : ($imap_ssl ? 993 : $CONFIG['default_port']); 
     264    } 
     265 
    239266  // exit if IMAP login failed 
    240   if (!($imap_login  = $IMAP->connect($host, $user, $pass))) 
     267  if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl))) 
    241268    return FALSE; 
    242269 
    243   // query if user already registered 
    244   $sql_result = $DB->query(sprintf("SELECT user_id, language, preferences 
    245                                     FROM %s 
    246                                     WHERE  username='%s' AND mail_host='%s'", 
    247                                    get_table_name('users'), 
    248                                    $user, $host)); 
    249  
    250270  // user already registered 
    251   if ($sql_arr = $DB->fetch_assoc($sql_result)) 
    252     { 
    253     $user_id = $sql_arr['user_id']; 
    254      
     271  if ($user_id && !empty($sql_arr)) 
     272    { 
    255273    // get user prefs 
    256274    if (strlen($sql_arr['preferences'])) 
     
    304322                      VALUES (NOW(), NOW(), '%s', '%s')", 
    305323                     get_table_name('users'), 
    306                      $user, $host)); 
     324                     addslashes($user), 
     325                     addslashes($host))); 
    307326 
    308327  if ($user_id = $DB->insert_id()) 
     
    317336                       get_table_name('identities'), 
    318337                       $user_id, 
    319                        $user_name, 
    320                        $user_email)); 
     338                       addslashes($user_name), 
     339                       addslashes($user_email))); 
    321340                        
    322341    // get existing mailboxes 
     
    330349    if ($CONFIG['trash_mbox'] && !in_array_nocase($CONFIG['trash_mbox'], $a_mailboxes)) 
    331350      $IMAP->create_mailbox($CONFIG['trash_mbox'], TRUE); 
     351    } 
     352  else 
     353    { 
     354    raise_error(array('code' => 500, 
     355                      'type' => 'php', 
     356                      'line' => __LINE__, 
     357                      'file' => __FILE__, 
     358                      'message' => "Failed to create new user"), TRUE, FALSE); 
    332359    } 
    333360     
     
    964991    { 
    965992    $select_host = new select(array('name' => '_host')); 
    966     $select_host->add($CONFIG['default_host']); 
     993     
     994    foreach ($CONFIG['default_host'] as $key => $value) 
     995      $select_host->add($value, (is_numeric($key) ? $value : $key)); 
     996       
    967997    $fields['host'] = $select_host->show($_POST['_host']); 
    968998    } 
  • trunk/roundcubemail/program/include/rcube_db.inc

    r20 r21  
    4141        $this->db_dsnw = $db_dsnw; 
    4242        $this->db_dsnr = $db_dsnr; 
     43         
     44        $dsn_array = DB::parseDSN($db_dsnw); 
     45        $this->db_provider = $dsn_array['phptype'];         
    4346    } 
    4447 
     
    5255    function dsn_connect($dsn) 
    5356    { 
    54         $dsn_array = DB::parseDSN($dsn); 
    55         $this->db_provider = $dsn_array['phptype']; 
    56          
    5757        // Use persistent connections if available 
    5858        $dbh = DB::connect($dsn, array('persistent' => $true)); 
    59  
     59         
    6060        if (DB::isError($dbh)) 
    6161            raise_error(array('code' => 500, 
     
    6464                        'file' => __FILE__, 
    6565                        'message' => $dbh->getMessage()), TRUE, FALSE); 
     66 
    6667        else if ($this->db_provider=='sqlite') 
    6768        { 
    68             if (!is_file($dsn_array['database']) || !filesize($dsn_array['database'])) 
    69                 $this->_sqlite_create_database($dbh, 'SQL/sqlite.initial.sql'); 
     69            $dsn_array = DB::parseDSN($dsn); 
     70            if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials)) 
     71                $this->_sqlite_create_database($dbh, $this->sqlite_initials); 
    7072        } 
    7173         
     
    7678    function db_connect ($mode) 
    7779    { 
     80        $this->db_mode = $mode; 
     81 
    7882        // Already connected 
    79          
    8083        if ($this->db_connected) 
    8184            { 
     
    97100        $this->db_handle = $this->dsn_connect($dsn); 
    98101        $this->db_connected = true; 
    99         $this->db_mode = $mode; 
    100102    } 
    101103 
     
    118120         
    119121        if (DB::isError($result)) 
    120             raise_error(array('code' => 500, 'type' => 'db', 
     122            raise_error(array('code' => 500, 
     123                              'type' => 'db', 
    121124                              'line' => __LINE__,  
    122125                              'file' => __FILE__,  
     
    128131    function db_execute ($query) 
    129132    { 
    130         db_connect('w'); 
     133        $this->db_connect('w'); 
    131134 
    132135        if ($this->db_provider == 'sqlite') 
     
    160163    function insert_id($sequence = '') 
    161164    { 
    162         if (!$this->db_link || $this->db_mode=='r') 
     165        if (!$this->db_handle || $this->db_mode=='r') 
    163166            return FALSE; 
    164167 
     
    168171                // PostgreSQL uses sequences 
    169172                $result =& $this->db_handle->getOne("SELECT CURRVAL('$sequence')");     
    170                 if (DB::isError($result)) 
     173                if (DB::isError($result)) { 
    171174                    raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,  
    172175                    'message' => $result->getMessage()), TRUE, TRUE); 
     176                } 
    173177                return $result; 
    174178                 
    175179            case 'mysql': // This is unfortuneate 
    176                 return mysql_insert_id($this->db_handle); 
     180                return mysql_insert_id(); 
    177181 
    178182            case 'sqlite': 
     
    190194 
    191195        if (DB::isError($result)) 
     196        { 
    192197            raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 
    193                          'message' => $this->db_link->getMessage()), TRUE, TRUE); 
     198                         'message' => $this->db_link->getMessage()), TRUE, FALSE); 
     199            return FALSE; 
     200        } 
    194201                          
    195202        return $result->fetchRow(DB_FETCHMODE_ASSOC); 
     
    232239            return ; 
    233240 
    234         $fd = fopen($fileName, 'r'); 
    235         if (!$fd) 
    236             return ; 
    237  
    238241        $data = ''; 
    239         while ($line = fgets($fd, 4096)) 
    240             $data .= $line; 
    241  
    242         fclose($fd); 
    243         sqlite_exec($dbh->connection, $data); 
     242        if ($fd = fopen($fileName, 'r')) 
     243          { 
     244          $data = fread($fd, filesize($fileName)); 
     245          fclose($fd); 
     246          } 
     247 
     248        if (strlen($data)) 
     249          sqlite_exec($dbh->connection, $data); 
    244250    } 
    245251 
  • trunk/roundcubemail/program/include/rcube_imap.inc

    r20 r21  
    2525require_once('lib/mime.inc'); 
    2626 
    27 // check for Open-SSL support in PHP build 
    28 //$ICL_SSL = TRUE; 
    29 //$ICL_PORT = 993; 
    3027 
    3128class rcube_imap 
     
    7673 
    7774 
    78   function connect($host, $user, $pass, $port=143) 
    79     { 
    80     global $ICL_PORT; 
     75  function connect($host, $user, $pass, $port=143, $use_ssl=FALSE) 
     76    { 
     77    global $ICL_PORT, $CONFIG; 
     78     
     79    // check for Open-SSL support in PHP build 
     80    if ($use_ssl && in_array('openssl', get_loaded_extensions())) 
     81      $ICL_SSL = TRUE; 
    8182 
    8283    $ICL_PORT = $port; 
    83     $this->conn = iil_Connect($host, $user, $pass); 
     84    $this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check')); 
    8485    $this->host = $host; 
    8586    $this->user = $user; 
    8687    $this->pass = $pass; 
     88     
     89    if ($this->conn && ($CONFIG['debug_level'] & 8)) 
     90      print $this->conn->message; 
     91       
     92    else if (!$this->conn && $GLOBALS['iil_error']) 
     93      { 
     94      raise_error(array('code' => 403, 
     95                       'type' => 'imap', 
     96                       'message' => $GLOBALS['iil_error']), TRUE, FALSE); 
     97      } 
    8798 
    8899    return $this->conn ? TRUE : FALSE; 
  • trunk/roundcubemail/program/include/session.inc

    r8 r21  
    3939  global $DB, $SESS_CHANGED; 
    4040   
    41   $sql_result = $DB->query(sprintf("SELECT vars, UNIX_TIMESTAMP(changed) AS changed 
     41  $sql_result = $DB->query(sprintf("SELECT vars, ip, UNIX_TIMESTAMP(changed) AS changed 
    4242                                    FROM   %s 
    4343                                    WHERE  sess_id='%s'", 
     
    8282    { 
    8383    $DB->query(sprintf("INSERT INTO %s 
    84                         (sess_id, vars, created, changed) 
    85                         VALUES ('%s', '%s', NOW(), NOW())", 
     84                        (sess_id, vars, ip, created, changed) 
     85                        VALUES ('%s', '%s', '%s', NOW(), NOW())", 
    8686                       get_table_name('session'), 
    8787                       $key, 
    88                        $vars)); 
     88                       $vars, 
     89                       $_SERVER['REMOTE_ADDR'])); 
    8990    } 
    9091 
  • trunk/roundcubemail/program/js/app.js

    r20 r21  
    7777     
    7878    // check browser 
    79     if (!(bw.dom && ((bw.ie && bw.vendver>=5.5 && !bw.opera) || (bw.mz && bw.vendver>=1) || (bw.safari && bw.vendver>=125) || (bw.opera && bw.vendver>=8)))) 
     79    if (!(bw.dom && ((bw.ie && bw.vendver>=5.5 && !bw.opera) || (bw.mz && bw.vendver>=1) || (bw.safari && bw.vendver>=125) || 
     80                     (bw.opera && bw.vendver>=8) || (bw.konq && bw.vendver>=3.4)))) 
    8081      { 
    8182      location.href = this.env.comm_path+'&_action=error&_code=0x199'; 
  • trunk/roundcubemail/program/js/common.js

    r8 r21  
    4848  this.ns6 = (this.ns && parseInt(this.vendver)==6);  // (this.mz && this.ns) ? true : false; 
    4949  this.ns7 = (this.ns && parseInt(this.vendver)==7);  // this.agent.indexOf('Netscape/7')>0); 
    50   this.safari = this.agent.toLowerCase().indexOf('safari')>0; 
    51   this.konq   = (this.agent.toLowerCase().indexOf('konqueror')>0);  
     50  this.safari = (this.agent.toLowerCase().indexOf('safari')>0 || this.agent.toLowerCase().indexOf('applewebkit')>0); 
     51  this.konq   = (this.agent.toLowerCase().indexOf('konqueror')>0); 
    5252 
    5353  this.opera = (window.opera) ? true : false; 
     
    5959    this.vendver = (/opera(\s|\/)([0-9\.]+)/i.test(navigator.userAgent)) ? parseFloat(RegExp.$2) : -1; 
    6060  else if(!this.vendver && this.safari) 
    61     this.vendver = (/safari\/([0-9]+)/i.test(this.agent)) ? parseInt(RegExp.$1) : 0; 
     61    this.vendver = (/(safari|applewebkit)\/([0-9]+)/i.test(this.agent)) ? parseInt(RegExp.$2) : 0; 
    6262  else if((!this.vendver && this.mz) || this.agent.indexOf('Camino')>0) 
    6363    this.vendver = (/rv:([0-9\.]+)/.test(this.agent)) ? parseFloat(RegExp.$1) : 0; 
    6464  else if(this.ie && window.RegExp) 
    6565    this.vendver = (/msie\s+([0-9\.]+)/i.test(this.agent)) ? parseFloat(RegExp.$1) : 0; 
     66  else if(this.konq && window.RegExp) 
     67    this.vendver = (/khtml\/([0-9\.]+)/i.test(this.agent)) ? parseFloat(RegExp.$1) : 0; 
     68 
    6669 
    6770  // get real language out of safari's user agent 
  • trunk/roundcubemail/program/lib/imap.inc

    r8 r21  
    346346                do{ 
    347347                $line = trim(chop(iil_ReadLine($conn->fp, 100))); 
     348                $conn->message.="$line\n"; 
    348349                        $a = explode(" ", $line); 
    349350                        if ($line[0]=="*"){ 
     
    363364                fputs($conn->fp, "a000 AUTHENTICATE CRAM-MD5\r\n"); 
    364365                $line = trim(chop(iil_ReadLine($conn->fp, 1024))); 
     366                $conn->message.="$line\n"; 
    365367                if ($line[0]=="+"){ 
    366368                        $conn->message.='Got challenge: '.htmlspecialchars($line)."\n"; 
  • trunk/roundcubemail/program/steps/settings/func.inc

    r8 r21  
    5858  $select_lang->add('English', 'en'); 
    5959  $select_lang->add('Espanol', 'es'); 
    60   $select_lang->add('Franais', 'fr'); 
     60  $select_lang->add('Français', 'fr'); 
    6161  $select_lang->add('Italiano', 'it'); 
    62  
    63   $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", 
    64                   $field_id, 
    65                   rcube_label('language'), 
     62  $select_lang->add('Nederlands', 'nl'); 
     63 
     64  $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", 
     65                  $field_id, 
     66                  rep_specialchars_output(rcube_label('language')), 
    6667                  $select_lang->show($sess_user_lang)); 
    6768 
     
    100101  $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", 
    101102                  $field_id, 
    102                   rcube_label('timezone'), 
     103                  rep_specialchars_output(rcube_label('timezone')), 
    103104                  $select_timezone->show($CONFIG['timezone'])); 
    104105 
     
    110111  $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", 
    111112                  $field_id, 
    112                   rcube_label('pagesize'), 
     113                  rep_specialchars_output(rcube_label('pagesize')), 
    113114                  $input_pagesize->show($CONFIG['pagesize'])); 
    114115 
     
    119120  $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", 
    120121                  $field_id, 
    121                   rcube_label('preferhtml'), 
     122                  rep_specialchars_output(rcube_label('preferhtml')), 
    122123                  $input_pagesize->show($CONFIG['prefer_html']?1:0)); 
    123124 
     
    128129  $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", 
    129130                  $field_id, 
    130                   rcube_label('prettydate'), 
     131                  rep_specialchars_output(rcube_label('prettydate')), 
    131132                  $input_prettydate->show($CONFIG['prettydate']?1:0)); 
    132133 
Note: See TracChangeset for help on using the changeset viewer.