Compare commits

...

924 commits

Author SHA1 Message Date
KodeStar
2e96b7bd09
Update app.php version 2023-11-11 15:04:44 +00:00
KodeStar
768e7a6576
Merge pull request #1222 from fyutins/2.x
Fix and add SVG support
2023-11-11 14:58:41 +00:00
Fyutins
431eafb2b6 Fix and add SVG support 2023-09-26 18:51:12 +02:00
Ian Jones
d2184eef0a
Update readme.md (#1186)
Spelling and Grammar, included a few apostrophes for correct plural form or possessive. 

Added Capitalization to proper nouns

Included a single colon for consistency to match the styling of  it's predecessor paragraph
2023-08-09 11:21:57 +02:00
Attila Kerekes
fbd050d4e4
fix: validate icons to be images (#1173) 2023-06-06 12:08:47 +02:00
Attila Kerekes
5d67f570a9
fix: validate icons to be images (#1167) 2023-06-05 18:27:30 +02:00
Attila Kerekes
7d016cdaa6
fix: Remove mix from trianglify.js (#1166) 2023-05-26 13:36:07 +02:00
ullbergm
6e954a355d
Add Trianglify (#1158) 2023-05-26 10:23:06 +02:00
KodeStar
60faccad27
Remove register route (#1163) 2023-05-20 21:56:34 +02:00
jatdung
1f5493ac98
fix sortable tooltip (#1130) 2023-05-16 16:42:17 +02:00
aptalca
9c117b7946
Merge pull request #1150 from linuxserver/2.x-project
handle issue-pr close and review submitted actions
2023-04-19 09:22:36 -04:00
aptalca
c72fee9644
handle issue-pr close and review submitted actions 2023-04-14 15:31:46 -04:00
aptalca
0999bebcb4
Merge pull request #1147 from linuxserver/2.x-issues
add issue-pr workflows
2023-04-08 19:00:40 -04:00
aptalca
1c41e3d1ef
add issue-pr workflows 2023-04-06 15:25:53 -04:00
Chris Hunt
ed3cd79c92
Change minor version ready for next release 2023-03-09 16:17:32 +00:00
Chris Hunt
192002f898
Update minor version 2023-03-09 16:10:51 +00:00
jatdung
18f7306b2c
Update Chinese language. (#1124) 2023-03-07 17:51:19 +01:00
jatdung
e9754519be
fix Request class error (#1126) 2023-03-07 12:32:58 +01:00
ShiftHackZ
1c276fbfc2
feat: Added Ukrainian translation (#1125) 2023-03-07 12:32:01 +01:00
jatdung
cefe07d218
fix language setting only available in view (#1117) 2023-02-23 18:24:11 +01:00
jatdung
cd4b522935
use sortablejs instead of jquery-ui (#1115) 2023-02-10 21:32:58 +01:00
angrystar170
1ad5603c3e
Update Korean language. (#1116) 2023-02-10 21:30:38 +01:00
Attila Kerekes
302e04bb12
fix: Update jquery, jquery-ui (#1113) 2023-02-04 20:34:49 +01:00
Attila Kerekes
49dab6e72b
fix: Add more error handling for app test (#1111) 2023-02-01 11:43:26 +01:00
Filipe F Moreira
c5d0769afb
Add BR translations (#1080) 2023-01-16 20:14:33 +01:00
KodeStar
4005894c16
Update app.php 2023-01-09 19:28:56 +00:00
Attila Kerekes
a4022ce517
fix: Escape app title and tag title on list pages CVE-2022-47968 (#1088) 2023-01-05 20:31:15 +01:00
Attila Kerekes
cd07d47445
fix: Add more verbose error when uploading background image (#1082) 2022-12-24 10:56:00 +01:00
Attila Kerekes
df70dcc521
feat: Add tags as classes to items (#1079) 2022-12-19 14:40:38 +01:00
Attila Kerekes
9e6321e500
fix: Enable tag slug creation from CN characters (#1077) 2022-12-16 10:26:00 +01:00
KodeStar
0d9850c1c7
Merge pull request #1073 from linuxserver/fix/395
fix: Autologin forces logout
2022-12-15 23:38:36 +00:00
Attila Kerekes
4d3083886e fix: Autologin forces logout 2022-12-15 22:21:16 +01:00
KodeStar
52f59afe63
Merge pull request #1072 from linuxserver/fix/895
fix: Public access to front also applies to tags
2022-12-15 19:48:54 +00:00
Attila Kerekes
aa886e4f77 fix: Public access to front also applies to tags 2022-12-15 20:17:08 +01:00
Attila Kerekes
3c9f361f5f
chore: Add eslint github check (#1067) 2022-12-11 18:44:37 +01:00
Attila Kerekes
5eb1f55b82
chore: Add php code sniffer github check (#1066) 2022-12-11 11:58:58 +01:00
KodeStar
d910f8e4f7
Merge pull request #1065 from linuxserver/feat/health
feat: Add health endpoint
2022-12-11 09:46:20 +00:00
Attila Kerekes
751b23a5e4 feat: Add health endpoint 2022-12-11 01:39:39 +01:00
Yusuke Arakawa
a4fa490fb4
feat: Add Japanese language (#1064)
Co-authored-by: Yusuke Arakawa <nekolaboratory@users.noreply.github.com>
2022-12-09 23:43:23 +01:00
Yusuke Arakawa
662f6ac3eb
chore: Sort the supported language list of readme.md (#1062) 2022-12-09 09:40:52 +01:00
Attila Kerekes
11257a272e
feat: Introduce queue based live stat refresh (#1059) 2022-12-05 16:29:06 +01:00
Attila Kerekes
6b93f8ed5c
test: Add item create test (#1058) 2022-12-05 16:28:18 +01:00
Attila Kerekes
8f9b2959b2
feat: Add basic import screen (#1056)
Co-authored-by: Chris Hunt <chris.hunt@kasmweb.com>
2022-12-04 22:12:54 +01:00
Attila Kerekes
45cc84c99c test: Add feature tests 2022-12-04 17:21:03 +00:00
Attila Kerekes
52620bc331 chore: Add laravel ide helper 2022-12-01 09:17:54 +00:00
Attila Kerekes
bd76efc613 chore: Migrate route definition to Laravel 8 format 2022-11-29 21:34:11 +00:00
Attila Kerekes
6dead1c529 fix: Make supportedApps legacy interface compatible 2022-11-29 19:26:07 +00:00
Attila Kerekes
bb5a078f35 feat: Add export import 2022-11-29 17:32:46 +00:00
Attila Kerekes
2ee5d07e48 fix: Make supportedapps compatible with legacy interface 2022-11-29 17:26:40 +00:00
Attila Kerekes
d30edb6749 chore: Add eslint prettier phpcs config PSR2 2022-11-28 19:47:10 +00:00
Chris Hunt
a53192beeb FIx: Blur onauxclick as well 2022-11-28 08:33:05 +00:00
Chris Hunt
ef1ffe880d Update version to 2.5.4 2022-11-28 08:30:34 +00:00
KodeStar
877b31f947
Merge pull request #1041 from linuxserver/bug/links_opening_in_new_tab_keep_focus
Blur tiles after clicking on them
2022-11-26 17:02:45 +00:00
Chris Hunt
827088df76 Blur tiles after clicking on them 2022-11-26 14:48:54 +00:00
Attila Kerekes
a12c1d559d fix: Use correct appTest argument type 2022-11-26 13:31:05 +00:00
KodeStar
f0b60fc19a
Merge pull request #1039 from linuxserver/fix/1038
fix: Enter should open search when not tile search is selected
2022-11-26 12:00:43 +00:00
Attila Kerekes
7c4619adb9 fix: Enter should open search when not tile search is selected 2022-11-26 12:22:12 +01:00
KodeStar
aa49a5fb42
Fixes #371 Tagged items when pinning/unpinning (#1036) 2022-11-25 23:21:45 +00:00
Attila Jozsef Kerekes
7565bd4028 chore: Add php code sniffer and apply fixes 2022-11-25 23:05:58 +00:00
Chris Hunt
181b7564e8 Merge branch '2.x' of github.com:linuxserver/Heimdall into 2.x 2022-11-25 16:23:40 +00:00
Chris Hunt
0d3640b67a Fix asset links 2022-11-25 16:23:34 +00:00
Attila Kerekes
82b209d4b5 fix: Test enhanced app with apikey 2022-11-25 16:11:39 +00:00
Chris Hunt
f576a82803 Fix: Change default logging to daily 2022-11-24 22:56:27 +00:00
Attila Kerekes
bb07ba5964 feat: Add db connection example config 2022-11-24 14:28:16 +00:00
Attila Kerekes
9aaa900a3e fix: New package lock with node 18.12 2022-11-24 08:36:20 +00:00
KodeStar
07f07449b9
Update: Updated npm dependencies + using mix (#1026) 2022-11-23 19:39:00 +00:00
Attila Kerekes
2836dadf1a fix: Disable saerch submit when tile search is active 2022-11-23 18:12:21 +00:00
KodeStar
4a90fdf22d
Merge pull request #1024 from KodeStar/2.x
Updated translations using lokalise.com
2022-11-23 15:11:54 +00:00
KodeStar
0de56e5876
Merge pull request #5 from KodeStar/lokalise-2022-11-23_16-08-41
Lokalise: Translations update
2022-11-23 15:10:37 +00:00
KodeStar
d886b44c1e Updated translations using lokalise.com 2022-11-23 15:09:10 +00:00
Chris Hunt
898ee6915d Merge branch '2.x' of github.com:linuxserver/Heimdall into 2.x 2022-11-23 13:25:10 +00:00
Chris Hunt
f6eae7f25f FIx: Use mix version rather than app version 2022-11-23 13:24:36 +00:00
KodeStar
c1255280aa
Merge pull request #1023 from linuxserver/feature/focus_and_sidebar_tooltips
Feature - focus and sidebar tooltips
2022-11-23 10:50:07 +00:00
Chris Hunt
5514d893f8 Fix: Add translations to sidebar tooltips 2022-11-23 10:19:27 +00:00
Chris Hunt
c4d5ca43dd Feature: Add focus styling 2022-11-23 10:09:16 +00:00
Chris Hunt
a90bcb1151 Fix: Move tooltips in from right 2022-11-23 09:42:33 +00:00
Chris Hunt
ffc736ada6 Fix: Added nicer tooltips to sidebar 2022-11-23 09:29:52 +00:00
KodeStar
966027faf5
Merge pull request #1022 from keriati/feat/kbr 2022-11-23 08:41:21 +00:00
Attila Kerekes
1111bf72d6
feat: Add basic keyboard navigation 2022-11-22 22:53:07 +01:00
KodeStar
cc6e47372e
Merge pull request #1020 from keriati/feat/nopwsubmit
feat: Prevent password submission when password is not changed.
2022-11-22 17:06:16 +00:00
KodeStar
256160727c
Merge pull request #1019 from keriati/feat/uniqueappupdate
feat: Make app update job unique
2022-11-22 17:05:28 +00:00
Attila Kerekes
0299ee6fa9
feat: Prevent password submission when password is not changed. 2022-11-22 17:52:10 +01:00
Attila Kerekes
8957a2f49f
feat: Make app update job unique 2022-11-22 17:23:26 +01:00
KodeStar
756ab353f3
Merge pull request #1018 from keriati/feat/appupdatejob
feat: Move app update to background job
2022-11-22 09:12:16 +00:00
Attila Kerekes
76f0b84827
feat: Move app update to background job 2022-11-22 00:05:57 +01:00
KodeStar
68c8dbc33a
Merge pull request #1017 from keriati/fix/appupdatereduce
fix: Throttle app updates when updating to new version.
2022-11-20 20:44:43 +00:00
Attila Kerekes
b1e856ccfc
fix: Throttle app updates when updating to new version. 2022-11-20 21:37:13 +01:00
KodeStar
44fb923b7f
Merge pull request #1015 from keriati/feat/testpwinject
feat: Inject password from db during testing when editing enhanced apps
2022-11-19 19:53:32 +00:00
Attila Kerekes
8bad474808
feat: Inject password from db during testing when editing enhanced apps 2022-11-19 20:48:31 +01:00
KodeStar
9a80064a50
Merge pull request #1014 from KodeStar/2.x
Automated missing translation strings using lokalise.com
2022-11-19 13:22:28 +00:00
KodeStar
e86c5e601d
Merge pull request #4 from KodeStar/lokalise-2022-11-19_14-15-24
Lokalise: Translations update
2022-11-19 13:18:05 +00:00
KodeStar
c4bf619be4 Updated translations using lokalise.com 2022-11-19 13:15:51 +00:00
KodeStar
4b29b476df
Merge pull request #1012 from keriati/feat/appupdateon
feat: Trigger app update when new version is deployed
2022-11-19 12:41:09 +00:00
KodeStar
3a39809585
Merge pull request #1013 from keriati/fix/fri18n
fix: Add missing FR translations
2022-11-19 12:04:58 +00:00
Attila Kerekes
157b972ff5
feat: Trigger app update when new version is deployed 2022-11-18 17:35:55 +01:00
Attila Kerekes
71b15a5aed
fix: Add missing FR translations 2022-11-18 17:12:50 +01:00
KodeStar
b50bf716dc
Merge pull request #1010 from keriati/feat/enhancedapppw
feat: Keep stored password when Enhanced App is updated
2022-11-17 21:20:16 +00:00
KodeStar
722d00df5f
Merge pull request #1009 from keriati/feat/eslangupdate
feat: Add more ES translations. fixes #961
2022-11-17 21:18:49 +00:00
Attila Kerekes
54679ff9eb
feat: Keep stored password when Enhanced App is updated 2022-11-17 21:13:10 +01:00
Attila Kerekes
4c7e56e6fe
feat: Add more ES translations fixes #961 2022-11-17 21:05:50 +01:00
KodeStar
7b0ae66101
Merge pull request #1008 from keriati/fix/stoppollonerror
fix: Stop polling enhanced apps when api returns error
2022-11-17 17:30:26 +00:00
Attila Kerekes
48616e87bd
fix: Stop polling enhanced apps when api returns error 2022-11-17 18:00:35 +01:00
Chris Hunt
f9280cd4c0 Don't commit debugbar json files 2022-11-17 16:20:21 +00:00
KodeStar
3124a01011
Merge pull request #1007 from keriati/fix/userlang
fix: User language setting
2022-11-17 16:17:36 +00:00
Attila Kerekes
ec27889086
fix: User language setting 2022-11-17 17:12:24 +01:00
KodeStar
aba1f37b1c
Merge pull request #1006 from smelikmartin/2.x
Added czech language resources
2022-11-17 09:51:01 +00:00
Martin Smelik
6565dfde07 Added czech language 2022-11-17 10:27:43 +01:00
KodeStar
aa98c3505c
Don't break if default search provider deleted from yaml
Fixes #904
2022-11-17 00:20:54 +00:00
KodeStar
15f5c3e5be
Merge pull request #999 from keriati/fix/sessionexpired
fix: Expired session setCookie issue #379
2022-11-16 22:54:59 +00:00
Attila Kerekes
fc2d153ded
fix: Expired session setCookie issue #379 2022-11-16 23:53:34 +01:00
KodeStar
4a7690147e
Update readme.md 2022-11-15 21:29:39 +00:00
KodeStar
7d32e6edb0
Merge pull request #975 from keriati/feat/langit
feat: add missing IT translations
2022-11-15 18:33:58 +00:00
Attila Kerekes
3d1fc80d64
feat: add missing IT translations 2022-11-15 14:07:12 +01:00
KodeStar
8b0700e9ef
Merge pull request #974 from keriati/feat/langderu
Add missing DE and RU translations
2022-11-15 11:56:29 +00:00
Attila Kerekes
cc241f1bd6
feat: Add DE and RU translations 2022-11-15 12:51:34 +01:00
Attila Kerekes
810ee03965
test: improve lang test debug output 2022-11-15 11:09:57 +01:00
KodeStar
7809abb376
Merge pull request #956 from keriati/chore/php7432
chore: set min php version 7.4.32
2022-11-14 23:49:15 +00:00
Attila Kerekes
2f3b7e52db
chore: set min php version 7.4.32 2022-11-14 23:34:32 +01:00
KodeStar
fdd5a78eb8
Merge pull request #955 from keriati/fix/php74dep
fix: install dependencies on php 7.4
2022-11-14 20:42:41 +00:00
Attila Jozsef Kerekes
98401f20a2
reinstall dependencies on php 7.4 2022-11-14 21:39:27 +01:00
Chris Hunt
30663e4d5e Change php version 2022-11-14 20:28:46 +00:00
Chris Hunt
8972a11c0a SImplify action 2022-11-14 19:43:43 +00:00
Chris Hunt
bf349eec7a Merge branch '2.x' of github.com:linuxserver/Heimdall into 2.x 2022-11-14 19:42:43 +00:00
Chris Hunt
cb314a4fd9 Change action to pull request 2022-11-14 19:42:37 +00:00
KodeStar
1a78c8077a
Merge pull request #954 from keriati/feat/lang-support
feat: Dynamically add all languages to db
2022-11-14 19:38:26 +00:00
Attila Kerekes
a3c75b2dd4
fix: Fall back to english only if intl is missing. 2022-11-14 20:35:25 +01:00
Chris Hunt
ee77d09c58 Update dependencies 2022-11-14 19:35:16 +00:00
Chris Hunt
0966639699 Add actions 2022-11-14 19:22:46 +00:00
Attila Jozsef Kerekes
153bb0e91d
chore: update readme.md with intl dependency 2022-11-14 20:02:51 +01:00
Attila Kerekes
0c7a60a5c7
fix: Add missing hungarian translations
Improve some existing translation keys
2022-11-14 19:56:10 +01:00
Attila Kerekes
edb51e56f1
feat: Dynamically add all languages to db
Add unit test to find missing translations
2022-11-14 19:31:07 +01:00
KodeStar
99193a578e
Merge pull request #818 from everaldofilho/language-pt-br
Change: added language pt in configuration, translated validation for pt-br
2022-11-14 15:07:45 +00:00
KodeStar
49b5d57e14
Delete SettingsSeeder.php 2022-11-14 15:07:22 +00:00
KodeStar
716d5a2f69
Merge pull request #880 from Yoshi315161/patch-1
Update German Translation
2022-11-14 15:05:07 +00:00
KodeStar
62340b07a9
Merge pull request #854 from bsciretti/2.x
Lombard translation
2022-11-14 15:04:36 +00:00
KodeStar
2312e8b648
Merge pull request #953 from keriati/refactor/ideafixes
refactor: apply auto fixes from idea
2022-11-14 14:53:14 +00:00
Attila Kerekes
b390a719e9
refactor: apply auto fixes from idea 2022-11-14 14:48:38 +01:00
KodeStar
d4f7ad842c
Merge pull request #951 from keriati/fix/950-env-db
fix: change how database type is checked #950
2022-11-14 09:57:49 +00:00
Attila Kerekes
5c2501c1a7
fix: change how database type is checked #950 2022-11-14 10:24:58 +01:00
KodeStar
198ffd7665
Merge pull request #949 from keriati/fix/554-private-app-icon
fix: Don't write existing icons to disk
2022-11-13 23:22:54 +00:00
Attila Kerekes
7cf9d46eb3
fix: Don't write existing icons to disk 2022-11-14 00:08:09 +01:00
KodeStar
66dbbc835e
Update app.php 2022-11-13 22:08:41 +00:00
KodeStar
178e46ca05
Merge pull request #947 from keriati/chore/laravel8
upgrade to laravel 8.0
2022-11-13 21:54:08 +00:00
Attila Kerekes
27f58c0866
upgrade to laravel 8.0 2022-11-13 21:18:38 +01:00
KodeStar
43f894b58d
Merge pull request #946 from keriati/chore/db-setup
Remove sqlite db file creation when mysql or pgsql is used
2022-11-13 15:12:18 +00:00
Attila Kerekes
b83f24c6f3
remove sqlite db file creation when mysql or pgsql is used 2022-11-13 11:34:58 +01:00
KodeStar
b22fbdbad1
Merge pull request #944 from keriati/fix/429
fix: adjust home tag index for mysql/mariadb in database seeder
2022-11-11 20:30:54 +00:00
Attila Kerekes
6552a8c061 fix: adjust user id for postgresql in database seeder 2022-11-11 20:28:57 +00:00
Attila Kerekes
bcd6f72b72 fix: adjust home tag index for mysql/mariadb in database seeder 2022-11-11 19:22:50 +00:00
KodeStar
d4fe699029
Merge pull request #941 from keriati/fix/886
fix: disable tooltips while reordering items
2022-11-07 16:35:40 +00:00
Attila Kerekes
db8fa38665 fix: disable tooltips while reordering items 2022-11-07 16:32:19 +00:00
KodeStar
df41de3a9a
Update app.php 2022-11-07 15:43:08 +00:00
KodeStar
b3070bc8f9
Merge pull request #940 from keriati/fix/appmodelcheck
fix: Add check to appModel so websites can be added again
2022-11-05 08:18:54 +00:00
Attila Kerekes
487cdc483c fix: Add check to appModel so websites can be added again 2022-11-05 07:02:20 +00:00
KodeStar
dcc0f90b23
Merge pull request #912 from eekdood/tag-hyperlink-fix
fix links in tag list
2022-10-31 17:46:03 +00:00
KodeStar
75014c8269
Merge pull request #937 from keriati/privateAppSupport
Improve Private App support
2022-10-31 10:32:55 +00:00
Attila Kerekes
386e4c788b feat: add remove option to registerapp 2022-10-28 14:48:04 +00:00
Attila Kerekes
fe0109494e feat: support the listing of private apps 2022-10-28 13:21:25 +00:00
Attila Kerekes
6907695c5d feat: support the listing of private apps 2022-10-28 09:55:16 +00:00
Attila Kerekes
533af2dc49 feat: support the listing of private apps 2022-10-27 21:57:23 +00:00
Eric Fawcett
1ac5eb6d23 fix links 2022-09-20 17:47:38 +00:00
Yoshi315161
ca557fcaf1
Update app.php
Add missing translations
2022-07-21 12:34:22 +02:00
Kode
e2ba89c80e Update dependencies 2022-06-29 13:20:08 +01:00
Kode
bbae811cd8 Update app.php 2022-06-29 13:19:02 +01:00
Kode
589aa73a15 Update app.php 2022-06-29 13:17:08 +01:00
Kode
fc023401f5 remove heimdall specific xsrf token as clearly not working 2022-06-29 13:13:00 +01:00
Brian Sciretti
1a4b6da3ea
Update app.php 2022-05-28 02:08:43 +02:00
Brian Sciretti
02b82dc740
Update app.php 2022-05-28 02:06:25 +02:00
Brian Sciretti
4e5129ab8f
Update app.php 2022-05-28 01:58:34 +02:00
Brian Sciretti
62d9b0cc76
Create app.php 2022-05-28 01:56:47 +02:00
KodeStar
02dfed0bc7
Merge pull request #823 from tomyvi/patch-2
Disable SSL checks on API calls
2022-04-12 11:56:20 +01:00
KodeStar
71d356935f
Merge pull request #822 from tomyvi/patch-1
Disable SSL checks on API calls
2022-04-12 11:56:04 +01:00
KodeStar
e53bae2c69 Update app.php 2022-04-12 11:51:47 +01:00
KodeStar
3117b9c483 Don't try to autoload file when checking if a class exists 2022-04-12 11:48:03 +01:00
tomyvi
c5817c9b2e
Disable SSL checks on API calls 2022-04-07 10:34:07 +02:00
tomyvi
c403e8b2df
Disable SSL checks on API calls 2022-04-07 10:33:31 +02:00
Everaldo da costa filho
1ca403cc6e change: added language pt in configuration, translated validation for pt-br 2022-04-02 21:20:17 -03:00
Kode
758c174141 Only getApp if app found 2022-04-02 15:19:55 +01:00
KodeStar
9bc9c48e06 Localhost doesn't like the certificate so ignore the warning 2022-03-30 13:14:35 +01:00
KodeStar
9a6dd623db add tag_id to fillable to try and fix #810 2022-03-30 13:14:05 +01:00
Kode
d1c6001fae update app version 2022-03-26 19:01:11 +00:00
Kode
74196a2bfa Check if class exists before checking if it's a search provider 2022-03-26 18:59:49 +00:00
Kode
724110dad2 Run ProcessApps when database version is bumped 2022-03-25 15:35:05 +00:00
KodeStar
3a043e0165
Update app.php 2022-03-25 15:02:35 +00:00
KodeStar
ac37c60e1f
Merge pull request #800 from xiazeyu/baidu
added Baidu and sort order by alphabet
2022-03-25 15:01:22 +00:00
S4kura0ne
937e576520
move tiles to the first 2022-03-25 01:00:07 +08:00
KodeStar
9086e9bd75
Merge pull request #794 from xiazeyu/2.x
Latest Chinese translation combined #789 and #617
2022-03-24 13:21:07 +00:00
s4kura0ne
4c90d8c87e
added Baidu and sort order by alphabet 2022-03-24 09:25:30 +08:00
s4kura0ne
a4cceb3ae0
remove Baidu in searchprovides.yaml 2022-03-24 09:20:46 +08:00
s4kura0ne
90c21d700d
merged old 'zh' translation, improved translation 2022-03-24 00:33:36 +08:00
s4kura0ne
15b1f3234b
added translation for baidu 2022-03-24 00:23:08 +08:00
s4kura0ne
a116345d60
remove unused translation 2022-03-24 00:21:47 +08:00
s4kura0ne
2b4e6d372c
remove changes in outdated SettingsSeeder.php 2022-03-24 00:19:43 +08:00
s4kura0ne
d370f2c3ee
finished chinese translation 2022-03-23 10:09:18 +08:00
S4kura0ne
ade09f3b1c
Merge pull request #3 from xiazeyu/master
https://github.com/xiazeyu/Heimdall/pull/2
2022-03-23 09:31:58 +08:00
s4kura0ne
80aa120086
solved Russian readme conflict 2022-03-23 09:28:39 +08:00
S4kura0ne
a5cbcaca03
Merge pull request #1 from anerg2046/2.x
Merge Chinese translate from anerg2046
2022-03-23 09:24:33 +08:00
Kode
f2bfc26c5e Update app.php 2022-03-21 21:37:44 +00:00
Kode
9f0abb6f4d Strip out invalid characters from tile background 2022-03-21 21:37:14 +00:00
KodeStar
9ca2078e7d
Add app version to asset url to bust cache 2022-03-21 06:42:59 +00:00
罗翀
9e4a06999b Chinese translate
add baidu search
2022-03-21 00:53:28 +08:00
KodeStar
8b72ff0a0d
Merge pull request #787 from KodeStar/2.x
Laravel shift and update defaults
2022-03-19 15:07:11 +00:00
Kode
51ddaccc16 Update defaults 2022-03-19 15:04:26 +00:00
KodeStar
4ff1a4aec4
Merge pull request #1 from KodeStar/shift-58933
Upgrade Checker
2022-03-19 14:27:44 +00:00
KodeStar
d5bd614cc6
Update Application.php 2022-03-19 14:05:01 +00:00
Shift
0f498eca75
Remove explicit deleted_at date cast 2022-03-19 13:54:34 +00:00
Shift
3dac9828c8
Convert to new helper methods
Laravel 5 added several new helper functions, including:

- `view()`
- `response()`
- `redirect()`
- `config()`
- `abort()`

Review the [helpers][1] documentation for more details.

[1]: https://laravel.com/docs/5.0/helpers
2022-03-19 13:54:34 +00:00
Shift
297c2bb30f
Shift bindings
PHP 5.5.9+ adds the new static `class` property which provides the fully qualified class name. This is preferred over using strings for class names since the `class` property references are checked by PHP.
2022-03-19 13:54:33 +00:00
Shift
b1dc4d4a41
Apply Laravel coding style
Shift automatically applies the Laravel coding style - which uses the PSR-2 coding style as a base with some minor additions.

You may customize the adopted coding style by adding a [PHP CS Fixer][1] or [PHP CodeSniffer][2] config to your project root. Feel free to use [Shift's Laravel ruleset][3] to help you get started.

For more information on customizing the code style applied by Shift, [watch this short video][4].

[1]: https://github.com/FriendsOfPHP/PHP-CS-Fixer
[2]: https://github.com/squizlabs/PHP_CodeSniffer
[3]: https://gist.github.com/laravel-shift/cab527923ed2a109dda047b97d53c200
[4]: https://laravelshift.com/videos/shift-code-style
2022-03-19 13:54:32 +00:00
KodeStar
0fe6565346
Update app.php 2022-03-19 07:06:02 +00:00
KodeStar
85c68c1f46
Merge pull request #783 from xavier-GitHub76/2.x
Update app.php (French translations Fix) + version app (2.4.4)
2022-03-18 16:40:10 +00:00
Kode
fc2191b8db Fix preview image 2022-03-18 16:36:05 +00:00
xavier-GitHub76
ee36a0cfae
Update app.php
Update version app to 2.4.4
2022-03-18 14:32:15 +01:00
Kode
a868a6cac1 Fix for creating tags not setting home dashboard as default 2022-03-18 10:10:00 +00:00
xavier-GitHub76
574756b236
Update app.php
French translate fix
2022-03-17 22:43:05 +01:00
Kode
f9599079e5 Update app.php 2022-03-17 19:04:39 +00:00
Kode
10afffb71d Fix test button 2022-03-17 19:03:06 +00:00
KodeStar
79d53af339 Update app.php 2022-03-17 13:42:07 +00:00
KodeStar
8cc6a9cc63 Pull missing apps on update apps list 2022-03-17 13:41:50 +00:00
KodeStar
18001fbdd0 Get app regardless of if it's enhanced (might be a search provider) 2022-03-17 12:56:51 +00:00
KodeStar
398df75865 Merge branch '2.x' 2022-03-17 11:01:43 +00:00
KodeStar
41c2983312 Add warning about http being needed in url 2022-03-17 10:55:52 +00:00
KodeStar
bd3b882b3a Squashed commit of the following:
commit e52bc9c6b2
Author: KodeStar <kodestar@gmail.com>
Date:   Thu Mar 17 10:23:15 2022 +0000

    Update supportedapps.json

commit a16233ee10
Author: KodeStar <kodestar@gmail.com>
Date:   Thu Mar 17 10:21:24 2022 +0000

    Fix for displaying svg icons correctly
2022-03-17 10:24:31 +00:00
KodeStar
e52bc9c6b2 Update supportedapps.json 2022-03-17 10:23:15 +00:00
KodeStar
a16233ee10 Fix for displaying svg icons correctly 2022-03-17 10:21:24 +00:00
Kode
5b177f1127 Merge branch '2.3' into 2.x 2022-03-16 20:16:04 +00:00
Kode
f7633b6a5f Update mix-manifest.json 2022-03-16 20:15:22 +00:00
Kode
d58e6cb560 Fix for #774 2022-03-16 20:13:16 +00:00
Kode
87fe9c1771 Move setLocale out of vie composer so it's available everywhere
Fixes #776
2022-03-16 20:07:43 +00:00
Kode
95d9e9edb9 Update app.php 2022-03-16 19:43:03 +00:00
Kode
f7b2c51f9d Fix for old apps and icon selector 2022-03-16 19:41:01 +00:00
Kode
72c70e27f2 Remove refresh button for now as update code isn't ready yet 2022-03-16 18:39:47 +00:00
Kode
becbe5ab96 More work on apps 2022-03-16 18:35:40 +00:00
Kode
f5bce95808 Add missing lang string, fixed #773 2022-03-16 18:34:48 +00:00
KodeStar
1e2b807e05 Lots of work on apps 2022-03-16 15:49:44 +00:00
Kode
ed3dbf2f14 More work on enhanced apps 2022-03-15 20:09:22 +00:00
Kode
1e35f83fed Changes to the tooltips 2022-03-15 19:08:10 +00:00
KodeStar
8499d100ff More work on apps 2022-03-15 18:19:01 +00:00
KodeStar
bdeae6a722 Add missing files 2022-03-15 11:30:21 +00:00
Kode
4c63b66dbf Initial start of replacing apps list to use github generated list 2022-03-14 15:56:36 +00:00
Kode
371f52f92e Fixes #469 2022-03-14 12:25:20 +00:00
KodeStar
6daaf94974
Add details for search providers 2022-03-14 10:34:37 +00:00
Kode
b8e5a22648 Update app.php 2022-03-14 07:56:41 +00:00
Kode
e821edf01a Fix tags url
Fixes #763
2022-03-14 07:56:02 +00:00
Kode
188316df47 Fix search using incorrect value
fixes #764
2022-03-14 07:55:26 +00:00
Kode
dd14ce8738 Update app.php 2022-03-13 19:31:30 +00:00
Kode
d8e4053ce4 Merge branch 'master' of https://github.com/linuxserver/Heimdall 2022-03-13 19:30:27 +00:00
Kode
f73b78f292 Add search providers as an editable yaml file + allow searching tiles 2022-03-13 19:30:24 +00:00
Kode
96ec1e0b08 Fixes #435 2022-03-13 16:13:36 +00:00
KodeStar
1904d9d910
Merge pull request #731 from linuxserver/dependabot/npm_and_yarn/lodash-4.17.21
Bump lodash from 4.17.11 to 4.17.21
2022-03-13 12:21:14 +00:00
KodeStar
beb2851f4a
Add noopener noreferrer to link 2022-03-13 09:20:58 +00:00
dependabot[bot]
645a0bc7fe
Bump lodash from 4.17.11 to 4.17.21
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.21)

---
updated-dependencies:
- dependency-name: lodash
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-13 08:53:35 +00:00
Kode
ef73918098 Update jquery 2022-03-12 23:27:11 +00:00
Kode
06a23c70af Should fix #379 2022-03-12 13:09:50 +00:00
Kode
323a6e17c7 Update database.php 2022-03-12 13:09:03 +00:00
Kode
0ca07c9698 Update composer.json 2022-03-12 12:55:42 +00:00
Kode
fbb21d2885 update redis config 2022-03-12 12:54:15 +00:00
Kode
b6741c8ff0 Update readme.md 2022-03-12 11:55:06 +00:00
Kode
7fdca02af7 Allow numbers in apps 2022-03-12 10:45:37 +00:00
Kode
271100c25b Update app.php 2022-03-12 09:38:19 +00:00
KodeStar
cfecce6100
Create SECURITY.md 2022-03-12 09:37:36 +00:00
Kode
d71341df7a Update app.blade.php 2022-03-11 23:20:18 +00:00
Kode
ac851f5a02 Update manifest.json 2022-03-11 23:15:55 +00:00
Kode
d2a8b7af48 Update app.blade.php 2022-03-11 23:10:47 +00:00
Kode
4d7a86fbf7 Update .env.example 2022-03-11 22:53:25 +00:00
KodeStar
87a3af3dbf
Merge pull request #654 from NoahNxT/master
Translation correction NL
2022-03-11 20:30:16 +00:00
KodeStar
79c76b9f50
Merge pull request #648 from angrystar170/master
Add korean language files
2022-03-11 20:29:52 +00:00
KodeStar
d7742df802
Merge pull request #644 from OllieJC/custom
Add custom CSS and JS settings
2022-03-11 20:28:28 +00:00
KodeStar
736222e173
Merge pull request #614 from risiko79/fix/#507
FIX: #507 Tag URLs do not respect APP_URL
2022-03-11 20:23:34 +00:00
KodeStar
047ffb0b55
Merge pull request #581 from rtzra/feature/RussianLanguage
added Russian translation
2022-03-11 20:22:32 +00:00
KodeStar
505d17cf57
Merge pull request #561 from mattycourtney/master
Updated link to letsencrypt image to point to SWAG
2022-03-11 20:22:10 +00:00
KodeStar
71c2da160d
Merge pull request #522 from bence192/patch-3
Create pagination.php
2022-03-11 20:17:58 +00:00
KodeStar
3487b9e479
Merge pull request #521 from bence192/patch-4
Create passwords.php
2022-03-11 20:17:39 +00:00
KodeStar
7cdf315d78
Merge pull request #512 from Babasile/master
Lang fr update
2022-03-11 20:17:18 +00:00
KodeStar
a1812a962c
Merge pull request #506 from Forceu/master
Added info about updating
2022-03-11 20:16:49 +00:00
KodeStar
b97cab34b0
Merge pull request #492 from crazychatting/lang_de_update
Lang de update
2022-03-11 20:16:24 +00:00
KodeStar
3426450b3c
Merge pull request #475 from e7jonas/patch-1
Fixed some spelling errors.
2022-03-11 20:15:53 +00:00
KodeStar
75804f4624
Merge pull request #457 from skay-zhang/patch-1
Creat new language
2022-03-11 20:15:21 +00:00
KodeStar
23f757e06f
Merge pull request #454 from shaohao/Fix-password-issue
Update FormBuilder.php
2022-03-11 20:13:51 +00:00
KodeStar
fabd704bab
Merge pull request #520 from bence192/patch-1
Hungarian lang added
2022-03-11 20:13:01 +00:00
KodeStar
c16fbae963
Merge pull request #523 from bence192/patch-2
Create auth.php
2022-03-11 20:12:45 +00:00
Kode
348759b9ad update logging 2022-03-11 19:38:08 +00:00
Kode
d961aeb19b more urls with double slashes 2022-03-11 19:06:29 +00:00
Kode
987a9c03b0 fix for double slash on views 2022-03-11 19:03:03 +00:00
Kode
d17fb04983 fix fa in pseudo classes 2022-03-11 10:40:47 +00:00
Kode
b07918d751 changes to lv7 to maybe fix the symlink issues? 2022-03-11 10:07:42 +00:00
KodeStar
f9a19fce91 Update to laravel 7 2022-03-10 11:54:29 +00:00
Noah Gillard
1b71e80d52 Translation correction NL 2022-02-08 22:58:07 +01:00
angrystar170
9fac11cb77 Update passwords.php 2022-01-23 23:30:53 +09:00
angrystar170
a94fb108fa Add korean language files 2022-01-23 23:24:54 +09:00
OllieJC
f51893b2d6
Use pre for textarea settings 2022-01-22 13:30:50 +00:00
OllieJC
a4b32dcafd
Add textarea option 2022-01-18 22:59:40 +00:00
OllieJC
862f870303
Add settings.advanced/custom_css/custom_js 2022-01-18 22:42:53 +00:00
OllieJC
869cfd34ab
Add custom CSS and JS options 2022-01-18 22:40:09 +00:00
OllieJC
9e67b7c72e
Add custom_css and custom_js advance settings 2022-01-18 22:33:21 +00:00
risiko79
a5b7f10809 FIX: #507 Tag URLs do not respect APP_URL
see https://github.com/linuxserver/Heimdall/issues/507
2021-08-29 19:58:50 +02:00
Evgeny Cheremnykh
698665176c added Russian translation 2021-05-01 18:56:27 +03:00
Matty Courtney
1bd65222e4 Updated link to letsencrypt image to point to SWAG 2021-02-21 10:13:48 +08:00
KodeStar
61a5a1a8b0
Merge pull request #530 from jhaveDK/master
Danish translation
2020-12-07 12:39:14 +00:00
Jesper Have
e51cdd7f7a Danish translation update 2020-12-06 18:58:05 +01:00
Jesper Have
a626222ff3 Opdateret 2020-12-06 18:50:32 +01:00
Jesper Have
af68a45a3d . 2020-12-06 18:40:37 +01:00
Jesper Have
7969df9344 Danish translation 2020-12-06 16:36:55 +01:00
bence192
67bc656325
Create passwords.php 2020-11-29 20:02:49 +01:00
bence192
b5baf0d606
Create pagination.php 2020-11-29 20:01:48 +01:00
bence192
32964e9045
Create auth.php 2020-11-29 20:00:29 +01:00
bence192
27a667675a
Create app.php 2020-11-29 19:57:27 +01:00
Babasile
9a221f47bf Lang fr update 2020-10-24 11:19:57 +02:00
Marc Ole Bulling
8d2fbc5599
Added info about updating 2020-09-25 13:37:31 +02:00
Robin Loose
84ebe6587d added admin-account-needed in language 2020-08-03 00:45:36 +02:00
Robin Loose
89a71a18da updated and corrected language de 2020-08-01 02:12:01 +02:00
e7jonas
05dd7a090b
Fixed some spelling errors. 2020-05-14 13:40:18 +01:00
KodeStar
3a9bdd2c43
Merge pull request #458 from AndyTempel/slovenian-translation
added Slovenian translation
2020-03-22 19:20:42 +00:00
AndrazKorenc
0292e9976e added Slovenian translation 2020-03-15 09:50:17 +01:00
sKai
365de9512f
Creat new language
Creat simplified chinese , apply to china
2020-03-09 20:57:31 +08:00
Shao Hao
e857023903
Update FormBuilder.php
Make she the value is passed to password input.
2020-03-03 14:11:51 +08:00
KodeStar
c058e1a452 Merge pull request #446 from vinanrra/patch-1
Update app.php
2020-02-10 09:10:34 +00:00
vinanrra
7f42967b67 Update app.php
Added Jackett
2020-02-10 09:58:26 +01:00
KodeStar
994961de54 Merge pull request #438 from LeoShivas/patch-1
Make background image relative
2020-02-10 08:57:53 +00:00
KodeStar
049d20536c Merge pull request #397 from scottt732/search-app-fixes
Improved custom search handling
2020-02-10 08:56:29 +00:00
LeoShivas
c9c8171a52
Make background image relative
I use Heimdall in a subfolder so that I access to it threw www.mydomain.com/heimdall/.
Custom background image doesn't load because Heimdall generate an absolute link (ie : www.mydomain.com/storage/backgrounds/mycustomimage.jpeg).
The link expected is www.mydomain.com/heimdall/storage/backgrounds/mycustomimage.jpeg.
To fix this, you have to make the path relative by replace in the code "/storage" by "storage" or "./storage".
2020-02-04 11:41:53 +01:00
KodeStar
e7a6ac5a75
Merge pull request #412 from vincentbitter/remote_user-login
Fix auto-login using REMOTE_USER variable
2020-01-06 08:44:06 +00:00
KodeStar
3a372107ba
Merge pull request #405 from vorpalhex/feature/#376/upload_icon_text
Update 'upload a file' to 'upload an icon'
2020-01-06 08:42:29 +00:00
KodeStar
493374de65
Merge pull request #404 from panigrc/feature-greek-translation
Greek translation
2020-01-06 08:40:49 +00:00
Vincent Bitter
c43fc929f7 Do not try to login if user was not found 2019-11-15 21:30:10 +01:00
Vincent Bitter
895d5f2ebe Check if variables are empty since they always exist 2019-11-15 21:29:15 +01:00
VorpalHex
cb4768e2cf Update 'upload a file' to 'upload an icon' 2019-10-12 18:11:23 -05:00
panigrc
6ca4bfb9ee Add greek language to the SettingsSeeder 2019-10-06 14:44:18 +02:00
panigrc
1f7de03d90 Add greek language files 2019-10-06 14:43:34 +02:00
Scott Holodak
861d287750 Improved custom search handling 2019-09-11 13:42:33 -04:00
KodeStar
e2cc32fd0a
Merge pull request #392 from auanasgheps/patch-1
Update Italian app.php
2019-08-29 14:58:19 +01:00
KodeStar
762df25c45
Merge pull request #393 from auanasgheps/patch-2
Create Italian auth.php
2019-08-29 14:56:39 +01:00
KodeStar
0b114e7dc1
Merge pull request #394 from auanasgheps/patch-3
Create pagination.php
2019-08-29 14:56:13 +01:00
Oliver Cervera
981876c43c
Create pagination.php
File was missing.
Translated.
2019-08-28 18:56:46 +02:00
Oliver Cervera
7fe9c477e3
Create Italian auth.php
File was missing.
Translated.
2019-08-28 18:55:56 +02:00
Oliver Cervera
5b3a7f4e02
Update Italian app.php
- Added and translated missing strings
- Reworked existing strings
2019-08-28 18:53:15 +02:00
Kode
60e20c4023 fix route typo when restoring trash 2019-07-14 09:46:10 +01:00
Chris
9e1bb6c075 Update composer min php version 2019-07-11 15:01:07 +01:00
KodeStar
9c05d0d803
Update readme.md 2019-07-03 12:59:27 +01:00
KodeStar
3d1393c0b3
Merge pull request #370 from scodx/patch-1
some minor spanish translations fixes
2019-06-25 08:27:46 +01:00
KodeStar
9914fdb111
Merge pull request #373 from alxlaxv/patch-1
New translation for new SearchInterface
2019-06-25 08:27:07 +01:00
alxlaxv
9b24c9f1b5
New translation for new SearchInterface 2019-06-24 23:36:19 +02:00
Oscar Sánchez
81b8c646d2
some minor spanish translations fixes 2019-06-24 12:15:55 -05:00
Chris
f734832e0f remove url() from around app link 2019-06-24 08:38:50 +01:00
KodeStar
1bde11b30b
Update readme.md 2019-06-23 18:42:51 +01:00
Kode
9e80c3fe40 2.2.2 hasn't been released yet 2019-06-22 17:05:05 +01:00
Kode
f272dd13ce Fix for tags not showing 2019-06-22 17:03:01 +01:00
Chris
9f26de89a4 add remember user and missing check icon 2019-06-19 12:11:55 +01:00
Chris
e23964ebad set session and remember user when logged in via remote means 2019-06-19 12:01:17 +01:00
Chris
d0584ac941 Update app version ready for next release 2019-06-19 11:49:17 +01:00
Chris
1410c41f48 Add REMOTE_USER auth 2019-06-19 11:32:41 +01:00
Chris
5f524563cf Merge branch 'master' of https://github.com/linuxserver/Heimdall 2019-06-18 13:41:06 +01:00
Chris
3d181623c3 fix small issue 2019-06-18 13:41:02 +01:00
KodeStar
1919dbfd96
Update readme.md 2019-06-18 13:22:14 +01:00
Chris
8e1615ac5f fix search tab behaviour and tag link in subfolder 2019-06-18 12:25:05 +01:00
Chris
7966f07fdb update scripts + add home dash as default tag 2019-06-18 11:51:07 +01:00
Chris
ac8fe7012b remove false from routes 2019-06-18 10:51:51 +01:00
Chris
51d89dae82 Possible fix for folder based RP 2019-06-18 08:46:57 +01:00
KodeStar
ef21ac0fe7
Merge pull request #359 from pahakalle/patch-1
Fix typo in Finnish translation
2019-06-13 19:10:04 +01:00
KodeStar
02697687cc
Merge pull request #364 from linuxserver/hometags
Allow apps to be tagged to the homepage
2019-06-13 19:09:19 +01:00
Kode
fd2f7f27a6 Make home tag translatable 2019-06-13 19:07:38 +01:00
Kode
21b1ef5e4b fix pin toggle and get homepage dash working 2019-06-13 18:59:01 +01:00
Chris
e452d3b5f6 add seed 2019-06-13 15:57:54 +01:00
Chris
1419882455 initial 2019-06-13 15:40:26 +01:00
KodeStar
d79202ed87
Update readme.md 2019-06-12 11:02:19 +01:00
KodeStar
aa05c947a9
Remove url validation 2019-06-11 14:11:13 +01:00
Chris
eb69ea05fa Update package-lock.json 2019-06-11 12:35:48 +01:00
Chris
244b0998f9 update bootstrap-sass 2019-06-11 12:34:28 +01:00
Chris
1f608b1c21 Update composer dependencies 2019-06-11 12:29:32 +01:00
Chris
7d6df3843b update node deps 2019-06-11 12:20:04 +01:00
Kalle Laine
dd4b94ba71
Fix typo in Finnish translation 2019-06-11 14:18:08 +03:00
Chris
edb9397a47 Add startpage back in 2019-06-11 12:02:18 +01:00
KodeStar
66815a8487
readd startpage 2019-06-11 11:45:13 +01:00
KodeStar
5ee19bceb6
Merge pull request #357 from Agurato/master
Add Qwant as search engine
2019-06-11 11:32:31 +01:00
KodeStar
deba7d0279
Merge branch 'master' into master 2019-06-11 11:32:11 +01:00
KodeStar
38e93d33f1
remove startpage 2019-06-11 11:30:33 +01:00
KodeStar
f182f305fc
remove startpage 2019-06-11 11:30:17 +01:00
KodeStar
03c675ed57
remove startpage 2019-06-11 11:29:54 +01:00
KodeStar
3916b2d4dc
remove startpage 2019-06-11 11:29:38 +01:00
KodeStar
698a7a9bbc
remove startpage 2019-06-11 11:28:07 +01:00
KodeStar
9954d1b6bf
Merge pull request #342 from dmbekker/master
Dutch Translation update
2019-06-11 11:04:52 +01:00
KodeStar
a98b981efe
Merge pull request #348 from Aerion/toggle-livestats-refresh-active-tab
turn off livestats update when the tab isn't active
2019-06-11 11:03:14 +01:00
KodeStar
dd2ca62eaf
Add private subnets to trusted proxies for reverse proxy use 2019-06-11 11:00:44 +01:00
Agurato
dc2a42ad6d Add Qwant as search engine 2019-06-08 13:02:12 +02:00
Guillaume Taquet Gasperini
b5b25458db turn off livestats update when the tab isn't active
Fixes #330: Turning off the updating when the tab isn't active

When the tab is not visible from the user, the livestats refresh are
stopped. As soon as its visibility changes (from visibilitychange
API), the livestats are refreshed as usual.

This will prevent unnecessary calls to the different services when the
tab is hidden from the user.
2019-05-20 21:58:03 +02:00
David
ac4bbceb2f New Translations, Fixes for current translation
Added new translations

Minor language-issues fixed
- Changed 'Toepassing' to 'Applicatie' (Both Acronyms were used)
- Changed 'Reeks' to 'Tekenreeks'
2019-04-22 16:38:07 +02:00
Kode
4980bfab12 fix not protocol breaking adding for some reason 2019-03-30 23:10:00 +00:00
Chris
63e0d07d50 remove unused storeSearchProvider 2019-02-04 08:51:49 +00:00
Kode
2b76520e3a change version number and update lang value 2019-01-18 18:42:17 +00:00
Kode
6631b8a23b update dev npm deps 2019-01-18 18:37:51 +00:00
Kode
04d34017c1 Composer deps update 2019-01-18 18:33:28 +00:00
KodeStar
6dcbcb452e
Merge pull request #316 from linuxserver/search-enhancements
Search enhancements
2019-01-18 18:27:19 +00:00
Kode
7c74b3bb13 update manifest 2019-01-18 18:26:07 +00:00
Kode
b76a9ee118 Merge branch 'master' into search-enhancements 2019-01-18 18:25:00 +00:00
Kode
40da649b10 Changes to search 2019-01-18 18:21:44 +00:00
Chris
cd64d762e7 additions to search 2019-01-18 15:21:50 +00:00
Chris
b91c52820a replace fontawesome with js version 2019-01-18 14:07:17 +00:00
KodeStar
1204ffd306
Update app.php 2019-01-16 17:24:31 +00:00
Chris
978267dd14 Update Search.php 2019-01-16 15:00:42 +00:00
Chris
f935fd94c6 initial work on seach changes 2019-01-16 14:47:32 +00:00
Chris
fb2428e21b fixes #109 2019-01-16 14:20:33 +00:00
Chris
e36a126c01 fixes #286 2019-01-16 12:02:38 +00:00
Chris
b186978624 fixes #299 2019-01-16 11:39:39 +00:00
Chris
49773d7654 Fixes #302 2019-01-16 10:37:25 +00:00
Chris
53c03751a1 ignore supported apps folder 2019-01-16 10:35:55 +00:00
Chris
9d2908449a Merge branch 'master' of https://github.com/linuxserver/Heimdall 2019-01-15 15:27:29 +00:00
KodeStar
caf92bcf6d
check for gitignore in public storage and symlink if missing 2019-01-15 15:25:53 +00:00
KodeStar
cbef469e02
Update AppServiceProvider.php 2019-01-15 15:23:10 +00:00
Chris
a6bfc1d76c ignore .env 2019-01-15 14:27:19 +00:00
KodeStar
0446a74de9
Merge pull request #308 from openseabrus/master
Portuguese (PT-PT) translation.
2019-01-07 08:27:46 +00:00
KodeStar
1a14079b39
add APP_KEY 2019-01-04 14:00:15 +00:00
KodeStar
d9c1919ddc
Merge pull request #313 from linuxserver/Fix-default-appkey
Update .env.example
2019-01-04 11:52:07 +00:00
KodeStar
f42ac0c5ba
if .env is missing copy example and generate key 2019-01-04 10:38:07 +00:00
KodeStar
c073929895
Delete .env 2019-01-04 10:36:04 +00:00
KodeStar
02df7844a4
Update .env.example 2019-01-04 10:34:12 +00:00
l1904l
e43aba0111 Portuguese (PT-PT) translation. 2018-12-26 15:56:34 +00:00
Kode
ac7446ffe6 update version 2018-11-14 18:14:23 +00:00
Kode
e45d3ca6ec remove apps 2018-11-14 18:10:55 +00:00
Chris
603550a453 autofocus password 2018-11-13 12:38:19 +00:00
Kode
4463ef4a9a add right to livestats 2018-11-10 21:37:21 +00:00
Kode
49b8dc0079 Update version number 2018-11-10 18:05:19 +00:00
Kode
ab83c3a551 Small changes
Copy icon if missing on new app add.
Change order of create symlink and load apps
2018-11-09 23:07:01 +00:00
Chris
98c6093674 Check url isn't missing when testing 2018-11-07 11:24:26 +00:00
Chris
e1f51521bf Update version 2018-11-07 08:57:18 +00:00
Chris
e85bc98dcc Fix ProcessJobs not working if folder is empty but table isn't 2018-11-07 08:54:00 +00:00
Chris
4ba52baa5c Remove old code from tags form 2018-11-06 15:44:09 +00:00
Chris
a82077b4de Update version 2018-11-06 15:15:55 +00:00
Chris
b8f04f3d11 Fix preview and config not retaining values 2018-11-06 14:52:45 +00:00
Chris
e91f65f833 Ignore copy errors 2018-11-06 11:53:25 +00:00
Chris
575ab9be2d update version 2018-11-06 11:29:33 +00:00
Chris
64071bb60f Add migration and change path 2018-11-06 11:28:22 +00:00
Chris
44621a1a61 Change version + replace supported with icons 2018-11-06 09:48:03 +00:00
Chris
c56043e1f9 Add default value to null rather than not set 2018-11-06 09:20:53 +00:00
Kode
e8e4cbfd41 Change sort order for applist 2018-11-05 21:03:42 +00:00
Kode
4b2bbe0614 update version 2018-11-05 19:03:26 +00:00
Kode
9adfa14e62 fix light colour livestats 2018-11-05 19:02:19 +00:00
Kode
067f82b632 fix copy failing 2018-11-05 18:47:56 +00:00
Chris
e24e7979be update version number 2018-11-05 15:28:17 +00:00
Chris
c7c2b6e6f2 change location of icons so it's persistant 2018-11-05 15:27:29 +00:00
Chris
96798963d6 Update register app to allow all 2018-11-05 12:31:43 +00:00
Chris
75508a81ef Update version 2018-11-05 09:44:11 +00:00
Chris
f7f4efadb7 Change html comment to php comment 2018-11-05 09:40:44 +00:00
Kode
4cc80b98db inconsequential update to try and fix broken build 2018-11-04 22:33:44 +00:00
Kode
b07efaa7d0 Merge branch 'master' of https://github.com/linuxserver/ifai 2018-11-04 21:43:16 +00:00
Kode
7ba8ea6dd4 die if missing php-zip 2018-11-04 21:43:12 +00:00
KodeStar
479461821f
Update readme to use shields for apps 2018-11-04 18:30:27 +00:00
Kode
d25aea38fb update app version to correct number 2018-11-04 16:26:08 +00:00
Kode
0067502b37 Initial application process 2018-11-04 16:20:12 +00:00
Kode
d321af6085 update app type via dropdown 2018-11-04 16:03:55 +00:00
Kode
b30f1730e4 order applist in dropdown by name 2018-11-04 15:27:57 +00:00
KodeStar
7a02986982
Merge pull request #282 from linuxserver/2.1.0
2.1.0
2018-11-04 14:54:13 +00:00
Kode
a4107cba25 Fix tags 2018-11-04 14:33:39 +00:00
KodeStar
ba187aa345
Merge pull request #281 from BiohZn/master
Finnish and Swedish translation
2018-11-04 13:24:39 +00:00
Conny Sjöblom
b400cef734 Update Finnish translation 2018-11-04 15:20:53 +02:00
Conny Sjöblom
03b72b8d2e Update Swedish translation 2018-11-04 15:19:48 +02:00
Conny Sjöblom
0c7e20dee0 Finnish translation 2018-11-04 15:06:38 +02:00
Conny Sjöblom
aa42c71a06 Swedish translation 2018-11-04 14:53:20 +02:00
Kode
041c0b81a3 updates 2018-11-01 08:55:21 +00:00
Chris
fe6776ee9d Some changes to SupportedApps.php 2018-10-31 15:42:34 +00:00
Chris
125b9f4160 Some fixes and changes to run css 2018-10-30 14:58:45 +00:00
Kode
488fee7b4b fixes 2018-10-29 19:43:08 +00:00
Kode
4fba596909 add enable button 2018-10-29 19:01:25 +00:00
Chris
af04781830 remove class name from icon name 2018-10-29 15:24:47 +00:00
Chris
2507cda94c Normalise classname to remove non alpha chars 2018-10-29 15:12:47 +00:00
Kode
21c1401859 fixes 2018-10-28 20:41:46 +00:00
Kode
4351f55225 updates 2018-10-28 10:59:59 +00:00
Kode
d1956c4e88 updates 2018-10-26 19:55:40 +01:00
Chris
d76d056ed1 changes 2018-10-25 14:42:14 +01:00
Chris
e081cc31a2 small update 2018-10-25 12:14:18 +01:00
Chris
88153b0e32 Redo app form page 2018-10-25 09:44:40 +01:00
Chris
2b2d51cb6f changes 2018-10-23 15:53:56 +01:00
Kode
abd8c7227d Merge branch 'master' into 2.1.0 2018-10-21 14:09:39 +01:00
Kode
50d6dc7b71 change to find first user with public front 2018-10-21 13:47:03 +01:00
Kode
b4a1ecc305 update EnhancedApps 2018-10-21 13:32:58 +01:00
Kode
540bead0db Fix test button 2018-10-21 13:23:23 +01:00
Kode
6e9f25d680 Fixes 2018-10-21 12:39:12 +01:00
Kode
268afe7006 Get working 2018-10-21 00:17:36 +01:00
Kode
7b9d3f0ec6 replace text input with password input and swap input for Form::password 2018-10-20 20:08:36 +01:00
Kode
de116030bc change password field on nzbget blade 2018-10-20 13:55:56 +01:00
Chris
4fb59385b7 work on applications 2018-10-19 15:10:05 +01:00
Chris
40d6808067 Merge branch 'master' into 2.1.0 2018-10-19 08:47:58 +01:00
Chris
3572bd8068 update laravel requirements 2018-10-19 08:13:00 +01:00
Chris
380a0e8623 changes 2018-10-18 15:59:38 +01:00
Chris
4f6a0cb7c6 Move current apps out 2018-10-18 10:37:18 +01:00
Chris
56cce8233b Replace svgs 2018-10-18 09:53:13 +01:00
KodeStar
af8afcf931
Update readme.md 2018-10-18 08:41:13 +01:00
Kode
7f997d60cd Update version 2018-10-17 22:17:27 +01:00
Kode
d45f5a805e wrap asset() round root assets 2018-10-17 22:16:23 +01:00
Kode
fc9c624509 update donate link 2018-10-17 19:53:27 +01:00
KodeStar
33372509eb
Merge pull request #266 from linuxserver/Multi-user
v2.0.0
2018-10-17 18:41:51 +01:00
Kode
bca0b02925 update version number to 2.0.0 2018-10-17 18:37:22 +01:00
Kode
24995135e6 update dependency 2018-10-17 18:35:09 +01:00
Chris
c1e4103edd Add support for pinned tabs in safari (potentially) 2018-10-17 11:31:42 +01:00
Chris
6eda423156 Added mailcow, webmin and virtualmin 2018-10-17 10:27:05 +01:00
Chris
7dc72d3519 style switch user icon same as user list page 2018-10-17 09:59:39 +01:00
Chris
907c22179b rearrange order 2018-10-17 09:49:23 +01:00
Chris
cdafbab7b1 possible fix for basic auth 2018-10-17 09:41:20 +01:00
Chris
e0064504e7 Merge branch 'master' into Multi-user 2018-10-17 08:39:10 +01:00
KodeStar
b22117dd01
Add missing override url 2018-10-17 08:36:06 +01:00
KodeStar
c88efa8dbc
Fix broken config 2018-10-17 08:33:42 +01:00
Kode
7d060ff803 Merge branch 'master' into Multi-user 2018-10-16 19:05:04 +01:00
KodeStar
d5f8b6aae0
Merge pull request #257 from ABOTlegacy/Monica
Monica
2018-10-16 19:01:52 +01:00
KodeStar
2416993c5e
Merge pull request #258 from ABOTlegacy/Bitwarden
Added Bitwarden to foundation apps.
2018-10-16 19:01:10 +01:00
KodeStar
494165a03a
Merge pull request #259 from dgw/readme-polishing
readme: formatting, typo fixes, spit & polish
2018-10-16 19:00:20 +01:00
KodeStar
88e607533c
Change to multiarch docker 2018-10-16 18:58:33 +01:00
KodeStar
035d2f9209
Merge pull request #265 from alxlaxv/master
Updating french translations
2018-10-16 18:53:05 +01:00
alxlaxv
53903daa87
Update app.php 2018-10-16 19:32:37 +02:00
alxlaxv
567994be1a
Merge pull request #1 from alxlaxv/patch-1
Update app.php
2018-10-16 19:21:03 +02:00
alxlaxv
32fa27337a
Update app.php
French translations improved
2018-10-16 17:27:53 +02:00
Chris
e1bb7646ac small fixes 2018-10-16 15:44:23 +01:00
KodeStar
108b636def
Merge pull request #260 from keranoz/patch-1
Update app.php
2018-10-16 15:20:03 +01:00
keranoz
4abb14bf54
Update app.php
Improved some translations that seemed machine translated and added missing entries.
2018-10-16 14:08:19 +00:00
Chris
f8f96593c1 Update userseeder 2018-10-16 15:04:53 +01:00
Chris
cb21b0f8f1 add basic auth support and put username in switch user section 2018-10-16 14:57:21 +01:00
Chris
4c8c5fa27f Replace name for username in list view 2018-10-16 14:28:12 +01:00
Chris
6093119dde Change name to username 2018-10-16 14:14:14 +01:00
Chris
15755a3fd1 move all assets locally 2018-10-16 12:58:56 +01:00
Chris
0213c81e0d muted the switch user button until it's hovered over 2018-10-16 11:24:21 +01:00
Chris
c47f296f17 Change location of switch user 2018-10-16 10:59:35 +01:00
Chris
75133474f7 Added support and br translation 2018-10-16 09:33:24 +01:00
Kode
ddbe171f3a minor change to user avatar size to cut down whitespace a bit 2018-10-15 20:43:27 +01:00
Kode
12e109f82c add unique validation for name and don't fail validation when already the owner of data 2018-10-15 20:34:21 +01:00
Kode
e095589172 fix validation on email 2018-10-15 20:25:21 +01:00
Kode
d0293c785b Get settings working and autologin 2018-10-15 19:56:45 +01:00
Chris
aa351e31bf trying to get session settings to work 2018-10-15 16:00:20 +01:00
Chris
aceed3d13b fix settings edit not working 2018-10-15 14:35:14 +01:00
Chris
10b70d4a09 changes 2018-10-15 13:02:16 +01:00
Chris
cb9e014cf3 Autologin togles working 2018-10-15 09:52:36 +01:00
Chris
99017d834e Merge branch 'master' into Multi-user 2018-10-15 09:08:42 +01:00
Chris
fb73f5ca24 Attempt to allow changing root URL 2018-10-15 09:03:54 +01:00
dgw
4369f1aeda readme: formatting, typo fixes, spit & polish
Includes making inter-sentence spaces consistent, `pre-formatting`
values where it seemed appropriate, correcting typos, and other
miscellaneous niceties to help the readme make a good first impression.
2018-10-14 17:38:05 -05:00
Kode
6501aacb1b update to laravel 5.7 and try getting autologin saved 2018-10-14 20:50:32 +01:00
Kode
c3da17befc User specific items 2018-10-14 17:27:28 +01:00
Kode
46bb073001 Working on multi user 2018-10-14 16:17:55 +01:00
Kode
e8b47776ce Merge branch 'master' into Multi-user 2018-10-13 15:52:42 +01:00
Kode
6941fd3e2d Fixes for folder installs 2018-10-13 15:32:15 +01:00
Andy Bottom
f5937879df Added Bitwarden to foundation apps. 2018-10-12 14:59:19 -05:00
Andy Bottom
93877b7025 Fixed spaces vs tabs. 2018-10-12 14:35:59 -05:00
Andy Bottom
6612631cc3 Added Monica to foundation apps. 2018-10-12 14:32:34 -05:00
Chris
30c3079a90 added setting user many to many relationship 2018-10-12 15:10:40 +01:00
Chris
e86e681c53 Initial commit of multi user 2018-10-12 14:57:46 +01:00
Chris
48f72652da Merge branch 'master' of https://github.com/linuxserver/Heimdall 2018-10-12 11:33:43 +01:00
Chris
a3f7bafedb change css and js links to asset links 2018-10-12 11:33:39 +01:00
KodeStar
d30d610042
Update readme.md 2018-10-12 11:13:51 +01:00
Kode
882e406266 remove var dump 2018-09-30 15:47:44 +01:00
Kode
45d421256c Update readme and remove addition to .env as not necessary for everyone 2018-09-30 11:52:54 +01:00
Kode
a2f20fc18f allow forcing https for reverse proxy use 2018-09-30 11:45:08 +01:00
KodeStar
988364cb7c
Merge pull request #246 from CHBMB/Bazarr
Bazarr
2018-09-13 13:40:12 +01:00
chbmb
a3816ed8a1
Update readme.md 2018-09-13 08:44:05 +01:00
chbmb
d48805ee2c
Update Item.php 2018-09-13 08:43:21 +01:00
chbmb
e820b81259
Add files via upload 2018-09-13 08:42:26 +01:00
chbmb
8b1046ce17
Create Bazarr.php 2018-09-13 08:41:57 +01:00
chbmb
a138b65842
Merge pull request #1 from linuxserver/master
Rebase
2018-09-13 08:36:04 +01:00
KodeStar
c344de3f04
Merge pull request #244 from CHBMB/patch-3
Better logo and colour scheme for Unraid
2018-09-03 12:55:25 +01:00
chbmb
427659a897
Add files via upload 2018-08-30 11:42:02 +01:00
chbmb
a6543970e7
Update Unraid.php 2018-08-30 11:40:55 +01:00
KodeStar
399ea088dc
Merge pull request #243 from CHBMB/patch-2
Update Unraid Icon & Colour Scheme
2018-08-29 17:37:18 +01:00
chbmb
3f87833e52
Add files via upload 2018-08-29 15:56:02 +01:00
chbmb
6dcb77023c
Update Unraid colour in line with new logo 2018-08-29 15:54:19 +01:00
KodeStar
4d37135bdf
Merge pull request #233 from CHBMB/freshrss
Freshrss
2018-07-19 21:49:13 +01:00
KodeStar
d109047fa5
Merge pull request #232 from CHBMB/bookstack
BookStack
2018-07-19 21:48:51 +01:00
KodeStar
b6112501e2
Merge pull request #231 from CHBMB/tvheadend
Add TVheadend to foundation apps
2018-07-19 21:47:16 +01:00
KodeStar
0663e236b4
Merge pull request #230 from CHBMB/patch-1
PfSense update
2018-07-19 21:46:30 +01:00
chbmb
f25cea1749
Add FreshRSS logo 2018-07-19 19:57:26 +01:00
chbmb
03e16415aa
Create FreshRSS.php 2018-07-19 19:56:39 +01:00
chbmb
9a55e05943
Add FreshRSS 2018-07-19 19:55:21 +01:00
chbmb
c06fa4eab6
Update readme.md 2018-07-19 19:54:24 +01:00
chbmb
5575b082ea
Update and rename Bookstack.php to BookStack.php 2018-07-18 21:18:19 +01:00
chbmb
1c6da858bc
Update Item.php 2018-07-18 21:17:33 +01:00
chbmb
f0a14641c1
Update readme.md 2018-07-18 21:17:03 +01:00
chbmb
c6d07cd8a4
Update readme.md 2018-07-18 21:15:48 +01:00
chbmb
df9f07faf4
Add files via upload 2018-07-18 21:15:14 +01:00
chbmb
a3dcc278d7
Create Bookstack.php 2018-07-18 21:13:53 +01:00
chbmb
5de473fa44
Add bookstack 2018-07-18 21:00:36 +01:00
chbmb
763c1545a6
Update readme.md 2018-07-18 20:47:25 +01:00
chbmb
ecde7a0f32
Update readme.md 2018-07-18 20:46:27 +01:00
chbmb
7fc5e0abb5
Add TVheadend 2018-07-18 20:45:40 +01:00
chbmb
06a655ac0c
Create TVheadend.php 2018-07-18 20:43:36 +01:00
chbmb
875ddaa834
Add TVheadend logo 2018-07-18 20:30:30 +01:00
chbmb
030fccbb50
Change pfSense logo to 250 x 250 2018-07-18 16:06:47 +01:00
chbmb
908f70d90a
Update pfsense logo to new version 2018-07-18 16:02:11 +01:00
chbmb
8724ced531
pfSense New Logo/Colour 2018-07-18 16:00:30 +01:00
KodeStar
aa1a3a95ca
Merge pull request #227 from MindTooth/update_package_json
Cleaned up package.json
2018-07-09 12:54:35 +01:00
Birger J. Nordølum
0767dc075e
Cleaned up package.json
And updated some dependencies.
2018-07-09 13:08:02 +02:00
KodeStar
c8a6c89036
Merge pull request #225 from linuxserver/revert-217-fix_reported_errors
Revert "Changed from variable assignment to comparison"
2018-06-22 11:37:34 +01:00
KodeStar
cafe386cc4
Revert "Changed from variable assignment to comparison" 2018-06-22 11:36:58 +01:00
KodeStar
0184c9695b
Merge pull request #218 from MindTooth/new_view
Cleaned of variable population in scripts.blade.php
2018-06-22 11:15:26 +01:00
KodeStar
19536edf28
Merge pull request #222 from MindTooth/add_info_to_files
Clarified _rune.scss file
2018-06-22 11:09:37 +01:00
KodeStar
045e4a20fa
Merge pull request #213 from MindTooth/tweak_readme
Readme style tweaks
2018-06-22 11:09:13 +01:00
Birger J. Nordølum
6cb8487a52
Clarified _rune.scss file 2018-06-21 17:41:04 +02:00
Birger J. Nordølum
c39e9aa13f
Trim variable in script view for create/edit.blade
Removed the large logic to populate the varible in page specific view.
2018-06-20 23:42:31 +02:00
KodeStar
0203440b06
Merge pull request #217 from MindTooth/fix_reported_errors
Changed from variable assignment to comparison
2018-06-20 21:20:12 +01:00
Birger J. Nordølum
7f7bf60456
Changed from variable assignment to comparison
Issue reported by CodeFactor:
https://www.codefactor.io/repository/github/mindtooth/heimdall/file/master/database/seeds/SettingsSeeder.php
2018-06-18 00:34:05 +02:00
KodeStar
e8673634bc
Merge pull request #216 from MindTooth/fix_error
Fixes compile error with webpack.mix.js and app.js
2018-06-17 22:33:33 +01:00
KodeStar
53e52c93ee
Merge pull request #214 from MindTooth/up_node_packages
Up packages.json to reflect upstream Laravel 5.5
2018-06-17 22:32:17 +01:00
Birger J. Nordølum
c239c0ea5a
Compiled new source for fix 2018-06-17 23:19:45 +02:00
Birger J. Nordølum
7142f755f5
Fixes error thrown by UglifyJS 2018-06-17 23:17:35 +02:00
Birger J. Nordølum
9fbc8dc1f9
Fix missing bracket in app.js 2018-06-17 23:17:35 +02:00
Birger J. Nordølum
d3819a6a88
Last fix for Huebee issue.
After some major debugging once again, I've concluded that the previous
webpack.mix.js worked fine, but threw an error when minifying the app.js
file.  The culprit is because the current app.js contains some newer
ECMAScript code that needs to be translated.  However, with the current
inclusion of huebee.js into the samme command, it seems to mess things
up.

Just as a potensial fix for now is to just ignore the issue, and have a
stab at it at a later date.  This reverts the "fixes" I've made before.
2018-06-16 15:15:00 +02:00
Birger J. Nordølum
6e93ed8e5f
Up packages.json to reflect upstream Laravel 5.5
This updates laravel-mix to 2.0.  Removed node-sass,
as it's already pulled by laravel-mix.
2018-06-16 14:56:45 +02:00
Birger J. Nordølum
98543d49a9
Readme style tweaks 2018-06-16 14:11:48 +02:00
KodeStar
9195eead27
Merge pull request #208 from MindTooth/fix_huebee
Fixes bug introduced in #203
2018-06-16 12:06:04 +01:00
KodeStar
e5b384736d
Merge pull request #209 from dansoaress/master
Brazilian Portuguese translation
2018-06-15 14:14:48 +01:00
Daniel Soares
4def720d1a spell checking 2018-06-14 14:06:59 -03:00
Daniel Soares
2a0404ea17 Brazilian Portuguese translation 2018-06-14 07:02:14 -03:00
Birger J. Nordølum
6d22c4f02e
Fixes bug introduced in #203
Needs to import the library when using webpack.mix.js.
Will also be the case for future libraries.
2018-06-14 00:20:42 +02:00
KodeStar
24ac12da65
Merge pull request #207 from MindTooth/fix_app_js
Fix issue with using override_url and running a test
2018-06-13 22:39:44 +01:00
Birger J. Nordølum
3f19882df8
All the other tweaks 2018-06-13 22:35:51 +02:00
Birger J. Nordølum
dd54c16c1f
Fixed test when using override_url 2018-06-13 22:35:51 +02:00
Kode
223e9289dc include arrow in text color fix 2018-06-13 20:11:28 +01:00
Kode
2e301bdd51 This closes #184, closes #126 2018-06-13 20:03:26 +01:00
Kode
e3ec7de23a Dependency updates and update version number 2018-06-13 19:35:28 +01:00
KodeStar
18ec208381
Merge pull request #205 from MindTooth/add_gitattribute
.gitattributes: More settings added
2018-06-13 15:22:04 +01:00
KodeStar
8666daa07d
Merge pull request #197 from finish06/master
Add App - Flood
2018-06-13 15:20:24 +01:00
KodeStar
926a9bdb03
Merge pull request #190 from ullbergm/app-Mylar
Foundation App: Mylar
2018-06-13 15:18:41 +01:00
Birger J. Nordølum
fc2d837a2c
.gitattributes: More settings added 2018-06-13 16:15:38 +02:00
KodeStar
3f69ccab99
Merge pull request #192 from ullbergm/app-Headphones
Foundation App: Headphones
2018-06-13 15:09:58 +01:00
KodeStar
b6ee82ee52
Merge pull request #201 from shuaiscott/master
Enhanced App: Deluge
2018-06-13 15:09:25 +01:00
KodeStar
da1eb859a9
Merge pull request #202 from MindTooth/enhanced_traefik
Enhanced App: Traefik
2018-06-13 15:08:11 +01:00
KodeStar
2b5269b823
Merge pull request #203 from MindTooth/fix_webpack
Fixes typo in webpack.mix.js
2018-06-13 15:07:19 +01:00
ullbergm
6c8eeb0ced
Merge branch 'master' into app-Mylar 2018-06-10 07:39:37 -04:00
Magnus Ullberg
c5e0f3abc8 Revert "Merge branch 'master' into app-Mylar"
This reverts commit 586941ece7, reversing
changes made to 263a4578d4.
2018-06-10 07:34:48 -04:00
Birger J. Nordølum
c6dbe22c57
Fixes typo in webpack.mix.js 2018-06-10 13:20:46 +02:00
KodeStar
51776e2aa3
Merge pull request #200 from ullbergm/Add-option-to-open-links-in-current-window-or-new-tab
WIP: Add option to open links in current window or new tab
2018-06-10 09:01:25 +01:00
KodeStar
c9d24607f6
Merge pull request #199 from MindTooth/tweak_names
lang_en: Reworded some strings, and removed whitespace
2018-06-10 08:53:37 +01:00
KodeStar
46f7a3d4f3
Merge pull request #198 from MindTooth/transmission_url
Transmission: Added custom URL
2018-06-10 08:50:33 +01:00
KodeStar
56cf450c89
Merge pull request #195 from ullbergm/app-MusicBrainz
Foundation App: MusicBrainz
2018-06-10 08:36:33 +01:00
KodeStar
38c350b020
Merge pull request #194 from ullbergm/app-LibreNMS
Foundation App: LibreNMS
2018-06-10 08:30:09 +01:00
KodeStar
1f46040f1b
Merge pull request #193 from ullbergm/app-LazyLibrarian
Foundation App: LazyLibrarian
2018-06-10 08:29:03 +01:00
KodeStar
63b95319cd
Merge pull request #191 from ullbergm/app-Booksonic
Foundation App: Booksonic
2018-06-10 08:25:17 +01:00
Birger J. Nordølum
a25d92be9e
Traefik: enhanced conversion 2018-06-09 18:20:36 +02:00
Scott Carlson
a161210a4a
Moving Deluge to Enhanced List 2018-06-08 15:39:57 -05:00
shuaiscott
24469eb2fa Adding Enhanced Deluge 2018-06-08 13:58:17 -06:00
ullbergm
a93fb49875
Update Item.php 2018-06-07 17:35:01 -04:00
ullbergm
08d7cdf95b
Update SettingsSeeder.php 2018-06-07 12:34:35 -04:00
ullbergm
a9334bc247
Update Item.php 2018-06-07 12:33:40 -04:00
ullbergm
2357d0c466
Update app.php 2018-06-07 12:33:14 -04:00
ullbergm
b003d51276
Update SettingsSeeder.php 2018-06-07 12:32:45 -04:00
ullbergm
503cbf9830
Update SettingsSeeder.php 2018-06-07 12:32:08 -04:00
ullbergm
2466058c5a
Update Item.php 2018-06-07 12:31:26 -04:00
Magnus Ullberg
6b1f422456 Initial stab at allowing you to select how links open. 2018-06-07 12:17:08 -04:00
Birger J. Nordølum
1d16d67733
lang_en: Reworded some strings, and removed whitespace 2018-06-07 10:49:35 +02:00
Birger J. Nordølum
6f9d15aed8
Transmission: Added custom URL 2018-06-07 10:42:02 +02:00
ullbergm
8725f974da
Update readme.md 2018-06-06 19:09:42 -04:00
ullbergm
2551c949ae
Update Item.php 2018-06-06 19:08:51 -04:00
ullbergm
30c6020ce7
Delete LazyLibrarian.php 2018-06-06 19:08:32 -04:00
ullbergm
d00b1ce1a1
Delete lazylibrarian.png 2018-06-06 19:08:12 -04:00
Caleb Dunn
2c43d79585 Add Flood class 2018-06-05 11:18:49 -05:00
Caleb Dunn
3e4aacb2b0 Add Flood 2018-06-05 11:17:17 -05:00
KodeStar
67cd22371b
Merge pull request #189 from ullbergm/app-Rancher
Foundation App: Rancher
2018-06-05 11:59:24 +01:00
ullbergm
586941ece7
Merge branch 'master' into app-Mylar 2018-06-04 21:41:52 -04:00
ullbergm
32a57cbfa6
Merge pull request #5 from ullbergm/app-Headphones
Added Headphones support.
2018-06-04 21:41:04 -04:00
ullbergm
1837a69b3e
Merge pull request #4 from ullbergm/app-Booksonic
Added Booksonic support.
2018-06-04 21:40:38 -04:00
ullbergm
aa8bfcfd92
Merge pull request #3 from ullbergm/app-MusicBrainz
Added MusicBrainz support.
2018-06-04 21:40:00 -04:00
ullbergm
9e0c658470
Merge pull request #2 from ullbergm/app-LibreNMS
Added LibreNMS support.
2018-06-04 19:20:01 -04:00
ullbergm
66aefff4f3
Merge branch 'master' into app-LibreNMS 2018-06-04 19:19:41 -04:00
ullbergm
bd0fdeecee
Merge pull request #1 from ullbergm/app-LazyLibrarian
Added LazyLibrarian support.
2018-06-04 19:18:25 -04:00
Magnus Ullberg
1055eeb01b Added Rancher support. 2018-06-04 19:13:30 -04:00
Magnus Ullberg
263a4578d4 Added Mylar support. 2018-06-04 19:13:08 -04:00
Magnus Ullberg
c446b8a5af Added MusicBrainz support. 2018-06-04 19:12:24 -04:00
Magnus Ullberg
847b34cdcb Added LibreNMS support. 2018-06-04 19:12:02 -04:00
Magnus Ullberg
5a57f90b8f Added LazyLibrarian support. 2018-06-04 19:11:36 -04:00
Magnus Ullberg
f8eb9f5bd0 Added Headphones support. 2018-06-04 19:11:11 -04:00
Magnus Ullberg
c8c336b574 Added Booksonic support. 2018-06-04 19:10:22 -04:00
KodeStar
43f1410974
added fileinfo note to installing section 2018-05-25 09:12:32 +01:00
KodeStar
1df110b3fb update app version 2018-05-04 17:57:03 +01:00
KodeStar
9bedce0df5
Merge pull request #177 from CHBMB/patch-1
Add unRAID to readme
2018-05-03 23:19:24 +01:00
chbmb
ae1d879e5a
Add unRAID to readme 2018-05-03 21:56:24 +01:00
KodeStar
caab2e0952
Merge pull request #176 from ninthwalker/master
Add Now Showing to Supported Apps
2018-05-01 21:55:16 +01:00
ninthwalker
a29d6517d3
add NowShowing 2018-05-01 11:43:56 -07:00
ninthwalker
dae2781818
Add files via upload 2018-05-01 11:34:56 -07:00
ninthwalker
c1de609b1a
Create NowShowing.php 2018-05-01 11:31:54 -07:00
KodeStar
4e84807950
Merge pull request #173 from CHBMB/patch-5
Add Unraid to supported apps
2018-04-30 18:45:00 +01:00
chbmb
41c9cb45d6
Add files via upload 2018-04-29 01:39:27 +01:00
chbmb
2d72772f86
Delete unraid.png 2018-04-29 01:39:11 +01:00
chbmb
1cf1f0e04d
Update Item.php 2018-04-29 01:30:45 +01:00
chbmb
324b88ec2b
Add files via upload 2018-04-29 01:29:08 +01:00
chbmb
ec64c7ba0b
Create Unraid.php 2018-04-29 01:27:48 +01:00
KodeStar
67e0f8570e
fix autofocus 2018-04-25 23:03:48 +01:00
KodeStar
1745100705
fix @CHBMB 's fsckup 2018-04-25 22:58:14 +01:00
KodeStar
28501944c5
Merge pull request #172 from CHBMB/master
Add StartPage support
2018-04-25 22:46:50 +01:00
chbmb
c5c1a68f5c
Merge pull request #3 from CHBMB/patch-4
Update SettingsSeeder.php
2018-04-25 22:41:54 +01:00
chbmb
e2ed7fbd28
Merge pull request #2 from CHBMB/patch-3
Update app.php
2018-04-25 22:41:36 +01:00
chbmb
ab0675055c
Merge pull request #1 from CHBMB/patch-2
Update Setting.php
2018-04-25 22:41:14 +01:00
chbmb
2b65559f36
Update SettingsSeeder.php 2018-04-25 22:40:15 +01:00
chbmb
b8beb07df5
Update app.php 2018-04-25 22:39:29 +01:00
chbmb
01748fec49
Update Setting.php 2018-04-25 22:38:30 +01:00
KodeStar
42a50b1a02
Merge pull request #169 from ferrymanders/master
AllowOverride explained for apache .htaccess
2018-04-17 09:03:41 +01:00
Ferry Manders
d81595f43f
AllowOverride explained for apache .htaccess
added extra example so users have a reference
2018-04-12 10:36:45 +02:00
Ferry Manders
71fa2d867f
AllowOverride explained for apache .htaccess
In some apache installations .htaccess is disallowed by default. explained a few fixes/work arounds.
2018-04-12 10:32:32 +02:00
KodeStar
f55dbb0002
Merge pull request #165 from kimpenhaus/master
added autofocus to search input #149
2018-04-11 15:02:19 +01:00
KodeStar
3e4d623786
Update readme.md 2018-04-06 09:13:30 +01:00
KodeStar
1b109aac3a
Merge pull request #166 from halorrr/patch-1
SupportedApp: Syncthing
2018-04-06 09:02:50 +01:00
KodeStar
8558975d55
Merge pull request #164 from albertsj1/fix_cp_icon
fix couchpotato icon capitalization
2018-04-04 09:45:20 +01:00
halorrr
0e895089c7
Create Syncthing.php 2018-04-04 01:31:43 -04:00
halorrr
5dd44f66c1
Update Item.php 2018-04-04 01:26:08 -04:00
halorrr
a1cfea46c6
Add files via upload 2018-04-04 07:25:18 +02:00
halorrr
42c492c85a
Update readme.md 2018-04-04 01:24:07 -04:00
Marcus Kimpenhaus
9e8794a39f added autofocus to search input #149 2018-04-02 11:13:49 +02:00
John Alberts
66c3604b2a
fix couchpotato icon capitalization 2018-03-31 22:29:59 -07:00
KodeStar
c0ee1ee27b
Update app.php 2018-03-27 10:57:49 +01:00
KodeStar
a3e669e433
Merge pull request #162 from halorrr/master
Bug Fix On Newly Added Apps
2018-03-27 10:52:29 +01:00
halorrr
8a83b4fff5
Capitalized first letter of filename to fix link 2018-03-26 09:29:26 -04:00
halorrr
69c48d3f5d
Deleted extra space at beginning of file 2018-03-26 09:28:53 -04:00
halorrr
88504a335e
Deleted extra space at beginning of file 2018-03-26 09:28:39 -04:00
halorrr
a44a433807
Deleted extra space at beginning of file 2018-03-26 09:28:26 -04:00
halorrr
9c03a8ae28
Deleted extra space at beginning of file 2018-03-26 09:28:12 -04:00
halorrr
767a5f3a94
Deleted extra space at beginning of file 2018-03-26 09:27:57 -04:00
halorrr
db1e138d36
Deleted extra space at beginning of file 2018-03-26 09:27:36 -04:00
halorrr
84aa05f9a9
Deleted extra space at beginning of file 2018-03-26 09:27:19 -04:00
KodeStar
1071b85472
Merge pull request #160 from LiamAkkerman/master
SupportedApp: Grafana
2018-03-26 08:34:56 +01:00
KodeStar
479412b190
Merge pull request #157 from halorrr/patch-2
SupportedApp: Cardigann
2018-03-26 08:34:26 +01:00
KodeStar
ac4fc5b0ba
Merge pull request #156 from halorrr/patch-1
SupportedApp: pyLoad
2018-03-26 08:33:28 +01:00
KodeStar
4a8770232d
Merge pull request #158 from rigrassm/mobile-app-compatible
Add html needed to allow the site to load as a mobile app
2018-03-26 08:31:40 +01:00
Liam B. Akkerman
2ea983bdae rename grafana icon file 2018-03-24 21:40:52 -07:00
Liam B. Akkerman
ffce8fa505 add grafana to readme 2018-03-24 21:37:07 -07:00
Liam B. Akkerman
cb9e529eb7 add grafana to Item.php 2018-03-24 21:35:23 -07:00
Liam B. Akkerman
7f0ee208fa add grafana icon 2018-03-24 21:29:46 -07:00
Liam B. Akkerman
2d38652034
add grafana app php 2018-03-24 21:23:15 -07:00
Ricky Grassmuck
4a2076a550
One more indentation fix
This time I really did fix it I swear!
2018-03-23 18:25:36 -05:00
Ricky Grassmuck
35049b26fe
Fix Indentation
Fixed indentation of newly added lines to match existing lines.
2018-03-23 18:24:40 -05:00
Ricky Grassmuck
39648ba372 Add html needed to allow the site to load as a mobile app 2018-03-23 18:11:04 -05:00
KodeStar
44ce0bbffd
Merge pull request #155 from imcdona/master
Document adding a supported application
2018-03-22 15:01:44 +00:00
halorrr
a634472873
Create Cardigann.php 2018-03-21 11:28:30 -04:00
halorrr
a98c30f7fa
Update Item.php 2018-03-21 11:25:31 -04:00
halorrr
43d4b80e11
Add files via upload 2018-03-21 16:24:47 +01:00
halorrr
09926fcc53
Update readme.md 2018-03-21 11:24:14 -04:00
halorrr
17eef7a4aa
Update pyLoad.php 2018-03-21 11:17:12 -04:00
halorrr
4738d7c951
Create pyLoad.php 2018-03-21 11:07:16 -04:00
halorrr
4be0af5fa3
Update Item.php 2018-03-21 11:06:33 -04:00
halorrr
8aaa0900e5
Add files via upload 2018-03-21 16:05:38 +01:00
halorrr
49b5d9b886
Update readme.md 2018-03-21 11:03:40 -04:00
Isaac McDonald
7a3912767b
Document adding a supported application
If you type the name of a supported application quickly enough in the title field, you'll never see the option to select that application from the list. Long term I think this needs to be addressed. In the short term, an explanation will suffice.
2018-03-21 07:52:47 -07:00
KodeStar
d1e473aafe
Merge pull request #151 from halorrr/patch-3
SupportedApp: Watcher3
2018-03-21 12:59:41 +00:00
KodeStar
c91eb7ed47
Merge branch 'master' into patch-3 2018-03-21 12:59:21 +00:00
KodeStar
443f631bac
Merge pull request #146 from halorrr/patch-1
SupportedApp: AirSonic
2018-03-21 12:57:53 +00:00
KodeStar
95be8d4698
Merge branch 'master' into patch-1 2018-03-21 12:57:39 +00:00
KodeStar
f3926d020f
Merge pull request #154 from imcdona/master
Changed pFsense to the proper pfSense. Changed Ttrss to tt-rss
2018-03-21 12:56:13 +00:00
KodeStar
b48eb5fdd3
Merge pull request #153 from albertsj1/better_transmission_icon
New Transmission icon with transparent background
2018-03-21 12:55:41 +00:00
KodeStar
b0fecdd017
Merge pull request #147 from halorrr/patch-2
SupportedApp: OpenVaultMedia
2018-03-21 12:55:08 +00:00
KodeStar
793483b6e9
Merge pull request #145 from halorrr/master
SupportedApp: WebTools
2018-03-21 12:54:21 +00:00
Isaac McDonald
c99c7fa9af Changed pFsense to the proper pfSense. Changed Ttrss to tt-rss 2018-03-20 14:15:01 -07:00
John Alberts
59449a73e1
New Transmission icon with transparent background 2018-03-20 08:31:12 -07:00
halorrr
dc86d636ac
Create Watcher3.php 2018-03-18 09:20:39 -04:00
halorrr
27dd2dd5f3
Update Item.php 2018-03-18 09:18:27 -04:00
halorrr
494ae1a47f
Add files via upload 2018-03-18 14:17:25 +01:00
halorrr
7d1e1e5ff1
Update readme.md 2018-03-18 09:09:10 -04:00
KodeStar
bcd1567b7d
Merge pull request #133 from albertsj1/couchpotato
Add Couchpotato as an enhanced app
2018-03-17 13:18:03 +00:00
KodeStar
ae391b885b
added missing dataonly attribute so it polls every 20 seconds 2018-03-17 13:17:45 +00:00
KodeStar
226bc84a4c
removed duplicate semi-colon 2018-03-17 13:15:39 +00:00
halorrr
e60a0c8f61
Logo for OpenMediaVault 2018-03-17 07:07:50 +01:00
halorrr
218c90a306
Delete openvaultmedia.png 2018-03-17 02:07:29 -04:00
halorrr
2a60c80194
Create OpenMediaVault.php 2018-03-17 02:06:26 -04:00
halorrr
35b1c55564
Update Item.php 2018-03-17 02:05:32 -04:00
halorrr
20476387ff
Add files via upload 2018-03-17 07:04:23 +01:00
halorrr
a787748a00
Update readme.md 2018-03-17 02:03:43 -04:00
halorrr
34ee540c30
Changed default colour for AirSonic 2018-03-17 02:02:35 -04:00
halorrr
975a5ffc82
Create AirSonic.php 2018-03-17 01:52:17 -04:00
halorrr
dee0870bf6
Airsonic added 2018-03-17 01:48:40 -04:00
halorrr
96ec3bd44e
Airsonic logo added 2018-03-17 06:47:20 +01:00
halorrr
e4cf4096a6
Adding AirSonic to readme 2018-03-17 01:46:12 -04:00
halorrr
3d79694c0a
Create WebTools.php 2018-03-17 01:24:14 -04:00
halorrr
eab3e4e6f7
Update Item.php 2018-03-17 01:19:30 -04:00
halorrr
462152bab2
Update readme.md 2018-03-17 01:17:33 -04:00
halorrr
766a455db0
Add files via upload 2018-03-17 06:16:06 +01:00
John Alberts
30200ac219
Get rid off aggressive polling option and always use inactive status 2018-03-16 15:08:04 -07:00
KodeStar
90a9113971
Merge pull request #140 from halorrr/master
FoundationApp: Krusader closes #144
2018-03-16 22:00:17 +00:00
KodeStar
ad1834568f
Merge pull request #141 from halorrr/patch-1
Adding Tautulli to Enhanced Apps
2018-03-16 21:58:19 +00:00
KodeStar
6231500b4a
Merge pull request #142 from grOGH/master
Add a readme section about using self-signed certificates with enhanced apps
2018-03-15 13:04:38 +00:00
grOGH
b2dbc08ea0
Add a readme section about using self-signed certificates with enhanced
apps
2018-03-15 08:48:56 +01:00
KodeStar
4700f68f4d
Update readme.md 2018-03-13 21:09:59 +00:00
halorrr
fa73738309
Update readme.md 2018-03-13 16:01:44 -04:00
halorrr
25f92ec438
Create tautulli.blade.php 2018-03-13 16:01:14 -04:00
halorrr
6a59c1dfd6
Update Item.php 2018-03-13 15:58:37 -04:00
halorrr
bad6e9d2fe
Create Tautulli.php 2018-03-13 15:57:14 -04:00
halorrr
e544972c1d
Add files via upload 2018-03-13 20:56:12 +01:00
halorrr
f1e5de0d58
Update readme.md 2018-03-13 15:52:44 -04:00
halorrr
e434e1effb
Update readme.md 2018-03-13 15:32:54 -04:00
halorrr
ca04b210e6
Update Item.php 2018-03-13 12:38:29 -04:00
halorrr
51275af41d
Create Krusader.php 2018-03-13 12:35:26 -04:00
halorrr
c2417ac5b3
Add files via upload 2018-03-13 17:32:04 +01:00
John Alberts
72831d413b
update couchpotato icon 2018-03-13 08:14:18 -07:00
John Alberts
5cb4bd5819
Icon name should be lower case. 2018-03-13 06:49:05 -07:00
KodeStar
2d9bbca9a9
Merge pull request #135 from albertsj1/fix_transmission_pic
Fix capitalization of tranmission icon name
2018-03-13 09:36:29 +00:00
KodeStar
7b54c4e969
Merge pull request #134 from albertsj1/update_readme
add some apps to the enhanced app section of the readme that were mis…
2018-03-13 09:35:54 +00:00
Chris
b50f4ec5ce Merge branch 'master' of https://github.com/linuxserver/Heimdall 2018-03-12 09:59:43 +00:00
Chris
86cc7534c2 fix html error in link, but replaced target _blank to a named window to keep the experience 2018-03-12 09:59:37 +00:00
John Alberts
1ab2565244
Fix capitalization of tranmission icon name 2018-03-11 21:23:01 -07:00
John Alberts
d2089a9344
add some apps to the enhanced app section of the readme that were missing. 2018-03-11 21:12:25 -07:00
John Alberts
39153c6936
Add Couchpotato as an enhanced app 2018-03-11 20:48:58 -07:00
KodeStar
1a8e2b92de closes #128 2018-03-11 17:47:05 +00:00
KodeStar
cf63e751bf
Merge pull request #127 from albertsj1/add_transmission
Add Enhanced App Transmission
2018-03-11 17:41:02 +00:00
KodeStar
0c51bc2771 fix multiple tags 2018-03-11 17:40:08 +00:00
John Alberts
5f278cce3e
cleanup a couple symlinks I didn't intend to commit and some errant whitespace 2018-03-09 07:59:01 -08:00
KodeStar
f8cf3ac832
Merge pull request #125 from frenos/foundation_glances
Foundation App for Glances
2018-03-09 08:05:07 +00:00
John Alberts
50bdd02a72
Add Enhanced App Transmission 2018-03-08 16:18:39 -08:00
frenos
424155e5cd Foundation App for Glances
Default color is the backgroundcolor of the official site.
2018-03-07 17:39:45 +01:00
Chris
c4a4d25f7e change js version to break cache 2018-03-06 09:43:54 +00:00
KodeStar
ca2e135cba closes #122, closes #82, 2018-03-05 19:38:23 +00:00
KodeStar
8b4583c59c update version 2018-03-01 19:21:18 +00:00
KodeStar
6a836f9151
Merge pull request #118 from Futos/add-new-foundationApps
Add new foundation apps
2018-03-01 10:16:43 +00:00
Futos
c7b92ad945 fix(SupportedApps): fixed class name 2018-02-28 13:04:45 +01:00
Futos
a05b7a43bd feat(SupportedApps): Added DokuWiki to Foundation Apps
Closes #104
2018-02-28 13:03:17 +01:00
Futos
929346b2f1 feat(SupportedApps): Added SickRage to Foundation Apps
Closes #102
2018-02-28 12:58:00 +01:00
Futos
23ceed01cb feat(SupportedApps): Added Gitea to Foundation Apps
Closes #101
2018-02-28 12:52:11 +01:00
KodeStar
2ccf9a1110
Merge pull request #115 from mrquatsch/runeaudio
Add Runeaudio to list of foundation apps
2018-02-26 12:02:35 +00:00
mrquatsch
4917d8e47b updated runeaudio scss to bump keyframes outside of the title-marquee 2018-02-25 20:44:24 -06:00
mrquatsch
a0963e5d92 add Runeaudio to app/Item list 2018-02-25 20:41:19 -06:00
KodeStar
e2731b532a
Update readme.md 2018-02-25 20:26:33 +00:00
KodeStar
eccd6056bd
Merge pull request #112 from mrquatsch/runeaudio
enhanced runeaudio app - displays artist and song
2018-02-25 16:39:20 +00:00
mrquatsch
c1273a4b01 new rune scss - imported in app.scss 2018-02-25 08:23:45 -06:00
KodeStar
017752b06e
Merge pull request #113 from Ephelyon/master
Add Dutch translation
2018-02-25 11:45:13 +00:00
KodeStar
9abb7a04ac
Merge pull request #114 from mrquatsch/patch-1
Rename plexpy.blade.app to plexpy.blade.php
2018-02-25 11:44:37 +00:00
mrquatsch
9533b9d887
Rename plexpy.blade.app to plexpy.blade.php 2018-02-24 13:58:54 -06:00
Ephelyon
f1a6feeb8f Add Dutch translation 2018-02-24 18:54:31 +00:00
KodeStar
35930f2ffb
Merge pull request #111 from mrquatsch/enhanced_plexpy
Enhanced Plexpy - display stream count via api token
2018-02-23 11:18:56 +00:00
mrquatsch
0a1e8a2f8b enhanced runeaudio app - displays artist and song 2018-02-22 13:41:30 -06:00
mrquatsch
4f9315132b Enhanced Plexpy - display stream count via api token 2018-02-22 13:27:44 -06:00
KodeStar
196a843148
Merge pull request #105 from Attoy/master
Update readme.md
2018-02-20 12:23:21 +00:00
KodeStar
9778875d52
Merge branch 'master' into master 2018-02-20 12:23:10 +00:00
KodeStar
fdeb812333
Merge pull request #106 from kehator/master
Add PL translation
2018-02-20 11:51:35 +00:00
KodeStar
e21e12e737
Update SettingsSeeder.php 2018-02-20 11:51:18 +00:00
nuc
52d2322955 Rough translation based on EN translation 2018-02-20 05:40:50 +00:00
KodeStar
5ea8f7df33 Fix target link 2018-02-19 23:15:09 +00:00
Attoy
7a9c73df3f
Update readme.md 2018-02-19 20:18:46 +01:00
KodeStar
1f38de989b fix routes 2018-02-18 22:36:32 +00:00
KodeStar
c4f119de9c Fix routes in controllers for RP support 2018-02-18 22:15:14 +00:00
KodeStar
fa2afa856a change release number 2018-02-18 19:23:17 +00:00
KodeStar
4c83680ae9 remove apps from tags 2018-02-18 19:21:42 +00:00
KodeStar
981665e3e3
Update readme.md 2018-02-18 19:04:19 +00:00
KodeStar
b3185292b3
Merge pull request #100 from linuxserver/v1.4
fixes to RP
2018-02-18 18:39:35 +00:00
KodeStar
249f437ff5 fixes to RP 2018-02-18 18:38:43 +00:00
KodeStar
a7563ab499
Merge pull request #99 from linuxserver/v1.4
V1.4
2018-02-18 17:51:26 +00:00
KodeStar
38f8143fd2 closes #46, #47, #77, #89 2018-02-18 17:48:52 +00:00
KodeStar
a051c17010 style the tags + close #47 2018-02-18 17:23:05 +00:00
KodeStar
0b62f8a1c8 change icon for tags 2018-02-18 17:04:18 +00:00
KodeStar
b803d4f49d fix mix 2018-02-17 23:18:20 +00:00
KodeStar
78e368f406 Merge branch 'master' into v1.4 2018-02-17 23:17:34 +00:00
KodeStar
90e613ab26
Update readme.md 2018-02-17 23:15:07 +00:00
KodeStar
e15914dc2e
Update readme.md 2018-02-17 23:09:21 +00:00
KodeStar
ebe6c39237 Closes #86 2018-02-17 22:23:30 +00:00
KodeStar
3369de9660 possible fix for RP for forms 2018-02-17 20:37:23 +00:00
KodeStar
98b831bc22 folder support 2018-02-17 00:13:38 +00:00
KodeStar
c0f741d914
Merge pull request #95 from cheesemarathon/master
feat: added Deluge to supported Apps - Closes #70
2018-02-16 17:37:35 +00:00
KodeStar
4c27a0cb5c
Update Item.php 2018-02-16 17:37:09 +00:00
KodeStar
4ff5f139f7
fix indentation 2018-02-16 17:36:36 +00:00
cheesemarathon
59910ecadc Add Graylog 2018-02-16 16:28:48 +00:00
Chris
4e37176436 changes to allow preview of image first 2018-02-16 15:27:48 +00:00
Chris
35085248b6 some changes to test droppable 2018-02-16 15:15:22 +00:00
nuc
3ad8a366a6 Add Polish Translation 2018-02-16 11:22:11 +00:00
KodeStar
b1660c92cc changed opening a link to new tab 2018-02-15 20:52:04 +00:00
KodeStar
6ec1a3d4cb
Merge pull request #90 from Futos/adding-new-foundation-apps
Adding new foundation apps
2018-02-15 20:45:57 +00:00
KodeStar
86ffa86800
Merge branch 'master' into adding-new-foundation-apps 2018-02-15 20:45:08 +00:00
KodeStar
22ad29c92f crap image 2018-02-15 20:42:53 +00:00
KodeStar
ebc1046ba6
Merge pull request #88 from cheesemarathon/master
feat: added Deluge to supported Apps - Closes #63
2018-02-15 20:41:50 +00:00
KodeStar
43e23b15dc update version 2018-02-15 20:33:36 +00:00
KodeStar
c8effe757b fix for nzbget on new apps 2018-02-15 20:33:07 +00:00
Futos
40b5cd3cff feat(SupportedApps): added TT-RSS Application to Foundation Apps
Closes #72
2018-02-15 19:59:53 +01:00
Futos
26435d85e8 feat(SupportedApps): added NZBHydra Application to Foundation Apps
Closes #66
2018-02-15 19:51:38 +01:00
Futos
b6d5e73708 feat(SupportedApps): added Deluge Application to Foundation Apps
Closes #63
2018-02-15 19:32:10 +01:00
Futos
2f193e0c83 feat(SupportedApps): added Medusa Application to Foundation Apps
Closes #64
2018-02-15 19:25:37 +01:00
Futos
4897c80646 feat(.gitignore): added MacOS generated files to ignore 2018-02-15 19:23:57 +01:00
cheesemarathon
601a455e08 Add Deluge 2018-02-15 15:03:41 +00:00
KodeStar
d37f4fd77b
Merge pull request #84 from cheesemarathon/master
feat: added ruTorrent to supported Apps - Closes #35
2018-02-15 14:07:37 +00:00
cheesemarathon
c395cb2206 Replace with better logo 2018-02-15 14:01:18 +00:00
cheesemarathon
b6f8c612f1 Removes icon background 2018-02-15 08:36:19 +00:00
cheesemarathon
18551528ca Removes icon background 2018-02-15 08:27:34 +00:00
cheesemarathon
bbc7782f40 Adds ruTorrent 2018-02-15 08:22:37 +00:00
KodeStar
c121341911
Update readme.md 2018-02-15 08:22:14 +00:00
KodeStar
990a256e40 update version 2018-02-14 21:43:52 +00:00
KodeStar
89e3caf4f2 Closes #78 2018-02-14 20:47:49 +00:00
KodeStar
3e4a458fac Change to Pihole to close #81 2018-02-14 20:39:15 +00:00
KodeStar
25d2897fb9
Merge pull request #79 from Futos/netdata
Netdata
2018-02-14 17:10:47 +00:00
KodeStar
a2151d0b93
Merge pull request #80 from cheesemarathon/master
Fix indentation
2018-02-14 17:07:30 +00:00
KodeStar
5b9dcd829c
Update Lidarr.php 2018-02-14 17:05:36 +00:00
cheesemarathon
e2e1471dfa Add Lidarr
Adds Lidarr as a foundation app
2018-02-14 13:41:10 +00:00
cheesemarathon
a664c9abe9 Fix indentation 2018-02-14 13:20:02 +00:00
Futos
0f9b1cdf25 fix(SupportedApps): fixed Item.php
Fixed Item.php because forgot to save the changes before push

Closes #65
2018-02-14 01:07:44 +01:00
Futos
7cfd6e7493 feat(SupportedApps): added Netdata like requested
#65
2018-02-14 01:04:06 +01:00
KodeStar
592f8f0831 closes #75 and adds initial support for proxmox 2018-02-13 22:46:36 +00:00
KodeStar
88c36d2b2d Fix sabnzbd api url failing if missing trailing slash 2018-02-13 18:48:42 +00:00
KodeStar
dbe5f1dfb2 Fix nzbget api url not working if missing trailing slash 2018-02-13 18:44:34 +00:00
KodeStar
1297ae7bb3 fix some foundation apps issues 2018-02-13 18:29:15 +00:00
KodeStar
ba48a45d39
Merge pull request #73 from cheesemarathon/master
Add apps
2018-02-13 17:58:50 +00:00
KodeStar
12b5de5cea
Added Italian language 2018-02-13 17:39:25 +00:00
KodeStar
a7b33647ea
Merge pull request #71 from Attoy/patch-1
Create resources/lang/it/app.php
2018-02-13 17:35:36 +00:00
KodeStar
3a7467e6f7
Merge pull request #74 from BiohZn/v1.2
V1.2
2018-02-13 17:33:00 +00:00
Conny Sjöblom
8c47ce9b0e Add Swedish translation 2018-02-13 19:01:39 +02:00
Conny Sjöblom
11f623cc35 Merge branch 'master' of https://github.com/linuxserver/Heimdall into v1.2 2018-02-13 18:58:12 +02:00
cheesemarathon
5365f4b867 Adjust colors 2018-02-13 15:22:38 +00:00
cheesemarathon
260a88623e Add apps
Adds jackett, radarr, sonarr and home asssistant as foundation apps
2018-02-13 15:00:59 +00:00
Attoy
2143cab1fa
Create app.php
Italian translation
2018-02-13 09:50:09 +01:00
KodeStar
5be3662b35
Update readme.md 2018-02-12 22:23:14 +00:00
KodeStar
c8ab62f9fe
Merge pull request #68 from aptalca/patch-1
Add reverse proxy info
2018-02-12 20:30:33 +00:00
aptalca
114c16a36f
Add reverse proxy info 2018-02-12 15:22:27 -05:00
KodeStar
8ac33ceb4c
Added Norwegian language 2018-02-12 18:45:26 +00:00
KodeStar
9290c20c43
Merge pull request #50 from Oisann/master
Translated most of the English language files into Norwegian.
2018-02-12 18:40:44 +00:00
Jonas Myhr Refseth
c302c26d87 Translated most of the English language files into Norwegian. The messages in validation.php could be hard to translate. 2018-02-12 19:26:31 +01:00
KodeStar
f04c6c2032
Merge pull request #44 from Futos/readme-changes
feat: added Pihole to Enhanced App
2018-02-12 17:28:42 +00:00
Futos
9d35d567ae feat: added Pihole to Enhanced App 2018-02-12 17:10:47 +01:00
KodeStar
3549ebc5b9
Merge pull request #43 from linuxserver/README_link
edit README for links to all arch's
2018-02-12 15:37:20 +00:00
sparklyballs
68c2dcf67d spacing on links 2018-02-12 15:32:19 +00:00
sparklyballs
cb4ab20249 edit README for links to all arch's 2018-02-12 15:30:33 +00:00
Chris
effafe7b2d update version number 2018-02-12 14:48:25 +00:00
Chris
a2aac1f33c Recreate storage symlink if lost 2018-02-12 14:47:12 +00:00
KodeStar
7c30f0c236
Update readme.md 2018-02-12 13:56:01 +00:00
KodeStar
39c71b6f26
Merge pull request #40 from Futos/jdownloader
feat: added Jdownloader to supported Apps - Closes #26
2018-02-12 13:30:04 +00:00
Futos
bc5c1ebb1e
Merge branch 'master' into jdownloader 2018-02-12 14:28:56 +01:00
KodeStar
800470f7fa
Merge pull request #39 from Futos/openhab
feat: added OpenHAB to supported Apps - Closes #30
2018-02-12 13:27:35 +00:00
KodeStar
a0195e2e08
Merge pull request #37 from Futos/mcmyadmin
feat: added Mcmyadmin as a supported App - Closes #27
2018-02-12 13:27:21 +00:00
Futos
f60aee8072
Merge branch 'master' into mcmyadmin 2018-02-12 14:25:43 +01:00
Futos
92b54d18a9
Merge branch 'master' into openhab 2018-02-12 14:25:04 +01:00
Futos
aeae6a6ebe
Merge branch 'master' into jdownloader 2018-02-12 14:23:37 +01:00
KodeStar
cf674629cb
Update readme.md 2018-02-12 13:04:01 +00:00
KodeStar
650ba498e1
Update readme.md 2018-02-12 12:11:04 +00:00
KodeStar
8cbd6b7001
Update readme.md 2018-02-12 10:02:34 +00:00
KodeStar
096ceb47ea
Merge pull request #38 from Futos/plexrequests
feat: added Plexrequests as a supported App - Closes #29
2018-02-11 23:40:02 +00:00
KodeStar
d0708ea8fb
Merge pull request #36 from Futos/traefik
feat: added Traefik as a supported App, also sorted lines alphabetically closes #28
2018-02-11 23:39:17 +00:00
Futos
d299e1dbb9 feat: added Jdownloader to supported Apps - Closes #26 2018-02-11 14:22:06 +01:00
Futos
ee96a2c625 feat: added OpenHAB to supported Apps - Closes #30 2018-02-11 14:09:54 +01:00
Futos
4c8477c4a9 feat: added Plexrequests as a supported App 2018-02-11 14:00:36 +01:00
Futos
aa97c8fd3a feat: added Mcmyadmin as a supported App - Closes #27 2018-02-11 13:41:17 +01:00
Futos
995eb6b557 feat: added Traefik as a supported App, also sorted lines alphabetically 2018-02-11 13:12:42 +01:00
Conny Sjöblom
9e93ac10f4 Correct the finnish translation 2018-02-07 22:03:09 +02:00
12211 changed files with 851148 additions and 365115 deletions

31
.env
View file

@ -1,31 +0,0 @@
APP_NAME=Heimdall
APP_ENV=local
APP_KEY=base64:I206O8ibx+GQyRE7BeOxDobn04Mfmyyc5Ptzns/C0mY=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=sqlite
DB_DATABASE=app.sqlite
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

View file

@ -1,19 +1,24 @@
APP_NAME=Laravel APP_NAME=Heimdall
APP_ENV=local APP_ENV=local
APP_KEY= APP_KEY=
APP_DEBUG=true APP_DEBUG=false
APP_LOG_LEVEL=debug
APP_URL=http://localhost APP_URL=http://localhost
DB_CONNECTION=mysql LOG_CHANNEL=daily
DB_HOST=127.0.0.1
DB_PORT=3306 DB_CONNECTION=sqlite
DB_DATABASE=homestead DB_DATABASE=app.sqlite
DB_USERNAME=homestead
DB_PASSWORD=secret #DB_CONNECTION=<mysql | pgsql>
#DB_HOST=<hostname | ip>
#DB_PORT=<port number>
#DB_DATABASE=<database>
#DB_USERNAME=<user>
#DB_PASSWORD=<password>
BROADCAST_DRIVER=log BROADCAST_DRIVER=log
CACHE_DRIVER=file CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file SESSION_DRIVER=file
SESSION_LIFETIME=120 SESSION_LIFETIME=120
QUEUE_DRIVER=sync QUEUE_DRIVER=sync
@ -22,14 +27,24 @@ REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null REDIS_PASSWORD=null
REDIS_PORT=6379 REDIS_PORT=6379
MAIL_DRIVER=smtp MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525 MAIL_PORT=2525
MAIL_USERNAME=null MAIL_USERNAME=null
MAIL_PASSWORD=null MAIL_PASSWORD=null
MAIL_ENCRYPTION=null MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID= PUSHER_APP_ID=
PUSHER_APP_KEY= PUSHER_APP_KEY=
PUSHER_APP_SECRET= PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1 PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

3
.eslintignore Normal file
View file

@ -0,0 +1,3 @@
huebee.js
jquery-ui.min.js
bootstrap.js

13
.eslintrc Normal file
View file

@ -0,0 +1,13 @@
{
"extends": ["airbnb-base", "prettier"],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": ["error"]
},
"env": {
"browser": true
},
"globals": {
"$": true
}
}

44
.gitattributes vendored
View file

@ -1,5 +1,49 @@
# Configuration file for Git attributes
# Core Settings {{{
# .gitattributes
.gitattributes !filter !diff
# Line Endings
* text=auto * text=auto
# Set binary to none-text files
*.png -text
# }}}
# GitHub Linguist {{{
# Exclude files/folder from being detected by the GitHub linguist
# statistic.
node_modules/* linguist-vendored
public/* linguist-generated=true
vendor/* linguist-vendored
# Remove Vue as it's currently not used in the project.
resources/assets/js/components/ExampleComponent.vue linguist-vendored
# System Wide
*.css linguist-vendored *.css linguist-vendored
*.scss linguist-vendored *.scss linguist-vendored
*.js linguist-vendored *.js linguist-vendored
# Include user generated files that's removed bu the setting above.
resources/assets/js/app.js linguist-vendored=false
resources/assets/sass/_app.scss linguist-vendored=false
resources/assets/sass/_rune.scss linguist-vendored=false
resources/assets/sass/_variables.scss linguist-vendored=false
# }}}
# Archive Exlude {{{
# Exclude files/folders from being exported when creating an archive.
.gitattributes export-ignore
.gitignore export-ignore
.travis.yml export-ignore
CHANGELOG.md export-ignore CHANGELOG.md export-ignore
# }}}

View file

@ -0,0 +1,16 @@
name: Issue & PR Tracker
on:
issues:
types: [opened,reopened,labeled,unlabeled,closed]
pull_request_target:
types: [opened,reopened,review_requested,review_request_removed,labeled,unlabeled,closed]
pull_request_review:
types: [submitted,edited,dismissed]
jobs:
manage-project:
permissions:
issues: write
uses: linuxserver/github-workflows/.github/workflows/issue-pr-tracker.yml@v1
secrets: inherit

13
.github/workflows/call_issues_cron.yml vendored Normal file
View file

@ -0,0 +1,13 @@
name: Mark stale issues and pull requests
on:
schedule:
- cron: '35 15 * * *'
workflow_dispatch:
jobs:
stale:
permissions:
issues: write
pull-requests: write
uses: linuxserver/github-workflows/.github/workflows/issues-cron.yml@v1
secrets: inherit

59
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,59 @@
name: Tests (PHP)
on: [pull_request]
jobs:
tests:
name: Run tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Setup PHP, with composer and extensions
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with:
php-version: '7.4'
extensions: mbstring, dom, fileinfo, mysql, libxml, xml, xmlwriter, dom, tokenizer, filter, json, phar, pcre, openssl, pdo, intl, curl
- name: Cache composer dependencies
uses: actions/cache@v1
with:
path: vendor
key: composer-${{ hashFiles('composer.lock') }}
- name: Run composer install
run: composer install -n --prefer-dist
env:
APP_ENV: testing
- name: Prepare Laravel Application
run: |
cp .env.example .env
php artisan key:generate
- name: Cache yarn dependencies
uses: actions/cache@v1
with:
path: node_modules
key: yarn-${{ hashFiles('yarn.lock') }}
- name: Run yarn
run: yarn && yarn dev
- name: Run ESLint
run: yarn lint
- name: Run tests
run: php artisan test
env:
APP_ENV: testing
- name: Php code sniffer
run: ./vendor/bin/phpcs
- name: Upload artifacts
uses: actions/upload-artifact@master
if: failure()
with:
name: Logs
path: ./storage/logs

21
.gitignore vendored
View file

@ -1,7 +1,9 @@
/app/SupportedApps
/node_modules /node_modules
/public/hot /public/hot
/public/storage /public/storage
/storage/*.key /storage/*.key
/storage/debugbar
/.idea /.idea
/.vagrant /.vagrant
Homestead.json Homestead.json
@ -9,4 +11,21 @@ Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
storage/app/public/.DS_Store ### macOS ###
*.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
storage/app/public/avatars/*
.env
.phpunit.result.cache

2080
.phpstorm.meta.php Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,20 @@
# Release Notes # Release Notes
## v1.4.0 (2018-02-18)
### Added
- Tag(folder) support
- Image preview for uploading icons
- A load of supported apps, full list of apps https://github.com/linuxserver/Heimdall/projects/1
### Changed
- Edited vendor/laravelcollective/html/src/FormBuilder.php to allow relative links #3369de9
- Changed links to use relative links for reverse proxy support
- Links open in new tab
### Fixed
- adds all the fixes in the 1.3.x point releases and on master
## v1.3.0 (2018-02-09) ## v1.3.0 (2018-02-09)
### Added ### Added

14
SECURITY.md Normal file
View file

@ -0,0 +1,14 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 2.3.x | :white_check_mark: |
| < 2.3 | :x: |
## Reporting a Vulnerability
You can report any vulnerabilities on our discord server by DM-ing a team member, or asking a team member to DM you.
https://discord.com/invite/YWrKVTn

20867
_ide_helper.php Normal file

File diff suppressed because it is too large Load diff

219
app/Application.php Normal file
View file

@ -0,0 +1,219 @@
<?php
namespace App;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
/**
* App\Application
*
* @property string $appid
* @property string $name
* @property string|null $sha
* @property string|null $icon
* @property string|null $website
* @property string|null $license
* @property string|null $description
* @property int $enhanced
* @property string $tile_background
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property string|null $class
* @method static Builder|Application newModelQuery()
* @method static Builder|Application newQuery()
* @method static Builder|Application query()
* @method static Builder|Application whereAppid($value)
* @method static Builder|Application whereClass($value)
* @method static Builder|Application whereCreatedAt($value)
* @method static Builder|Application whereDescription($value)
* @method static Builder|Application whereEnhanced($value)
* @method static Builder|Application whereIcon($value)
* @method static Builder|Application whereLicense($value)
* @method static Builder|Application whereName($value)
* @method static Builder|Application whereSha($value)
* @method static Builder|Application whereTileBackground($value)
* @method static Builder|Application whereUpdatedAt($value)
* @method static Builder|Application whereWebsite($value)
*/
class Application extends Model
{
/**
* @var bool
*/
public $incrementing = false;
/**
* @var string
*/
protected $primaryKey = 'appid';
/**
* @return mixed
*/
public function icon()
{
if (! file_exists(storage_path('app/public/'.$this->icon))) {
$img_src = app_path('SupportedApps/'.$this->name.'/'.str_replace('icons/', '', $this->icon));
$img_dest = storage_path('app/public/'.$this->icon);
//die("i: ".$img_src);
@copy($img_src, $img_dest);
}
return $this->icon;
}
/**
* @return string
*/
public function iconView(): string
{
return asset('storage/'.$this->icon);
}
/**
* @return string
*/
public function defaultColour(): string
{
// check if light or dark
if ($this->tile_background == 'light') {
return '#fafbfc';
}
return '#161b1f';
}
/**
* @return string
*/
public function class(): string
{
$name = $this->name;
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
return '\App\SupportedApps\\'.$name.'\\'.$name;
}
/**
* @param $name
* @return string
*/
public static function classFromName($name): string
{
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
return $class;
}
/**
* @return Collection
*/
public static function apps(): Collection
{
$json = json_decode(file_get_contents(storage_path('app/supportedapps.json'))) ?? [];
$apps = collect($json->apps);
return $apps->sortBy('name', SORT_NATURAL | SORT_FLAG_CASE);
}
/**
* @return array
*/
public static function autocomplete(): array
{
$apps = self::apps();
$list = [];
foreach ($apps as $app) {
$list[] = (object) [
'label' => $app->name,
'value' => $app->appid,
];
}
return $list;
}
/**
* @param $appid
* @return mixed|null
* @throws GuzzleException
*/
public static function getApp($appid)
{
Log::debug("Get app triggered for: $appid");
$localapp = self::where('appid', $appid)->first();
$app = self::single($appid);
$application = ($localapp) ? $localapp : new self;
// Files missing? || app not in db || old sha version
if (! file_exists(app_path('SupportedApps/'.className($app->name))) ||
! $localapp ||
$localapp->sha !== $app->sha
) {
$gotFiles = SupportedApps::getFiles($app);
if ($gotFiles) {
$app = SupportedApps::saveApp($app, $application);
}
}
return $app;
}
/**
* @param $appid
* @return mixed|null
*/
public static function single($appid)
{
$apps = self::apps();
$app = $apps->where('appid', $appid)->first();
if ($app === null) {
// Try in db for Private App
$appModel = self::where('appid', $appid)->first();
if ($appModel) {
$app = json_decode($appModel->toJson());
}
}
if ($app === null) {
return null;
}
$classname = preg_replace('/[^\p{L}\p{N}]/u', '', $app->name);
$app->class = '\App\SupportedApps\\'.$classname.'\\'.$classname;
return $app;
}
/**
* @return array
*/
public static function applist(): array
{
$list = [];
$list['null'] = 'None';
$apps = self::apps();
foreach ($apps as $app) {
$list[$app->appid] = $app->name;
}
// Check for private apps in the db
$appsListFromDB = self::all(['appid', 'name']);
foreach ($appsListFromDB as $app) {
// Already existing keys are overwritten,
// only private apps should be added at the end
$list[$app->appid] = $app->name;
}
return $list;
}
}

View file

@ -0,0 +1,107 @@
<?php
namespace App\Console\Commands;
use App\Application;
use App\SupportedApps;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
class RegisterApp extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'register:app {folder} {--remove}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Add a local app to the registry';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
$folder = $this->argument('folder');
if ($folder == 'all') {
$apps = scandir(app_path('SupportedApps'));
foreach ($apps as $folder) {
if ($folder == '.' || $folder == '..') {
continue;
}
$this->addApp($folder);
}
} else {
$this->addApp($folder, $this->option('remove'));
}
}
/**
* @param $folder
* @param bool $remove
* @return void
*/
public function addApp($folder, bool $remove = false)
{
$json = app_path('SupportedApps/'.$folder.'/app.json');
if (!file_exists($json)) {
$this->error('Could not find ' . $json);
return;
}
$app = json_decode(file_get_contents($json));
if (!isset($app->appid)) {
$this->error('No App ID for - ' . $folder);
return;
}
$exists = Application::find($app->appid);
if ($exists) {
if ($remove) {
$exists->delete();
$this->info('Application Removed - ' . $app->name . ' - ' . $app->appid);
return;
}
$this->error('Application already registered - ' . $exists->name . ' - ' . $exists->appid);
return;
}
// Doesn't exist so add it
SupportedApps::saveApp($app, new Application);
$this->saveIcon($folder, $app->icon);
$this->info('Application Added - ' . $app->name . ' - ' . $app->appid);
}
/**
* @param $appFolder
* @param $icon
* @return void
*/
private function saveIcon($appFolder, $icon)
{
$iconPath = app_path('SupportedApps/' . $appFolder . '/' . $icon);
$contents = file_get_contents($iconPath);
Storage::disk('public')->put('icons/'.$icon, $contents);
}
}

View file

@ -19,7 +19,7 @@ class Kernel extends ConsoleKernel
/** /**
* Define the application's command schedule. * Define the application's command schedule.
* *
* @param \Illuminate\Console\Scheduling\Schedule $schedule * @param Schedule $schedule
* @return void * @return void
*/ */
protected function schedule(Schedule $schedule) protected function schedule(Schedule $schedule)

12
app/EnhancedApps.php Normal file
View file

@ -0,0 +1,12 @@
<?php
namespace App;
interface EnhancedApps
{
public function test();
public function livestats();
public function url($endpoint);
}

View file

@ -2,8 +2,8 @@
namespace App\Exceptions; namespace App\Exceptions;
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler class Handler extends ExceptionHandler
{ {
@ -22,32 +22,20 @@ class Handler extends ExceptionHandler
* @var array * @var array
*/ */
protected $dontFlash = [ protected $dontFlash = [
'current_password',
'password', 'password',
'password_confirmation', 'password_confirmation',
]; ];
/** /**
* Report or log an exception. * Register the exception handling callbacks for the application.
* *
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void * @return void
*/ */
public function report(Exception $exception) public function register()
{ {
parent::report($exception); $this->reportable(function (Throwable $e) {
} //
});
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
} }
} }

View file

@ -1,12 +1,138 @@
<?php <?php
function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afterunit = '') use Illuminate\Support\Str;
/**
* @param $bytes
* @param bool $is_drive_size
* @param string $beforeunit
* @param string $afterunit
* @return string
*/
function format_bytes($bytes, bool $is_drive_size = true, string $beforeunit = '', string $afterunit = ''): string
{ {
$btype = ($is_drive_size === true) ? 1000 : 1024; $btype = ($is_drive_size === true) ? 1000 : 1024;
$labels = array('B','KB','MB','GB','TB'); $labels = ['B', 'KB', 'MB', 'GB', 'TB'];
for($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++); // use 1000 rather than 1024 to simulate HD size not real size // use 1000 rather than 1024 to simulate HD size not real size
if($labels[$x] == "TB") return(round($bytes, 3).$beforeunit.$labels[$x].$afterunit); for ($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++) ;
elseif($labels[$x] == "GB") return(round($bytes, 2).$beforeunit.$labels[$x].$afterunit); if ($labels[$x] == 'TB') {
elseif($labels[$x] == "MB") return(round($bytes, 2).$beforeunit.$labels[$x].$afterunit); return round($bytes, 3) . $beforeunit . $labels[$x] . $afterunit;
else return(round($bytes, 0).$beforeunit.$labels[$x].$afterunit); } elseif ($labels[$x] == 'GB') {
return round($bytes, 2) . $beforeunit . $labels[$x] . $afterunit;
} elseif ($labels[$x] == 'MB') {
return round($bytes, 2) . $beforeunit . $labels[$x] . $afterunit;
} else {
return round($bytes, 0) . $beforeunit . $labels[$x] . $afterunit;
}
}
/**
* @param $title
* @param string $separator
* @param string $language
* @return string
*/
function str_slug($title, string $separator = '-', string $language = 'en'): string
{
return Str::slug($title, $separator, $language);
}
if (!function_exists('str_is')) {
/**
* Determine if a given string matches a given pattern.
*
* @param string|array $pattern
* @param string $value
* @return bool
*
* @deprecated Str::is() should be used directly instead. Will be removed in Laravel 6.0.
*/
function str_is($pattern, string $value): bool
{
return Str::is($pattern, $value);
}
}
/**
* @param $hex
* @return float|int
*/
function get_brightness($hex)
{
// returns brightness value from 0 to 255
// strip off any leading #
// $hex = str_replace('#', '', $hex);
$hex = preg_replace("/[^0-9A-Fa-f]/", '', $hex);
if (strlen($hex) == 3) {
$hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
}
$c_r = hexdec(substr($hex, 0, 2));
$c_g = hexdec(substr($hex, 2, 2));
$c_b = hexdec(substr($hex, 4, 2));
return (($c_r * 299) + ($c_g * 587) + ($c_b * 114)) / 1000;
}
/**
* @param $hex
* @return string
*/
function title_color($hex): string
{
if (get_brightness($hex) > 130) {
return ' black';
} else {
return ' white';
}
}
/**
* @return string
*/
function getLinkTargetAttribute(): string
{
$target = \App\Setting::fetch('window_target');
if ($target === 'current') {
return '';
} else {
return ' target="' . $target . '"';
}
}
/**
* @param $name
* @return array|string|string[]|null
*/
function className($name)
{
return preg_replace('/[^\p{L}\p{N}]/u', '', $name);
}
/**
* @param string $file
* @param string $extension
* @return bool
*/
function isImage(string $file, string $extension): bool
{
$allowedExtensions = ['jpg', 'jpeg', 'png', 'bmp', 'gif', 'svg', 'webp'];
if (!in_array($extension, $allowedExtensions)) {
return false;
}
$tempFileName = @tempnam("/tmp", "image-check-");
$handle = fopen($tempFileName, "w");
fwrite($handle, $file);
fclose($handle);
if ($extension == 'svg') {
return 'image/svg+xml' === mime_content_type($tempFileName);
}
$size = @getimagesize($tempFileName);
return is_array($size) && str_starts_with($size['mime'], 'image');
} }

View file

@ -3,7 +3,18 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\URL;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpFoundation\Response;
class LoginController extends Controller class LoginController extends Controller
{ {
@ -25,7 +36,7 @@ class LoginController extends Controller
* *
* @var string * @var string
*/ */
protected $redirectTo = '/home'; protected string $redirectTo = '/';
/** /**
* Create a new controller instance. * Create a new controller instance.
@ -34,6 +45,116 @@ class LoginController extends Controller
*/ */
public function __construct() public function __construct()
{ {
$this->middleware('guest')->except('logout'); Session::put('backUrl', URL::previous());
$this->middleware('guest')->except(['logout','autologin']);
}
/**
* @return string
*/
public function username(): string
{
return 'username';
}
/**
* Handle a login request to the application.
*
* @param Request $request
* @return Response
*
* @throws ValidationException
*/
public function login(Request $request): Response
{
$current_user = User::currentUser();
$request->merge(['username' => $current_user->username, 'remember' => true]);
//die(print_r($request->all()));
$this->validateLogin($request);
// If the class is using the ThrottlesLogins trait, we can automatically throttle
// the login attempts for this application. We'll key this by the username and
// the IP address of the client making these requests into this application.
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
// If the login attempt was unsuccessful we will increment the number of attempts
// to login and redirect the user back to the login form. Of course, when this
// user surpasses their maximum number of attempts they will get locked out.
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}
public function index()
{
}
/**
* @param User $user
* @return RedirectResponse
*/
public function setUser(User $user): RedirectResponse
{
Auth::logout();
session(['current_user' => $user]);
return redirect()->route('dash');
}
/**
* @param $uuid
* @return RedirectResponse
*/
public function autologin($uuid): RedirectResponse
{
Auth::logout();
$user = User::where('autologin', $uuid)->first();
if (!$user) {
return redirect()->route('dash');
}
Auth::login($user, true);
session(['current_user' => $user]);
return redirect()->route('dash');
}
/**
* Show the application's login form.
*
* @return Application|Factory|View
*/
public function showLoginForm()
{
return view('auth.login');
}
/**
* @param Request $request
* @param $user
* @return RedirectResponse
*/
protected function authenticated(Request $request, $user): RedirectResponse
{
return back();
}
/**
* @return mixed|string
*/
public function redirectTo()
{
return Session::get('url.intended') ? Session::get('url.intended') : $this->redirectTo;
} }
} }

View file

@ -2,10 +2,10 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator; use App\User;
use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller class RegisterController extends Controller
{ {
@ -27,7 +27,7 @@ class RegisterController extends Controller
* *
* @var string * @var string
*/ */
protected $redirectTo = '/home'; protected string $redirectTo = '/';
/** /**
* Create a new controller instance. * Create a new controller instance.
@ -45,7 +45,7 @@ class RegisterController extends Controller
* @param array $data * @param array $data
* @return \Illuminate\Contracts\Validation\Validator * @return \Illuminate\Contracts\Validation\Validator
*/ */
protected function validator(array $data) protected function validator(array $data): \Illuminate\Contracts\Validation\Validator
{ {
return Validator::make($data, [ return Validator::make($data, [
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
@ -58,7 +58,7 @@ class RegisterController extends Controller
* Create a new user instance after a valid registration. * Create a new user instance after a valid registration.
* *
* @param array $data * @param array $data
* @return \App\User * @return User
*/ */
protected function create(array $data) protected function create(array $data)
{ {

View file

@ -25,7 +25,7 @@ class ResetPasswordController extends Controller
* *
* @var string * @var string
*/ */
protected $redirectTo = '/home'; protected string $redirectTo = '/';
/** /**
* Create a new controller instance. * Create a new controller instance.

View file

@ -2,12 +2,29 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs; use App\User;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController class Controller extends BaseController
{ {
use AuthorizesRequests, DispatchesJobs, ValidatesRequests; use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
protected $user;
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = $this->user();
//print_r($this->user);
return $next($request);
});
}
public function user()
{
return User::currentUser();
}
} }

View file

@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers;
use App\Item;
use App\User;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\RateLimiter;
class HealthController extends Controller
{
/**
* @return int
*/
private static function getUsers(): int
{
return User::count();
}
/**
* @return int
*/
private static function getItems(): int
{
return Item::select('id')
->where('deleted_at', null)
->where('type', '0')
->count();
}
/**
* Handle the incoming request.
*
* @param Request $request
* @return JsonResponse|Response
* @throws BindingResolutionException
*/
public function __invoke(Request $request)
{
$REQUESTS_MAX_PER_MIN = 30;
$STATUS_TOO_MANY_REQUESTS = 429;
if (RateLimiter::remaining('health', $REQUESTS_MAX_PER_MIN) < 1) {
return response()->make('Too many attempts.', $STATUS_TOO_MANY_REQUESTS);
}
RateLimiter::hit('health');
return response()->json([
'status' => 'ok',
'items' => self::getItems(),
'users' => self::getUsers(),
]);
}
}

View file

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return RedirectResponse
*/
public function index(): RedirectResponse
{
return redirect()->route('dash');
}
}

View file

@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ImportController extends Controller
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
$this->middleware('allowed');
}
/**
* Handle the incoming request.
*
* @param Request $request
* @return View
*/
public function __invoke(Request $request): View
{
return view('items.import');
}
}

View file

@ -2,317 +2,521 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Http\Request; use App\Application;
use App\Item; use App\Item;
use App\Setting; use App\Jobs\ProcessApps;
use App\SupportedApps\Nzbget; use App\User;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\ServerException;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Validation\ValidationException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
class ItemController extends Controller class ItemController extends Controller
{ {
public function __construct()
{
parent::__construct();
$this->middleware('allowed');
}
/** /**
* Display a listing of the resource on the dashboard. * Display a listing of the resource on the dashboard.
* *
* @return \Illuminate\Http\Response * @return View
*/ */
public function dash() public function dash(): View
{ {
$data['apps'] = Item::pinned()->orderBy('order', 'asc')->get(); $data['apps'] = Item::whereHas('parents', function ($query) {
$data['all_apps'] = Item::all(); $query->where('id', 0);
})->orWhere('type', 1)->pinned()->orderBy('order', 'asc')->get();
$data['all_apps'] = Item::whereHas('parents', function ($query) {
$query->where('id', 0);
})->orWhere('type', 1)->orderBy('order', 'asc')->get();
//$data['all_apps'] = Item::doesntHave('parents')->get();
//die(print_r($data['apps']));
return view('welcome', $data); return view('welcome', $data);
} }
/** /**
* Set order on the dashboard. * Set order on the dashboard.
* *
* @return \Illuminate\Http\Response * @return void
*/ */
public function setOrder(Request $request) public function setOrder(Request $request)
{ {
$order = array_filter($request->input('order')); $order = array_filter($request->input('order'));
foreach($order as $o => $id) { foreach ($order as $o => $id) {
$item = Item::find($id); $item = Item::find($id);
$item->order = $o; $item->order = $o;
$item->save(); $item->save();
} }
} }
/** /**
* Pin item on the dashboard. * Pin item on the dashboard.
* *
* @return \Illuminate\Http\Response * @param $id
* @return RedirectResponse
*/ */
public function pin($id) public function pin($id): RedirectResponse
{ {
$item = Item::findOrFail($id); $item = Item::findOrFail($id);
$item->pinned = true; $item->pinned = true;
$item->save(); $item->save();
return redirect()->route('dash'); $route = route('dash', []);
return redirect($route);
} }
/** /**
* Unpin item on the dashboard. * Unpin item on the dashboard.
* *
* @return \Illuminate\Http\Response * @param $id
* @return RedirectResponse
*/ */
public function unpin($id) public function unpin($id): RedirectResponse
{ {
$item = Item::findOrFail($id); $item = Item::findOrFail($id);
$item->pinned = false; $item->pinned = false;
$item->save(); $item->save();
return redirect()->route('dash'); $route = route('dash', []);
return redirect($route);
} }
/** /**
* Unpin item on the dashboard. * Unpin item on the dashboard.
* *
* @return \Illuminate\Http\Response * @return RedirectResponse|View
*/ */
public function pinToggle($id, $ajax=false) public function pinToggle($id, $ajax = false, $tag = false)
{ {
$item = Item::findOrFail($id); $item = Item::findOrFail($id);
$new = ((bool)$item->pinned === true) ? false : true; $new = !(((bool)$item->pinned === true));
$item->pinned = $new; $item->pinned = $new;
$item->save(); $item->save();
if($ajax) {
$data['apps'] = Item::pinned()->get(); if ($ajax) {
$item = Item::whereId($tag)->first();
$data['apps'] = new Collection;
if ((int)$tag === 0) {
$tags = Item::where('type', 1)->pinned()->orderBy('order', 'asc')->get();
$data['apps'] = $data['apps']->merge($tags);
}
$apps = $item->children()->pinned()->orderBy('order', 'asc')->get();
$data['apps'] = $data['apps']->merge($apps);
$data['ajax'] = true; $data['ajax'] = true;
return view('sortable', $data); return view('sortable', $data);
} else { } else {
return redirect()->route('dash'); $route = route('dash', []);
return redirect($route);
} }
} }
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return \Illuminate\Http\Response * @param Request $request
* @return View
*/ */
public function index(Request $request) public function index(Request $request): View
{ {
$trash = (bool)$request->input('trash'); $trash = (bool)$request->input('trash');
$data['apps'] = Item::orderBy('title', 'asc')->get(); $data['apps'] = Item::ofType('item')->orderBy('title', 'asc')->get();
$data['trash'] = Item::onlyTrashed()->get(); $data['trash'] = Item::ofType('item')->onlyTrashed()->get();
if($trash) { if ($trash) {
return view('items.trash', $data); return view('items.trash', $data);
} else { } else {
return view('items.list', $data); return view('items.list', $data);
} }
} }
/** /**
* Show the form for creating a new resource. * Show the form for creating a new resource.
* *
* @return \Illuminate\Http\Response * @return View
*/ */
public function create() public function create(): View
{ {
// //
$data = []; $data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
return view('items.create', $data); $data['tags']->prepend(__('app.dashboard'), 0);
$data['current_tags'] = '0';
return view('items.create', $data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return View
*/
public function edit(int $id): View
{
// Get the item
$item = Item::find($id);
if ($item->appid === null && $item->class !== null) { // old apps wont have an app id so set it
$app = Application::where('class', $item->class)->first();
if ($app) {
$item->appid = $app->appid;
}
}
$data['item'] = $item;
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['tags']->prepend(__('app.dashboard'), 0);
$data['current_tags'] = $data['item']->tags();
//$data['current_tags'] = $data['item']->parent;
//die(print_r($data['current_tags']));
// show the edit form and pass the nerd
return view('items.edit', $data);
}
/**
* @param Request $request
* @param null $id
* @return Item
* @throws ValidationException
*/
public static function storelogic(Request $request, $id = null): Item
{
$application = Application::single($request->input('appid'));
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
'file' => 'image'
]);
if ($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path,
]);
} elseif (strpos($request->input('icon'), 'http') === 0) {
$options = array(
"ssl" => array(
"verify_peer" => false,
"verify_peer_name" => false,
),
);
$file = $request->input('icon');
$path_parts = pathinfo($file);
$extension = $path_parts['extension'];
$contents = file_get_contents($request->input('icon'), false, stream_context_create($options));
if (!isImage($contents, $extension)) {
throw ValidationException::withMessages(['file' => 'Icon must be an image.']);
}
$path = 'icons/' . ($application ? $application->icon : md5($contents) . '.' . $extension);
// Private apps could have here duplicated icons folder
if (strpos($path, 'icons/icons/') !== false) {
$path = str_replace('icons/icons/', 'icons/', $path);
}
if (!Storage::disk('public')->exists($path)) {
Storage::disk('public')->put($path, $contents);
}
$request->merge([
'icon' => $path,
]);
}
$config = Item::checkConfig($request->input('config'));
// Don't overwrite the stored password if it wasn't submitted when updating the item
if ($id !== null && strpos($config, '"password":null') !== false) {
$storedItem = Item::find($id);
$storedConfigObject = json_decode($storedItem->getAttribute('description'));
$configObject = json_decode($config);
$configObject->password = $storedConfigObject->password;
$config = json_encode($configObject);
}
$current_user = User::currentUser();
$request->merge([
'description' => $config,
'user_id' => $current_user->getId(),
]);
if ($request->input('appid') === 'null') {
$request->merge([
'class' => null,
]);
} else {
$request->merge([
'class' => Application::classFromName($application->name),
]);
}
if ($id === null) {
$item = Item::create($request->all());
} else {
$item = Item::find($id);
$item->update($request->all());
}
$item->parents()->sync($request->tags);
return $item;
} }
/** /**
* Store a newly created resource in storage. * Store a newly created resource in storage.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
* @return \Illuminate\Http\Response * @return RedirectResponse
*/ */
public function store(Request $request) public function store(Request $request): RedirectResponse
{ {
// self::storelogic($request);
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
]);
if($request->hasFile('file')) { $route = route('dash', []);
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$config = Item::checkConfig($request->input('config')); return redirect($route)
$request->merge([
'description' => $config
]);
//die(print_r($request->input('config')));
Item::create($request->all());
return redirect()->route('dash')
->with('success', __('app.alert.success.item_created')); ->with('success', __('app.alert.success.item_created'));
} }
/** /**
* Display the specified resource. * Display the specified resource.
* *
* @param int $id * @param int $id
* @return \Illuminate\Http\Response * @return void
*/ */
public function show($id) public function show(int $id): void
{ {
// //
} }
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
// Get the item
$item = Item::find($id);
// show the edit form and pass the nerd
return view('items.edit')
->with('item', $item);
}
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
* @param int $id * @param int $id
* @return \Illuminate\Http\Response * @return RedirectResponse
*/ */
public function update(Request $request, $id) public function update(Request $request, int $id): RedirectResponse
{ {
$validatedData = $request->validate([ self::storelogic($request, $id);
'title' => 'required|max:255', $route = route('dash', []);
'url' => 'required',
]);
//die(print_r($request->all()));
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$config = Item::checkConfig($request->input('config'));
$request->merge([
'description' => $config
]);
Item::find($id)->update($request->all()); return redirect($route)
->with('success', __('app.alert.success.item_updated'));
return redirect()->route('dash')
->with('success',__('app.alert.success.item_updated'));
} }
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
* *
* @param int $id * @param Request $request
* @return \Illuminate\Http\Response * @param int $id
* @return RedirectResponse
*/ */
public function destroy(Request $request, $id) public function destroy(Request $request, int $id): RedirectResponse
{ {
// //
$force = (bool)$request->input('force'); $force = (bool)$request->input('force');
if($force) { if ($force) {
Item::withTrashed() Item::withTrashed()
->where('id', $id) ->where('id', $id)
->forceDelete(); ->forceDelete();
} else { } else {
Item::find($id)->delete(); Item::find($id)->delete();
} }
return redirect()->route('items.index') $route = route('items.index', []);
->with('success',__('app.alert.success.item_deleted'));
return redirect($route)
->with('success', __('app.alert.success.item_deleted'));
} }
/** /**
* Restore the specified resource from soft deletion. * Restore the specified resource from soft deletion.
* *
* @param int $id * @param int $id
* @return \Illuminate\Http\Response * @return RedirectResponse
*/ */
public function restore($id) public function restore(int $id): RedirectResponse
{ {
// //
Item::withTrashed() Item::withTrashed()
->where('id', $id) ->where('id', $id)
->restore(); ->restore();
return redirect()->route('items.index')
->with('success',__('app.alert.success.item_restored'));
}
public function isSupportedAppByKey($app) $route = route('items.index', []);
{
$output = false; return redirect($route)
$all_supported = Item::supportedList(); ->with('success', __('app.alert.success.item_restored'));
if(array_key_exists($app, $all_supported)) {
$output = new $all_supported[$app];
}
return $output;
} }
/** /**
* Return details for supported apps * Return details for supported apps
* *
* @return Json * @param Request $request
* @return string|null
* @throws GuzzleException
*/ */
public function appload(Request $request) public function appload(Request $request): ?string
{ {
$output = []; $output = [];
$app = $request->input('app'); $appid = $request->input('app');
if(($app_details = $this->isSupportedAppByKey($app)) !== false) { if ($appid === 'null') {
// basic details return null;
$output['icon'] = $app_details->icon();
$output['colour'] = $app_details->defaultColour();
// live details
if($app_details instanceof \App\SupportedApps\Contracts\Livestats) {
$output['config'] = $app_details->configDetails();
} else {
$output['config'] = null;
}
} }
$output['config'] = null;
$output['custom'] = null;
$app = Application::single($appid);
$output = (array)$app;
$appdetails = Application::getApp($appid);
if ((bool)$app->enhanced === true) {
// if(!isset($app->config)) { // class based config
$output['custom'] = className($appdetails->name) . '.config';
// }
}
$output['colour'] = ($app->tile_background == 'light') ? '#fafbfc' : '#161b1f';
if (strpos($app->icon, '://') !== false) {
$output['iconview'] = $app->icon;
} elseif (strpos($app->icon, 'icons/') !== false) {
// Private apps have the icon locally
$output['iconview'] = URL::to('/') . '/storage/' . $app->icon;
$output['icon'] = str_replace('icons/', '', $output['icon']);
} else {
$output['iconview'] = config('app.appsource') . 'icons/' . $app->icon;
}
return json_encode($output); return json_encode($output);
} }
/**
* @param Request $request
* @return void
*/
public function testConfig(Request $request) public function testConfig(Request $request)
{ {
$data = $request->input('data'); $data = $request->input('data');
//$url = $data[array_search('url', array_column($data, 'name'))]['value']; //$url = $data[array_search('url', array_column($data, 'name'))]['value'];
$single = Application::single($data['type']);
$app = $data['type']; $app = $single->class;
// If password is not resubmitted fill it from the database when in edit mode
if (array_key_exists('password', $data) &&
$data['password'] === null &&
array_key_exists('id', $data)
) {
$item = Item::find($data['id']);
if ($item) {
$itemConfig = $item->getConfig();
$data['password'] = $itemConfig->password;
}
}
$app_details = new $app(); $app_details = new $app();
$app_details->config = (object)$data; $app_details->config = (object)$data;
$app_details->testConfig(); $app_details->test();
} }
/**
* @param $url
* @param array $attrs
* @param array|bool $overridevars
* @return ResponseInterface|null
* @throws GuzzleException
*/
public function execute($url, array $attrs = [], $overridevars = false): ?ResponseInterface
{
$vars = ($overridevars !== false) ?
$overridevars : [
'http_errors' => false,
'timeout' => 15,
'connect_timeout' => 15,
'verify' => false,
];
$client = new Client($vars);
$method = 'GET';
try {
return $client->request($method, $url, $attrs);
} catch (ConnectException $e) {
Log::error('Connection refused');
Log::debug($e->getMessage());
} catch (ServerException $e) {
Log::debug($e->getMessage());
}
return null;
}
/**
* @param $url
* @return StreamInterface
* @throws GuzzleException
*/
public function websitelookup($url): StreamInterface
{
$url = base64_decode($url);
$data = $this->execute($url);
return $data->getBody();
}
/**
* @param $id
* @return void
*/
public function getStats($id) public function getStats($id)
{ {
$item = Item::find($id); $item = Item::find($id);
$config = json_decode($item->description); $config = $item->getconfig();
if(isset($config->type)) { if (isset($item->class)) {
$config->url = $item->url; $application = new $item->class;
if(isset($config->override_url) && !empty($config->override_url)) { $application->config = $config;
$config->url = $config->override_url; echo $application->livestats();
}
$app_details = new $config->type;
$app_details->config = $config;
echo $app_details->executeConfig();
} }
} }
/**
* @return \Illuminate\Contracts\Foundation\Application|RedirectResponse|Redirector
*/
public function checkAppList()
{
ProcessApps::dispatch();
$route = route('items.index');
return redirect($route)
->with('success', __('app.alert.success.updating'));
}
} }

View file

@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers;
use App\Item;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Collection;
class ItemRestController extends Controller
{
public function __construct()
{
parent::__construct();
$this->middleware('allowed');
}
/**
* Display a listing of the resource.
*
* @return Collection
*/
public function index()
{
$columns = [
'title',
'colour',
'url',
'description',
'appid',
'appdescription',
];
return Item::select($columns)
->where('deleted_at', null)
->where('type', '0')
->orderBy('order', 'asc')
->get();
}
/**
* Show the form for creating a new resource.
*
* @return void
*/
public function create()
{
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return object
*/
public function store(Request $request): object
{
$item = ItemController::storelogic($request);
if ($item) {
return (object) ['status' => 'OK'];
}
return (object) ['status' => 'FAILED'];
}
/**
* Display the specified resource.
*
* @param Item $item
* @return Response
*/
public function show(Item $item)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param Item $item
* @return Response
*/
public function edit(Item $item)
{
//
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param Item $item
* @return Response
*/
public function update(Request $request, Item $item)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param Item $item
* @return Response
*/
public function destroy(Item $item)
{
//
}
}

View file

@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers;
use App\Search;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
class SearchController extends Controller
{
/**
* @param Request $request
* @return Application|RedirectResponse|Redirector|mixed|void
*/
public function index(Request $request)
{
$requestprovider = $request->input('provider');
$query = $request->input('q');
$provider = Search::providerDetails($requestprovider);
if ($provider->type == 'standard') {
return redirect($provider->url.'?'.$provider->query.'='.urlencode($query));
} elseif ($provider->type == 'external') {
$class = new $provider->class;
//print_r($provider);
return $class->getResults($query, $provider);
}
//print_r($provider);
}
}

View file

@ -2,17 +2,25 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Setting; use App\Setting;
use App\SettingGroup; use App\SettingGroup;
use App\Http\Controllers\Controller; use Exception;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class SettingsController extends Controller class SettingsController extends Controller
{ {
public function __construct()
{
parent::__construct();
$this->middleware('allowed');
}
/** /**
* @return \Illuminate\View\View * @return View
*/ */
public function index() public function index(): View
{ {
$settings = SettingGroup::with([ $settings = SettingGroup::with([
'settings', 'settings',
@ -26,77 +34,108 @@ class SettingsController extends Controller
/** /**
* @param int $id * @param int $id
* *
* @return \Illuminate\Http\RedirectResponse * @return RedirectResponse|View
*/ */
public function edit($id) public function edit(int $id)
{ {
$setting = Setting::find($id); $setting = Setting::find($id);
//die("s: ".$setting->label);
if((bool)$setting->system === true) return abort(404); if ((bool) $setting->system === true) {
return abort(404);
}
if (!is_null($setting)) { if (! is_null($setting)) {
return view('settings.edit')->with([ return view('settings.edit')->with([
'setting' => $setting, 'setting' => $setting,
]); ]);
} else { } else {
return redirect()->route('settings.list')->with([ $route = route('settings.list', []);
'error' => __('app.alert.error.not_exist'),
return redirect($route)
->with([
'errors' => collect([__('app.alert.error.not_exist')]),
]); ]);
} }
} }
/** /**
* @param Request $request
* @param int $id * @param int $id
* *
* @return \Illuminate\Http\RedirectResponse * @return RedirectResponse
*/ */
public function update(Request $request, $id) public function update(Request $request, int $id): RedirectResponse
{ {
$setting = Setting::find($id); $setting = Setting::find($id);
$user = $this->user();
$route = route('settings.index', []);
if (!is_null($setting)) { try {
$data = Setting::getInput(); if (is_null($setting)) {
throw new Exception('not_exists');
if ($setting->type == 'image') {
if($request->hasFile('value')) {
$path = $request->file('value')->store('backgrounds');
$setting->value = $path;
}
} else {
$setting->value = $data->value;
} }
$setting->save(); if ($setting->type === 'image') {
$validatedData = $request->validate([
'value' => 'image'
]);
return redirect()->route('settings.index')->with([ if (!$request->hasFile('value')) {
'success' => __('app.alert.success.setting_updated'), throw new \Exception(
]); 'file_too_big'
} else { );
return redirect()->route('settings.index')->with([ }
'error' => __('app.alert.error.not_exist'),
]); $path = $request->file('value')->store('backgrounds');
if ($path === null) {
throw new \Exception('file_not_stored');
}
$setting_value = $path;
} else {
$data = Setting::getInput($request);
$setting_value = $data->value;
}
$user->settings()->detach($setting->id);
$user->settings()->save($setting, ['uservalue' => $setting_value]);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'),
]);
} catch (Exception $e) {
return redirect($route)
->with([
'errors' => collect([__('app.alert.error.'.$e->getMessage())]),
]);
} }
} }
/** /**
* @param int $id * @param int $id
* *
* @return \Illuminate\Http\RedirectResponse * @return RedirectResponse
*/ */
public function clear($id) public function clear(int $id): RedirectResponse
{ {
$user = $this->user();
$setting = Setting::find($id); $setting = Setting::find($id);
if((bool)$setting->system !== true) { if ((bool) $setting->system !== true) {
$setting->value = ''; $user->settings()->detach($setting->id);
$setting->save(); $user->settings()->save($setting, ['uservalue' => '']);
} }
return redirect()->route('settings.index')->with([ $route = route('settings.index', []);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'), 'success' => __('app.alert.success.setting_updated'),
]); ]);
}
public function search(Request $request)
{
} }
} }

View file

@ -0,0 +1,222 @@
<?php
namespace App\Http\Controllers;
use App\Item;
use App\User;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class TagController extends Controller
{
public function __construct()
{
$this->middleware('allowed');
}
/**
* Display a listing of the resource.
*
* @return Application|Factory|View
*/
public function index(Request $request)
{
$trash = (bool) $request->input('trash');
$data['apps'] = Item::ofType('tag')->where('id', '>', 0)->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('tag')->where('id', '>', 0)->onlyTrashed()->get();
if ($trash) {
return view('tags.trash', $data);
} else {
return view('tags.list', $data);
}
}
/**
* Show the form for creating a new resource.
*
* @return Application|Factory|View
*/
public function create()
{
$data = [];
return view('tags.create', $data);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return RedirectResponse
*/
public function store(Request $request): RedirectResponse
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'file' => 'image'
]);
if ($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path,
]);
}
$slug = str_slug($request->title, '-', 'en_US');
$current_user = User::currentUser();
// set item type to tag
$request->merge([
'type' => '1',
'url' => $slug,
'user_id' => $current_user->getId(),
]);
//die(print_r($request->all()));
Item::create($request->all());
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.tag_created'));
}
/**
* Display the specified resource.
*
* @param $slug
* @return View
*/
public function show($slug): View
{
$item = Item::whereUrl($slug)->first();
//print_r($item);
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
$data['tag'] = $item->id;
$data['all_apps'] = $item->children;
return view('welcome', $data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return View
*/
public function edit(int $id): View
{
// Get the item
$item = Item::find($id);
// show the edit form and pass the nerd
return view('tags.edit')
->with('item', $item);
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return RedirectResponse
*/
public function update(Request $request, int $id): RedirectResponse
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'file' => 'image'
]);
if ($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path,
]);
}
$slug = str_slug($request->title, '-', 'en_US');
// set item type to tag
$request->merge([
'url' => $slug,
]);
Item::find($id)->update($request->all());
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.tag_updated'));
}
/**
* Remove the specified resource from storage.
*
* @param Request $request
* @param int $id
* @return RedirectResponse
*/
public function destroy(Request $request, int $id): RedirectResponse
{
//
$force = (bool) $request->input('force');
if ($force) {
Item::withTrashed()
->where('id', $id)
->forceDelete();
} else {
Item::find($id)->delete();
}
$route = route('tags.index', []);
return redirect($route)
->with('success', __('app.alert.success.item_deleted'));
}
/**
* Restore the specified resource from soft deletion.
*
* @param int $id
* @return RedirectResponse
*/
public function restore(int $id): RedirectResponse
{
//
Item::withTrashed()
->where('id', $id)
->restore();
$route = route('tags.index', []);
return redirect($route)
->with('success', __('app.alert.success.item_restored'));
}
/**
* Add item to tag
*
* @param $tag
* @param $item
* @return int 1|0
*/
public function add($tag, $item): int
{
$tag = Item::find($tag);
$item = Item::find($item);
if ($tag && $item) {
// only add items, not cats
if ((int) $item->type === 0) {
$tag->children()->attach($item);
return 1;
}
}
return 0;
}
}

View file

@ -0,0 +1,182 @@
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
class UserController extends Controller
{
public function __construct()
{
parent::__construct();
$this->middleware('allowed')->except(['selectUser']);
}
/**
* Display a listing of the resource.
*
* @return View
*/
public function index(): View
{
$data['users'] = User::all();
return view('users.index', $data);
}
/**
* Show the form for creating a new resource.
*
* @return View
*/
public function create(): View
{
$data = [];
return view('users.create', $data);
}
public function selectUser()
{
Auth::logout();
$data['users'] = User::all();
return view('userselect', $data);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return RedirectResponse
*/
public function store(Request $request): RedirectResponse
{
$validatedData = $request->validate([
'username' => 'required|max:255|unique:users',
'email' => 'required|email',
'password' => 'nullable|confirmed',
'password_confirmation' => 'nullable',
'file' => 'image'
]);
$user = new User;
$user->username = $request->input('username');
$user->email = $request->input('email');
$user->public_front = $request->input('public_front');
$password = $request->input('password');
if (! empty($password)) {
$user->password = bcrypt($password);
}
if ($request->hasFile('file')) {
$path = $request->file('file')->store('avatars');
$user->avatar = $path;
}
if ((bool) $request->input('autologin_allow') === true) {
$user->autologin = (string) Str::uuid();
}
$user->save();
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.user_updated'));
}
/**
* Display the specified resource.
*
* @param int $id
* @return void
*/
public function show(int $id): void
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param User $user
* @return View
*/
public function edit(User $user): View
{
$data['user'] = $user;
return view('users.edit', $data);
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param User $user
* @return RedirectResponse
*/
public function update(Request $request, User $user): RedirectResponse
{
$validatedData = $request->validate([
'username' => 'required|max:255|unique:users,username,'.$user->id,
'email' => 'required|email',
'password' => 'nullable|confirmed',
'password_confirmation' => 'nullable',
'file' => 'image'
]);
//die(print_r($request->all()));
$user->username = $request->input('username');
$user->email = $request->input('email');
$user->public_front = $request->input('public_front');
$password = $request->input('password');
if (! empty($password)) {
$user->password = bcrypt($password);
} elseif ($password == 'null') {
$user->password = null;
}
if ($request->hasFile('file')) {
$path = $request->file('file')->store('avatars');
$user->avatar = $path;
}
if ((bool) $request->input('autologin_allow') === true) {
$user->autologin = (is_null($user->autologin)) ? (string) Str::uuid() : $user->autologin;
} else {
$user->autologin = null;
}
$user->save();
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.user_updated'));
}
/**
* Remove the specified resource from storage.
*
* @param User $user
* @return RedirectResponse | void
*/
public function destroy(User $user): RedirectResponse
{
if ($user->id !== 1) {
$user->delete();
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.user_deleted'));
}
}
}

View file

@ -51,6 +51,7 @@ class Kernel extends HttpKernel
* @var array * @var array
*/ */
protected $routeMiddleware = [ protected $routeMiddleware = [
'allowed' => \App\Http\Middleware\CheckAllowed::class,
'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,

View file

@ -0,0 +1,59 @@
<?php
namespace App\Http\Middleware;
use App\User;
use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use Session;
class CheckAllowed
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
* @throws AuthenticationException
*/
public function handle(Request $request, Closure $next)
{
$route = Route::currentRouteName();
$current_user = User::currentUser();
// Non admin users can't access users management
if (str_is('users*', $route)) {
if ($current_user->getId() !== 1) {
return redirect()->route('dash');
}
}
// Public access to frontpage
if ($route === 'dash' || $route === 'tags.show') {
if ((bool)$current_user->public_front === true) {
return $next($request);
}
}
// Continue with passwordless user
if (empty($current_user->password)) {
return $next($request);
}
// Check if user is logged in as $current_user
if (Auth::check()) {
$loggedin_user = Auth::user();
if ($loggedin_user->id === $current_user->getId()) {
return $next($request);
}
}
// Redirect to login
Auth::authenticate();
return redirect()->route('user.select');
}
}

View file

@ -3,6 +3,7 @@
namespace App\Http\Middleware; namespace App\Http\Middleware;
use Closure; use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated class RedirectIfAuthenticated
@ -10,15 +11,15 @@ class RedirectIfAuthenticated
/** /**
* Handle an incoming request. * Handle an incoming request.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
* @param \Closure $next * @param Closure $next
* @param string|null $guard * @param string|null $guard
* @return mixed * @return mixed
*/ */
public function handle($request, Closure $next, $guard = null) public function handle(Request $request, Closure $next, string $guard = null)
{ {
if (Auth::guard($guard)->check()) { if (Auth::guard($guard)->check()) {
return redirect('/home'); return redirect()->intended();
} }
return $next($request); return $next($request);

View file

@ -2,8 +2,8 @@
namespace App\Http\Middleware; namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware; use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware class TrustProxies extends Middleware
{ {
@ -12,18 +12,12 @@ class TrustProxies extends Middleware
* *
* @var array * @var array
*/ */
protected $proxies; protected $proxies = ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8', '127.0.0.1'];
/** /**
* The current proxy header mappings. * The current proxy header mappings.
* *
* @var array * @var array
*/ */
protected $headers = [ protected $headers = Request::HEADER_X_FORWARDED_ALL;
Request::HEADER_FORWARDED => 'FORWARDED',
Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
];
} }

View file

@ -2,98 +2,409 @@
namespace App; namespace App;
use Illuminate\Contracts\Routing\UrlGenerator;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Symfony\Component\ClassLoader\ClassMapGenerator; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use stdClass;
use Symfony\Component\ClassLoader\ClassMapGenerator;
// @codingStandardsIgnoreStart
/**
* App\Item
*
* @property int $id
* @property string $title
* @property string|null $colour
* @property string|null $icon
* @property string $url
* @property string|null $description
* @property int $pinned
* @property int $order
* @property \Illuminate\Support\Carbon|null $deleted_at
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int $type
* @property int $user_id
* @property string|null $class
* @property string|null $appid
* @property string|null $appdescription
* @property-read \Illuminate\Database\Eloquent\Collection|Item[] $children
* @property-read int|null $children_count
* @property-read string $droppable
* @property-read \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\UrlGenerator|mixed|string $link
* @property-read string $link_icon
* @property-read string $link_target
* @property-read string $link_type
* @property-read \Illuminate\Database\Eloquent\Collection|Item[] $parents
* @property-read int|null $parents_count
* @property-read \App\User|null $user
* @method static \Database\Factories\ItemFactory factory(...$parameters)
* @method static Builder|Item newModelQuery()
* @method static Builder|Item newQuery()
* @method static Builder|Item ofType($type)
* @method static \Illuminate\Database\Query\Builder|Item onlyTrashed()
* @method static Builder|Item pinned()
* @method static Builder|Item query()
* @method static Builder|Item whereAppdescription($value)
* @method static Builder|Item whereAppid($value)
* @method static Builder|Item whereClass($value)
* @method static Builder|Item whereColour($value)
* @method static Builder|Item whereCreatedAt($value)
* @method static Builder|Item whereDeletedAt($value)
* @method static Builder|Item whereDescription($value)
* @method static Builder|Item whereIcon($value)
* @method static Builder|Item whereId($value)
* @method static Builder|Item whereOrder($value)
* @method static Builder|Item wherePinned($value)
* @method static Builder|Item whereTitle($value)
* @method static Builder|Item whereType($value)
* @method static Builder|Item whereUpdatedAt($value)
* @method static Builder|Item whereUrl($value)
* @method static Builder|Item whereUserId($value)
* @method static \Illuminate\Database\Query\Builder|Item withTrashed()
* @method static \Illuminate\Database\Query\Builder|Item withoutTrashed()
* @mixin \Eloquent
*/
// @codingStandardsIgnoreEnd
class Item extends Model class Item extends Model
{ {
use SoftDeletes; use SoftDeletes;
// use HasFactory;
protected $fillable = [
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order'
];
/** /**
* The attributes that should be mutated to dates. * @return void
*
* @var array
*/ */
protected $dates = ['deleted_at']; protected static function boot()
{
parent::boot();
public static function supportedList() static::addGlobalScope('user_id', function (Builder $builder) {
{ $current_user = User::currentUser();
return [ if ($current_user) {
'Duplicati' => \App\SupportedApps\Duplicati::class, $builder->where('user_id', $current_user->getId())->orWhere('user_id', 0);
'Emby' => \App\SupportedApps\Emby::class, } else {
'NZBGet' => \App\SupportedApps\Nzbget::class, $builder->where('user_id', 0);
'pFsense' => \App\SupportedApps\Pfsense::class, }
'Pihole' => \App\SupportedApps\Pihole::class, });
'Plex' => \App\SupportedApps\Plex::class,
'Plexpy' => \App\SupportedApps\Plexpy::class,
'Portainer' => \App\SupportedApps\Portainer::class,
'UniFi' => \App\SupportedApps\Unifi::class,
'Nextcloud' => \App\SupportedApps\Nextcloud::class,
'Sabnzbd' => \App\SupportedApps\Sabnzbd::class,
];
}
public static function supportedOptions()
{
return array_keys(self::supportedList());
} }
protected $fillable = [
'title',
'url',
'colour',
'icon',
'appdescription',
'description',
'pinned',
'order',
'type',
'class',
'user_id',
'tag_id',
'appid',
];
/** /**
* Scope a query to only include pinned items. * Scope a query to only include pinned items.
* *
* @param \Illuminate\Database\Eloquent\Builder $query * @param Builder $query
* @return \Illuminate\Database\Eloquent\Builder * @return Builder
*/ */
public function scopePinned($query) public function scopePinned(Builder $query): Builder
{ {
return $query->where('pinned', 1); return $query->where('pinned', 1);
} }
public function getConfigAttribute()
{
$output = null;
$view = null;
if(isset($this->description) && !empty($this->description)){
$output = json_decode($this->description);
$output = is_object($output) ? $output : new \stdClass();
if(isset($output->type) && !empty($output->type)) {
$class = $output->type;
$sap = new $class();
$view = $sap->configDetails();
$output->view = $view;
}
if(!isset($output->dataonly)) $output->dataonly = '0';
}
return (object)$output;
}
public static function checkConfig($config) public static function checkConfig($config)
{ {
if(empty($config)) { // die(print_r($config));
if (empty($config)) {
$config = null; $config = null;
} else { } else {
$store = false;
//die(var_dump($config));
foreach($config as $key => $check) {
if($key == 'type') continue;
if($key == 'dataonly') continue;
if(!empty($check) && $check != '0') {
$store = true;
break;
}
}
//die(var_dump($store))
$config['enabled'] = ($store) ? true : false;
$config = json_encode($config); $config = json_encode($config);
} }
return $config;
return $config;
}
public function tags()
{
$id = $this->id;
$tags = ItemTag::select('tag_id')->where('item_id', $id)->pluck('tag_id')->toArray();
$tagdetails = self::select('id', 'title', 'url', 'pinned')->whereIn('id', $tags)->get();
//print_r($tags);
if (in_array(0, $tags)) {
$details = new self([
'id' => 0,
'title' => __('app.dashboard'),
'url' => '',
'pinned' => 0,
]);
$tagdetails->prepend($details);
}
return $tagdetails;
}
/**
* @return string
*/
public function getTagClass(): string
{
$tags = $this->tags();
$slugs = [];
foreach ($tags as $tag) {
if ($tag->url) {
$slugs[] = 'tag-'.$tag->url;
}
}
return implode(' ', $slugs);
}
/**
* @return BelongsToMany
*/
public function parents(): BelongsToMany
{
return $this->belongsToMany(Item::class, 'item_tag', 'item_id', 'tag_id');
}
/**
* @return BelongsToMany
*/
public function children(): BelongsToMany
{
return $this->belongsToMany(Item::class, 'item_tag', 'tag_id', 'item_id');
}
/**
* @return \Illuminate\Contracts\Foundation\Application|UrlGenerator|mixed|string
*/
public function getLinkAttribute()
{
if ((int) $this->type === 1) {
return url('tag/'.$this->url);
} else {
return $this->url;
}
}
/**
* @return string
*/
public function getDroppableAttribute(): string
{
if ((int) $this->type === 1) {
return ' droppable';
} else {
return '';
}
}
/**
* @return string
*/
public function getLinkTargetAttribute(): string
{
$target = Setting::fetch('window_target');
if ((int) $this->type === 1 || $target === 'current') {
return '';
} else {
return ' target="'.$target.'"';
}
}
/**
* @return string
*/
public function getLinkIconAttribute(): string
{
if ((int) $this->type === 1) {
return 'fa-tag';
} else {
return 'fa-arrow-alt-to-right';
}
}
/**
* @return string
*/
public function getLinkTypeAttribute(): string
{
if ((int) $this->type === 1) {
return 'tags';
} else {
return 'items';
}
}
/**
* @param $class
* @return false|mixed|string
*/
public static function nameFromClass($class)
{
$explode = explode('\\', $class);
$name = end($explode);
return $name;
}
/**
* @param $query
* @param $type
* @return mixed
*/
public function scopeOfType($query, $type)
{
switch ($type) {
case 'item':
$typeid = 0;
break;
case 'tag':
$typeid = 1;
break;
}
return $query->where('type', $typeid);
}
/**
* @return bool
*/
public function enhanced(): bool
{
/*if(isset($this->class) && !empty($this->class)) {
$app = new $this->class;
} else {
return false;
}
return (bool)($app instanceof \App\EnhancedApps);*/
return $this->description !== null;
}
/**
* @param $class
* @return bool
*/
public static function isEnhanced($class): bool
{
if (!class_exists($class, false) || $class === null || $class === 'null') {
return false;
}
$app = new $class;
return (bool) ($app instanceof EnhancedApps);
}
/**
* @param $class
* @return false|mixed
*/
public static function isSearchProvider($class)
{
if (!class_exists($class, false) || $class === null || $class === 'null') {
return false;
}
$app = new $class;
return ((bool) ($app instanceof SearchInterface)) ? $app : false;
}
/**
* @return bool
*/
public function enabled(): bool
{
if ($this->enhanced()) {
$config = $this->getconfig();
if ($config) {
return (bool) $config->enabled;
}
}
return false;
}
/**
* @return mixed|stdClass
*/
public function getconfig()
{
// $explode = explode('\\', $this->class);
if (! isset($this->description) || empty($this->description)) {
$config = new stdClass;
// $config->name = end($explode);
$config->enabled = false;
$config->override_url = null;
$config->apikey = null;
return $config;
}
$config = json_decode($this->description);
// $config->name = end($explode);
$config->url = $this->url;
if (isset($config->override_url) && ! empty($config->override_url)) {
$config->url = $config->override_url;
} else {
$config->override_url = null;
}
return $config;
}
/**
* @param $class
* @return Application|null
*/
public static function applicationDetails($class): ?Application
{
if (! empty($class)) {
$name = self::nameFromClass($class);
$application = Application::where('name', $name)->first();
if ($application) {
return $application;
}
}
return null;
}
/**
* @param $class
* @return string
*/
public static function getApplicationDescription($class): string
{
$details = self::applicationDetails($class);
if ($details !== null) {
return $details->description.' - '.$details->license;
}
return '';
}
/**
* Get the user that owns the item.
*
* @return BelongsTo
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
} }
} }

27
app/ItemTag.php Normal file
View file

@ -0,0 +1,27 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\Pivot;
/**
* App\ItemTag
*
* @property int $item_id
* @property int $tag_id
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag query()
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag whereItemId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag whereTagId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ItemTag whereUpdatedAt($value)
* @mixin \Eloquent
*/
class ItemTag extends Pivot
{
use HasFactory;
}

61
app/Jobs/ProcessApps.php Normal file
View file

@ -0,0 +1,61 @@
<?php
namespace App\Jobs;
use App\Application;
use App\Item;
use App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
class ProcessApps implements ShouldQueue, ShouldBeUnique
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
* @throws GuzzleException
*/
public function handle()
{
Log::debug('Process Apps dispatched');
$localapps = Application::whereNull('class')->get();
$json = SupportedApps::getList()->getBody();
Storage::disk('local')->put('supportedapps.json', $json);
foreach ($localapps as $app) {
$app->class = $app->class();
$app->save();
}
$items = Item::whereNotNull('class')->get();
foreach ($items as $item) {
if (! file_exists(app_path('SupportedApps/'.Item::nameFromClass($item->class)))) {
$app = Application::where('class', $item->class)->first();
if ($app) {
Application::getApp($app->appid);
}
}
}
}
}

60
app/Jobs/UpdateApps.php Normal file
View file

@ -0,0 +1,60 @@
<?php
namespace App\Jobs;
use App\Application;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
class UpdateApps implements ShouldQueue, ShouldBeUnique
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
* @throws GuzzleException
*/
public function handle()
{
Log::debug('Update of all apps triggered!');
$apps = Application::all('appid')->toArray();
// We onl update the apps that are actually in use by items
// 1 sec delay after each update to throttle the requests
foreach ($apps as $appKey => $app) {
Application::getApp($app['appid']);
sleep(1);
}
Log::debug('Update of all apps finished!');
Cache::lock('updateApps')->forceRelease();
}
/**
* @return void
*/
public function failed($exception)
{
Cache::lock('updateApps')->forceRelease();
}
}

View file

@ -2,10 +2,18 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\ServiceProvider; use App\Application;
use Artisan; use App\Jobs\ProcessApps;
use Schema; use App\Jobs\UpdateApps;
use App\Setting; use App\Setting;
use App\User;
use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
{ {
@ -16,42 +24,97 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot() public function boot()
{ {
$alt_bg = ''; if (! class_exists('ZipArchive')) {
die('You are missing php-zip');
if(!is_file(base_path('.env'))) {
touch(base_path('.env'));
Artisan::call('key:generate');
} }
if(!is_file(database_path('app.sqlite'))) {
// first time setup $this->createEnvFile();
touch(database_path('app.sqlite'));
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true)); $this->setupDatabase();
if (! is_file(public_path('storage/.gitignore'))) {
Artisan::call('storage:link'); Artisan::call('storage:link');
//Cache \Session::put('current_user', null);
//Artisan::call('config:cache');
//Artisan::call('route:cache');
} }
if(is_file(database_path('app.sqlite'))) {
if(Schema::hasTable('settings')) {
if($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url('.asset('storage/'.$bg_image).')"';
}
// check version to see if an upgrade is needed $applications = Application::all();
$db_version = Setting::fetch('version');
$app_version = config('app.version'); if ($applications->count() <= 0) {
if(version_compare($app_version, $db_version) == 1) { // app is higher than db, so need to run migrations etc ProcessApps::dispatch();
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true)); }
}
} else { $lang = Setting::fetch('language');
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true)); \App::setLocale($lang);
// User specific settings need to go here as session isn't available at this point in the app
view()->composer('*', function ($view) {
if (isset($_SERVER['HTTP_AUTHORIZATION']) && ! empty($_SERVER['HTTP_AUTHORIZATION'])) {
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
} }
$lang = Setting::fetch('language'); if (! \Auth::check()) {
\App::setLocale($lang); if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])
&& ! empty($_SERVER['PHP_AUTH_USER']) && ! empty($_SERVER['PHP_AUTH_PW'])) {
$credentials = ['username' => $_SERVER['PHP_AUTH_USER'], 'password' => $_SERVER['PHP_AUTH_PW']];
if (\Auth::attempt($credentials, true)) {
// Authentication passed...
$user = \Auth::user();
//\Session::put('current_user', $user);
session(['current_user' => $user]);
}
} elseif (isset($_SERVER['REMOTE_USER']) && ! empty($_SERVER['REMOTE_USER'])) {
$user = User::where('username', $_SERVER['REMOTE_USER'])->first();
if ($user) {
\Auth::login($user, true);
session(['current_user' => $user]);
}
}
}
$alt_bg = '';
$trianglify = 'false';
$trianglify_seed = null;
if (Setting::fetch('trianglify')) {
$trianglify = 'true';
$trianglify_seed = Setting::fetch('trianglify_seed');
} elseif ($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url(storage/'.$bg_image.')"';
}
$allusers = User::all();
$current_user = User::currentUser();
$view->with('alt_bg', $alt_bg);
$view->with('trianglify', $trianglify);
$view->with('trianglify_seed', $trianglify_seed);
$view->with('allusers', $allusers);
$view->with('current_user', $current_user);
});
$this->app['view']->addNamespace('SupportedApps', app_path('SupportedApps'));
if (env('FORCE_HTTPS') === true) {
\URL::forceScheme('https');
} }
view()->share('alt_bg', $alt_bg);
if (env('APP_URL') != 'http://localhost') {
\URL::forceRootUrl(env('APP_URL'));
}
}
/**
* Generate app key if missing and .env exists
*
* @return void
*/
public function genKey()
{
if (is_file(base_path('.env'))) {
if (empty(env('APP_KEY'))) {
Artisan::call('key:generate', ['--force' => true, '--no-interaction' => true]);
}
}
} }
/** /**
@ -61,8 +124,78 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function register() public function register()
{ {
if ($this->app->isLocal()) {
$this->app->register(IdeHelperServiceProvider::class);
}
$this->app->singleton('settings', function () { $this->app->singleton('settings', function () {
return new Setting(); return new Setting();
}); });
} }
/**
* Check if database needs an update or do first time database setup
*
* @return void
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function setupDatabase(): void
{
$db_type = config()->get('database.default');
if ($db_type == 'sqlite') {
$db_file = database_path(env('DB_DATABASE', 'app.sqlite'));
if (! is_file($db_file)) {
touch($db_file);
}
}
if ($this->needsDBUpdate()) {
Artisan::call('migrate', ['--path' => 'database/migrations', '--force' => true, '--seed' => true]);
ProcessApps::dispatchSync();
$this->updateApps();
}
}
/**
* @return void
*/
public function createEnvFile(): void
{
if (!is_file(base_path('.env'))) {
copy(base_path('.env.example'), base_path('.env'));
}
$this->genKey();
}
/**
* @return bool
*/
private function needsDBUpdate(): bool
{
if (!Schema::hasTable('settings')) {
return true;
}
$db_version = Setting::_fetch('version');
$app_version = config('app.version');
return version_compare($app_version, $db_version) === 1;
}
/**
* @return void
*/
private function updateApps()
{
// This lock ensures that the job is not invoked multiple times.
// In 5 minutes all app updates should be finished.
$lock = Cache::lock('updateApps', 5*60);
if ($lock->get()) {
UpdateApps::dispatchAfterResponse();
}
}
} }

View file

@ -2,7 +2,6 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider class AuthServiceProvider extends ServiceProvider

View file

@ -2,8 +2,8 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast; use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider class BroadcastServiceProvider extends ServiceProvider
{ {

View file

@ -2,7 +2,6 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider class EventServiceProvider extends ServiceProvider

View file

@ -2,8 +2,8 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider class RouteServiceProvider extends ServiceProvider
{ {
@ -12,9 +12,9 @@ class RouteServiceProvider extends ServiceProvider
* *
* In addition, it is set as the URL generator's root namespace. * In addition, it is set as the URL generator's root namespace.
* *
* @var string * REMOVED WITH LARAVEL 8 UPGRADE
*/ */
protected $namespace = 'App\Http\Controllers'; // protected $namespace = 'App\Http\Controllers';
/** /**
* Define your route model bindings, pattern filters, etc. * Define your route model bindings, pattern filters, etc.

143
app/Search.php Normal file
View file

@ -0,0 +1,143 @@
<?php
namespace App;
use Cache;
use Form;
use Illuminate\Support\Collection;
use Yaml;
abstract class Search
{
/**
* List of all search providers
*
* @return Collection
*/
public static function providers(): Collection
{
$providers = self::standardProviders();
$providers = $providers + self::appProviders();
return collect($providers);
}
/**
* Gets details for a single provider
*
* @return false|object
*/
public static function providerDetails($provider)
{
$providers = self::providers();
if (! isset($providers[$provider])) {
return false;
}
return (object) $providers[$provider] ?? false;
}
/**
* Array of the standard providers
*
* @return array
*/
public static function standardProviders(): array
{
// $providers = json_decode(file_get_contents(storage_path('app/searchproviders.json')));
// print_r($providers);
$providers = Yaml::parseFile(storage_path('app/searchproviders.yaml'));
$all = [];
foreach ($providers as $key => $provider) {
$all[$key] = $provider;
$all[$key]['type'] = 'standard';
}
return $all;
}
/**
* Loops through users apps to see if app is a search provider, might be worth
* looking into caching this at some point
*
* @return array
*/
public static function appProviders(): array
{
$providers = [];
$userapps = Item::all();
foreach ($userapps as $app) {
if (empty($app->class)) {
continue;
}
if (($provider = Item::isSearchProvider($app->class)) !== false) {
$name = Item::nameFromClass($app->class);
$providers[$app->id] = [
'id' => $app->id,
'type' => $provider->type,
'class' => $app->class,
'url' => $app->url,
'name' => $app->title,
'colour' => $app->colour,
'icon' => $app->icon,
'description' => $app->description,
];
}
}
return $providers;
}
/**
* Outputs the search form
*
* @return string
*/
public static function form(): string
{
$output = '';
$homepage_search = Setting::fetch('homepage_search');
$search_provider = Setting::where('key', '=', 'search_provider')->first();
$user_search_provider = Setting::fetch('search_provider');
//die(print_r($search_provider));
//die(var_dump($user_search_provider));
// return early if search isn't applicable
if ((bool) $homepage_search !== true) {
return $output;
}
$user_search_provider = $user_search_provider ?? 'none';
if ((bool) $search_provider) {
if ((bool) $user_search_provider) {
$name = 'app.options.'.$user_search_provider;
$provider = self::providerDetails($user_search_provider);
$output .= '<div class="searchform">';
$output .= '<form action="'.url('search').'"'.getLinkTargetAttribute().' method="get">';
$output .= '<div id="search-container" class="input-container">';
$output .= '<select name="provider">';
foreach (self::providers() as $key => $searchprovider) {
$selected = ((string) $key === (string) $user_search_provider) ? ' selected="selected"' : '';
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['name'].'</option>';
}
$output .= '</select>';
$output .= Form::text(
'q',
null,
[
'class' => 'homesearch',
'autofocus' => 'autofocus',
'placeholder' => __('app.settings.search').'...'
]
);
$output .= '<button type="submit">'.ucwords(__('app.settings.search')).'</button>';
$output .= '</div>';
$output .= '</form>';
$output .= '</div>';
}
}
return $output;
}
}

8
app/SearchInterface.php Normal file
View file

@ -0,0 +1,8 @@
<?php
namespace App;
interface SearchInterface
{
public function getResults($query, $providerdetails);
}

View file

@ -2,10 +2,47 @@
namespace App; namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Input;
use Form; use Form;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Http\Request;
use Illuminate\Session\SessionManager;
use Illuminate\Session\Store;
use Illuminate\Support\Facades\Input;
/**
* App\Setting
*
* @mixin Builder
* @property int $id
* @property int $group_id
* @property string $key
* @property string $type
* @property string|null $options
* @property string $label
* @property string|null $value
* @property string $order
* @property int $system
* @property-read mixed $edit_value
* @property-read mixed $list_value
* @property-read \App\SettingGroup|null $group
* @property-read \Illuminate\Database\Eloquent\Collection|\App\User[] $users
* @property-read int|null $users_count
* @method static Builder|Setting newModelQuery()
* @method static Builder|Setting newQuery()
* @method static Builder|Setting query()
* @method static Builder|Setting whereGroupId($value)
* @method static Builder|Setting whereId($value)
* @method static Builder|Setting whereKey($value)
* @method static Builder|Setting whereLabel($value)
* @method static Builder|Setting whereOptions($value)
* @method static Builder|Setting whereOrder($value)
* @method static Builder|Setting whereSystem($value)
* @method static Builder|Setting whereType($value)
* @method static Builder|Setting whereValue($value)
*/
class Setting extends Model class Setting extends Model
{ {
/** /**
@ -16,7 +53,7 @@ class Setting extends Model
protected $table = 'settings'; protected $table = 'settings';
protected $fillable = [ protected $fillable = [
'id', 'group_id', 'key', 'type', 'options', 'label', 'value', 'order', 'system' 'id', 'group_id', 'key', 'type', 'options', 'label', 'value', 'order', 'system',
]; ];
/** /**
@ -34,40 +71,56 @@ class Setting extends Model
protected static $cache = []; protected static $cache = [];
/** /**
* @return array * @param Request $request
* @return object
*/ */
public static function getInput() public static function getInput(Request $request): object
{ {
return (object) [ return (object) [
'value' => Input::get('value'), 'value' => $request->input('value'),
'image' => Input::file('value'), 'image' => $request->file('value'),
]; ];
} }
public function getListValueAttribute() public function getListValueAttribute()
{ {
switch($this->type) { if ((bool) $this->system === true) {
$value = self::_fetch($this->key);
} else {
$value = self::fetch($this->key);
}
$this->value = $value;
switch ($this->type) {
case 'image': case 'image':
if(!empty($this->value)) { if (! empty($this->value)) {
$value = '<a href="'.asset('storage/'.$this->value).'" title="'.__('app.settings.view').'" target="_blank">'.__('app.settings.view').'</a>'; $value = '<a href="'.asset('storage/'.$this->value).'" title="'.
__('app.settings.view').
'" target="_blank">'.
__('app.settings.view').
'</a>';
} else { } else {
$value = __('app.options.none'); $value = __('app.options.none');
} }
break; break;
case 'boolean': case 'boolean':
if((bool)$this->value === true) { if ((bool) $this->value === true) {
$value = __('app.options.yes'); $value = __('app.options.yes');
} else { } else {
$value = __('app.options.no'); $value = __('app.options.no');
} }
break; break;
case 'select': case 'select':
if(!empty($this->value) && $this->value !== 'none') { if (! empty($this->value) && $this->value !== 'none') {
$options = (array)json_decode($this->options); $options = (array) json_decode($this->options);
$value = __($options[$this->value]); if ($this->key === 'search_provider') {
$options = Search::providers()->pluck('name', 'id')->toArray();
}
$value = (array_key_exists($this->value, $options))
? __($options[$this->value])
: __('app.options.none');
} else { } else {
$value = __('app.options.none'); $value = __('app.options.none');
} }
break; break;
default: default:
$value = __($this->value); $value = __($this->value);
@ -75,26 +128,46 @@ class Setting extends Model
} }
return $value; return $value;
} }
public function getEditValueAttribute() public function getEditValueAttribute()
{ {
switch($this->type) { if ((bool) $this->system === true) {
$value = self::_fetch($this->key);
} else {
$value = self::fetch($this->key);
}
$this->value = $value;
switch ($this->type) {
case 'image': case 'image':
$value = ''; $value = '';
if(isset($this->value) && !empty($this->value)) { if (isset($this->value) && ! empty($this->value)) {
$value .= '<a class="setting-view-image" href="'.asset('storage/'.$this->value).'" title="'.__('app.settings.view').'" target="_blank"><img src="'.asset('storage/'.$this->value).'" /></a>'; $value .= '<a class="setting-view-image" href="'.
asset('storage/'.$this->value).
'" title="'.
__('app.settings.view').
'" target="_blank"><img src="'.
asset('storage/'.
$this->value).
'" /></a>';
} }
$value .= Form::file('value', ['class' => 'form-control']); $value .= Form::file('value', ['class' => 'form-control']);
if(isset($this->value) && !empty($this->value)) { if (isset($this->value) && ! empty($this->value)) {
$value .= '<a class="settinglink" href="'.route('settings.clear', $this->id).'" title="'.__('app.settings.remove').'">'.__('app.settings.reset').'</a>'; $value .= '<a class="settinglink" href="'.
route('settings.clear', $this->id).
'" title="'.
__('app.settings.remove').
'">'.
__('app.settings.reset').
'</a>';
} }
break; break;
case 'boolean': case 'boolean':
$checked = false; $checked = false;
if(isset($this->value) && (bool)$this->value === true) $checked = true; if (isset($this->value) && (bool) $this->value === true) {
$checked = true;
}
$set_checked = ($checked) ? ' checked="checked"' : ''; $set_checked = ($checked) ? ' checked="checked"' : '';
$value = ' $value = '
<input type="hidden" name="value" value="0" /> <input type="hidden" name="value" value="0" />
@ -106,23 +179,31 @@ class Setting extends Model
break; break;
case 'select': case 'select':
$options = json_decode($this->options); $options = json_decode($this->options);
foreach($options as $key => $opt) { if ($this->key === 'search_provider') {
$options = Search::providers()->pluck('name', 'id');
}
foreach ($options as $key => $opt) {
$options->$key = __($opt); $options->$key = __($opt);
} }
$value = Form::select('value', $options, null, ['class' => 'form-control']); $value = Form::select('value', $options, null, ['class' => 'form-control']);
break; break;
case 'textarea':
$value = Form::textarea('value', null, ['class' => 'form-control', 'cols' => '44', 'rows' => '15']);
break;
default: default:
$value = Form::text('value', null, ['class' => 'form-control']); $value = Form::text('value', null, ['class' => 'form-control']);
break; break;
} }
return $value; return $value;
} }
public function group() /**
* @return BelongsTo
*/
public function group(): BelongsTo
{ {
return $this->belongsTo('App\SettingGroup', 'group_id'); return $this->belongsTo(\App\SettingGroup::class, 'group_id');
} }
/** /**
@ -130,22 +211,59 @@ class Setting extends Model
* *
* @return mixed * @return mixed
*/ */
public static function fetch($key) public static function fetch(string $key)
{ {
if (Setting::cached($key)) { $user = self::user();
return Setting::$cache[$key];
} else {
$find = self::where('key', '=', $key)->first();
if (!is_null($find)) { return self::_fetch($key, $user);
}
// @codingStandardsIgnoreStart
/**
* @param string $key
*
* @return mixed
*/
public static function _fetch($key, $user = null)
{
// @codingStandardsIgnoreEnd
//$cachekey = ($user === null) ? $key : $key.'-'.$user->id;
//if (Setting::cached($cachekey)) {
// return Setting::$cache[$cachekey];
//} else {
$find = self::where('key', '=', $key)->first();
if (! is_null($find)) {
if ((bool) $find->system === true) { // if system variable use global value
$value = $find->value; $value = $find->value;
Setting::add($key, $value); } else { // not system variable so use user specific value
// check if user specified value has been set
return $value; //print_r($user);
} else { $usersetting = $user->settings()->where('id', $find->id)->first();
return false; //print_r($user->settings);
//die(var_dump($usersetting));
//->pivot->value;
//echo "user: ".$user->id." --- ".$usersettings;
if (isset($usersetting) && ! empty($usersetting)) {
$value = $usersetting->pivot->uservalue;
} else { // if not get default from base setting
//$user->settings()->save($find, ['value' => $find->value]);
//$has_setting = $user->settings()->where('id', $find->id)->exists();
//if($has_setting) {
// $user->settings()->updateExistingPivot($find->id, ['uservalue' => (string)$find->value]);
//} else {
// $user->settings()->save($find, ['uservalue' => (string)$find->value]);
//}
$value = $find->value;
}
} }
//Setting::add($cachekey, $value);
return $value;
} else {
return false;
} }
//}
} }
/** /**
@ -154,7 +272,7 @@ class Setting extends Model
*/ */
public static function add($key, $value) public static function add($key, $value)
{ {
Setting::$cache[$key] = $value; self::$cache[$key] = $value;
} }
/** /**
@ -162,57 +280,24 @@ class Setting extends Model
* *
* @return bool * @return bool
*/ */
public static function cached($key) public static function cached($key): bool
{ {
return array_key_exists($key, Setting::$cache); return array_key_exists($key, self::$cache);
} }
/** /**
* @return html * The users that belong to the setting.
*/ */
public static function search() public function users(): BelongsToMany
{ {
$output = ''; return $this->belongsToMany(\App\User::class)->using(\App\SettingUser::class)->withPivot('uservalue');
$homepage_search = self::fetch('homepage_search'); }
$search_provider = self::where('key', '=', 'search_provider')->first();
//die(var_dump($search_provider->value));
// return early if search isn't applicable
if((bool)$homepage_search !== true) return $output;
if($search_provider->value === 'none') return $output;
if(empty($search_provider->value)) return $output;
if(is_null($search_provider->value)) return $output;
/**
if((bool)$homepage_search && (bool)$search_provider) { * @return \Illuminate\Contracts\Foundation\Application|SessionManager|Store|mixed
*/
$options = (array)json_decode($search_provider->options); public static function user()
$name = $options[$search_provider->value]; {
if((bool)$search_provider->value) { return User::currentUser();
switch($search_provider->value) {
case 'google':
$url = 'https://www.google.com/search';
$var = 'q';
break;
case 'ddg':
$url = 'https://duckduckgo.com/';
$var = 'q';
break;
case 'bing':
$url = 'https://www.bing.com/search';
$var = 'q';
break;
}
$output .= '<div class="searchform">';
$output .= Form::open(['url' => $url, 'method' => 'get']);
$output .= '<div class="input-container">';
$output .= Form::text($var, null, ['class' => 'homesearch', 'placeholder' => __($name).' '.__('app.settings.search').'...']);
$output .= '<button type="submit">'.ucwords(__('app.settings.search')).'</button>';
$output .= '</div>';
$output .= Form::close();
$output .= '</div>';
}
}
return $output;
} }
} }

View file

@ -3,7 +3,24 @@
namespace App; namespace App;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* App\SettingGroup
*
* @property int $id
* @property string $title
* @property int $order
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Setting[] $settings
* @property-read int|null $settings_count
* @method static \Illuminate\Database\Eloquent\Builder|SettingGroup newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|SettingGroup newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|SettingGroup query()
* @method static \Illuminate\Database\Eloquent\Builder|SettingGroup whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|SettingGroup whereOrder($value)
* @method static \Illuminate\Database\Eloquent\Builder|SettingGroup whereTitle($value)
* @mixin \Eloquent
*/
class SettingGroup extends Model class SettingGroup extends Model
{ {
/** /**
@ -20,8 +37,11 @@ class SettingGroup extends Model
*/ */
public $timestamps = false; public $timestamps = false;
public function settings() /**
* @return HasMany
*/
public function settings(): HasMany
{ {
return $this->hasMany('App\Setting', 'group_id'); return $this->hasMany(\App\Setting::class, 'group_id');
} }
} }

24
app/SettingUser.php Normal file
View file

@ -0,0 +1,24 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Relations\Pivot;
/**
* App\SettingUser
*
* @property int $setting_id
* @property int $user_id
* @property string|null $uservalue
* @method static \Illuminate\Database\Eloquent\Builder|SettingUser newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|SettingUser newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|SettingUser query()
* @method static \Illuminate\Database\Eloquent\Builder|SettingUser whereSettingId($value)
* @method static \Illuminate\Database\Eloquent\Builder|SettingUser whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|SettingUser whereUservalue($value)
* @mixin \Eloquent
*/
class SettingUser extends Pivot
{
//
}

232
app/SupportedApps.php Normal file
View file

@ -0,0 +1,232 @@
<?php
namespace App;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\ServerException;
use Illuminate\Support\Facades\Log;
use Psr\Http\Message\ResponseInterface;
abstract class SupportedApps
{
protected $jar = false;
protected $method = 'GET';
protected $error;
/**
* @param $url
* @param array $attrs
* @return object
* @throws GuzzleException
*/
public function appTest($url, array $attrs = []): object
{
if (empty($this->config->url)) {
return (object) [
'code' => 404,
'status' => 'No URL has been specified',
'response' => 'No URL has been specified',
];
}
$res = $this->execute($url, $attrs);
if ($res == null) {
return (object) [
'code' => null,
'status' => $this->error,
'response' => 'Connection failed',
];
}
switch ($res->getStatusCode()) {
case 200:
$status = 'Successfully communicated with the API';
break;
case 401:
$status = 'Failed: Invalid credentials';
break;
case 404:
$status = 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
$status = 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
return (object) [
'code' => $res->getStatusCode(),
'status' => $status,
'response' => $res->getBody(),
];
}
/**
* @param $url
* @param array $attrs
* @param array|bool|null $overridevars
* @param string|bool|null $overridemethod
* @return ResponseInterface|null
* @throws GuzzleException
*/
public function execute(
$url,
array $attrs = [],
$overridevars = null,
$overridemethod = null
): ?ResponseInterface {
$res = null;
$vars = ($overridevars === null || $overridevars === false) ?
[
'http_errors' => false,
'timeout' => 15,
'connect_timeout' => 15,
] : $overridevars;
$client = new Client($vars);
$method = ($overridemethod === null || $overridemethod === false) ? $this->method : $overridemethod;
try {
return $client->request($method, $url, $attrs);
} catch (ConnectException $e) {
Log::error('Connection refused');
Log::debug($e->getMessage());
$this->error = 'Connection refused - '.(string) $e->getMessage();
} catch (ServerException $e) {
Log::debug($e->getMessage());
$this->error = (string) $e->getResponse()->getBody();
}
$this->error = 'General error connecting with API';
return $res;
}
/**
* @return void
*/
public function login()
{
}
/**
* @param string $url
* @param bool $addslash
* @return string
*/
public function normaliseurl(string $url, bool $addslash = true): string
{
$url = rtrim($url, '/');
if ($addslash) {
$url .= '/';
}
return $url;
}
/**
* @param $status
* @param $data
* @return false|string
*/
public function getLiveStats($status, $data)
{
$className = get_class($this);
$explode = explode('\\', $className);
$name = end($explode);
$html = view('SupportedApps::'.$name.'.livestats', $data)->with('data', $data)->render();
return json_encode(['status' => $status, 'html' => $html]);
//return
}
/**
* @return ResponseInterface
* @throws GuzzleException
*/
public static function getList(): ResponseInterface
{
// $list_url = 'https://apps.heimdall.site/list';
$list_url = config('app.appsource').'list.json';
$client = new Client(['http_errors' => false, 'verify' => false, 'timeout' => 15, 'connect_timeout' => 15]);
return $client->request('GET', $list_url);
}
public static function configValue($item = null, $key = null)
{
if (isset($item) && ! empty($item)) {
return $item->getconfig()->$key;
} else {
return null;
}
}
/**
* @param $app
* @return bool|false
* @throws GuzzleException
*/
public static function getFiles($app): bool
{
Log::debug("Download triggered for ".print_r($app, true));
$zipurl = config('app.appsource').'files/'.$app->sha.'.zip';
$client = new Client(['http_errors' => false, 'timeout' => 60, 'connect_timeout' => 15, 'verify' => false]);
$res = $client->request('GET', $zipurl);
// Something went wrong?
if ($res->getStatusCode() !== 200) {
return false;
}
if (! file_exists(app_path('SupportedApps'))) {
mkdir(app_path('SupportedApps'), 0777, true);
}
$src = app_path('SupportedApps/'.className($app->name).'.zip');
file_put_contents($src, $res->getBody());
$zip = new \ZipArchive();
$x = $zip->open($src); // open the zip file to extract
if ($x === true) {
$zip->extractTo(app_path('SupportedApps')); // place in the directory with same name
$zip->close();
unlink($src); //Deleting the Zipped file
} else {
var_dump($x);
return false;
}
return true;
}
/**
* @param $details
* @param $app
* @return mixed
*/
public static function saveApp($details, $app)
{
$app->appid = $details->appid;
$app->name = $details->name;
$app->sha = $details->sha ?? null;
$app->icon = 'icons/'.$details->icon;
$app->website = $details->website;
$app->license = $details->license;
$appclass = $app->class();
$application = new $appclass;
$enhanced = (bool) ($application instanceof \App\EnhancedApps);
$app->class = $appclass;
$app->enhanced = $enhanced;
$app->tile_background = $details->tile_background;
$app->save();
return $app;
}
}

View file

@ -1,9 +0,0 @@
<?php namespace App\SupportedApps\Contracts;
interface Applications {
public function defaultColour();
public function icon();
}

View file

@ -1,11 +0,0 @@
<?php namespace App\SupportedApps\Contracts;
interface Livestats {
public function configDetails();
public function testConfig();
public function executeConfig();
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Duplicati implements Contracts\Applications {
public function defaultColour()
{
return '#2c3744';
}
public function icon()
{
return 'supportedapps/duplicati.png';
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Emby implements Contracts\Applications {
public function defaultColour()
{
return '#222';
}
public function icon()
{
return 'supportedapps/emby.png';
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Nextcloud implements Contracts\Applications {
public function defaultColour()
{
return '#0e2c3e';
}
public function icon()
{
return 'supportedapps/nextcloud.png';
}
}

View file

@ -1,80 +0,0 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Nzbget implements Contracts\Applications, Contracts\Livestats {
public $config;
public function defaultColour()
{
return '#253827';
}
public function icon()
{
return 'supportedapps/nzbget.png';
}
public function configDetails()
{
return 'nzbget';
}
public function testConfig()
{
$res = $this->buildRequest('status');
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$output = '';
$res = $this->buildRequest('status');
$data = json_decode($res->getBody());
//$data->result->RemainingSizeMB = '10000000';
//$data->result->DownloadRate = '100000000';
$size = $data->result->RemainingSizeMB;
$rate = $data->result->DownloadRate;
$queue_size = format_bytes($size*1000*1000, false, ' <span>', '</span>');
$current_speed = format_bytes($rate, false, ' <span>');
if($size > 0 || $rate > 0) {
$output = '
<ul class="livestats">
<li><span class="title">Queue</span><strong>'.$queue_size.'</strong></li>
<li><span class="title">Speed</span><strong>'.$current_speed.'/s</span></strong></li>
</ul>
';
}
return $output;
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$username = $config->username;
$password = $config->password;
$rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $url);
$rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
$api_url = $rebuild_url.'jsonrpc/'.$endpoint;
$client = new Client(['http_errors' => false]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Pfsense implements Contracts\Applications {
public function defaultColour()
{
return '#4e4742';
}
public function icon()
{
return 'supportedapps/pfsense.png';
}
}

View file

@ -1,70 +0,0 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Pihole implements Contracts\Applications, Contracts\Livestats {
public function defaultColour()
{
return '#352222';
}
public function icon()
{
return 'supportedapps/pihole.png';
}
public function configDetails()
{
return 'pihole';
}
public function testConfig()
{
$res = $this->buildRequest();
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$output = '';
$res = $this->buildRequest();
$data = json_decode($res->getBody());
$output = '
<ul class="livestats">
<li><span class="title">Domains<br />Blocked</span><strong>'.$data->domains_being_blocked.'</strong></li>
<li><span class="title">Blocked<br />Today</span><strong>'.$data->ads_blocked_today.'</span></strong></li>
</ul>
';
return $output;
}
public function buildRequest()
{
$config = $this->config;
$url = $config->url;
$api_url = $url.'admin/api.php';
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Plex implements Contracts\Applications {
public function defaultColour()
{
return '#222';
}
public function icon()
{
return 'supportedapps/plex.png';
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Plexpy implements Contracts\Applications {
public function defaultColour()
{
return '#2d2208';
}
public function icon()
{
return 'supportedapps/plexpy.png';
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Portainer implements Contracts\Applications {
public function defaultColour()
{
return '#283f44';
}
public function icon()
{
return 'supportedapps/portainer.png';
}
}

View file

@ -1,82 +0,0 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Sabnzbd implements Contracts\Applications, Contracts\Livestats {
public $config;
public function defaultColour()
{
return '#3e3924';
}
public function icon()
{
return 'supportedapps/sabnzbd.png';
}
public function configDetails()
{
return 'sabnzbd';
}
public function testConfig()
{
$res = $this->buildRequest('queue');
switch($res->getStatusCode()) {
case 200:
$data = json_decode($res->getBody());
if(isset($data->error) && !empty($data->error)) {
echo 'Failed: '.$data->error;
} else {
echo 'Successfully connected to the API';
}
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$output = '';
$res = $this->buildRequest('queue');
$data = json_decode($res->getBody());
//$data->result->RemainingSizeMB = '10000000';
//$data->result->DownloadRate = '100000000';
$size = $data->queue->mbleft;
$rate = $data->queue->kbpersec;
$queue_size = format_bytes($size*1000*1000, false, ' <span>', '</span>');
$current_speed = format_bytes($rate*1000, false, ' <span>');
if($size > 0 || $rate > 0) {
$output = '
<ul class="livestats">
<li><span class="title">Queue</span><strong>'.$queue_size.'</strong></li>
<li><span class="title">Speed</span><strong>'.$current_speed.'/s</span></strong></li>
</ul>
';
}
return $output;
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$apikey = $config->apikey;
$api_url = $url.'api?output=json&apikey='.$apikey.'&mode='.$endpoint;
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View file

@ -1,12 +0,0 @@
<?php namespace App\SupportedApps;
class Unifi implements Contracts\Applications {
public function defaultColour()
{
return '#363840';
}
public function icon()
{
return 'supportedapps/unifi.png';
}
}

View file

@ -2,20 +2,61 @@
namespace App; namespace App;
use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
// @codingStandardsIgnoreStart
/**
* App\User
*
* @property int $id
* @property string $username
* @property string $email
* @property string|null $avatar
* @property string|null $password
* @property string|null $autologin
* @property int $public_front
* @property string|null $remember_token
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Item[] $items
* @property-read int|null $items_count
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection|\Illuminate\Notifications\DatabaseNotification[] $notifications
* @property-read int|null $notifications_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Setting[] $settings
* @property-read int|null $settings_count
* @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|User newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|User query()
* @method static \Illuminate\Database\Eloquent\Builder|User whereAutologin($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereAvatar($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereEmail($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value)
* @method static \Illuminate\Database\Eloquent\Builder|User wherePublicFront($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereRememberToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereUsername($value)
* @mixin \Eloquent
*/
// @codingStandardsIgnoreEnd
class User extends Authenticatable class User extends Authenticatable
{ {
use Notifiable; use Notifiable;
use HasFactory;
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
* *
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'name', 'email', 'password', 'username', 'email', 'password',
]; ];
/** /**
@ -26,4 +67,44 @@ class User extends Authenticatable
protected $hidden = [ protected $hidden = [
'password', 'remember_token', 'password', 'remember_token',
]; ];
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* Get the items for the user.
*/
public function items(): HasMany
{
return $this->hasMany(Item::class);
}
/**
* The settings that belong to the user.
*/
public function settings(): BelongsToMany
{
return $this->belongsToMany(Setting::class)->withPivot('uservalue');
}
public static function currentUser()
{
$current_user = session('current_user');
if ($current_user) { // if logged in, set this user
return $current_user;
} else { // not logged in, get first user
$user = self::where('public_front', true)->first();
if (! $user) {
$user = self::first();
}
session(['current_user' => $user]);
return $user;
}
}
} }

View file

@ -12,7 +12,7 @@
*/ */
$app = new Illuminate\Foundation\Application( $app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../') $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
); );
/* /*

View file

@ -1,34 +1,48 @@
{ {
"name": "laravel/laravel", "name": "laravel/laravel",
"description": "The Laravel Framework.", "description": "The Laravel Framework.",
"keywords": ["framework", "laravel"], "keywords": [
"framework",
"laravel"
],
"license": "MIT", "license": "MIT",
"type": "project", "type": "project",
"require": { "require": {
"php": ">=7.0.0", "php": ">=7.4.32",
"fideloper/proxy": "~3.3", "facade/ignition": "^2.3.6",
"guzzlehttp/guzzle": "^6.3", "fideloper/proxy": "^4.0",
"laravel/framework": "5.5.*", "graham-campbell/github": "^10.5",
"laravel/tinker": "~1.0", "guzzlehttp/guzzle": "^7.4",
"laravelcollective/html": "^5.5" "laravel/framework": "^8.0",
"laravel/tinker": "^2.0",
"laravel/ui": "^3.0",
"laravelcollective/html": "^6.0",
"nunomaduro/collision": "^5.0",
"symfony/yaml": "^5.4",
"ext-json": "*",
"ext-intl": "*"
}, },
"require-dev": { "require-dev": {
"barryvdh/laravel-ide-helper": "^2.12",
"filp/whoops": "~2.0", "filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4", "fzaninotto/faker": "~1.4",
"mockery/mockery": "~1.0", "mockery/mockery": "~1.0",
"phpunit/phpunit": "~6.0", "phpunit/phpunit": "~9.0",
"squizlabs/php_codesniffer": "3.*",
"symfony/thanks": "^1.0" "symfony/thanks": "^1.0"
}, },
"autoload": { "autoload": {
"classmap": [ "classmap": [
"database/seeds", "database/seeders",
"database/factories" "database/factories"
], ],
"files": [ "files": [
"app/Helper.php" "app/Helper.php"
], ],
"psr-4": { "psr-4": {
"App\\": "app/" "App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
} }
}, },
"autoload-dev": { "autoload-dev": {
@ -39,6 +53,7 @@
"extra": { "extra": {
"laravel": { "laravel": {
"dont-discover": [ "dont-discover": [
"barryvdh/laravel-ide-helper"
] ]
} }
}, },
@ -52,11 +67,20 @@
"post-autoload-dump": [ "post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover" "@php artisan package:discover"
],
"post-update-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
"@php artisan ide-helper:generate",
"@php artisan ide-helper:meta"
] ]
}, },
"config": { "config": {
"preferred-install": "dist", "preferred-install": "dist",
"sort-packages": true, "sort-packages": true,
"optimize-autoloader": true "optimize-autoloader": true,
"allow-plugins": {
"kylekatarnls/update-helper": true,
"symfony/thanks": true
}
} }
} }

8256
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -13,8 +13,8 @@ return [
| |
*/ */
'name' => env('APP_NAME', 'Heimdall'), 'name' => env('APP_NAME', 'Heimdall'),
'version' => '1.3.0', 'version' => '2.5.8',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -40,7 +40,7 @@ return [
| |
*/ */
'debug' => env('APP_DEBUG', false), 'debug' => (bool) env('APP_DEBUG', false),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -55,6 +55,9 @@ return [
'url' => env('APP_URL', 'http://localhost'), 'url' => env('APP_URL', 'http://localhost'),
'asset_url' => env('ASSET_URL', null),
'appsource' => env('APP_SOURCE', 'https://appslist.heimdall.site/'),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Timezone | Application Timezone
@ -94,6 +97,19 @@ return [
'fallback_locale' => 'en', 'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Encryption Key | Encryption Key
@ -109,23 +125,6 @@ return [
'cipher' => 'AES-256-CBC', 'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Logging Configuration
|--------------------------------------------------------------------------
|
| Here you may configure the log settings for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Settings: "single", "daily", "syslog", "errorlog"
|
*/
'log' => env('APP_LOG', 'single'),
'log_level' => env('APP_LOG_LEVEL', 'debug'),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Autoloaded Service Providers | Autoloaded Service Providers
@ -194,6 +193,7 @@ return [
'aliases' => [ 'aliases' => [
'App' => Illuminate\Support\Facades\App::class, 'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class, 'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class, 'Blade' => Illuminate\Support\Facades\Blade::class,
@ -211,6 +211,7 @@ return [
'Gate' => Illuminate\Support\Facades\Gate::class, 'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class, 'Hash' => Illuminate\Support\Facades\Hash::class,
'Html' => Collective\Html\HtmlFacade::class, 'Html' => Collective\Html\HtmlFacade::class,
'Http' => Illuminate\Support\Facades\Http::class,
'Lang' => Illuminate\Support\Facades\Lang::class, 'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class, 'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class, 'Mail' => Illuminate\Support\Facades\Mail::class,
@ -225,9 +226,14 @@ return [
'Schema' => Illuminate\Support\Facades\Schema::class, 'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class, 'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class, 'Storage' => Illuminate\Support\Facades\Storage::class,
'Str' => Illuminate\Support\Str::class,
'URL' => Illuminate\Support\Facades\URL::class, 'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class, 'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class, 'View' => Illuminate\Support\Facades\View::class,
'Yaml' => Symfony\Component\Yaml\Yaml::class,
'SupportedApps' => App\SupportedApps::class,
'EnhancedApps' => App\EnhancedApps::class,
], ],

View file

@ -44,6 +44,7 @@ return [
'api' => [ 'api' => [
'driver' => 'token', 'driver' => 'token',
'provider' => 'users', 'provider' => 'users',
'hash' => false,
], ],
], ],
@ -96,7 +97,21 @@ return [
'provider' => 'users', 'provider' => 'users',
'table' => 'password_resets', 'table' => 'password_resets',
'expire' => 60, 'expire' => 60,
'throttle' => 60,
], ],
], ],
/*
|--------------------------------------------------------------------------
| Password Confirmation Timeout
|--------------------------------------------------------------------------
|
| Here you may define the amount of seconds before a password confirmation
| times out and the user is prompted to re-enter their password via the
| confirmation screen. By default, the timeout lasts for three hours.
|
*/
'password_timeout' => 10800,
]; ];

View file

@ -37,7 +37,7 @@ return [
'app_id' => env('PUSHER_APP_ID'), 'app_id' => env('PUSHER_APP_ID'),
'options' => [ 'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'), 'cluster' => env('PUSHER_APP_CLUSTER'),
'encrypted' => true, 'useTLS' => true,
], ],
], ],

View file

@ -1,5 +1,7 @@
<?php <?php
use Illuminate\Support\Str;
return [ return [
/* /*
@ -36,6 +38,7 @@ return [
'array' => [ 'array' => [
'driver' => 'array', 'driver' => 'array',
'serialize' => false,
], ],
'database' => [ 'database' => [
@ -73,6 +76,15 @@ return [
'connection' => 'default', 'connection' => 'default',
], ],
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
], ],
/* /*
@ -86,9 +98,6 @@ return [
| |
*/ */
'prefix' => env( 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
'CACHE_PREFIX',
str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
),
]; ];

View file

@ -1,5 +1,7 @@
<?php <?php
use Illuminate\Support\Str;
return [ return [
/* /*
@ -42,6 +44,7 @@ return [
'mysql' => [ 'mysql' => [
'driver' => 'mysql', 'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'), 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'), 'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'), 'database' => env('DB_DATABASE', 'forge'),
@ -51,12 +54,17 @@ return [
'charset' => 'utf8mb4', 'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci', 'collation' => 'utf8mb4_unicode_ci',
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true,
'strict' => true, 'strict' => true,
'engine' => null, 'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
], ],
'pgsql' => [ 'pgsql' => [
'driver' => 'pgsql', 'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'), 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'), 'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'), 'database' => env('DB_DATABASE', 'forge'),
@ -64,12 +72,14 @@ return [
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8', 'charset' => 'utf8',
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public', 'schema' => 'public',
'sslmode' => 'prefer', 'sslmode' => 'prefer',
], ],
'sqlsrv' => [ 'sqlsrv' => [
'driver' => 'sqlsrv', 'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'), 'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'), 'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'), 'database' => env('DB_DATABASE', 'forge'),
@ -77,8 +87,9 @@ return [
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8', 'charset' => 'utf8',
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true,
], ],
], ],
/* /*
@ -107,13 +118,27 @@ return [
'redis' => [ 'redis' => [
'client' => 'predis', 'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [ 'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'), 'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null), 'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379), 'port' => env('REDIS_PORT', '6379'),
'database' => 0, 'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
], ],
], ],

View file

@ -61,8 +61,10 @@ return [
'secret' => env('AWS_SECRET_ACCESS_KEY'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'), 'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'), 'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
], ],
], ],
]; ];

91
config/github.php Normal file
View file

@ -0,0 +1,91 @@
<?php
declare(strict_types=1);
/*
* This file is part of Laravel GitHub.
*
* (c) Graham Campbell <graham@alt-three.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
return [
/*
|--------------------------------------------------------------------------
| Default Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the connections below you wish to use as
| your default connection for all work. Of course, you may use many
| connections at once using the manager class.
|
*/
'default' => 'main',
/*
|--------------------------------------------------------------------------
| GitHub Connections
|--------------------------------------------------------------------------
|
| Here are each of the connections setup for your application. Example
| configuration has been included, but you may add as many connections as
| you would like. Note that the 5 supported authentication methods are:
| "application", "jwt", "none", "password", and "token".
|
*/
'connections' => [
'main' => [
'token' => 'your-token',
'method' => 'token',
// 'backoff' => false,
// 'cache' => false,
// 'version' => 'v3',
// 'enterprise' => false,
],
'app' => [
'clientId' => 'your-client-id',
'clientSecret' => 'your-client-secret',
'method' => 'application',
// 'backoff' => false,
// 'cache' => false,
// 'version' => 'v3',
// 'enterprise' => false,
],
'jwt' => [
'token' => 'your-jwt-token',
'method' => 'jwt',
// 'backoff' => false,
// 'cache' => false,
// 'version' => 'v3',
// 'enterprise' => false,
],
'other' => [
'username' => 'your-username',
'password' => 'your-password',
'method' => 'password',
// 'backoff' => false,
// 'cache' => false,
// 'version' => 'v3',
// 'enterprise' => false,
],
'none' => [
'method' => 'none',
// 'backoff' => false,
// 'cache' => false,
// 'version' => 'v3',
// 'enterprise' => false,
],
],
];

52
config/hashing.php Normal file
View file

@ -0,0 +1,52 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Hash Driver
|--------------------------------------------------------------------------
|
| This option controls the default hash driver that will be used to hash
| passwords for your application. By default, the bcrypt algorithm is
| used; however, you remain free to modify this option if you wish.
|
| Supported: "bcrypt", "argon", "argon2id"
|
*/
'driver' => 'bcrypt',
/*
|--------------------------------------------------------------------------
| Bcrypt Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Bcrypt algorithm. This will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'bcrypt' => [
'rounds' => env('BCRYPT_ROUNDS', 10),
],
/*
|--------------------------------------------------------------------------
| Argon Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Argon algorithm. These will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'argon' => [
'memory' => 1024,
'threads' => 2,
'time' => 2,
],
];

104
config/logging.php Normal file
View file

@ -0,0 +1,104 @@
<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'daily'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'papertrail' => [
'driver' => 'monolog',
'level' => 'debug',
'handler' => SyslogUdpHandler::class,
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];

View file

@ -4,18 +4,16 @@ return [
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Default Queue Driver | Default Queue Connection Name
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Laravel's queue API supports an assortment of back-ends via a single | Laravel's queue API supports an assortment of back-ends via a single
| API, giving you convenient access to each back-end using the same | API, giving you convenient access to each back-end using the same
| syntax for each one. Here you may set the default queue driver. | syntax for every one. Here you may define a default connection.
|
| Supported: "sync", "database", "beanstalkd", "sqs", "redis", "null"
| |
*/ */
'default' => env('QUEUE_DRIVER', 'sync'), 'default' => env('QUEUE_CONNECTION', 'sync'),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -26,6 +24,8 @@ return [
| is used by your application. A default configuration has been added | is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more. | for each back-end shipped with Laravel. You are free to add more.
| |
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
|
*/ */
'connections' => [ 'connections' => [
@ -46,22 +46,25 @@ return [
'host' => 'localhost', 'host' => 'localhost',
'queue' => 'default', 'queue' => 'default',
'retry_after' => 90, 'retry_after' => 90,
'block_for' => 0,
], ],
'sqs' => [ 'sqs' => [
'driver' => 'sqs', 'driver' => 'sqs',
'key' => env('SQS_KEY', 'your-public-key'), 'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('SQS_SECRET', 'your-secret-key'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'your-queue-name'), 'queue' => env('SQS_QUEUE', 'your-queue-name'),
'region' => env('SQS_REGION', 'us-east-1'), 'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
], ],
'redis' => [ 'redis' => [
'driver' => 'redis', 'driver' => 'redis',
'connection' => 'default', 'connection' => 'default',
'queue' => 'default', 'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90, 'retry_after' => 90,
'block_for' => null,
], ],
], ],
@ -78,6 +81,7 @@ return [
*/ */
'failed' => [ 'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
'database' => env('DB_CONNECTION', 'mysql'), 'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs', 'table' => 'failed_jobs',
], ],

View file

@ -8,31 +8,26 @@ return [
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| This file is for storing the credentials for third party services such | This file is for storing the credentials for third party services such
| as Stripe, Mailgun, SparkPost and others. This file provides a sane | as Mailgun, Postmark, AWS and more. This file provides the de facto
| default location for this type of information, allowing packages | location for this type of information, allowing packages to have
| to have a conventional place to find your various credentials. | a conventional file to locate the various service credentials.
| |
*/ */
'mailgun' => [ 'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'), 'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'), 'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
],
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
], ],
'ses' => [ 'ses' => [
'key' => env('SES_KEY'), 'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('SES_SECRET'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => 'us-east-1', 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
], ],
'sparkpost' => [
'secret' => env('SPARKPOST_SECRET'),
],
'stripe' => [
'model' => App\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],
]; ];

View file

@ -1,5 +1,7 @@
<?php <?php
use Illuminate\Support\Str;
return [ return [
/* /*
@ -70,7 +72,7 @@ return [
| |
*/ */
'connection' => null, 'connection' => env('SESSION_CONNECTION', null),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -96,7 +98,7 @@ return [
| |
*/ */
'store' => null, 'store' => env('SESSION_STORE', null),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -124,7 +126,7 @@ return [
'cookie' => env( 'cookie' => env(
'SESSION_COOKIE', 'SESSION_COOKIE',
str_slug(env('APP_NAME', 'laravel'), '_').'_session' Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
), ),
/* /*
@ -164,7 +166,7 @@ return [
| |
*/ */
'secure' => env('SESSION_SECURE_COOKIE', false), 'secure' => env('SESSION_SECURE_COOKIE'),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

View file

@ -28,6 +28,9 @@ return [
| |
*/ */
'compiled' => realpath(storage_path('framework/views')), 'compiled' => env(
'VIEW_COMPILED_PATH',
realpath(storage_path('framework/views'))
),
]; ];

3698
css/app.css vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Item;
use Illuminate\Database\Eloquent\Factories\Factory;
class ItemFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Item::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array
{
return [
'title' => $this->faker->unique()->text(),
'url' => $this->faker->unique()->url(),
];
}
}

View file

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Item;
use App\ItemTag;
use Illuminate\Database\Eloquent\Factories\Factory;
class ItemTagFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = ItemTag::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array
{
return [];
}
}

View file

@ -1,23 +1,47 @@
<?php <?php
use Faker\Generator as Faker; namespace Database\Factories;
/* use App\User;
|-------------------------------------------------------------------------- use Illuminate\Database\Eloquent\Factories\Factory;
| Model Factories use Illuminate\Support\Str;
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(App\User::class, function (Faker $faker) { class UserFactory extends Factory
return [ {
'name' => $faker->name, /**
'email' => $faker->unique()->safeEmail, * The name of the factory's corresponding model.
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret *
'remember_token' => str_random(10), * @var string
]; */
}); protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'username' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'public_front' => 1,
'remember_token' => Str::random(10),
];
}
/**
* Indicate that the model's email address should be unverified.
*
* @return \Illuminate\Database\Eloquent\Factories\Factory
*/
public function unverified()
{
return $this->state(function (array $attributes) {
return [
'email_verified_at' => null,
];
});
}
}

View file

@ -1,8 +1,8 @@
<?php <?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateItemsTable extends Migration class CreateItemsTable extends Migration
{ {

View file

@ -1,8 +1,8 @@
<?php <?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingsTable extends Migration class CreateSettingsTable extends Migration
{ {

View file

@ -1,8 +1,8 @@
<?php <?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingGroupsTable extends Migration class CreateSettingGroupsTable extends Migration
{ {

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddColumnsToItemsForGroups extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->integer('type')->default(0)->index(); // 0 = item, 1 = category
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['type']);
});
}
}

View file

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ItemTag extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('item_tag', function (Blueprint $table) {
$table->integer('item_id')->unsigned()->index();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('items')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('item_tag');
}
}

View file

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username')->unique();
$table->string('email');
$table->string('avatar')->nullable();
$table->string('password')->nullable();
$table->string('autologin')->nullable()->index();
$table->boolean('public_front')->default(false);
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePasswordResetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets');
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddUserIdToItemsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->integer('user_id')->default(1)->index(); // 0 = item, 1 = category
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['user_id']);
});
}
}

View file

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingUserPivotTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('setting_user', function (Blueprint $table) {
$table->integer('setting_id')->unsigned()->index();
$table->foreign('setting_id')->references('id')->on('settings')->onDelete('cascade');
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->primary(['setting_id', 'user_id']);
$table->string('uservalue')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('setting_user');
}
}

View file

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateApplicationsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('applications', function (Blueprint $table) {
$table->string('appid')->unique();
$table->string('name')->unique();
$table->string('sha')->unique()->nullable();
$table->string('icon')->nullable();
$table->string('website')->nullable();
$table->string('license')->nullable();
$table->mediumText('description')->nullable();
$table->boolean('enhanced')->default(false);
$table->string('tile_background')->default('dark');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('applications');
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddClassToItemsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->string('class')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['class']);
});
}
}

View file

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateJobsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('jobs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('queue')->index();
$table->longText('payload');
$table->unsignedTinyInteger('attempts');
$table->unsignedInteger('reserved_at')->nullable();
$table->unsignedInteger('available_at');
$table->unsignedInteger('created_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('jobs');
}
}

View file

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFailedJobsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('failed_jobs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->text('connection');
$table->text('queue');
$table->longText('payload');
$table->longText('exception');
$table->timestamp('failed_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('failed_jobs');
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddAppidToItems extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->string('appid')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['appid']);
});
}
}

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddClassToApplication extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('applications', function (Blueprint $table) {
$table->string('class')->nullable()->index();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('applications', function (Blueprint $table) {
$table->dropColumn(['class']);
});
}
}

Some files were not shown because too many files have changed in this diff Show more