Commit Graph

355 Commits

Author SHA1 Message Date
Toby Zerner
d5074c5286 Use gd as the image driver
Presumably gd is more common than imagick, and we already check for it
during installation.
2015-08-28 05:41:25 +09:30
Toby Zerner
b0db7bf751 Polish admin dashboard 2015-08-27 10:50:15 +09:30
Franz Liedke
559110a83f Coding standards 2015-08-27 01:40:18 +02:00
Franz Liedke
9ec54ad892 Change base URL etc. in config.php file 2015-08-27 00:47:54 +02:00
Toby Zerner
0b8aa5c124 Add header comment; PSR-2 fixes; remove seeders 2015-08-26 16:56:32 +09:30
Toby Zerner
8ec342f6cb Autoload the cached PHP renderer 2015-08-26 09:46:20 +09:30
Toby Zerner
b67ae4c8a3 Use PHP formatter rendering engine
Removes dependency on XSLT extension
2015-08-26 09:34:49 +09:30
Toby Zerner
edccd10693 Only delete avatar if it exists 2015-08-17 16:06:51 +09:30
Toby Zerner
a32250884c Ensure posts are sorted correctly 2015-08-17 15:52:39 +09:30
Toby Zerner
212880640d Support table custom table prefix
Laravel automatically adds a table prefix to any table names, so we
need to wrap our aliased table in DB::raw.
2015-08-14 12:51:30 +09:30
Toby Zerner
34d4a7ed89 Fix Laravel 5.1 compat 2015-08-14 12:50:32 +09:30
Toby Zerner
014bacb7ab Add ability to uninstall an extension 2015-08-14 12:48:29 +09:30
Toby Zerner
2edcbacccc Improve install command, add custom migrations system
Implemented our own migration repository + migrator (based on Laravel's
stuff) so that we can keep track of which migrations have been run for
core and per-extension. That way we can simple call the migrator to
upgrade core/extensions, and to uninstall extensions.
2015-08-14 12:47:59 +09:30
Toby Zerner
5bcf6ae630 Add Escaper plugin so that formatting can be escaped 2015-08-13 13:04:56 +09:30
Toby Zerner
58223b8a23 Don't allow empty post content
Parsing the post content makes it non-empty (`<t></t>`), so we don't
parse it if it is empty. Also delete a created discussion if the first
post was invalid.

closes flarum/core#224
2015-08-13 13:03:49 +09:30
Toby Zerner
9a0190e13a Allow post author to see their own deleted post
closes flarum/core#225
2015-08-13 13:02:13 +09:30
Toby Zerner
6dd6942e17 Fix avatar uploading permissions
closes flarum/core#230
2015-08-13 12:59:40 +09:30
Toby Zerner
8aafce5fd8 Fix Laravel 5.1 compat 2015-08-13 10:41:17 +09:30
Toby Zerner
47595ff9c4 Decouple from Laravel, implement translator 2015-08-12 18:33:39 +09:30
Toby Zerner
9f0358bb39 Update to Laravel 5.1
Eloquent `lists()` now returns a collection
2015-08-12 13:24:11 +09:30
Toby Zerner
3aebd458b0 Make sure access/email/password tokens are valid 2015-08-06 15:04:38 +09:30
Toby Zerner
c361c97394 Enforce discussion renaming/deleting/post editing timed permissions 2015-08-05 19:21:33 +09:30
Toby Zerner
4c06e78b57 Allow/disallow signup per config 2015-08-05 18:19:26 +09:30
Toby Zerner
023eff95e3 Let users see themselves even if they can't see the forum 2015-08-05 18:12:09 +09:30
Toby Zerner
ff8dc5ef25 Enforce forum.view permission 2015-08-05 18:08:31 +09:30
Toby Zerner
42e382045a API: Add event for determining user groups for permissions 2015-08-05 16:06:55 +09:30
Toby Zerner
f42c3cd1ed Allow admins to delete users 2015-08-05 12:08:28 +09:30
Toby Zerner
1679f1e27b Implement edit user modal
EditUserHandler is a bit rough
2015-08-05 11:49:37 +09:30
Toby Zerner
f49d0e5341 Allow locale to be selected in footer 2015-08-05 09:50:57 +09:30
Toby Zerner
48df9bb678 Fix syntax error 2015-08-04 21:50:44 +09:30
Toby Zerner
187517a9c7 Remove ability for users to delete themselves 2015-08-04 21:35:41 +09:30
Toby Zerner
e091b037f3 Radically simplify user activity system
The activity system we were using was built around a separate table.
Whenever the user posted something, or deleted a post, we would sync
the table. The advantage of this was that we could aggregate activity
of all different types very efficiently.

It turns out that it came with a huge disadvantage: there was no
efficient way to enforce permissions on activity. If a user posted
something in a private tag, everyone could still see it on their
activity feed. My stopgap solution was to only sync activity for posts
that are viewable by guests, but that was way too limited.

It also turns out that aggregating activity of different types is
really not that useful, especially considering most of it is the user
making posts. So I've gotten rid of that whole overly-complicated
system, and just made the user profile display separate lists of posts
and discussions, retrieved from those respective APIs. The discussions
page is an actual discussion list too, which is pretty cool.

It's still technically possible to aggregate different activity types
(basically just aggregate API responses together), but we can do that
later if there's a need for it.

This is probably my favourite commit of the day :)
2015-08-04 18:44:22 +09:30
Toby Zerner
a2c3c4e51b Only add posted activity if the post is visible publicly
This is very restrictive behaviour and we'll probably need to think of
something a bit more powerful in the future. But it's a good stopgap.
2015-08-04 17:47:46 +09:30
Toby Zerner
667fe56947 Use morphTo instead of mappedMorphTo
Turns out we don't need MappedMorphTo after all.
2015-08-04 17:33:58 +09:30
Toby Zerner
5b3484d3c8 Improve error handling somewhat
- Fix composer crashing/not showing alert on error
- Make a general ValidationException which takes an array of field ⇒
messages to be outputted nicely by the API
2015-08-04 13:03:46 +09:30
Toby Zerner
70901b1420 Rough extension management implementation 2015-08-03 12:03:30 +09:30
Toby Zerner
66ee6e57ee Convert permission IDs into strings 2015-08-02 18:02:35 +09:30
Toby Zerner
6f09ba6591 Clean up 2015-07-31 20:17:17 +09:30
Toby Zerner
fde7afd3e2 Finish admin permissions page and clean up everything 2015-07-31 20:16:47 +09:30
Toby Zerner
5706c71c86 Convert email/password token date fields 2015-07-31 20:14:19 +09:30
Toby Zerner
cea8e7f567 Add group management actions to API 2015-07-31 20:10:49 +09:30
Toby Zerner
6641af3ac3 Refactor some model stuff out into traits 2015-07-31 20:09:31 +09:30
Toby Zerner
513d896f51 Fix more aspects of the password reset process 2015-07-31 14:13:35 +09:30
Toby Zerner
42fd8e26c1 Begin implementing permissions page 2015-07-29 21:00:27 +09:30
Toby Zerner
d8d9cac7c3 Enable caching of minified formatter JS 2015-07-29 20:54:48 +09:30
Toby Zerner
8f29949016 Fix email confirmation 2015-07-28 17:14:08 +09:30
Toby Zerner
02944548a1 Clean up 2015-07-28 15:35:03 +09:30
Toby Zerner
8c18ff3349 Tweak TextFormatter JS settings 2015-07-28 12:44:58 +09:30
Toby Zerner
153a5b7ce4 PERF: avoid reinstantiation of event subscribers 2015-07-27 11:53:47 +09:30
Toby Zerner
c0d57fd399 PERF: further simplify User::hasPermission() 2015-07-27 11:20:18 +09:30
Toby Zerner
07b4a5125f PERF: cache the results of User::hasPermssion() 2015-07-27 11:17:21 +09:30
Toby Zerner
b04e7f96c8 Cache model dates 2015-07-27 10:59:24 +09:30
Toby Zerner
ae3bbc1700 Replace duplicate tags instead of erroring 2015-07-23 20:29:39 +09:30
Toby Zerner
c1b12c7fc9 Extract emoticons, BBCode, and Markdown into extensions 2015-07-23 20:24:41 +09:30
Toby Zerner
c8e6fbc338 Pass correct param to notification email views 2015-07-23 16:39:56 +09:30
Toby Zerner
5b54a122c9 Notification one-per-user limit should work between instances 2015-07-23 14:33:58 +09:30
Toby Zerner
b699bbadbc Make formatter extensible 2015-07-23 14:29:33 +09:30
Toby Zerner
8442f65cdf Fix post visibility scoping 2015-07-22 16:05:11 +09:30
Toby Zerner
a0fe68272c Implement TextFormatter for posts
Get rid of formatting on user bios, we'll do that with JavaScript
2015-07-22 16:03:48 +09:30
Toby Zerner
c697c734d5 Don't run gambits if there's no search query 2015-07-22 09:57:52 +09:30
Toby Zerner
e1a51f095f Random cleanup 2015-07-22 09:57:25 +09:30
Toby Zerner
d410746c51 Fix new notifications on old subjects not appearing 2015-07-20 18:20:34 +09:30
Toby Zerner
c287d40072 Fix incorrect variable name 2015-07-20 18:10:11 +09:30
Toby Zerner
19fe138770 Change order of bootstrapping
See commit on flarum/flarum for explanation
2015-07-20 18:01:08 +09:30
Toby Zerner
57650fa648 Rework public API based on events 2015-07-18 22:59:47 +09:30
Toby Zerner
ea29bd42d8 Merge remote-tracking branch 'origin/master' 2015-07-17 15:05:03 +09:30
Toby Zerner
e3bfa8e404 Fix notifications 2015-07-17 14:48:20 +09:30
Franz Liedke
fab9bdb0ef Remove unused import 2015-07-16 00:44:02 +02:00
Franz Liedke
c2bf0b6b3a Inject SettingsRepository where possible 2015-07-16 00:32:50 +02:00
Franz Liedke
31e9f44dfb Rename caching setting repository implementation
I'm foreseeing another implementation that uses real caching (across requests).
2015-07-16 00:10:52 +02:00
Franz Liedke
6a7889934c Register database and cache implementations as binding for the settings repository 2015-07-15 23:54:56 +02:00
Franz Liedke
ba3fa73f16 Build a caching repository decorator for settings 2015-07-15 23:22:25 +02:00
Franz Liedke
8e9cf4fd2e Move settings repositories to own namespace
Also add a third method to the contract. This will help with building a caching decorator.
2015-07-15 23:16:57 +02:00
Toby Zerner
88b754ee8d Don't include deleted notifications in the unread count 2015-07-15 14:01:11 +09:30
Toby Zerner
0bb00e4eb2 Fix broken user activity syncer 2015-07-15 14:01:11 +09:30
Toby Zerner
42f1fa1272 Improve fulltext search API and interface 2015-07-07 20:35:18 +09:30
Toby Zerner
38c2ff0306 Finish client action refactoring. closes flarum/core#126 2015-07-07 19:23:13 +09:30
Toby Zerner
8a54b362c7 Add todos to document magic properties on models 2015-07-07 19:20:18 +09:30
Toby Zerner
5fe88e448e Improve post stream
- Return all discussion post IDs from API requests which add/remove
posts, so the post stream updates appropriately. Related to #146
- Always unload posts that are two pages away, no matter how fast
you’re scrolling
- Retrieve posts from cache instead of reloading them
- Fix various bugs. Maybe #152, needs confirmation
2015-07-06 16:26:27 +09:30
Toby Zerner
01ec661c3f PSR-2 fixes 2015-07-05 21:46:57 +09:30
Toby Zerner
873088750f Remove Interface suffix from some classes 2015-07-05 12:30:23 +09:30
Toby Zerner
2cc619a998 Remove todo 2015-07-05 12:25:51 +09:30
Toby Zerner
53e269fd89 Extract model validation into a trait
Also use Laravel’s ValidationException rather than our own custom one
2015-07-05 12:25:08 +09:30
Toby Zerner
04501545e3 Move Group to its own namespace
We’ll need to add commands etc. for group management in the future
2015-07-04 19:30:58 +09:30
Toby Zerner
86811c6508 Get rid of Repository interfaces 2015-07-04 18:38:59 +09:30
Toby Zerner
336c05e77a Clean up
Goddammit GitHub for Mac
2015-07-04 12:25:21 +09:30
Toby Zerner
a74b40fe47 Massive refactor
- Use contextual namespaces within Flarum\Core
- Clean up and docblock everything
- Refactor Activity/Notification blueprint stuff
- Refactor Formatter stuff
- Refactor Search stuff
- Upgrade to JSON-API 1.0
- Removed “addedPosts” and “removedPosts” relationships from discussion
API. This was used for adding/removing event posts after renaming a
discussion etc. Instead we should make an additional request to get all
new posts

Todo:
- Fix Extenders and extensions
- Get rid of repository interfaces
- Fix other bugs I’ve inevitably introduced
2015-07-04 12:24:48 +09:30
Franz Liedke
12dd550a14 Add settings repository interface and database implementation.
Almost done with flarum/core#121 now.
2015-07-01 23:08:26 +02:00
Toby Zerner
c1e7c00e2d Clean up some relation stuff 2015-07-01 22:35:56 +09:30
Toby Zerner
56932604db Refactor CoreServiceProvider
A good start I think, but still some work to do. If we go ahead with
https://github.com/flarum/core/issues/132#issuecomment-117507974 (which
I am in favour of), we can extract the entity-related stuff into some
smaller service providers (e.g. discussion repo, an event listener,
permissions, and gambits stuff could all go in
Flarum\Core\Discussions\DiscussionsServiceProvider).
2015-07-01 22:34:11 +09:30
Toby Zerner
d414ee33ed Make traits more generic
Type hinting User should take place in the callbacks. Theoretically
these traits could be used for another project now, where something
else has permissions (like a Sheep class, or a number)
2015-07-01 16:49:40 +09:30
Toby Zerner
810f79ee77 Cleanup, fix static date property error 2015-07-01 16:47:07 +09:30
Toby Zerner
d44b101373 Clean up merging stuff 2015-07-01 16:31:06 +09:30
Toby Zerner
3f32236379 API: allow date attributes to be added 2015-07-01 15:11:57 +09:30
Toby Zerner
c1595af84f Add todo about model validation 2015-07-01 13:35:27 +09:30
Toby Zerner
eafdd415ef Clean up model custom relation functionality 2015-07-01 13:22:09 +09:30
Toby Zerner
094825792a Clean up activity model 2015-07-01 13:19:24 +09:30
Franz Liedke
6e7cb1ff0e Some fixes to get along with the new bootstrapping 2015-06-30 23:29:52 +02:00
Toby Zerner
558d12c870 Search API tweaks
Rename some methods, include a mechanism for gambit negation.
Also always include the relevant posts in results. closes
flarum/core#111
2015-06-26 12:20:43 +09:30
Toby Zerner
bdd7e43e5a Notification API tweaks 2015-06-26 12:18:53 +09:30
Toby Zerner
e829788b63 Update start_post_id when starting a discussion 2015-06-25 09:48:28 +09:30
Toby Zerner
7c0accf14f Be more specific as to when we require edit permission
Since we update per-user data (e.g. isLiked) through this command’s
event
2015-06-25 08:38:18 +09:30
Toby Zerner
b4dcc02520 Give author permission to delete discussion if there are no replies
Forgot to commit this part in 64e5d50533
:3
2015-06-24 09:13:54 +09:30
Toby Zerner
64e5d50533 Allow author to delete discussion if there are no replies
Also disallow the first post in a discussion to be deleted or hidden
(thus preventing discussions with zero posts)

closes flarum/core#90 closes flarum/core#92
2015-06-23 10:34:33 +09:30
Toby Zerner
479a09a41f Fix incorrect login after confirming token 2015-06-19 19:25:47 +09:30
Toby Zerner
190c7a6741 Update avatar uploading code for psr-7
Not sure if a tmp file is the best way, but it works
2015-06-19 16:26:16 +09:30
Toby Zerner
22f91bb7e4 Add model validation messages 2015-06-19 11:43:49 +09:30
Toby Zerner
d90a8142a1 Get signup working again 2015-06-19 11:43:36 +09:30
Toby Zerner
d14716fa4d Get login/forgot password working again 2015-06-19 11:19:49 +09:30
Toby Zerner
96a2c0eb78 Run discussion events after first post is created 2015-06-19 09:07:39 +09:30
Toby Zerner
6db3bd9178 Refactor some APIs 2015-06-18 12:45:14 +09:30
Toby Zerner
f2888ee65f Cache permissions per user ID 2015-06-18 12:44:13 +09:30
Toby Zerner
a7e02ca890 Fix permission check in UserSearcher 2015-06-18 12:43:20 +09:30
Toby Zerner
b7617fa5d3 Get rid of total count from UserSearcher
Same reasoning as 64e6b7d26c
2015-06-18 12:42:56 +09:30
Toby Zerner
11b740c768 Make sure user activity is synced when whole discussions are deleted
We need to fire the PostWasDeleted event for every post when a
discussion is deleted. This means deleting big discussions will be an
intensive process, but that’s OK because it’s very rare.
2015-06-18 12:41:00 +09:30
Toby Zerner
9cb257e11d Update core permissions stuff 2015-06-18 12:38:24 +09:30
Toby Zerner
25d375cad4 Back to rewritten URLs 2015-06-17 17:58:43 +09:30
Toby Zerner
61bea371ab Use UrlGenerator to get avatar URL 2015-06-17 12:48:01 +09:30
Toby Zerner
b91ca93e09 Fix LoginWithCookie middleware being ineffective
Flarum\Support\Actor needs to be a singleton. There is a comment in
LoginWithHeader - is there a better approach to the whole Actor thing?
2015-06-17 12:47:49 +09:30
Franz Liedke
708782637e Change config values to match new base URLs 2015-06-17 02:37:06 +02:00
Franz Liedke
e8aff5bc95 Make sure generated usernames cannot break validation 2015-06-17 02:36:51 +02:00
Franz Liedke
1cbc60ca41 Merge branch 'master' into psr-7
Conflicts:
	src/Api/Actions/Discussions/IndexAction.php
	src/Api/Actions/SerializeAction.php
	src/Core/Formatter/FormatterManager.php
	src/Extend/ForumAssets.php
	src/Forum/Actions/IndexAction.php
	src/Forum/ForumServiceProvider.php
2015-06-17 00:52:50 +02:00
Franz Liedke
33d663bc8e Revamp routing
All routes are now stored in a RouteCollection, which is then used
for dispatching by the (reusable) RouterMiddleware.

This change also entails moving all routes to the service providers.
This may be changed again later, and is done for convenience reasons
right now.
2015-06-17 00:16:35 +02:00
Toby Zerner
f0df751465 Overhaul permissions
Get rid of Permissible - too complex and inefficient. Replace with:
- a “Locked” trait which works similarly but only evaluates logic on
hydrated models.
- a “VisibleScope” trait which also works similarly but only scopes
queries

This is all we need, Permissible is overkill. There is only one
instance where we have to duplicate some logic
(Discussion::scopeVisiblePosts and Post::allow(‘view’, …)) but it’s
barely anything.

Haven’t decoupled for now, we can definitely look at doing that later.

Permissions table seeder slightly updated.

Also did a bit of a query audit, there’s still a lot to be done but
it’s much better than it was. Some relatively low-hanging fruit
detailed in EloquentPostRepository.
2015-06-16 17:33:56 +09:30
Toby Zerner
963078b375 Cache user permissions between calls 2015-06-16 17:18:02 +09:30
Toby Zerner
64e6b7d26c Remove total results from discussion searching
It’s too inefficient (requires a whole table scan) to do a query like:
select count(*) from discussions where [conditions determining
visibility]
2015-06-16 16:58:10 +09:30
Toby Zerner
c1e3820480 Add a serializer and API action to get information about the forum 2015-06-15 12:18:20 +09:30
Toby Zerner
9997c5d7a3 Update permissions 2015-06-12 16:41:46 +09:30
Toby Zerner
8b162344cd Lay the groundwork for translation & refactor asset compilation
Ditched the idea of having language packs as extensions. Reasoning:

1. Because we use machine keys for translations (rather than English
keys), extensions need to be able to define default translations. If
English translations are to be included in extensions and not in a
language pack extension, then it doesn’t make sense to have other
languages as language pack extensions. Inconsistency → complexity.

2. Translations should maintain version parity with their respective
extensions. There’s no way to do this if extension translations are
external to the extension.

Instead, localisation will be a core effort, as well as a per-extension
effort. Translators will be encouraged to send PRs to core + extensions.

In core, each locale has a directory containing three files:
- translations.yml
- config.js: contains pluralisation logic for the JS app, as well as
moment.js localisation if necessary
- config.php: contains pluralisation logic for the PHP app

Extensions can use the Flarum\Extend\Locale extender to add/override
translations/config to a locale.

Asset compilation has been completely refactored with a better
architecture. Translations + config.js are compiled and cached for the
currently active locale.
2015-06-10 14:23:56 +09:30
Franz Liedke
d1cd4b174b Remove last remaining usage of DB facade 2015-06-09 02:40:02 +02:00
Franz Liedke
fed3c2ebd1 Remove facade usage 2015-06-09 00:06:08 +02:00
Franz Liedke
38dfe787f2 Avoid usage of facade in user model 2015-06-08 11:20:46 +02:00
Toby Zerner
4d2f58b693 Clear bio HTML cache when saving bio 2015-06-08 09:50:07 +09:30
Toby Zerner
7a76bf175d Make HTMLPurifier config extensible; allow images 2015-06-08 09:37:30 +09:30
Toby Zerner
f928e746d9 Prevent formatter from being invoked if bio is empty 2015-06-08 09:34:39 +09:30
Franz Liedke
1962eeab72 Remove outdated column name from user table seeder 2015-06-07 22:04:11 +02:00
Franz Liedke
c2df8d5214 Merge branch 'master' into psr-7
Conflicts:
	composer.json
	composer.lock
	src/Api/Actions/TokenAction.php
	src/Core/Formatter/FormatterManager.php
	src/Core/Handlers/Events/EmailConfirmationMailer.php
	src/Forum/Actions/ConfirmEmailAction.php
	src/Forum/Actions/IndexAction.php
	src/Forum/Actions/ResetPasswordAction.php
	src/Forum/Actions/SavePasswordAction.php
	src/Forum/routes.php
2015-06-06 13:59:59 +02:00
Toby Zerner
381e7a2c57 Usernames must only contain alphanumeric chars/dashes/underscores
Perhaps we can relax this a little bit, but right now these are the
only characters that are parsed for @mentions anyway
2015-06-04 11:19:23 +09:30
Toby Zerner
aae7678cea Really rough fulltext driver implementation 2015-06-04 11:11:56 +09:30
Toby Zerner
42851f425b Rejig formatting API. closes flarum/core#85
It works but it’s not the most pretty thing in the world. @franzliedke
Would be great if you could take a look at the whole formatting API and
work your magic on it sometime… my brain is fried!
2015-06-04 10:48:07 +09:30
Toby Zerner
9487a56d61 Allow <hr> in posts 2015-06-03 18:12:15 +09:30
Toby Zerner
5d89618bbd Implement search on front end 2015-06-03 18:10:56 +09:30
Franz Liedke
79480242a7 Use contracts for typehints where possible. 2015-06-03 03:21:24 +02:00
Franz Liedke
7383c14eae Remove lots of unneeded imports. 2015-06-03 03:20:58 +02:00
Toby Zerner
6cf1dbe648 Add HTMLPurifier after formatters are run.
After a morning of searching, it seems there is no PHP Markdown library
that has built-in XSS/sanitization support. The recommended solution is
to use HTMLPurifier.

This actually works out OK, though, as it’s probably a good idea to
enforce sanitization regardless of which formatters are enabled, and to
not leave them with the responsibility of sanitization (it’s a big
responsibility). Since we cache rendered posts, the slow speed of
HTMLPurifier isn’t a concern.

Note that HTMLPurifier requires a file to be loaded by Composer, but
Studio does not yet support this, so for now I have included it
manually.
2015-06-02 11:36:25 +09:30
Toby Zerner
fb3038d128 Password cannot be null 2015-06-01 17:55:52 +09:30
Toby Zerner
82377f2302 Fix error on account registration 2015-06-01 17:55:41 +09:30
Toby Zerner
5d28fc2713 Only validate dirty attributes
To prevent unique-checking queries on every update
2015-06-01 12:26:44 +09:30
Toby Zerner
3334063740 Use pre-loaded state if applicable. closes flarum/core#89 2015-06-01 12:26:11 +09:30
Toby Zerner
351775ef02 Add NotificationWillBeSent event 2015-06-01 08:52:04 +09:30