├── public
├── favicon.ico
├── images
│ ├── rss.png
│ ├── gravatar-20.jpg
│ └── gravatar-40.jpg
├── font-awesome
│ └── fonts
│ │ ├── FontAwesome.otf
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.ttf
│ │ └── fontawesome-webfont.woff
├── js
│ ├── autosize.js
│ ├── tags.js
│ ├── essentials.js
│ ├── actions.js
│ └── models.js
├── jquery-ui
│ ├── images
│ │ ├── ui-icons_222222_256x240.png
│ │ ├── ui-icons_228ef1_256x240.png
│ │ ├── ui-icons_ef8c08_256x240.png
│ │ ├── ui-icons_ffd27a_256x240.png
│ │ ├── ui-icons_ffffff_256x240.png
│ │ ├── ui-bg_flat_10_000000_40x100.png
│ │ ├── ui-bg_glass_65_ffffff_1x400.png
│ │ ├── ui-bg_glass_100_f6f6f6_1x400.png
│ │ ├── ui-bg_glass_100_fdf5ce_1x400.png
│ │ ├── ui-bg_gloss-wave_35_f6a828_500x100.png
│ │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png
│ │ ├── ui-bg_diagonals-thick_20_666666_40x40.png
│ │ ├── ui-bg_highlight-soft_100_eeeeee_1x100.png
│ │ └── ui-bg_highlight-soft_75_ffe45c_1x100.png
│ └── jquery-ui.structure.min.css
├── 502.html
├── unsemantic
│ ├── js
│ │ ├── adapt.min.js
│ │ └── html5.js
│ └── css
│ │ ├── reset.css
│ │ └── reset-rtl.css
├── tagsinput
│ └── jquery.tagsinput.css
└── formalize
│ └── js
│ └── jquery.formalize.min.js
├── .gitignore
├── schema
├── 07thread-updated.sql
├── 12reply-updated.sql
├── 01thread-slug.sql
├── 13user-role.sql
├── 16thread_editor.sql
├── 17thread_ascii_slug.sql
├── 06thread_activity.sql
├── 15notifications_sent_flag.sql
├── 18unique-user-name.sql
├── 09nonces.sql
├── 08disposable-email-blacklist.sql
├── 04notifications.sql
├── 10reports.sql
├── 02reply-thank.sql
├── 03subscriptions.sql
├── 14tags.sql
├── 05thread-views.sql
├── 11user.sql
└── 00schema.sql
├── templates
├── forbidden.apl
├── include
│ ├── admin_nav.apl
│ ├── markup-help-button.apl
│ ├── thread-controls.apl
│ ├── markup-help.apl
│ ├── reply-thank.apl
│ ├── quick-edit-form.apl
│ ├── pager.apl
│ ├── reply-meta.apl
│ ├── quick-reply-form.apl
│ └── reply-controls.apl
├── not_found.apl
├── admin_index.apl
├── password_changed.apl
├── email
│ ├── notifications_digest.apl
│ ├── confirmation_required.apl
│ ├── password_reset.apl
│ └── deregistration_confirmation_required.apl
├── password_reset_success.apl
├── deregistration_confirmation_success.apl
├── password_reset_confirmation_needed.apl
├── deregistration_confirmation_needed.apl
├── activation_needed.apl
├── resend_registration_confirmation_success.apl
├── activation_success.apl
├── deregister.apl
├── activation_failure.apl
├── request_password_reset.apl
├── reset_password.apl
├── resend_registration_confirmation.apl
├── change_password.apl
├── settings.apl
├── login.apl
├── register.apl
├── list_subscriptions.apl
├── profile.apl
├── admin_list_users.apl
├── index.apl
├── threads_rss.apl
├── list_notifications.apl
├── create_thread.apl
└── update_thread.apl
├── lib
└── Threads
│ ├── DB.pm
│ ├── Helper
│ ├── Displayer.pm
│ ├── Config.pm
│ ├── Markup.pm
│ ├── Truncate.pm
│ ├── Meta.pm
│ ├── User.pm
│ ├── AdminUser.pm
│ ├── Gravatar.pm
│ ├── Date.pm
│ ├── Antibot.pm
│ ├── Url.pm
│ ├── Notification.pm
│ ├── Acl.pm
│ ├── Subscription.pm
│ ├── Reply.pm
│ └── Pager.pm
│ ├── Action.pm
│ ├── Validator
│ ├── FakeField.pm
│ ├── MaxLength.pm
│ ├── MinLength.pm
│ ├── Readable.pm
│ ├── Captcha.pm
│ ├── Tags.pm
│ ├── TooFast.pm
│ ├── Email.pm
│ └── NotDisposableEmail.pm
│ ├── Job
│ ├── Base.pm
│ ├── CleanupInactiveRegistrations.pm
│ ├── CleanupThreadViews.pm
│ └── SendEmailNotifications.pm
│ ├── Action
│ ├── TranslateMixin.pm
│ ├── Preview.pm
│ ├── Logout.pm
│ ├── AdminListUsers.pm
│ ├── DeleteSubscriptions.pm
│ ├── ListNotifications.pm
│ ├── ListSubscriptions.pm
│ ├── JSONMixin.pm
│ ├── DeleteNotifications.pm
│ ├── Settings.pm
│ ├── ReadReply.pm
│ ├── AdminToggleBlocked.pm
│ ├── ThreadsRss.pm
│ ├── AutocompleteTags.pm
│ ├── DeleteThread.pm
│ ├── ConfirmRegistration.pm
│ ├── DeleteReply.pm
│ ├── FormBase.pm
│ ├── ToggleSubscription.pm
│ ├── ChangePassword.pm
│ ├── ConfirmDeregistration.pm
│ ├── Deregister.pm
│ ├── Index.pm
│ ├── ToggleReport.pm
│ ├── ThankReply.pm
│ ├── ResetPassword.pm
│ ├── ViewThread.pm
│ ├── UpdateReply.pm
│ ├── CreateThread.pm
│ ├── UpdateThread.pm
│ ├── RequestPasswordReset.pm
│ └── Login.pm
│ ├── DB
│ ├── Thank.pm
│ ├── View.pm
│ ├── DisposableEmailBlacklist.pm
│ ├── Subscription.pm
│ ├── Notification.pm
│ ├── Nonce.pm
│ ├── MapThreadTag.pm
│ ├── Report.pm
│ ├── Tag.pm
│ ├── User.pm
│ └── Confirmation.pm
│ ├── LimitChecker.pm
│ ├── Middleware
│ └── Origin.pm
│ ├── Notificator.pm
│ ├── Util.pm
│ ├── Origin.pm
│ ├── ObjectACL.pm
│ ├── UserLoader.pm
│ └── MarkupRenderer.pm
├── t
├── lib
│ ├── TestLib.pm
│ ├── TestFunctional.pm
│ ├── TestMail.pm
│ ├── TestRequest.pm
│ └── TestDB.pm
├── util.t
├── validator
│ ├── email.t
│ ├── fake_field.t
│ ├── captcha.t
│ ├── readable.t
│ ├── min_length.t
│ ├── max_length.t
│ ├── tags.t
│ ├── too_fast.t
│ └── not_disposable_email.t
├── helper
│ ├── user.t
│ ├── truncate.t
│ ├── subscription.t
│ ├── gravatar.t
│ ├── thread.t
│ └── url.t
├── action
│ ├── preview.t
│ ├── settings.t
│ ├── logout.t
│ ├── delete_notifications.t
│ ├── delete_subscriptions.t
│ ├── autocomplete_tags.t
│ └── change_password.t
├── generate.pl
├── object_acl.t
├── jobs
│ ├── cleanup_thread_views.t
│ └── cleanup_inactive_registrations.t
├── functional
│ ├── feeds.t
│ └── replies.t
└── db
│ ├── user.t
│ └── confirmation.t
├── config
├── config.test.yml
└── config.yml.example
├── tjs
├── app.psgi
├── models
│ ├── value_object.js
│ └── value_object_observable.js
├── suite.html
└── actions
│ ├── no_count_title.js
│ └── no_count.js
├── util
├── update-thread-slug-ascii.pl
├── create-user.pl
├── update-po-files.pl
├── import-disposable-emails.pl
├── deploy.sh
├── block-user.pl
└── run-job.pl
├── .gitmodules
├── cpanfile
└── README.md
/public/favicon.ico:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | db.db
2 | util/deploy.sh.rc
3 | config/config.dev.yml
4 | config/config.yml
5 |
--------------------------------------------------------------------------------
/public/images/rss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/images/rss.png
--------------------------------------------------------------------------------
/schema/07thread-updated.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `threads` ADD COLUMN `updated` INT NOT NULL DEFAULT 0;
2 |
--------------------------------------------------------------------------------
/schema/12reply-updated.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `replies` ADD COLUMN `updated` INT NOT NULL DEFAULT 0;
2 |
--------------------------------------------------------------------------------
/schema/01thread-slug.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `threads` ADD COLUMN `slug` VARCHAR(255) NOT NULL DEFAULT '';
2 |
--------------------------------------------------------------------------------
/schema/13user-role.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `users` ADD COLUMN `role` VARCHAR(32) NOT NULL DEFAULT 'user';
2 |
--------------------------------------------------------------------------------
/schema/16thread_editor.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `threads` ADD COLUMN `editor_id` INT NOT NULL DEFAULT 0;
2 |
--------------------------------------------------------------------------------
/schema/17thread_ascii_slug.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `threads` ADD COLUMN `slug_ascii` NOT NULL DEFAULT '';
2 |
--------------------------------------------------------------------------------
/public/images/gravatar-20.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/images/gravatar-20.jpg
--------------------------------------------------------------------------------
/public/images/gravatar-40.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/images/gravatar-40.jpg
--------------------------------------------------------------------------------
/schema/06thread_activity.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `threads` ADD COLUMN `last_activity` INT NOT NULL DEFAULT 0;
2 |
--------------------------------------------------------------------------------
/templates/forbidden.apl:
--------------------------------------------------------------------------------
1 |
2 |
3 | Forbidden
4 |
5 |
6 |
--------------------------------------------------------------------------------
/templates/include/admin_nav.apl:
--------------------------------------------------------------------------------
1 | <%= loc('Users') %>
2 |
--------------------------------------------------------------------------------
/templates/not_found.apl:
--------------------------------------------------------------------------------
1 |
2 |
3 | Not found
4 |
5 |
6 |
--------------------------------------------------------------------------------
/schema/15notifications_sent_flag.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `notifications` ADD COLUMN `is_sent` INTEGER NOT NULL DEFAULT 0;
2 |
--------------------------------------------------------------------------------
/lib/Threads/DB.pm:
--------------------------------------------------------------------------------
1 | package Threads::DB;
2 |
3 | use strict;
4 | use warnings;
5 |
6 | use parent 'ObjectDB';
7 |
8 | 1;
9 |
--------------------------------------------------------------------------------
/schema/18unique-user-name.sql:
--------------------------------------------------------------------------------
1 | update users set name = id where name = '';
2 | create unique index name on users(`name`);
3 |
--------------------------------------------------------------------------------
/public/font-awesome/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/font-awesome/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/templates/admin_index.apl:
--------------------------------------------------------------------------------
1 |
2 |
3 | %== $helpers->displayer->render('include/admin_nav');
4 |
5 |
6 |
--------------------------------------------------------------------------------
/templates/password_changed.apl:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= loc('Password changed.') %>
4 |
5 |
6 |
--------------------------------------------------------------------------------
/templates/email/notifications_digest.apl:
--------------------------------------------------------------------------------
1 | %== loc('You have got unread notifications. Check the link below:');
2 |
3 |
4 | <%= $url %>
5 |
--------------------------------------------------------------------------------
/public/font-awesome/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/font-awesome/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/public/font-awesome/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/font-awesome/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/public/font-awesome/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/font-awesome/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/public/js/autosize.js:
--------------------------------------------------------------------------------
1 | (function(){
2 |
3 | $(document).ready(function() {
4 | $('textarea').autosize();
5 | });
6 |
7 | })();
8 |
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-icons_222222_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-icons_222222_256x240.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-icons_228ef1_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-icons_228ef1_256x240.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-icons_ef8c08_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-icons_ef8c08_256x240.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-icons_ffd27a_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-icons_ffd27a_256x240.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-icons_ffffff_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-icons_ffffff_256x240.png
--------------------------------------------------------------------------------
/templates/include/markup-help-button.apl:
--------------------------------------------------------------------------------
1 | <%= loc('markup') %>
2 |
3 |
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_flat_10_000000_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_flat_10_000000_40x100.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png
--------------------------------------------------------------------------------
/lib/Threads/Helper/Displayer.pm:
--------------------------------------------------------------------------------
1 | package Threads::Helper::Displayer;
2 |
3 | use strict;
4 | use warnings;
5 |
6 | use parent 'Tu::Helper::Displayer';
7 |
8 | 1;
9 |
--------------------------------------------------------------------------------
/templates/password_reset_success.apl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
<%= loc('Your password was successfully reset!') %>
4 |
5 |
6 |
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
--------------------------------------------------------------------------------
/public/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vti/threads/HEAD/public/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
--------------------------------------------------------------------------------
/templates/deregistration_confirmation_success.apl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
<%= loc('Your account was successfully removed!') %>
4 |
5 |
6 |
--------------------------------------------------------------------------------
/public/502.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Please wait. We are updating...
7 |
8 |