Commit Graph

3659 Commits

Author SHA1 Message Date
Mikael Nordfeldth
1d0a448e07 Publish rel="me" in Link HTTP headers 2016-02-24 16:43:09 +01:00
Mikael Nordfeldth
afbdcf8938 Don't publish mbox_sha1sum in FOAF by default.
We say the email is private data, so reasonably we shouldn't reveal it
indirectly through a hash sum: http://xmlns.com/foaf/spec/#term_mbox_sha1sum
2016-02-19 00:10:05 +01:00
Mikael Nordfeldth
73dbc5ca1b Use ToSelector choice again. 2016-02-17 23:44:15 +01:00
Mikael Nordfeldth
d9b649642d Show notice feed URLs (and author) 2016-02-17 23:32:56 +01:00
Mikael Nordfeldth
5fbb01130a By default, disallow users to set private_stream 2016-02-17 22:58:31 +01:00
Mikael Nordfeldth
47dc15c9f6 Describe that we don't allow empty fullnames. 2016-02-17 22:48:32 +01:00
Mikael Nordfeldth
d6bf90cfb7 If profile fullname is 0 chars use nickname 2016-02-17 22:43:45 +01:00
Mikael Nordfeldth
c7c34ec05a Only administrators can delete other privileged users. 2016-02-12 15:00:18 +01:00
Mikael Nordfeldth
e5ad98e601 Silence action can only be used on non-priviliged users 2016-02-12 14:22:25 +01:00
Mikael Nordfeldth
ec257d940a Either use or don't use HTTPS
The risk of injection attacks using HTTP is too great to allow a
site that allows both HTTP and HTTPS...
2016-02-10 00:57:39 +01:00
Mikael Nordfeldth
7c90d7022b Require the license with HTML5 2016-02-08 17:56:35 +01:00
Mikael Nordfeldth
cd71188d3a SimpleCaptcha plugin to stop basic bots 2016-02-08 17:47:09 +01:00
Mikael Nordfeldth
a30d34be7f Returnto the previous page when deleting a notice. 2016-02-08 15:30:28 +01:00
Mikael Nordfeldth
25c15119bc Backupaccount is always readonly 2016-02-03 01:15:35 +01:00
Mikael Nordfeldth
19b743a9f5 Set time limit to increase time backupaccount can take
Wills till run out of memory probably, we should fix that.
2016-02-03 01:04:14 +01:00
Mikael Nordfeldth
a6898b033d Fullname and location are now text, not varchar, and can be >191|255 2016-01-28 19:12:30 +01:00
Mikael Nordfeldth
7e6783bb8f Replace htmLawed with HTMLPurifier 2016-01-28 19:01:13 +01:00
Mikael Nordfeldth
d73c264e25 Haha, forgot that the $content content must also be there! 2016-01-27 23:04:19 +01:00
Mikael Nordfeldth
a47563cf3d Don't add space if there's no string in new notice content 2016-01-27 22:41:53 +01:00
Mikael Nordfeldth
03d2b680f8 Allow empty new-notice content via web if there's an upload 2016-01-27 22:39:43 +01:00
Akio Nishimura
d13454fb84 Now we can delete a group logo. 2016-01-21 08:10:35 +09:00
Mikael Nordfeldth
a1530b0e68 Removing superflous debug stuff 2016-01-14 22:12:36 +01:00
Mikael Nordfeldth
8df38df5cb Get uploaded media_ids via File::getByID()
Filters out failed ones...
2016-01-14 22:05:03 +01:00
Mikael Nordfeldth
e5019c3858 Accept media_ids parameter from Twitter API v1.1 clients
They upload the media first and then provide media IDs in a comma
separated parameter (but we just split it to all whole integers).
2016-01-14 20:24:01 +01:00
Mikael Nordfeldth
b570f0d3cb Media files are accepted and uploaded via Twitter API now 2016-01-14 19:15:02 +01:00
Mikael Nordfeldth
0caf0612d0 Make Twitter Media upload API v1.1 reach us
Now we just have to accept the 'media' or 'media_data' (base64 encoded)
POST arguments instead of $_FILES uploads.
2016-01-14 18:29:21 +01:00
Mikael Nordfeldth
1e5770bbcf $this->notice is never unset after prepare 2016-01-13 21:34:15 +01:00
Mikael Nordfeldth
adba38ce20 Deleted_notice is pluginified, don't call directly from core 2016-01-13 21:29:23 +01:00
mmn
e4a1dff98d Merge branch 'apiaccountregister_event_branch' into 'nightly'
APIStartRegistrationTry event



See merge request !77
2016-01-11 21:08:09 +00:00
hannes
543a7e421e APIStartRegistrationTry event 2016-01-11 20:04:31 +00:00
Mikael Nordfeldth
33194b3cff Attention goes to the parent notice author too 2016-01-08 02:58:31 +01:00
Mikael Nordfeldth
c48871cf1b Notice from web now saves context->attention too! ;) 2016-01-07 23:24:15 +01:00
Mikael Nordfeldth
1f02dc639e shortenLinks _after_ media upload to be consistent with api 2016-01-07 18:14:45 +01:00
Mikael Nordfeldth
6505504411 shortenLinks with a capital L 2016-01-07 18:12:29 +01:00
Mikael Nordfeldth
6924bb1d29 Gah and a 302 in the non-exception-handling redirect too 2016-01-06 20:09:59 +01:00
Mikael Nordfeldth
a9b5519293 Attachment thumbnail redirect is a 302 redirect
It SHOULD be cached but it might no longer be valid if we empty cache or something.
2016-01-06 20:07:40 +01:00
Mikael Nordfeldth
4d179c6b0c Our URLs are permanent redirects, mind you! 2016-01-06 20:06:14 +01:00
Mikael Nordfeldth
b596391fcd Avoid having to check for notices without rendered copies in upgrade.php
Always call the Notice->getRendered() function to get a rendered copy.
We could perhaps put some sanitation there too in the future
2016-01-06 15:32:27 +01:00
Mikael Nordfeldth
0fd2ad649e Conversation IDs (again) no longer based on Notice ID 2016-01-06 13:58:46 +01:00
Mikael Nordfeldth
4b22b0c42a More listitems and lists into separate files + stronger typing 2016-01-06 01:36:46 +01:00
Mikael Nordfeldth
6d9f390ba8 Separating classes into files and stronger typing 2016-01-06 01:30:12 +01:00
Mikael Nordfeldth
792b62874e Require Profile for Profile->getLists 2016-01-06 00:18:10 +01:00
Mikael Nordfeldth
3d66d960a1 Require Profile for Profile->getOtherTags 2016-01-06 00:07:15 +01:00
Mikael Nordfeldth
8ad6b8809a Don't abort on too long notices in Notice::saveActivity 2016-01-05 17:31:09 +01:00
Mikael Nordfeldth
c19964094b Pending subscription requests now work as they should
A slight layout issue with the buttons still persists
2016-01-03 20:27:53 +01:00
Mikael Nordfeldth
0dfafe2567 NewnoticeAction now uses Notice::saveActivity(...) 2016-01-01 20:18:54 +01:00
Mikael Nordfeldth
54325e266f upgrade script makes sure all notices have rendered copies 2016-01-01 18:30:38 +01:00
Mikael Nordfeldth
b0bf620c61 RecoverpasswordAction uses User->setPassword() 2015-12-30 17:53:43 +01:00
Mikael Nordfeldth
29847f172f setPassword now runs validate too 2015-12-30 17:51:57 +01:00
Chimo
c95f74018d Add AtomPub, Twitter-compat. API documentation to doc-src/ 2015-11-24 13:00:32 -05:00
mmn
3255e2e1b8 Merge branch 'page_title_showstream' into 'nightly'
Show page title in user's profile page

Enable page title on user's profile page to make it consistent with all other pages and better orient users.

![Screenshot_-_250715_-_14_50_00](https://git.gnu.io/aroque/gnu-social/uploads/06e92b233e88fdb66047fbc0571f9831/Screenshot_-_250715_-_14_50_00.png)

See merge request !22
2015-10-10 20:36:59 +00:00
mmn
89d3d9b2ce Merge branch 'usergroups_page' into 'nightly'
Improve display of user's groups page.

* Show page notice as for subscriptions
* Show instructions when user has no groups
* Add explanation of remote groups and link to skilledtest wiki

Here is how it looks when a logged in user is not following groups yet

![login_nogroups](https://git.gnu.io/aroque/gnu-social/uploads/34b1bdcdb9e7277ec3deff4594061c59/login_nogroups.png)

After following a group, you still see the instruction notice. This way you have links to searching groups and creating a new one.

![login_groups](https://git.gnu.io/aroque/gnu-social/uploads/cb50689bcdfca7adc5cdcbe620487aa4/login_groups.png)

Finally when logged out:

![nologin_groups](https://git.gnu.io/aroque/gnu-social/uploads/40d81ab909321f8729c2696dd3938d46/nologin_groups.png)

The current version on nightly has basically no text at all.

See merge request !25
2015-10-10 20:35:36 +00:00
Mikael Nordfeldth
a793d211d2 Match parent class definition of clientError 2015-10-10 20:51:53 +02:00
Mikael Nordfeldth
b4c51b2d39 Use an atom:link to ApiMediaUpload response instead of mediahref
'cause why not?
2015-10-10 20:41:14 +02:00
Mikael Nordfeldth
9728270acd Add mediahref in our incredibly arbitrary response 2015-10-10 17:15:29 +02:00
Mikael Nordfeldth
5d91c9a820 Don't send multiple error responses in ApiMediaUpload :) 2015-10-10 17:12:44 +02:00
Mikael Nordfeldth
dd149a76f3 AtomPub should work now, at least for post/note 2015-10-09 16:19:26 +02:00
Mikael Nordfeldth
216a04df86 Switching variable access in ApiTimelineUser to GNUsocial improvements 2015-10-09 11:23:20 +02:00
Mikael Nordfeldth
dac617d95a I think all the notice deletion calls are event-compatible now
This means we can handle DeleteNoticeAsProfile in plugins, such as
the ActivityModeration plugin.
2015-10-03 12:26:09 +02:00
Mikael Nordfeldth
ad3b62cf2f ShowprofiletagAction now extends ShowstreamAction 2015-09-27 23:46:30 +02:00
Mikael Nordfeldth
0e24709989 Profile/Peopletag file splitting for autoload 2015-09-27 22:51:50 +02:00
Mikael Nordfeldth
0bd0c65b87 Bring back title to DocAction 2015-09-15 14:26:33 +02:00
Mikael Nordfeldth
b209dcf8a7 DocAction now extends ManagedAction 2015-09-15 12:07:35 +02:00
Mikael Nordfeldth
e06553b15b Suggested edits by hannes2peer 2015-09-03 18:04:13 +02:00
aroquen
a04b1cda45 Drop dead variable 2015-07-26 11:10:57 +02:00
aroquen
b0abce9bc8 Page notice message as instructions class 2015-07-26 11:10:30 +02:00
aroquen
c6f58d432c Improve display of user's groups page.
* Show page notice as for subscriptions
* Show instructions when user has no groups
* Add explanation of remote groups and link to skilledtest wiki
2015-07-25 21:38:38 +02:00
aroquen
ad49158fb5 Show page title in user's profile page 2015-07-25 14:45:45 +02:00
Mikael Nordfeldth
266b032b17 UsergroupbyidAction now extends ManagedAction 2015-07-21 02:32:17 +02:00
Mikael Nordfeldth
992fe6896f Urlsettings now adapted to FormAction 2015-07-17 15:16:45 +02:00
Mikael Nordfeldth
2dd979d3f8 SMS Settings now better adapted to FormAction 2015-07-17 14:29:07 +02:00
Mikael Nordfeldth
9f82da07f1 ProfilesettingsAction and related stuff modernised 2015-07-17 12:20:11 +02:00
Mikael Nordfeldth
53e820b466 Maximum character limit with utf8mb4 is 191 in varchar 2015-07-17 11:22:25 +02:00
Mikael Nordfeldth
cfaaf3c13c PasswordsettingsAction aligned with FormAction
Also made some changes in the password "munging" function call
common_munge_password to accept a profile instead of user ID (which
was only there because stoneage StatusNet used the ID to generate a
not-very-random salt, but nowadays we primarily use AuthCrypt plugin).
2015-07-17 01:47:43 +02:00
Mikael Nordfeldth
47ef917f62 oldschool settings adapted to FormAction
TODO: Rename this "Layout", "Display" or something, since it might
actually be interesting to have non-threaded views for some users.
2015-07-17 01:18:28 +02:00
Mikael Nordfeldth
a6e299a2fc OAuth stuff adapted for FormAction
TODO: Break OAuth out into a plugin.
2015-07-17 01:07:19 +02:00
Mikael Nordfeldth
f1d9d8a6ed ImSettings adapted to FormAction inheritance
TODO: Get separate Form classes and move User_im_prefs to Profile_prefs
2015-07-16 21:18:50 +02:00
Mikael Nordfeldth
647171e089 EmailSettingsAction adapted to FormAction
TODO: EmailSettingsForm as a separate class would be good!
2015-07-16 21:17:22 +02:00
Mikael Nordfeldth
fd2efbc6f8 AvatarSettings more aligned to FormAction
TODO: Make classes called AvatarCropForm and AvatarUploadForm
2015-07-16 19:21:12 +02:00
Mikael Nordfeldth
673bef2fda OAuth widgets separated into their own files 2015-07-16 18:52:43 +02:00
Mikael Nordfeldth
01a4ab30dc Removing MicroID as well as simplifying profileaction
sorry, forgot to commit in between
2015-07-14 16:52:20 +02:00
Mikael Nordfeldth
e868ac41cd userrss action didn't call parent preparation method 2015-07-11 19:48:18 +02:00
Mikael Nordfeldth
ac98600640 More RESTish URL (/notice/:notice/delete) for notice delete
Also returns to 'top' now after notice deletion.
2015-07-11 11:26:48 +02:00
Mikael Nordfeldth
7d524307d2 DeletenoticeForm is its own class now 2015-07-11 11:26:44 +02:00
Mikael Nordfeldth
2a1be57470 Merge branch 'nightly' into deletenotice_form_fix 2015-07-11 10:49:41 +02:00
Mikael Nordfeldth
ad453785f0 FoafAction now a ManagedAction 2015-07-10 23:10:24 +02:00
Mikael Nordfeldth
3900a739b9 Forgotten migrations of ->profile and ->user to ->getTarget()
GalleryAction extends ProfileAction which no longer uses ->profile and ->user
2015-07-10 23:05:02 +02:00
Mikael Nordfeldth
6c4985476e Merge branch 'nightly' into deletenotice_form_fix 2015-07-10 13:54:06 +02:00
Mikael Nordfeldth
50c297bcbe ShowstreamAction fixes so it's not as horrible 2015-07-10 12:34:06 +02:00
Mikael Nordfeldth
e567406c9f RedirecturlAction now extends ManagedAction 2015-07-10 12:08:33 +02:00
Mikael Nordfeldth
76432b958b delete notice form fix 2015-07-10 00:52:22 +02:00
Mikael Nordfeldth
e46b2803a7 Introducing TargetedRss10Action for simplifying RSS 1.0 2015-07-10 00:28:36 +02:00
Mikael Nordfeldth
06f60b57c1 StartpageAction essentially duplicated TopAction 2015-07-09 23:01:50 +02:00
Mikael Nordfeldth
d63bca9d3c Rss10Action now in an autodetected file. 2015-07-09 14:22:22 +02:00
Mikael Nordfeldth
43cec8eaac API actions are not ManagedAction yet 2015-07-09 13:46:03 +02:00
Mikael Nordfeldth
6919dda958 RobotstxtAction migrated to ManagedAction 2015-07-07 19:45:01 +02:00
Mikael Nordfeldth
acdcb2ad8d prepare and handle function to match parents 2015-07-07 19:34:42 +02:00
Mikael Nordfeldth
3b6a424c9f Mismatching function declarations. 2015-07-04 19:51:36 +02:00
Mikael Nordfeldth
9054bb69e9 I had some inheritance the wrong way around. 2015-07-04 19:48:35 +02:00
Mikael Nordfeldth
d5a24da167 only variables can be sent by reference (strict standards) 2015-06-25 20:13:27 +02:00
Mikael Nordfeldth
fde3b99e8e Less redundant code, please 2015-06-21 01:37:29 +02:00
chimo
39462c3a2e Documentation about plugins
* Content in plugins/doc/Plugin_development.md from:
https://web.archive.org/web/20140821102047/http://status.net/wiki/HOWTO_Make_a_Plugin

* Point link on Plugins Admin Panel page to plugins/README.md
2015-06-14 11:59:46 -04:00
Mikael Nordfeldth
4fc62a8bf5 Another function not matching parent declaration 2015-06-07 09:26:12 +02:00
Mikael Nordfeldth
d76d37340a Function declarations not matching their parents 2015-06-06 22:14:56 +02:00
mmn
a39f51c044 Merge branch 'tagprofile-ajax-fix' into 'nightly'
Only serve tagprofile HTML if we aren't POSTing via ajax

This fixes an issue where POSTing the selftag form in the
profile_block sidebar via AJAX would generate an XML response
containing both the content from doPost() and showPage(),
resulting in invalid XML.

These changes make it so that if we're POSTing via AJAX,
we serve content from doPost(), otherwise we serve showPage()
but never both.

See merge request !8
2015-06-06 10:26:43 +00:00
Chimo
47c83f4c49 Only serve tagprofile HTML if we aren't POSTing via ajax
This fixes an issue where POSTing the selftag form in the
profile_block sidebar via AJAX would generate an XML response
containing both the content from doPost() and showPage(),
resulting in invalid XML.

These changes make it so that if we're POSTing via AJAX,
we serve content from doPost(), otherwise we serve showPage()
but never both.
2015-06-06 00:22:14 -04:00
Mikael Nordfeldth
c26e08d6a6 some more extensions of ShowstreamAction broke in last commit 2015-06-05 21:49:34 +02:00
Mikael Nordfeldth
8ad81a6aa3 Allow showing profiles with UserbyidAction (/user/:id) 2015-06-05 21:24:41 +02:00
Mikael Nordfeldth
a4739b0107 Move some last OpenID stuff into the OpenID plugin (XRDS) 2015-06-04 01:08:03 +02:00
Mikael Nordfeldth
bdd15cfe63 don't double the output for some PublicAction->extraHead 2015-06-04 00:56:46 +02:00
Mikael Nordfeldth
551c69ed56 Extend Networkpublic and Public actions from SitestreamAction 2015-06-04 00:51:07 +02:00
Mikael Nordfeldth
2cebbead75 Accidentally presented Atom feed as ActivityStreams JSON 2015-06-02 12:58:30 +02:00
Mikael Nordfeldth
82f9b6908c Fake recovery by email address, to hide registrants on the site 2015-05-30 23:29:58 +02:00
Mikael Nordfeldth
731d283159 Password recovery logic cleaned up 2015-05-30 23:18:17 +02:00
Mikael Nordfeldth
2b58d6b774 Merge branch 'quitagram' into nightly
Fixes that make quitagram work better amongst other things.
2015-04-22 22:17:50 +02:00
Mikael Nordfeldth
51ecd6be15 Fix some ProfileAction stuff, add function profileActionPreparation
Split up files with multiple classes to multiple files for autoload, sorry
for baking this into this commit.
2015-04-22 21:22:38 +02:00
Mikael Nordfeldth
f6432fdf48 File_thumbnail->getUrl now gives Attachment_thumbnail action URL
That in turn redirects to the statically stored file.
2015-04-03 21:21:39 +02:00
Mikael Nordfeldth
642f7f850d repeat actions to Share plugin 2015-03-12 21:46:10 +01:00
Mikael Nordfeldth
1adf5f2863 Merge branch 'nightly' into repeat_as_shareplugin 2015-03-12 20:54:06 +01:00
Mikael Nordfeldth
3ee673ac91 ImageFile->resize now totally replaced with resizeTo 2015-03-12 20:47:07 +01:00
Mikael Nordfeldth
dcfcceb6f2 Share plugin now handles showing form in NoticeOptionItems 2015-03-12 16:33:34 +01:00
Mikael Nordfeldth
c85e78ac3c Remove unnecessary require lines and definitions
ProfileNoticeList and ProfileNoticeListItem are in their own files now too
2015-03-12 15:53:59 +01:00
Mikael Nordfeldth
2a32af084f ImageFile $id argument is only for File objects
Remember to eliminate the Avatar/group logo call to ImageFile->resize!
2015-03-11 00:20:48 +01:00
Mikael Nordfeldth
0a2c51510c FormAction wants getInstructions to be protected
only showInstructions is public
2015-03-10 21:46:33 +01:00
Mikael Nordfeldth
7aa1e02d06 Don't use a placeholder value on the nickname field
(because the placeholder would be 'Nickname', and it might confuse
someone who thinks they can use capital letters...)
2015-03-08 23:29:38 +01:00
Mikael Nordfeldth
1ea876296d A bunch of FormAction and ManagedAction synchronization 2015-03-08 20:41:42 +01:00
Mikael Nordfeldth
55894f02c7 TagProfileAction and OStatusPlugin now use less redundant code 2015-03-08 20:14:46 +01:00
Mikael Nordfeldth
32dacb9369 ROLLBACK queries in the proper order 2015-03-08 19:44:23 +01:00
Mikael Nordfeldth
d6423bbbc8 Sensitive-test _is_ done in index.php 2015-03-08 19:17:01 +01:00
Mikael Nordfeldth
1a1b992858 RepliesAction migrated to extend ManagedAction 2015-03-08 12:38:15 +01:00
Mikael Nordfeldth
196df7d8a4 Change the title of NewnoticeAction if replying 2015-03-07 20:34:46 +01:00
Mikael Nordfeldth
38f977d2f3 Make sure we save 0 as '0' because of DB_DataObject bug 2015-03-06 23:21:57 +01:00
Mikael Nordfeldth
62596d462b Get the values from the correct object. 2015-03-06 00:47:18 +01:00
Mikael Nordfeldth
f35ea45e09 Values of 0 would not be updated because of DB_DataObject
Upstream bug causing (int)0 to be interpreted as a "null string":
https://pear.php.net/bugs/bug.php?id=20291
2015-03-06 00:44:00 +01:00
Mikael Nordfeldth
ec4e432d55 Subscription::ensureStart skips AlreadyFulfilledException
Sometimes we just want to accept the user's wrong, but when it comes
to remote APIs etc. we probably want to let the client know it has
done something already (in this case multiple identical subscription
requests - which might indicate to it that it should refresh the sub
lists or something).
2015-03-04 11:38:04 +01:00
Mikael Nordfeldth
19bf975e56 Aahhh, gotta run php -l before pushing stuff!!! 2015-03-01 12:47:48 +01:00
Mikael Nordfeldth
1227d2d710 Forgot to make syntax edits on last commit. 2015-03-01 12:45:58 +01:00
Mikael Nordfeldth
bece816ec7 User class throws exception on register failure 2015-03-01 12:36:19 +01:00
Mikael Nordfeldth
8fac7a9f6c StatusNet class renamed GNUsocial
also added backward compatible StatusNet class for the two calls I know
third party plugins use, isHTTPS and getActivePlugins
2015-02-27 12:44:15 +01:00
Mikael Nordfeldth
f7553d73a2 501 Not Implemented on timelines for remote users. 2015-02-25 16:31:02 +01:00
buttle
b9d4a9c9f9 added DocNav EVENT
Event to overide DocNav
two small css changes to indent notice footer correctly.
2015-02-24 21:51:31 +01:00
Mikael Nordfeldth
df2cc09362 $this->scoped->getUser() instead of common_current_user(); 2015-02-19 17:46:37 +01:00
Mikael Nordfeldth
042cb1604a ROLLBACK if query failed in email settings savePreferences 2015-02-19 17:43:08 +01:00
Mikael Nordfeldth
0deaf6c50c use common_purify to purify HTML, one function to rule them all 2015-02-18 00:14:28 +01:00
Mikael Nordfeldth
282f4d6a89 Various $this->scoped fixes and protected prepare/handle in API actions 2015-02-17 17:20:00 +01:00
Mikael Nordfeldth
901a825b61 Non-functional "retweeted to me" API call modified (but not fixed)
For some reason the "retweeted to me" part of the Twitter API was removed
when Evan made some inbox changes back in the StatusNet days. We might
recover this functionality, but not yet. The proper function calls are
however fixed in this commit.
2015-02-17 16:48:24 +01:00
Mikael Nordfeldth
75f35bcfe7 apiauth action with ->user changed to ->scoped 2015-02-17 16:39:27 +01:00
Chimo
7cea3f9f11 Add 'statusnet_textarea' backward-compatibility 2015-02-10 10:53:24 -05:00
Chimo
d816af9aa9 Prepopulate newnotice from URL arg 2015-02-09 18:06:26 -05:00
Mikael Nordfeldth
8616055959 Can now delete lists/peopletags (thanks MrB)
Reported on https://bugz.foocorp.net/T79
Fix by MrB: https://gist.github.com/mrvdb/0f5d84c9b56c0a390c4a
2015-02-08 23:48:35 +01:00