PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/code/classes/Daemon/PMaild/MTA/Auth.class.php

https://github.com/blekkzor/pinetd2
PHP | 97 lines | 76 code | 18 blank | 3 comment | 13 complexity | 781402f7a0ceb1cf676e92454e0a430a MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. namespace Daemon\PMaild\MTA;
  3. use pinetd\Logger;
  4. use pinetd\SQL;
  5. class Auth {
  6. private $login = null;
  7. private $info = null;
  8. private $SQL;
  9. public function __construct($localConfig) {
  10. $this->SQL = SQL::Factory($localConfig['Storage']);
  11. }
  12. public function getLogin() {
  13. return $this->login;
  14. }
  15. public function getInfo() {
  16. return $this->info;
  17. }
  18. public function login($login, $pass, $mode = null) {
  19. $pos = strrpos($login, '@');
  20. if ($pos === false) $pos = strrpos($login, '+'); // compatibility with old-style stuff
  21. if ($pos === false) return false;
  22. $domain = substr($login, $pos+1);
  23. $user = substr($login, 0, $pos);
  24. $info = array(
  25. 'domain' => $domain,
  26. 'user' => $user,
  27. );
  28. // load domain
  29. $DAO_domains = $this->SQL->DAO('domains', 'domainid');
  30. $domain = $DAO_domains->loadByField(array('domain' => $domain));
  31. if (!$domain) return false;
  32. $domain = $domain[0];
  33. $info['domainid'] = $domain->domainid;
  34. if(!is_null($mode)) {
  35. // check if domain has required protocol
  36. $proto = array_flip(explode(',', $domain->protocol));
  37. if (!isset($proto[$mode])) {
  38. Logger::log(Logger::LOG_INFO, strtoupper($mode).' login denied to user '.$login.': '.strtoupper($mode).' disabled');
  39. return false;
  40. }
  41. }
  42. $DAO_accounts = $this->SQL->DAO('z'.$domain->domainid.'_accounts', 'id');
  43. $account = $DAO_accounts->loadByField(array('user'=>$user));
  44. if (!$account) return false;
  45. $account = $account[0];
  46. if (is_null($account->password)) {
  47. if (strlen($pass) < 4) return false;
  48. $account->password = crypt($pass);
  49. $account->commit();
  50. Logger::log(Logger::LOG_INFO, 'Recording new password for user '.$login);
  51. }
  52. // check password
  53. if ($account->password[0] == '$') {
  54. $pass = crypt($pass, $account->password);
  55. } else {
  56. switch(strlen($account->password)) {
  57. case 13: // old-style unix passwords, limited to 8 chars, highly discouraged
  58. $pass = crypt($pass, $account->password);
  59. break;
  60. case 32:
  61. $pass = md5($pass);
  62. break;
  63. case 40:
  64. $pass = sha1($pass);
  65. break;
  66. default:
  67. return false; // password disabled?
  68. }
  69. }
  70. if ($account->password != $pass) return false; // auth failed
  71. Logger::log(Logger::LOG_DEBUG, get_class($this).': User '.$login.' logged in successfully'.(is_null($mode)?'':' on '.$mode));
  72. $account->last_login = $this->SQL->now();
  73. $account->commit(); // will also commit password if set
  74. $info['account'] = $account;
  75. $this->info = $info;
  76. $this->login = $account->user . '@' . $domain->domain;
  77. return true;
  78. }
  79. }