Completed
Push — master ( 849a76...c6389c )
by cam
04:45
created
ecrire/action/inscrire_auteur.php 2 patches
Indentation   +205 added lines, -205 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Inscription
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 
@@ -39,68 +39,68 @@  discard block
 block discarded – undo
39 39
  * @return array|string
40 40
  */
41 41
 function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()) {
42
-	if (!is_array($options)) {
43
-		$options = array('id' => $options);
44
-	}
45
-
46
-	if (function_exists('test_inscription')) {
47
-		$f = 'test_inscription';
48
-	} else {
49
-		$f = 'test_inscription_dist';
50
-	}
51
-	$desc = $f($statut, $mail_complet, $nom, $options);
52
-
53
-	// erreur ?
54
-	if (!is_array($desc)) {
55
-		return _T($desc);
56
-	}
57
-
58
-	include_spip('base/abstract_sql');
59
-	$res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
60
-	// erreur ?
61
-	if (!$res) {
62
-		return _T('titre_probleme_technique');
63
-	}
64
-
65
-	$row = sql_fetch($res);
66
-	sql_free($res);
67
-	if ($row) {
68
-		if (isset($options['force_nouveau']) and $options['force_nouveau'] == true) {
69
-			$desc['id_auteur'] = $row['id_auteur'];
70
-			$desc = inscription_nouveau($desc);
71
-		} else {
72
-			$desc = $row;
73
-		}
74
-	} else // s'il n'existe pas deja, creer les identifiants
75
-	{
76
-		$desc = inscription_nouveau($desc);
77
-	}
78
-
79
-	// erreur ?
80
-	if (!is_array($desc)) {
81
-		return $desc;
82
-	}
83
-
84
-
85
-	// generer le mot de passe (ou le refaire si compte inutilise)
86
-	$desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
87
-
88
-	// attribuer un jeton pour confirmation par clic sur un lien
89
-	$desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
90
-
91
-	// charger de suite cette fonction, pour ses utilitaires
92
-	$envoyer_inscription = charger_fonction("envoyer_inscription", "");
93
-	list($sujet, $msg, $from, $head) = $envoyer_inscription($desc, $nom, $statut, $options);
94
-
95
-	$notifications = charger_fonction('notifications', 'inc');
96
-	notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
97
-
98
-	// Notifications
99
-	$notifications('inscription', $desc['id_auteur'],
100
-		array('nom' => $desc['nom'], 'email' => $desc['email'])
101
-	);
102
-
103
-	return $desc;
42
+    if (!is_array($options)) {
43
+        $options = array('id' => $options);
44
+    }
45
+
46
+    if (function_exists('test_inscription')) {
47
+        $f = 'test_inscription';
48
+    } else {
49
+        $f = 'test_inscription_dist';
50
+    }
51
+    $desc = $f($statut, $mail_complet, $nom, $options);
52
+
53
+    // erreur ?
54
+    if (!is_array($desc)) {
55
+        return _T($desc);
56
+    }
57
+
58
+    include_spip('base/abstract_sql');
59
+    $res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
60
+    // erreur ?
61
+    if (!$res) {
62
+        return _T('titre_probleme_technique');
63
+    }
64
+
65
+    $row = sql_fetch($res);
66
+    sql_free($res);
67
+    if ($row) {
68
+        if (isset($options['force_nouveau']) and $options['force_nouveau'] == true) {
69
+            $desc['id_auteur'] = $row['id_auteur'];
70
+            $desc = inscription_nouveau($desc);
71
+        } else {
72
+            $desc = $row;
73
+        }
74
+    } else // s'il n'existe pas deja, creer les identifiants
75
+    {
76
+        $desc = inscription_nouveau($desc);
77
+    }
78
+
79
+    // erreur ?
80
+    if (!is_array($desc)) {
81
+        return $desc;
82
+    }
83
+
84
+
85
+    // generer le mot de passe (ou le refaire si compte inutilise)
86
+    $desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
87
+
88
+    // attribuer un jeton pour confirmation par clic sur un lien
89
+    $desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
90
+
91
+    // charger de suite cette fonction, pour ses utilitaires
92
+    $envoyer_inscription = charger_fonction("envoyer_inscription", "");
93
+    list($sujet, $msg, $from, $head) = $envoyer_inscription($desc, $nom, $statut, $options);
94
+
95
+    $notifications = charger_fonction('notifications', 'inc');
96
+    notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
97
+
98
+    // Notifications
99
+    $notifications('inscription', $desc['id_auteur'],
100
+        array('nom' => $desc['nom'], 'email' => $desc['email'])
101
+    );
102
+
103
+    return $desc;
104 104
 }
105 105
 
106 106
 
@@ -123,23 +123,23 @@  discard block
 block discarded – undo
123 123
  *
124 124
  */
125 125
 function test_inscription_dist($statut, $mail, $nom, $options) {
126
-	include_spip('inc/filtres');
127
-	if (!$r = email_valide($mail)) {
128
-		return 'info_email_invalide';
129
-	}
130
-	$nom = trim(corriger_caracteres($nom));
131
-	$res = array('email' => $r, 'nom' => $nom, 'prefs' => $statut);
132
-	if (isset($options['login'])) {
133
-		$login = trim(corriger_caracteres($options['login']));
134
-		if ((strlen($login) >= _LOGIN_TROP_COURT) and (strlen($nom) <= 64)) {
135
-			$res['login'] = $login;
136
-		}
137
-	}
138
-	if (!isset($res['login']) and ((strlen($nom) < _LOGIN_TROP_COURT) or (strlen($nom) > 64))) {
139
-		return 'ecrire:info_login_trop_court';
140
-	}
141
-
142
-	return $res;
126
+    include_spip('inc/filtres');
127
+    if (!$r = email_valide($mail)) {
128
+        return 'info_email_invalide';
129
+    }
130
+    $nom = trim(corriger_caracteres($nom));
131
+    $res = array('email' => $r, 'nom' => $nom, 'prefs' => $statut);
132
+    if (isset($options['login'])) {
133
+        $login = trim(corriger_caracteres($options['login']));
134
+        if ((strlen($login) >= _LOGIN_TROP_COURT) and (strlen($nom) <= 64)) {
135
+            $res['login'] = $login;
136
+        }
137
+    }
138
+    if (!isset($res['login']) and ((strlen($nom) < _LOGIN_TROP_COURT) or (strlen($nom) > 64))) {
139
+        return 'ecrire:info_login_trop_court';
140
+    }
141
+
142
+    return $res;
143 143
 }
144 144
 
145 145
 
@@ -152,33 +152,33 @@  discard block
 block discarded – undo
152 152
  * @return mixed|string
153 153
  */
154 154
 function inscription_nouveau($desc) {
155
-	if (!isset($desc['login']) or !strlen($desc['login'])) {
156
-		$desc['login'] = test_login($desc['nom'], $desc['email']);
157
-	}
155
+    if (!isset($desc['login']) or !strlen($desc['login'])) {
156
+        $desc['login'] = test_login($desc['nom'], $desc['email']);
157
+    }
158 158
 
159
-	$desc['statut'] = 'nouveau';
160
-	include_spip('action/editer_auteur');
161
-	if (isset($desc['id_auteur'])) {
162
-		$id_auteur = $desc['id_auteur'];
163
-	} else {
164
-		$id_auteur = auteur_inserer();
165
-	}
159
+    $desc['statut'] = 'nouveau';
160
+    include_spip('action/editer_auteur');
161
+    if (isset($desc['id_auteur'])) {
162
+        $id_auteur = $desc['id_auteur'];
163
+    } else {
164
+        $id_auteur = auteur_inserer();
165
+    }
166 166
 
167
-	if (!$id_auteur) {
168
-		return _T('titre_probleme_technique');
169
-	}
167
+    if (!$id_auteur) {
168
+        return _T('titre_probleme_technique');
169
+    }
170 170
 
171
-	$desc['lang'] = $GLOBALS['spip_lang'];
171
+    $desc['lang'] = $GLOBALS['spip_lang'];
172 172
 
173
-	include_spip('inc/autoriser');
174
-	// lever l'autorisation pour pouvoir modifier le statut
175
-	autoriser_exception('modifier', 'auteur', $id_auteur);
176
-	auteur_modifier($id_auteur, $desc);
177
-	autoriser_exception('modifier', 'auteur', $id_auteur, false);
173
+    include_spip('inc/autoriser');
174
+    // lever l'autorisation pour pouvoir modifier le statut
175
+    autoriser_exception('modifier', 'auteur', $id_auteur);
176
+    auteur_modifier($id_auteur, $desc);
177
+    autoriser_exception('modifier', 'auteur', $id_auteur, false);
178 178
 
179
-	$desc['id_auteur'] = $id_auteur;
179
+    $desc['id_auteur'] = $id_auteur;
180 180
 
181
-	return $desc;
181
+    return $desc;
182 182
 }
183 183
 
184 184
 
@@ -190,29 +190,29 @@  discard block
 block discarded – undo
190 190
  * @return string
191 191
  */
192 192
 function test_login($nom, $mail) {
193
-	include_spip('inc/charsets');
194
-	$nom = strtolower(translitteration($nom));
195
-	$login_base = preg_replace("/[^\w\d_]/", "_", $nom);
196
-
197
-	// il faut eviter que le login soit vraiment trop court
198
-	if (strlen($login_base) < 3) {
199
-		$mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
200
-		$login_base = preg_replace("/[^\w\d]/", "_", $mail);
201
-	}
202
-	if (strlen($login_base) < 3) {
203
-		$login_base = 'user';
204
-	}
205
-
206
-	$login = $login_base;
207
-
208
-	for ($i = 1; ; $i++) {
209
-		if (!sql_countsel('spip_auteurs', "login='$login'")) {
210
-			return $login;
211
-		}
212
-		$login = $login_base . $i;
213
-	}
214
-
215
-	return $login;
193
+    include_spip('inc/charsets');
194
+    $nom = strtolower(translitteration($nom));
195
+    $login_base = preg_replace("/[^\w\d_]/", "_", $nom);
196
+
197
+    // il faut eviter que le login soit vraiment trop court
198
+    if (strlen($login_base) < 3) {
199
+        $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
200
+        $login_base = preg_replace("/[^\w\d]/", "_", $mail);
201
+    }
202
+    if (strlen($login_base) < 3) {
203
+        $login_base = 'user';
204
+    }
205
+
206
+    $login = $login_base;
207
+
208
+    for ($i = 1; ; $i++) {
209
+        if (!sql_countsel('spip_auteurs', "login='$login'")) {
210
+            return $login;
211
+        }
212
+        $login = $login_base . $i;
213
+    }
214
+
215
+    return $login;
216 216
 }
217 217
 
218 218
 
@@ -230,26 +230,26 @@  discard block
 block discarded – undo
230 230
  */
231 231
 function envoyer_inscription_dist($desc, $nom, $mode, $options = array()) {
232 232
 
233
-	$contexte = array_merge($desc, $options);
234
-	$contexte['nom'] = $nom;
235
-	$contexte['mode'] = $mode;
236
-	$contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
237
-	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
238
-	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
239
-	// S'il y a l'option redirect, on l'ajoute directement ici
240
-	if (isset($options['redirect'])) {
241
-		$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'redirect', $options['redirect']);
242
-	}
243
-
244
-	$modele_mail = 'modeles/mail_inscription';
245
-	if (isset($options['modele_mail']) and $options['modele_mail']){
246
-		$modele_mail = $options['modele_mail'];
247
-	}
248
-	$message = recuperer_fond($modele_mail, $contexte);
249
-	$from = (isset($options['from']) ? $options['from'] : null);
250
-	$head = null;
251
-
252
-	return array("", $message, $from, $head);
233
+    $contexte = array_merge($desc, $options);
234
+    $contexte['nom'] = $nom;
235
+    $contexte['mode'] = $mode;
236
+    $contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
237
+    $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
238
+    $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
239
+    // S'il y a l'option redirect, on l'ajoute directement ici
240
+    if (isset($options['redirect'])) {
241
+        $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'redirect', $options['redirect']);
242
+    }
243
+
244
+    $modele_mail = 'modeles/mail_inscription';
245
+    if (isset($options['modele_mail']) and $options['modele_mail']){
246
+        $modele_mail = $options['modele_mail'];
247
+    }
248
+    $message = recuperer_fond($modele_mail, $contexte);
249
+    $from = (isset($options['from']) ? $options['from'] : null);
250
+    $head = null;
251
+
252
+    return array("", $message, $from, $head);
253 253
 }
254 254
 
255 255
 
@@ -260,12 +260,12 @@  discard block
 block discarded – undo
260 260
  * @return string
261 261
  */
262 262
 function creer_pass_pour_auteur($id_auteur) {
263
-	include_spip('inc/acces');
264
-	$pass = creer_pass_aleatoire(16, $id_auteur);
265
-	include_spip('action/editer_auteur');
266
-	auteur_instituer($id_auteur, array('pass' => $pass));
263
+    include_spip('inc/acces');
264
+    $pass = creer_pass_aleatoire(16, $id_auteur);
265
+    include_spip('action/editer_auteur');
266
+    auteur_instituer($id_auteur, array('pass' => $pass));
267 267
 
268
-	return $pass;
268
+    return $pass;
269 269
 }
270 270
 
271 271
 /**
@@ -278,17 +278,17 @@  discard block
 block discarded – undo
278 278
  * @return string
279 279
  */
280 280
 function tester_statut_inscription($statut_tmp, $id) {
281
-	include_spip('inc/autoriser');
282
-	if ($statut_tmp) {
283
-		return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
284
-	} elseif (
285
-		autoriser('inscrireauteur', $statut_tmp = "1comite", $id)
286
-		or autoriser('inscrireauteur', $statut_tmp = "6forum", $id)
287
-	) {
288
-		return $statut_tmp;
289
-	}
290
-
291
-	return '';
281
+    include_spip('inc/autoriser');
282
+    if ($statut_tmp) {
283
+        return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
284
+    } elseif (
285
+        autoriser('inscrireauteur', $statut_tmp = "1comite", $id)
286
+        or autoriser('inscrireauteur', $statut_tmp = "6forum", $id)
287
+    ) {
288
+        return $statut_tmp;
289
+    }
290
+
291
+    return '';
292 292
 }
293 293
 
294 294
 
@@ -302,35 +302,35 @@  discard block
 block discarded – undo
302 302
  * @return array
303 303
  */
304 304
 function confirmer_statut_inscription($auteur) {
305
-	// securite
306
-	if ($auteur['statut'] != 'nouveau') {
307
-		return $auteur;
308
-	}
309
-
310
-	$s = $auteur['prefs'];
311
-	// securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
312
-	if (!preg_match(',^\w+$,', $s)) {
313
-		$s = '6forum';
314
-	}
315
-	include_spip('inc/autoriser');
316
-	if (!autoriser('inscrireauteur', $s)) {
317
-		return $auteur;
318
-	}
319
-
320
-	include_spip('inc/autoriser');
321
-	// accorder l'autorisation de modif du statut auteur
322
-	autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
323
-	include_spip('action/editer_auteur');
324
-	// changer le statut
325
-	auteur_modifier($auteur['id_auteur'], array('statut' => $s));
326
-	unset($_COOKIE['spip_session']); // forcer la maj de la session
327
-	// lever l'autorisation de modif du statut auteur
328
-	autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
329
-
330
-	// mettre a jour le statut
331
-	$auteur['statut'] = $s;
332
-
333
-	return $auteur;
305
+    // securite
306
+    if ($auteur['statut'] != 'nouveau') {
307
+        return $auteur;
308
+    }
309
+
310
+    $s = $auteur['prefs'];
311
+    // securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
312
+    if (!preg_match(',^\w+$,', $s)) {
313
+        $s = '6forum';
314
+    }
315
+    include_spip('inc/autoriser');
316
+    if (!autoriser('inscrireauteur', $s)) {
317
+        return $auteur;
318
+    }
319
+
320
+    include_spip('inc/autoriser');
321
+    // accorder l'autorisation de modif du statut auteur
322
+    autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
323
+    include_spip('action/editer_auteur');
324
+    // changer le statut
325
+    auteur_modifier($auteur['id_auteur'], array('statut' => $s));
326
+    unset($_COOKIE['spip_session']); // forcer la maj de la session
327
+    // lever l'autorisation de modif du statut auteur
328
+    autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
329
+
330
+    // mettre a jour le statut
331
+    $auteur['statut'] = $s;
332
+
333
+    return $auteur;
334 334
 }
335 335
 
336 336
 
@@ -342,14 +342,14 @@  discard block
 block discarded – undo
342 342
  * @return string
343 343
  */
344 344
 function auteur_attribuer_jeton($id_auteur) {
345
-	include_spip('inc/acces');
346
-	// s'assurer de l'unicite du jeton pour le couple (email,cookie)
347
-	do {
348
-		$jeton = creer_uniqid();
349
-		sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
350
-	} while (sql_countsel("spip_auteurs", "cookie_oubli=" . sql_quote($jeton)) > 1);
351
-
352
-	return $jeton;
345
+    include_spip('inc/acces');
346
+    // s'assurer de l'unicite du jeton pour le couple (email,cookie)
347
+    do {
348
+        $jeton = creer_uniqid();
349
+        sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
350
+    } while (sql_countsel("spip_auteurs", "cookie_oubli=" . sql_quote($jeton)) > 1);
351
+
352
+    return $jeton;
353 353
 }
354 354
 
355 355
 /**
@@ -359,15 +359,15 @@  discard block
 block discarded – undo
359 359
  * @return array|bool
360 360
  */
361 361
 function auteur_verifier_jeton($jeton) {
362
-	// refuser un jeton corrompu
363
-	if (preg_match(',[^0-9a-f.],i', $jeton)) {
364
-		return false;
365
-	}
362
+    // refuser un jeton corrompu
363
+    if (preg_match(',[^0-9a-f.],i', $jeton)) {
364
+        return false;
365
+    }
366 366
 
367
-	// on peut tomber sur un jeton compose uniquement de chiffres, il faut forcer le $type pour sql_quote pour eviter de planter
368
-	$desc = sql_fetsel('*', 'spip_auteurs', "cookie_oubli=" . sql_quote($jeton, '', 'string'));
367
+    // on peut tomber sur un jeton compose uniquement de chiffres, il faut forcer le $type pour sql_quote pour eviter de planter
368
+    $desc = sql_fetsel('*', 'spip_auteurs', "cookie_oubli=" . sql_quote($jeton, '', 'string'));
369 369
 
370
-	return $desc;
370
+    return $desc;
371 371
 }
372 372
 
373 373
 /**
@@ -377,5 +377,5 @@  discard block
 block discarded – undo
377 377
  * @return bool
378 378
  */
379 379
 function auteur_effacer_jeton($id_auteur) {
380
-	return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
380
+    return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
381 381
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -56,7 +56,7 @@  discard block
 block discarded – undo
56 56
 	}
57 57
 
58 58
 	include_spip('base/abstract_sql');
59
-	$res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
59
+	$res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=".sql_quote($desc['email']));
60 60
 	// erreur ?
61 61
 	if (!$res) {
62 62
 		return _T('titre_probleme_technique');
@@ -209,7 +209,7 @@  discard block
 block discarded – undo
209 209
 		if (!sql_countsel('spip_auteurs', "login='$login'")) {
210 210
 			return $login;
211 211
 		}
212
-		$login = $login_base . $i;
212
+		$login = $login_base.$i;
213 213
 	}
214 214
 
215 215
 	return $login;
@@ -242,7 +242,7 @@  discard block
 block discarded – undo
242 242
 	}
243 243
 
244 244
 	$modele_mail = 'modeles/mail_inscription';
245
-	if (isset($options['modele_mail']) and $options['modele_mail']){
245
+	if (isset($options['modele_mail']) and $options['modele_mail']) {
246 246
 		$modele_mail = $options['modele_mail'];
247 247
 	}
248 248
 	$message = recuperer_fond($modele_mail, $contexte);
@@ -346,8 +346,8 @@  discard block
 block discarded – undo
346 346
 	// s'assurer de l'unicite du jeton pour le couple (email,cookie)
347 347
 	do {
348 348
 		$jeton = creer_uniqid();
349
-		sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
350
-	} while (sql_countsel("spip_auteurs", "cookie_oubli=" . sql_quote($jeton)) > 1);
349
+		sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=".intval($id_auteur));
350
+	} while (sql_countsel("spip_auteurs", "cookie_oubli=".sql_quote($jeton)) > 1);
351 351
 
352 352
 	return $jeton;
353 353
 }
@@ -365,7 +365,7 @@  discard block
 block discarded – undo
365 365
 	}
366 366
 
367 367
 	// on peut tomber sur un jeton compose uniquement de chiffres, il faut forcer le $type pour sql_quote pour eviter de planter
368
-	$desc = sql_fetsel('*', 'spip_auteurs', "cookie_oubli=" . sql_quote($jeton, '', 'string'));
368
+	$desc = sql_fetsel('*', 'spip_auteurs', "cookie_oubli=".sql_quote($jeton, '', 'string'));
369 369
 
370 370
 	return $desc;
371 371
 }
@@ -377,5 +377,5 @@  discard block
 block discarded – undo
377 377
  * @return bool
378 378
  */
379 379
 function auteur_effacer_jeton($id_auteur) {
380
-	return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
380
+	return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=".intval($id_auteur));
381 381
 }
Please login to merge, or discard this patch.