Ignore:
Timestamp:
Dec 10, 2007 10:27:19 AM (5 years ago)
Author:
thomasb
Message:

New class rcube_user + send message disposition notification

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/program/include/main.inc

    r931 r938  
    3030require_once('lib/utf7.inc'); 
    3131require_once('lib/utf8.class.php'); 
     32require_once('include/rcube_user.inc'); 
    3233require_once('include/rcube_shared.inc'); 
    3334require_once('include/rcmail_template.inc'); 
     
    4950  { 
    5051  global $sess_id, $sess_user_lang; 
    51   global $CONFIG, $INSTALL_PATH, $BROWSER, $OUTPUT, $_SESSION, $IMAP, $DB; 
     52  global $CONFIG, $INSTALL_PATH, $BROWSER, $OUTPUT, $_SESSION, $IMAP, $DB, $USER; 
    5253 
    5354  // check client 
     
    8889  $sess_user_lang = rcube_language_prop($_SESSION['user_lang']); 
    8990 
     91  // create user object 
     92  $USER = new rcube_user($_SESSION['user_id']); 
    9093 
    9194  // overwrite config with user preferences 
     
    322325function rcmail_kill_session() 
    323326  { 
    324   // save user preferences 
    325   $a_user_prefs = $_SESSION['user_prefs']; 
    326   if (!is_array($a_user_prefs)) 
    327     $a_user_prefs = array(); 
    328      
     327  global $USER; 
     328   
    329329  if ((isset($_SESSION['sort_col']) && $_SESSION['sort_col']!=$a_user_prefs['message_sort_col']) || 
    330330      (isset($_SESSION['sort_order']) && $_SESSION['sort_order']!=$a_user_prefs['message_sort_order'])) 
    331331    { 
    332     $a_user_prefs['message_sort_col'] = $_SESSION['sort_col']; 
    333     $a_user_prefs['message_sort_order'] = $_SESSION['sort_order']; 
    334     rcmail_save_user_prefs($a_user_prefs); 
     332    $a_user_prefs = array('message_sort_col' => $_SESSION['sort_col'], 'message_sort_order' => $_SESSION['sort_order']); 
     333    $USER->save_prefs($a_user_prefs); 
    335334    } 
    336335 
    337336  $_SESSION = array('user_lang' => $GLOBALS['sess_user_lang'], 'auth_time' => time(), 'temp' => true); 
    338337  setcookie('sessauth', '-del-', time()-60); 
     338  $USER->reset(); 
    339339  } 
    340340 
     
    532532function rcmail_login($user, $pass, $host=NULL) 
    533533  { 
    534   global $CONFIG, $IMAP, $DB, $sess_user_lang; 
     534  global $CONFIG, $IMAP, $DB, $USER, $sess_user_lang; 
    535535  $user_id = NULL; 
    536536   
     
    584584  // try to resolve email address from virtuser table     
    585585  if (!empty($CONFIG['virtuser_file']) && strpos($user, '@')) 
    586     $user = rcmail_email2user($user); 
     586    $user = rcube_user::email2user($user); 
    587587 
    588588  // lowercase username if it's an e-mail address (#1484473) 
     
    591591 
    592592  // query if user already registered 
    593   $sql_result = $DB->query( 
    594     "SELECT user_id, username, language, preferences 
    595      FROM ".get_table_name('users')." 
    596      WHERE  mail_host=? AND (username=? OR alias=?)", 
    597     $host, 
    598     $user, 
    599     $user); 
     593  if ($existing = rcube_user::query($user, $host)) 
     594  $USER = $existing; 
    600595 
    601596  // user already registered -> overwrite username 
    602   if ($sql_arr = $DB->fetch_assoc($sql_result)) 
    603     { 
    604     $user_id = $sql_arr['user_id']; 
    605     $user = $sql_arr['username']; 
     597  if ($USER->ID) 
     598    { 
     599    $user_id = $USER->ID; 
     600    $user = $USER->data['username']; 
    606601    } 
    607602 
    608603  // exit if IMAP login failed 
    609604  if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl))) 
    610     return FALSE; 
     605    return false; 
    611606 
    612607  // user already registered 
    613   if ($user_id && !empty($sql_arr)) 
     608  if ($USER->ID) 
    614609    { 
    615610    // get user prefs 
    616     if (strlen($sql_arr['preferences'])) 
    617       { 
    618       $user_prefs = unserialize($sql_arr['preferences']); 
    619       $_SESSION['user_prefs'] = $user_prefs; 
    620       array_merge($CONFIG, $user_prefs); 
    621       } 
    622  
     611    $_SESSION['user_prefs'] = $USER->get_prefs(); 
     612    array_merge($CONFIG, $_SESSION['user_prefs']); 
    623613 
    624614    // set user specific language 
    625     if (strlen($sql_arr['language'])) 
    626       $sess_user_lang = $_SESSION['user_lang'] = $sql_arr['language']; 
     615    if (!empty($USER->data['language'])) 
     616      $sess_user_lang = $_SESSION['user_lang'] = $USER->data['language']; 
    627617       
    628618    // update user's record 
    629     $DB->query("UPDATE ".get_table_name('users')." 
    630                 SET    last_login=".$DB->now()." 
    631                 WHERE  user_id=?", 
    632                 $user_id); 
     619    $USER->touch(); 
    633620    } 
    634621  // create new system user 
    635622  else if ($CONFIG['auto_create_user']) 
    636623    { 
    637     $user_id = rcmail_create_user($user, $host); 
     624    if ($created = rcube_user::create($user, $host)) 
     625    { 
     626      $USER = $created; 
     627       
     628      // get existing mailboxes 
     629      $a_mailboxes = $IMAP->list_mailboxes(); 
     630    } 
    638631    } 
    639632  else 
     
    647640    } 
    648641 
    649   if ($user_id) 
    650     { 
    651     $_SESSION['user_id']   = $user_id; 
     642  if ($USER->ID) 
     643    { 
     644    $_SESSION['user_id']   = $USER->ID; 
     645    $_SESSION['username']  = $USER->data['username']; 
    652646    $_SESSION['imap_host'] = $host; 
    653647    $_SESSION['imap_port'] = $imap_port; 
    654648    $_SESSION['imap_ssl']  = $imap_ssl; 
    655     $_SESSION['username']  = $user; 
    656649    $_SESSION['user_lang'] = $sess_user_lang; 
    657650    $_SESSION['password']  = encrypt_passwd($pass); 
     
    670663  return FALSE; 
    671664  } 
    672  
    673  
    674 /** 
    675  * Create new entry in users and identities table 
    676  * 
    677  * @param string User name 
    678  * @param string IMAP host 
    679  * @return mixed New user ID or False on failure 
    680  */ 
    681 function rcmail_create_user($user, $host) 
    682 { 
    683   global $DB, $CONFIG, $IMAP; 
    684  
    685   $user_email = ''; 
    686  
    687   // try to resolve user in virtusertable 
    688   if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@')) 
    689     $user_email = rcmail_user2email($user); 
    690  
    691   $DB->query("INSERT INTO ".get_table_name('users')." 
    692               (created, last_login, username, mail_host, alias, language) 
    693               VALUES (".$DB->now().", ".$DB->now().", ?, ?, ?, ?)", 
    694               strip_newlines($user), 
    695               strip_newlines($host), 
    696               strip_newlines($user_email), 
    697               $_SESSION['user_lang']); 
    698  
    699   if ($user_id = $DB->insert_id(get_sequence_name('users'))) 
    700   { 
    701     $mail_domain = rcmail_mail_domain($host); 
    702     
    703     if ($user_email=='') 
    704       $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain); 
    705  
    706     $user_name = $user!=$user_email ? $user : ''; 
    707  
    708     // try to resolve the e-mail address from the virtuser table 
    709     if (!empty($CONFIG['virtuser_query']) && 
    710         ($sql_result = $DB->query(preg_replace('/%u/', $DB->escapeSimple($user), $CONFIG['virtuser_query']))) && 
    711         ($DB->num_rows()>0)) 
    712     { 
    713       while ($sql_arr = $DB->fetch_array($sql_result)) 
    714       { 
    715         $DB->query("INSERT INTO ".get_table_name('identities')." 
    716                    (user_id, del, standard, name, email) 
    717                    VALUES (?, 0, 1, ?, ?)", 
    718                    $user_id, 
    719                    strip_newlines($user_name), 
    720                    preg_replace('/^@/', $user . '@', $sql_arr[0])); 
    721       } 
    722     } 
    723     else 
    724     { 
    725       // also create new identity records 
    726       $DB->query("INSERT INTO ".get_table_name('identities')." 
    727                   (user_id, del, standard, name, email) 
    728                   VALUES (?, 0, 1, ?, ?)", 
    729                   $user_id, 
    730                   strip_newlines($user_name), 
    731                   strip_newlines($user_email)); 
    732     } 
    733                         
    734     // get existing mailboxes 
    735     $a_mailboxes = $IMAP->list_mailboxes(); 
    736   } 
    737   else 
    738   { 
    739     raise_error(array( 
    740       'code' => 500, 
    741       'type' => 'php', 
    742       'line' => __LINE__, 
    743       'file' => __FILE__, 
    744       'message' => "Failed to create new user"), TRUE, FALSE); 
    745   } 
    746      
    747   return $user_id; 
    748 } 
    749665 
    750666 
     
    791707 
    792708  return $result; 
    793   } 
    794  
    795  
    796 /** 
    797  * Resolve username using a virtuser table 
    798  * 
    799  * @param string E-mail address to resolve 
    800  * @return string Resolved IMAP username 
    801  */ 
    802 function rcmail_email2user($email) 
    803   { 
    804   $user = $email; 
    805   $r = rcmail_findinvirtual("^$email"); 
    806  
    807   for ($i=0; $i<count($r); $i++) 
    808     { 
    809     $data = $r[$i]; 
    810     $arr = preg_split('/\s+/', $data); 
    811     if(count($arr)>0) 
    812       { 
    813       $user = trim($arr[count($arr)-1]); 
    814       break; 
    815       } 
    816     } 
    817  
    818   return $user; 
    819   } 
    820  
    821  
    822 /** 
    823  * Resolve e-mail address from virtuser table 
    824  * 
    825  * @param string User name 
    826  * @return string Resolved e-mail address 
    827  */ 
    828 function rcmail_user2email($user) 
    829   { 
    830   $email = ""; 
    831   $r = rcmail_findinvirtual("$user$"); 
    832  
    833   for ($i=0; $i<count($r); $i++) 
    834     { 
    835     $data=$r[$i]; 
    836     $arr = preg_split('/\s+/', $data); 
    837     if (count($arr)>0) 
    838       { 
    839       $email = trim($arr[0]); 
    840       break; 
    841       } 
    842     } 
    843  
    844   return $email; 
    845   }  
    846  
    847  
    848 /** 
    849  * Write the given user prefs to the user's record 
    850  * 
    851  * @param mixed User prefs to save 
    852  * @return boolean True on success, False on failure 
    853  */ 
    854 function rcmail_save_user_prefs($a_user_prefs) 
    855   { 
    856   global $DB, $CONFIG, $sess_user_lang; 
    857    
    858   // merge (partial) prefs array with existing settings 
    859   $a_user_prefs += (array)$_SESSION['user_prefs']; 
    860    
    861   $DB->query("UPDATE ".get_table_name('users')." 
    862               SET    preferences=?, 
    863                      language=? 
    864               WHERE  user_id=?", 
    865               serialize($a_user_prefs), 
    866               $sess_user_lang, 
    867               $_SESSION['user_id']); 
    868  
    869   if ($DB->affected_rows()) 
    870     { 
    871     $_SESSION['user_prefs'] = $a_user_prefs;   
    872     $CONFIG = array_merge($CONFIG, $a_user_prefs); 
    873     return TRUE; 
    874     } 
    875      
    876   return FALSE; 
    877709  } 
    878710 
     
    15141346  return $styles; 
    15151347  } 
     1348 
     1349/** 
     1350 * Try to autodetect operating system and find the correct line endings 
     1351 * 
     1352 * @return string The appropriate mail header delimiter 
     1353 */ 
     1354function rcmail_header_delm() 
     1355{ 
     1356  global $CONFIG; 
     1357   
     1358  // use the configured delimiter for headers 
     1359  if (!empty($CONFIG['mail_header_delimiter'])) 
     1360    return $CONFIG['mail_header_delimiter']; 
     1361  else if (strtolower(substr(PHP_OS, 0, 3)=='win'))  
     1362    return "\r\n"; 
     1363  else if (strtolower(substr(PHP_OS, 0, 3)=='mac')) 
     1364    return "\r\n"; 
     1365  else     
     1366    return "\n"; 
     1367} 
    15161368 
    15171369 
Note: See TracChangeset for help on using the changeset viewer.