forked from alexjeen/Roundcube-AutoLogin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RoundcubeAutoLogin.php
136 lines (116 loc) · 3.92 KB
/
RoundcubeAutoLogin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
// From https://github.com/alexjeen/Roundcube-AutoLogin
/**
* Class to automatically login on a Roundcube installation
* @compatibility RoundCube 1.0.2+
*/
// a roundcube exception class
class RoundCubeException extends Exception {}
// main class
class RoundcubeAutoLogin
{
// roundcube link (with a trailing slash)
private $_rc_link = '';
private $ch;
/**
* Creates a new RC object
* @param $roundcube_link the roundcube link with a trailing slash
*/
public function __construct($roundcube_link)
{
$this->_rc_link = $roundcube_link;
$this->ch = curl_init();
}
/**
* Tries to log a RC user in using cURL. Does two requests. One to
* get a session token to perform the login, and one to do the actual
* login of the user
*
* @param $email the full e-mailaddress of the user
* @param $password the password of the user
*
* @returns The cookies you should set with setcookie
*/
public function login($email, $password)
{
try
{
$token = $this->_get_token();
if($token === FALSE) {
throw new RoundCubeException('Unable to get token, is your RC link correct?');
}
// make the request to roundcube
$post_params = array(
'_token' => $token,
'_task' => 'login',
'_action' => 'login',
'_timezone' => '',
'_url' => '_task=login',
'_user' => $email,
'_pass' => $password
);
curl_setopt($this->ch, CURLOPT_URL, $this->_rc_link . '?_task=login');
curl_setopt($this->ch, CURLOPT_COOKIEFILE, '');
curl_setopt($this->ch, CURLOPT_COOKIEJAR, '');
curl_setopt($this->ch, CURLOPT_POST, TRUE);
curl_setopt($this->ch, CURLOPT_HEADER, TRUE);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, http_build_query($post_params));
$response = curl_exec($this->ch);
$response_info = curl_getinfo($this->ch);
if($response_info['http_code'] == 302)
{
// find all relevant cookies to set (php session + rc auth cookie)
// newer RoundCubes use set-cookie, older use Set-Cookie
preg_match_all('/Set-Cookie: (.*)\b/i', $response, $cookies);
$cookie_return = array();
foreach($cookies[1] as $cookie)
{
preg_match('|([A-z0-9\_]*)=([A-z0-9\_\-]*);|', $cookie, $cookie_match);
if($cookie_match) {
$cookie_return[$cookie_match[1]] = $cookie_match[2];
}
}
return $cookie_return;
}
else
{
throw new RoundCubeException('Login failed, please check your credentials.');
}
}
catch(RoundCubeException $e)
{
echo 'RC error: ' . $e->getMessage();
}
catch(Exception $e)
{
echo 'General error: ' . $e->getMessage();
}
}
/**
* Redirect to RC
*/
public function redirect()
{
header('Location: ' . $this->_rc_link . '?task=mail');
}
/**
* Gets a token to use for the login
*/
private function _get_token()
{
curl_setopt($this->ch, CURLOPT_URL, $this->_rc_link);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($this->ch, CURLOPT_COOKIEFILE, '');
curl_setopt($this->ch, CURLOPT_COOKIEJAR, '');
$response = curl_exec($this->ch);
preg_match('|<input type="hidden" name="_token" value="([A-z0-9]*)">|', $response, $matches);
if($matches) {
return $matches[1];
}
else {
return FALSE;
}
}
}
?>