Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a36628edc7 | ||
|
d4fa67cc8e | ||
|
51740e4d49 | ||
|
d7ab9cd72e | ||
|
e5f22390dc | ||
|
e9df9b7bdb | ||
|
05825ecc93 | ||
|
34b25e032e | ||
|
e6a8cad494 | ||
|
2570877580 | ||
|
8dc071c955 | ||
|
0e99f04c43 | ||
|
f5acc4a386 | ||
|
3ab4b1cdb6 | ||
|
596b4b8e02 | ||
|
45b50d3387 | ||
|
6f6a593984 | ||
|
e1c8080e8f | ||
|
b3eef26174 | ||
|
a855c98834 | ||
|
3037794b6d | ||
|
cc5739918e | ||
|
23ecdf2a07 | ||
|
182ae843ca | ||
|
13256d2a66 | ||
|
fabdad7dc7 | ||
|
7df7eb1aeb | ||
|
2590528d63 | ||
|
b4f45b8537 | ||
|
077a5a04a2 | ||
|
c01906055e | ||
|
d247c08aeb | ||
|
4c0f42984c |
|
@ -423,6 +423,16 @@ class QvitterPlugin extends Plugin {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove CSRF cookie on logout
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onEndLogout($action) {
|
||||||
|
common_set_cookie('Qvitter-CSRF', '', 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add script to default ui, to be able to toggle Qvitter with one click
|
* Add script to default ui, to be able to toggle Qvitter with one click
|
||||||
|
@ -1287,6 +1297,24 @@ class QvitterPlugin extends Plugin {
|
||||||
*/
|
*/
|
||||||
public function onEndSetApiUser($user) {
|
public function onEndSetApiUser($user) {
|
||||||
|
|
||||||
|
// if we're POST:ing and are logged in using a regular session (i.e. not basic auth or oauth)
|
||||||
|
// check that we have a correct csrf cookie and header, otherwise deny
|
||||||
|
if(common_logged_in() && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
|
if(!isset($_COOKIE['Qvitter-CSRF'])) {
|
||||||
|
throw new ServerException(_('Error setting user. Missing authorization cookie data. Please logout and login again.'));
|
||||||
|
}
|
||||||
|
$csrf_token = sha1(common_config('qvitter', 'appid').session_id());
|
||||||
|
if($_COOKIE['Qvitter-CSRF'] != $csrf_token) {
|
||||||
|
throw new ServerException(_('Error setting user. Invalid authorization cookie data. Please logout and login again.'));
|
||||||
|
}
|
||||||
|
if(!isset($_SERVER['HTTP_X_QVITTER_CSRF'])) {
|
||||||
|
throw new ServerException(_('Error setting user. Missing authorization header data. Please logout and login again.'));
|
||||||
|
}
|
||||||
|
if($_SERVER['HTTP_X_QVITTER_CSRF'] != $csrf_token) {
|
||||||
|
throw new ServerException(_('Error setting user. Invalid authorization header data. Please logout and login again.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// cleanup sessions, to allow for simultaneous http-requests,
|
// cleanup sessions, to allow for simultaneous http-requests,
|
||||||
// e.g. if posting a notice takes a very long time
|
// e.g. if posting a notice takes a very long time
|
||||||
Session::cleanup();
|
Session::cleanup();
|
||||||
|
|
|
@ -45,6 +45,15 @@ class QvitterAction extends ApiAction
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
|
|
||||||
|
// if we're logged in but we have missing or incorrect csrf cookie, logout
|
||||||
|
if(common_logged_in()) {
|
||||||
|
$csrf_token = sha1(common_config('qvitter', 'appid').session_id());
|
||||||
|
if(!isset($_COOKIE['Qvitter-CSRF']) || $_COOKIE['Qvitter-CSRF'] != $csrf_token) {
|
||||||
|
header('Location: '.common_path('').'main/logout');
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$user = common_current_user();
|
$user = common_current_user();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -112,6 +112,17 @@ class QvitterLoginAction extends FormAction
|
||||||
common_rememberme($user);
|
common_rememberme($user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure we have a unique app id for this Qvitter installation in config
|
||||||
|
// to use for creating a csrf token
|
||||||
|
if(common_config('qvitter', 'appid') == false) {
|
||||||
|
Config::save('qvitter', 'appid', sha1(common_random_hexstr(16)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// set csrf-cookie
|
||||||
|
$csrf_token = sha1(common_config('qvitter', 'appid').session_id());
|
||||||
|
common_set_cookie('Qvitter-CSRF', $csrf_token, time() + 60*60*24*30); // 1 month
|
||||||
|
|
||||||
|
|
||||||
$url = common_get_returnto();
|
$url = common_get_returnto();
|
||||||
|
|
||||||
if ($url) {
|
if ($url) {
|
||||||
|
|
|
@ -334,6 +334,9 @@ function postUpdateBookmarks(newBookmarks) {
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/update_bookmarks.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/update_bookmarks.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
bookmarks: bookmarksString
|
bookmarks: bookmarksString
|
||||||
},
|
},
|
||||||
|
@ -358,6 +361,9 @@ function postNewLinkColor(newLinkColor) {
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/update_link_color.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/update_link_color.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
linkcolor: newLinkColor
|
linkcolor: newLinkColor
|
||||||
},
|
},
|
||||||
|
@ -383,6 +389,9 @@ function postNewBackgroundColor(newBackgroundColor) {
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/update_background_color.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/update_background_color.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
backgroundcolor: newBackgroundColor
|
backgroundcolor: newBackgroundColor
|
||||||
},
|
},
|
||||||
|
@ -412,6 +421,9 @@ function postSetProfilePref(namespace, topic, data, callback) {
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/set_profile_pref.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/set_profile_pref.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
namespace: namespace,
|
namespace: namespace,
|
||||||
topic: topic,
|
topic: topic,
|
||||||
|
@ -448,6 +460,9 @@ function APIFollowOrUnfollowUser(followOrUnfollow,user_id,this_element,actionOnS
|
||||||
$.ajax({ url: window.apiRoot + postRequest,
|
$.ajax({ url: window.apiRoot + postRequest,
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
user_id: user_id
|
user_id: user_id
|
||||||
},
|
},
|
||||||
|
@ -485,6 +500,9 @@ function APIBlockOrUnblockUser(blockOrUnblock,user_id,actionOnSuccess) {
|
||||||
$.ajax({ url: window.apiRoot + postRequest,
|
$.ajax({ url: window.apiRoot + postRequest,
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
id: user_id
|
id: user_id
|
||||||
},
|
},
|
||||||
|
@ -515,6 +533,9 @@ function APISandboxCreateOrDestroy(createOrDestroy,userId,actionOnSuccess) {
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/sandbox/' + createOrDestroy + '.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/sandbox/' + createOrDestroy + '.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
id: userId
|
id: userId
|
||||||
},
|
},
|
||||||
|
@ -545,6 +566,9 @@ function APISilenceCreateOrDestroy(createOrDestroy,userId,actionOnSuccess) {
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/silence/' + createOrDestroy + '.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/silence/' + createOrDestroy + '.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
id: userId
|
id: userId
|
||||||
},
|
},
|
||||||
|
@ -577,6 +601,9 @@ function APIJoinOrLeaveGroup(joinOrLeave,group_id,this_element,actionOnSuccess)
|
||||||
$.ajax({ url: window.apiRoot + 'statusnet/groups/' + joinOrLeave + '.json',
|
$.ajax({ url: window.apiRoot + 'statusnet/groups/' + joinOrLeave + '.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
id: group_id
|
id: group_id
|
||||||
},
|
},
|
||||||
|
@ -608,6 +635,9 @@ function postQueetToAPI(queetText_txt, in_reply_to_status_id, postToGroups, acti
|
||||||
$.ajax({ url: window.apiRoot + 'qvitter/statuses/update.json',
|
$.ajax({ url: window.apiRoot + 'qvitter/statuses/update.json',
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
status: queetText_txt,
|
status: queetText_txt,
|
||||||
source: 'Qvitter',
|
source: 'Qvitter',
|
||||||
|
@ -643,6 +673,9 @@ function postActionToAPI(action, actionOnSuccess) {
|
||||||
$.ajax({ url: window.apiRoot + action,
|
$.ajax({ url: window.apiRoot + action,
|
||||||
cache: false,
|
cache: false,
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('X-Qvitter-CSRF', getCookieValue('Qvitter-CSRF'));
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
source: 'Qvitter'
|
source: 'Qvitter'
|
||||||
},
|
},
|
||||||
|
|
|
@ -37,6 +37,18 @@
|
||||||
· ·
|
· ·
|
||||||
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
|
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
|
||||||
|
|
||||||
|
/* ·
|
||||||
|
·
|
||||||
|
· Get cookie by name
|
||||||
|
·
|
||||||
|
· @param a: cookie name
|
||||||
|
·
|
||||||
|
· · · · · · · · · */
|
||||||
|
|
||||||
|
function getCookieValue(a) {
|
||||||
|
var b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
|
||||||
|
return b ? b.pop() : '';
|
||||||
|
}
|
||||||
|
|
||||||
/* ·
|
/* ·
|
||||||
·
|
·
|
||||||
|
|
Loading…
Reference in New Issue
Block a user