Compare commits
515 Commits
master
...
backport/2
Author | SHA1 | Date |
---|---|---|
korelstar | 9cfd0b123d | |
dependabot-preview[bot] | 739bbc27c0 | |
Roeland Jago Douma | 3306c2fb35 | |
dependabot-preview[bot] | 9037a76efd | |
Julius Härtl | 80cda3b174 | |
Roeland Jago Douma | 51e279918f | |
Nextcloud bot | f5e5b07d05 | |
Roeland Jago Douma | e3090136b8 | |
Morris Jobke | c6af693dac | |
Roeland Jago Douma | 7ca8fd43a6 | |
Nextcloud bot | 1b7b7f077f | |
Nextcloud bot | c27540accf | |
Nextcloud bot | 6321d82522 | |
kesselb | 1f16f66550 | |
kesselb | 959c9e30cb | |
Roeland Jago Douma | dd6e1cf4fb | |
Nextcloud bot | df233efab9 | |
Roeland Jago Douma | 1ed66f2ac1 | |
Robin Appelman | 2fe8c42a97 | |
Roeland Jago Douma | 1dd4f0efc0 | |
Roeland Jago Douma | 6bc2d6d68e | |
Roeland Jago Douma | dd014059d7 | |
Bjoern Schiessle | a187bce7a3 | |
Nextcloud bot | 3bcc23ba2c | |
dependabot-preview[bot] | 8cd1f023da | |
dependabot-preview[bot] | 87a8b9a2fd | |
Nextcloud bot | 0ef3834b6c | |
dependabot-preview[bot] | 0e4f72e930 | |
dependabot-preview[bot] | e3c2f50174 | |
Nextcloud bot | 08b74729b9 | |
Nextcloud bot | 3fe1cbb107 | |
Nextcloud bot | 17e68b105e | |
dependabot-preview[bot] | ea79d7e93e | |
dependabot-preview[bot] | 1ddc2ecfde | |
Nextcloud bot | edd3f064c2 | |
Joas Schilling | 3d9abee6f0 | |
Morris Jobke | 59752ce269 | |
Morris Jobke | 1e25855db7 | |
Nextcloud bot | 8d91e00dcb | |
Morris Jobke | e9f513d60e | |
Valdnet | ae99737d95 | |
Valdnet | e80a5a0ee0 | |
Nextcloud bot | 0975394ba3 | |
John Molakvoæ | 1cdb80bb70 | |
Arthur Schiwon | c41a916250 | |
blizzz | 47148762c8 | |
Christoph Wurst | c42b4733bd | |
Nextcloud bot | 1c1d6a03ff | |
Nextcloud bot | 96e4b44fd8 | |
Nextcloud bot | a67681c8d0 | |
Roeland Jago Douma | d8650efaba | |
Roeland Jago Douma | a3c07f6e1f | |
Nextcloud bot | b6160045f4 | |
blizzz | 5415fff855 | |
Roeland Jago Douma | e0b09e2ff7 | |
Morris Jobke | 7d9111dbc3 | |
Roeland Jago Douma | f4135573d0 | |
Joas Schilling | ca8b2a6b5e | |
Nextcloud bot | 009b212684 | |
Joas Schilling | 5975a68033 | |
Joas Schilling | a1d746fe05 | |
Julius Härtl | 97b9e8f0bc | |
Julius Härtl | e2fffcda44 | |
Julius Härtl | 56561856ff | |
Joas Schilling | 7358312e45 | |
Nextcloud bot | 070380d9da | |
Arthur Schiwon | 4dc4b7617b | |
Lukas Reschke | 6d86506956 | |
Joas Schilling | ab595274c0 | |
Joas Schilling | 6a8d6beb57 | |
Julius Härtl | cfbb98b901 | |
Roeland Jago Douma | edd493defd | |
Nextcloud bot | 3012794e06 | |
Roeland Jago Douma | 4082318616 | |
Roeland Jago Douma | e075f80f41 | |
Roeland Jago Douma | c4acfa74e3 | |
Julius Härtl | b6f95360fd | |
Roeland Jago Douma | 5edb02dccf | |
Joas Schilling | d1756dde20 | |
Joas Schilling | 6ed9bb36ac | |
Joas Schilling | 2c1218826d | |
acsfer | 63fa7d9354 | |
acsfer | c12be83a0b | |
Roeland Jago Douma | 49d3fdf0c1 | |
dependabot-preview[bot] | 7709f90e22 | |
Maxence Lange | 35204381bb | |
dependabot-preview[bot] | 36b1e06c28 | |
Nextcloud bot | ec5942a1d0 | |
Nextcloud bot | 8676d77eec | |
Nextcloud bot | dfb6043634 | |
blizzz | f6e19b829d | |
Joas Schilling | 9505839f19 | |
Nextcloud bot | cdb9eb401e | |
Morris Jobke | 13e0556688 | |
Robin Appelman | f22fa87e6a | |
Arthur Schiwon | 04b851b8b8 | |
Roeland Jago Douma | 20a3df9888 | |
Roeland Jago Douma | 97e5fe43df | |
Morris Jobke | f7ac16f421 | |
Joas Schilling | f600fbf364 | |
Morris Jobke | a54eaeaaff | |
Nextcloud bot | b5bbf0021d | |
Roeland Jago Douma | 52c070acaa | |
Claas Augner | c0bd430246 | |
Morris Jobke | 144976bcb0 | |
Julius Härtl | 7e6e923d17 | |
Nextcloud bot | 3d24aef406 | |
Joas Schilling | 82edb9fe1a | |
Morris Jobke | 21dd86d1a7 | |
Morris Jobke | e930853429 | |
Vincent Petry | 1a839ce481 | |
Morris Jobke | c580dd5fe9 | |
Roeland Jago Douma | f915efc859 | |
Roeland Jago Douma | f7d88b0b5a | |
Morris Jobke | 1e542beaab | |
Morris Jobke | 44bbc2454b | |
Nextcloud bot | 7482baf138 | |
Arthur Schiwon | 92e1606c18 | |
Roeland Jago Douma | 872df4ab72 | |
Morris Jobke | e590f44c4a | |
Vincent Petry | fe0f1c792c | |
Roeland Jago Douma | 6bc4561f09 | |
Morris Jobke | 3e1a6778c2 | |
Morris Jobke | 871d20c54e | |
Nextcloud bot | f1d7e56cab | |
Nextcloud bot | 72a2b0663c | |
Maxopoly | 0f64b7cd0d | |
Nextcloud bot | c5e0d912c5 | |
dependabot-preview[bot] | 123da4ddac | |
dependabot-preview[bot] | 68906d2013 | |
Roeland Jago Douma | 50e897aa53 | |
Joas Schilling | 0214201008 | |
Nextcloud bot | a0472937af | |
Nextcloud bot | c2a4afccea | |
Nextcloud bot | 5cc58a04a3 | |
Roeland Jago Douma | 0b75897a69 | |
Jan C. Borchardt | fb588f4cbd | |
Jan C. Borchardt | 225eaab208 | |
Jan C. Borchardt | 0ba4ff060a | |
Nextcloud bot | 736933af7a | |
Joas Schilling | 385420c64f | |
Lukas Reschke | ad91f39c46 | |
Roeland Jago Douma | 87212ab097 | |
Lukas Reschke | b5838c5248 | |
Roeland Jago Douma | dcbe928371 | |
Valdnet | 0c3fcbac91 | |
Nextcloud bot | c2d01da31f | |
Nextcloud bot | 3198e50d5b | |
Nextcloud bot | 4ad8a5ae8f | |
Nextcloud bot | 0216927050 | |
Roeland Jago Douma | bd555dbe85 | |
Joas Schilling | ae8b0ffdbc | |
Roeland Jago Douma | 591aac3b03 | |
Joas Schilling | bffdbb1258 | |
Roeland Jago Douma | 3e4fa6728a | |
Roeland Jago Douma | 23148e7682 | |
Roeland Jago Douma | 58839f2923 | |
Roeland Jago Douma | c12f5482b2 | |
Nextcloud bot | 2e13dc2aa1 | |
Nextcloud bot | 1f3d1546dd | |
Lukas Reschke | d66e86c56c | |
Nextcloud bot | 6b67b81287 | |
Nextcloud bot | a9b5cde333 | |
Nextcloud bot | e85188f429 | |
Nextcloud bot | fe7ad83c76 | |
dependabot-preview[bot] | 5a47a7ae5d | |
dependabot-preview[bot] | 3b8fb0096b | |
John Molakvoæ | b59cf16325 | |
Nextcloud bot | e14860c8f2 | |
Roeland Jago Douma | fd6ffd0257 | |
blizzz | 21e2be4fb3 | |
Morris Jobke | 9010524442 | |
Julius Härtl | dc8e819915 | |
Julius Härtl | 89a19a338e | |
Robin Appelman | 17b64a4606 | |
Robin Appelman | 40507ca543 | |
Joas Schilling | e0dcf642de | |
Vincent Petry | 6ac708c99a | |
Julius Härtl | d6bad03a5c | |
Morris Jobke | 052c9abfdf | |
Joas Schilling | 0c348863e7 | |
Nextcloud bot | 737f755941 | |
Joas Schilling | f38248dcd4 | |
kesselb | 618a48487f | |
Julius Härtl | 00daf58da8 | |
Christoph Wurst | 0432b32535 | |
Christoph Wurst | 3e5fbd4ef1 | |
Nextcloud bot | 6d70bd9246 | |
Arthur Schiwon | caec3a8cee | |
Joas Schilling | e3927afe19 | |
Samuel | 3073732002 | |
Samuel | c49cff453c | |
Samuel | 22ddcfa740 | |
Julius Härtl | fc2e09b667 | |
Joas Schilling | b2072cd6fc | |
Christoph Wurst | ba1d671055 | |
Joas Schilling | 3afeb5c908 | |
Joas Schilling | 3ebe3a0e5f | |
Nextcloud bot | 68e9013c39 | |
Roeland Jago Douma | f9cef329ba | |
Joas Schilling | 2b8dfc03b6 | |
Roeland Jago Douma | 2cc0fd0f62 | |
J0WI | 6691bc4bd4 | |
Nick Sweeting | e7aefc3424 | |
Joas Schilling | a956c53e04 | |
Vincent Petry | 15e52fa7cb | |
Vincent Petry | 6cb5f36cf4 | |
Vincent Petry | 9ca91c15db | |
Vincent Petry | ec492eadfa | |
Vincent Petry | 92ff94083b | |
Vincent Petry | ecae714157 | |
Vincent Petry | ab22999eb9 | |
Vincent Petry | 2613826fcc | |
Vincent Petry | 73ec32d19b | |
Vincent Petry | 2fd62b4f0d | |
Vincent Petry | ad402ffc96 | |
Vincent Petry | b9d59e2994 | |
Vincent Petry | 5c854ba132 | |
Vincent Petry | 5d76574a81 | |
Vincent Petry | e2ab530ee3 | |
Vincent Petry | f45f826b52 | |
Nextcloud bot | d6156b970b | |
Nextcloud bot | f10f9d090a | |
Nextcloud bot | dd99255087 | |
Robin Appelman | 861fbd06a5 | |
Roeland Jago Douma | 785f6c63a0 | |
Roeland Jago Douma | d65ce19f6e | |
Roeland Jago Douma | cc5c93ffb3 | |
Roeland Jago Douma | 5d8df1bed2 | |
Christian Weiske | 74794bf100 | |
John Molakvoæ | 9a4cbba7f6 | |
Nextcloud bot | 9ddc6df797 | |
Morris Jobke | 82f6d632b6 | |
Morris Jobke | cf8be87e47 | |
Valdnet | 23ccae6840 | |
Robin Appelman | fdf7eb10a2 | |
Nextcloud bot | 769c6fedad | |
Morris Jobke | ffb7c51ca6 | |
Morris Jobke | f7922bdd0d | |
Morris Jobke | ba9e1c0d1a | |
Vincent Petry | bb7ff7f440 | |
Valdnet | 7a7bd29177 | |
Morris Jobke | 88b0b5aa40 | |
Morris Jobke | e5dc0b7ad1 | |
Vincent Petry | 447ccc1e55 | |
Vincent Petry | bad3243944 | |
Vincent Petry | 3e815f555d | |
Vincent Petry | 365c99b0be | |
Vincent Petry | 2c4b21b2fc | |
Vincent Petry | 544ea63613 | |
John Molakvoæ (skjnldsv) | e9fafce71b | |
Nextcloud bot | ef273fef4b | |
Robin Appelman | 03c430868a | |
Robin Appelman | 5a1ae2c3c0 | |
Robin Appelman | 2c565d68bc | |
Robin Appelman | d4381c0eac | |
Robin Appelman | 8551ee079d | |
Robin Appelman | 277c0039f6 | |
Robin Appelman | c8679885f6 | |
Robin Appelman | 423e1581e0 | |
Robin Appelman | 2500d296c5 | |
Robin Appelman | d2245734d4 | |
Robin Appelman | 680e21b7c5 | |
Nextcloud bot | c60f0e06d0 | |
Daniel Calviño Sánchez | e6ee498f88 | |
Daniel Calviño Sánchez | 4cb539bf09 | |
Morris Jobke | a07e171df7 | |
Roeland Jago Douma | e12e2ae8a3 | |
Joas Schilling | 3fd9d0dc50 | |
Joas Schilling | e9ea4a0f01 | |
Joas Schilling | f2acf492cf | |
Joas Schilling | 553a25e1a1 | |
John Molakvoæ | 83b7b6f474 | |
Valdnet | 207e8cbf9e | |
Valdnet | ba1e966439 | |
Nextcloud bot | 2e2d2e79e8 | |
Morris Jobke | 476c30b807 | |
Nextcloud bot | 89319b995f | |
Sascha Wiswedel | a52482246b | |
Roeland Jago Douma | b3bf640111 | |
Nextcloud bot | 798eff0161 | |
Robin Appelman | 7f066931e4 | |
Morris Jobke | eaae526ba7 | |
Morris Jobke | 06a9463e11 | |
Vincent Petry | 0e5379a7b3 | |
Robin Appelman | def56ca0cd | |
Vincent Petry | 695ccecf26 | |
Morris Jobke | 682df0b788 | |
Nextcloud bot | 942b40583c | |
Roeland Jago Douma | 8942d76f72 | |
Vincent Petry | 15cb3f0624 | |
Daniel Calviño Sánchez | 7e87b12271 | |
Daniel Calviño Sánchez | 388110a35e | |
Vincent Petry | 73d2f42d41 | |
Nextcloud bot | 4ebf9c2d1a | |
Morris Jobke | 0e642a5f5e | |
Morris Jobke | c1c377f609 | |
Morris Jobke | a70bdb962b | |
Morris Jobke | 95ebe5e819 | |
Arthur Schiwon | 4cd15b7815 | |
Morris Jobke | 4b3684fbc4 | |
Morris Jobke | aa8a31b3ec | |
Morris Jobke | a2d17c3c02 | |
kesselb | 5ecbfa4f20 | |
Robin Appelman | 0532f64aa8 | |
John Molakvoæ (skjnldsv) | 1be574319c | |
Vincent Petry | 215967db96 | |
Morris Jobke | 162e763e26 | |
Nextcloud bot | fd29c1d72a | |
Robin Appelman | 1089d8545b | |
Robin Appelman | 44d4957548 | |
Robin Appelman | f6f92e8bc6 | |
Robin Appelman | 719db4cee9 | |
Robin Appelman | bb180a95bb | |
Morris Jobke | 120aefb795 | |
Christoph Wurst | e09d59aa81 | |
Nextcloud bot | 8d6a4bef6c | |
Robin Appelman | e5ffb96c36 | |
Robin Appelman | c727879073 | |
Robin Appelman | ec0985ba68 | |
Robin Appelman | eb56b1d0bd | |
Robin Appelman | 046638abeb | |
Vincent Petry | f109677856 | |
Robin Appelman | f2a35cd3f8 | |
Roeland Jago Douma | 8806bbe6fe | |
Roeland Jago Douma | 7059b0b21f | |
Nextcloud bot | 7c21fba61f | |
Nextcloud bot | 0ea077ae1f | |
Nextcloud bot | 5b923eee03 | |
Robin Appelman | 6308267aff | |
Robin Appelman | a5ceded17f | |
Robin Appelman | b6af62fd24 | |
Roeland Jago Douma | 7f0f9fcd93 | |
Roeland Jago Douma | 3ac6dc3b50 | |
Joas Schilling | 2d92f1117b | |
Joas Schilling | 6951c4ef56 | |
Joas Schilling | 3efb2d2208 | |
Nextcloud bot | 6e2f7ddc7a | |
Julius Härtl | cd5e27e3f3 | |
Vincent Petry | 04dd7b234e | |
Vincent Petry | ec443159af | |
Vincent Petry | 1d0b210d00 | |
Roeland Jago Douma | 0e8ada1a8a | |
Joas Schilling | 62ef45028e | |
Joas Schilling | 5fa52d492a | |
Joas Schilling | 99c1eda9c5 | |
Joas Schilling | 490bfa7330 | |
Joas Schilling | 49f7d08b38 | |
Joas Schilling | 72fb176ec9 | |
Joas Schilling | 5afaf3d06c | |
Joas Schilling | 77f6d768bc | |
Joas Schilling | 8069c52a85 | |
Joas Schilling | 30610aa615 | |
Joas Schilling | c7560ab3a9 | |
Joas Schilling | 52d43bf3cc | |
Joas Schilling | 88855d8827 | |
Joas Schilling | 5af22f84b3 | |
Joas Schilling | 19ccc992d5 | |
Joas Schilling | 3feca65399 | |
Joas Schilling | ebb9f1d16a | |
Julius Härtl | 1a25b2e402 | |
Nextcloud bot | e28dbef7a1 | |
Robin Appelman | ac29f27b17 | |
Roeland Jago Douma | cc48b81411 | |
Roeland Jago Douma | f94c69123a | |
Joas Schilling | a659ee1c2d | |
Roeland Jago Douma | fa2dc9abc5 | |
kesselb | c74cccd12c | |
Vincent Petry | ff95956e5d | |
Roeland Jago Douma | 4c68aee72b | |
Roeland Jago Douma | 4cf3a9f81e | |
Julius Härtl | deb01f04da | |
Nextcloud bot | 3c07ae86ea | |
Roeland Jago Douma | 1ac8630a51 | |
Nextcloud bot | 45cc358d79 | |
Julius Härtl | ecb64381fb | |
Daniel Calviño Sánchez | 8185c46bd8 | |
Daniel Calviño Sánchez | 3a470c2ebe | |
Daniel Calviño Sánchez | b086a0f007 | |
Daniel Calviño Sánchez | 1058abc97c | |
Daniel Calviño Sánchez | 270db2f523 | |
Daniel Calviño Sánchez | 4c98d2949f | |
Daniel Calviño Sánchez | 34814adb36 | |
Daniel Calviño Sánchez | d03bc3e535 | |
Daniel Calviño Sánchez | f3a4ec723a | |
Roeland Jago Douma | 6842530d7f | |
Nextcloud bot | 48df1bef17 | |
Nextcloud bot | 0dc05f51ef | |
Roeland Jago Douma | e645482089 | |
Nextcloud bot | 5e6a891fce | |
Richard Steinmetz | 4c2159a622 | |
Vincent Petry | 9f7973a70e | |
Roeland Jago Douma | d81954f913 | |
Roeland Jago Douma | 3aba094d86 | |
Roeland Jago Douma | b4b55616c2 | |
Roeland Jago Douma | 01b9988a2d | |
Robin Appelman | 67d62a820c | |
Nextcloud bot | 163bf97c3e | |
Roeland Jago Douma | 8ab601cf66 | |
Roeland Jago Douma | 5e2a9de3f0 | |
Vincent Petry | 1575b09d0d | |
Roeland Jago Douma | 4df7cf1f54 | |
Roeland Jago Douma | 27e2f066a1 | |
Nextcloud bot | 5a39900c24 | |
Daniel Kesselberg | 549cefed15 | |
Roeland Jago Douma | 3922966f3c | |
Julius Härtl | f1363bcfde | |
Roeland Jago Douma | 7c8c8902fa | |
Nextcloud bot | 2a66d4e5d1 | |
Arthur Schiwon | 9d937489db | |
Roeland Jago Douma | 8aafd0d765 | |
Roeland Jago Douma | db5229bd70 | |
Robin Appelman | 36749161d7 | |
Julius Härtl | 472f6faf3f | |
Julius Härtl | 060a0101ae | |
Roeland Jago Douma | 65db84d0fc | |
Anna Larch | b5de59e4d7 | |
Jonas Rittershofer | 41930265e9 | |
kesselb | 097bdf973e | |
Nextcloud bot | 3aca170a3e | |
Roeland Jago Douma | b96a0cd77d | |
Roeland Jago Douma | d0f4bac711 | |
Roeland Jago Douma | 9c23684dcd | |
Sascha Wiswedel | 7897414f1a | |
Roeland Jago Douma | 256927d8d4 | |
Arthur Schiwon | 81fcc0a618 | |
Julius Härtl | 1f45359c26 | |
Nextcloud bot | 05978f40ff | |
Nextcloud bot | 38f40f821d | |
Nextcloud bot | a07d4d3ed5 | |
Nextcloud bot | b5eeca3ab3 | |
Christoph Wurst | 8ab3a3312c | |
Christoph Wurst | 2eb21bdceb | |
Nextcloud bot | d523d9973f | |
Nextcloud bot | 90fa31c280 | |
Joas Schilling | bffd87abf4 | |
Nextcloud bot | cb9edff655 | |
Nextcloud bot | f405de31da | |
Nextcloud bot | 8bdc933821 | |
Roeland Jago Douma | 8985b79306 | |
Nextcloud bot | 704dfee918 | |
Joas Schilling | 6ed4c604c7 | |
blizzz | 49b7b5ba53 | |
Roeland Jago Douma | 5c3dd4cc74 | |
Nextcloud bot | 7c11b9e974 | |
Christoph Wurst | cff48176c3 | |
Arthur Schiwon | 2df924bdce | |
Christoph Wurst | 2724bb8c86 | |
Roeland Jago Douma | ae8d2bd28a | |
Joas Schilling | a745d58133 | |
Nextcloud bot | 1db95da5d1 | |
Dan VerWeire | d3415f4bf9 | |
Christoph Wurst | 9fa902f0e2 | |
Nextcloud bot | b4b5d9b811 | |
Roeland Jago Douma | b32a4ba969 | |
Roeland Jago Douma | 4a2f46e188 | |
Joas Schilling | 82ab80e6e8 | |
Roeland Jago Douma | efa1ef5d69 | |
Nextcloud bot | 0c909dd072 | |
Nextcloud bot | cca4693fc7 | |
Joas Schilling | 219cc77719 | |
Nextcloud bot | 69daa9e0a8 | |
Roeland Jago Douma | 132966e149 | |
Roeland Jago Douma | 32a49e228b | |
Roeland Jago Douma | 2163ac59d5 | |
Nextcloud bot | a15066b840 | |
Christoph Wurst | 3878bcbc11 | |
Roeland Jago Douma | 1ddf59efc0 | |
Roeland Jago Douma | cb3199f061 | |
Elsie Hupp | 68ce1a9a0a | |
Elsie Hupp | 4551fdd2e3 | |
elsiehupp | f21fd1097e | |
Joas Schilling | 5164f43bd3 | |
Joas Schilling | 814a8acccc | |
Joas Schilling | cf11f914a7 | |
Joas Schilling | 8e43331d47 | |
Roeland Jago Douma | 1afa136060 | |
Nextcloud bot | a858513eee | |
Roeland Jago Douma | 0ea266e8bf | |
Nextcloud bot | c00819572f | |
Roeland Jago Douma | 7a09536114 | |
Nextcloud bot | 0fd3c5f8cb | |
Vincent Petry | 9696791460 | |
Nextcloud bot | 4257656130 | |
Nextcloud bot | 6d813b419e | |
Vincent Petry | a4d2581c65 | |
Nextcloud bot | 7216f876dd | |
Roeland Jago Douma | be4db2d48d | |
Roeland Jago Douma | f24ce39733 | |
Christoph Wurst | a35bebd7d4 | |
Roeland Jago Douma | ba63f588e7 | |
Roeland Jago Douma | fa6e799e31 | |
Roeland Jago Douma | 83d17b0fb4 | |
Nextcloud bot | 5ec0132c17 | |
Vincent Petry | a1e7ac9e33 | |
Vincent Petry | 04473c0f0e | |
Roeland Jago Douma | ee8c35614a | |
Nextcloud bot | 0ee17df264 | |
Roeland Jago Douma | 2acc4db356 | |
Christoph Wurst | f57fc89975 | |
Christoph Wurst | f4b32f9676 | |
Christoph Wurst | 62f9f4f7fc | |
Christoph Wurst | f8a87f8cdc | |
Christoph Wurst | b5fd6950a1 | |
Joas Schilling | fa3a2820f4 | |
Nextcloud bot | 207b7d54fb | |
James Letendre | 74d90d0165 | |
James Letendre | b65b2bbf55 | |
Arthur Schiwon | a834819abb | |
James Letendre | 5750d79181 | |
Arthur Schiwon | 6ebb368265 | |
Arthur Schiwon | cfc00aa2cd | |
Arthur Schiwon | e5b59531a3 | |
James Letendre | c9a724829a | |
Roeland Jago Douma | 43b101caeb |
|
@ -1,47 +0,0 @@
|
||||||
FROM ubuntu:focal
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
# PHP
|
|
||||||
RUN apt-get update -y
|
|
||||||
RUN apt-get install --no-install-recommends -y \
|
|
||||||
php7.4 \
|
|
||||||
php7.4-gd \
|
|
||||||
php7.4-zip \
|
|
||||||
php7.4-curl \
|
|
||||||
php7.4-xml \
|
|
||||||
php7.4-mbstring \
|
|
||||||
php7.4-sqlite \
|
|
||||||
php7.4-xdebug \
|
|
||||||
php7.4-pgsql \
|
|
||||||
php7.4-intl \
|
|
||||||
php7.4-imagick \
|
|
||||||
php7.4-gmp \
|
|
||||||
php7.4-apcu \
|
|
||||||
php7.4-bcmath \
|
|
||||||
libmagickcore-6.q16-3-extra \
|
|
||||||
curl \
|
|
||||||
vim \
|
|
||||||
lsof \
|
|
||||||
make \
|
|
||||||
nodejs \
|
|
||||||
npm
|
|
||||||
|
|
||||||
RUN echo "xdebug.remote_enable = 1" >> /etc/php/7.4/cli/conf.d/20-xdebug.ini
|
|
||||||
RUN echo "xdebug.remote_autostart = 1" >> /etc/php/7.4/cli/conf.d/20-xdebug.ini
|
|
||||||
|
|
||||||
# Docker
|
|
||||||
RUN apt-get -y install \
|
|
||||||
apt-transport-https \
|
|
||||||
ca-certificates \
|
|
||||||
curl \
|
|
||||||
gnupg-agent \
|
|
||||||
software-properties-common
|
|
||||||
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
|
|
||||||
RUN add-apt-repository \
|
|
||||||
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
|
|
||||||
$(lsb_release -cs) \
|
|
||||||
stable"
|
|
||||||
RUN apt-get update -y
|
|
||||||
RUN apt-get install -y docker-ce docker-ce-cli containerd.io
|
|
||||||
RUN ln -s /var/run/docker-host.sock /var/run/docker.sock
|
|
|
@ -1,18 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
$cloudEnvironmentId = getenv('CLOUDENV_ENVIRONMENT_ID');
|
|
||||||
|
|
||||||
$CONFIG = [
|
|
||||||
'mail_from_address' => 'no-reply',
|
|
||||||
'mail_smtpmode' => 'smtp',
|
|
||||||
'mail_sendmailmode' => 'smtp',
|
|
||||||
'mail_domain' => 'example.com',
|
|
||||||
'mail_smtphost' => 'localhost',
|
|
||||||
'mail_smtpport' => '1025',
|
|
||||||
'memcache.local' => '\OC\Memcache\APCu',
|
|
||||||
];
|
|
||||||
|
|
||||||
if($cloudEnvironmentId !== true) {
|
|
||||||
$CONFIG['overwritehost'] = $cloudEnvironmentId . '-80.apps.codespaces.githubusercontent.com';
|
|
||||||
$CONFIG['overwriteprotocol'] = 'https';
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
{
|
|
||||||
"name": "NextcloudServer",
|
|
||||||
"dockerComposeFile": "docker-compose.yml",
|
|
||||||
"service": "nextclouddev",
|
|
||||||
"postCreateCommand": ".devcontainer/setup.sh",
|
|
||||||
"forwardPorts": [
|
|
||||||
80,
|
|
||||||
8080,
|
|
||||||
8025
|
|
||||||
],
|
|
||||||
"runArgs": [
|
|
||||||
"--privileged"
|
|
||||||
],
|
|
||||||
"extensions": [
|
|
||||||
"felixfbecker.php-debug",
|
|
||||||
"felixfbecker.php-intellisense",
|
|
||||||
"ms-azuretools.vscode-docker"
|
|
||||||
],
|
|
||||||
"settings": {
|
|
||||||
"php.suggest.basic": false,
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
nextclouddev:
|
|
||||||
build: .
|
|
||||||
volumes:
|
|
||||||
- .:/workspace:cached
|
|
||||||
- /var/run/docker.sock:/var/run/docker-host.sock
|
|
||||||
command: /bin/sh -c "while sleep 1000; do :; done"
|
|
||||||
ports:
|
|
||||||
- 80:80
|
|
||||||
- 8080:8080
|
|
||||||
- 8025:8025
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: postgres
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
network_mode: service:nextclouddev
|
|
||||||
|
|
||||||
adminer:
|
|
||||||
image: adminer
|
|
||||||
restart: always
|
|
||||||
network_mode: service:nextclouddev
|
|
||||||
|
|
||||||
mailhog:
|
|
||||||
image: mailhog/mailhog
|
|
||||||
restart: always
|
|
||||||
network_mode: service:nextclouddev
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" >/dev/null 2>&1 && pwd )"
|
|
||||||
|
|
||||||
cd $DIR/
|
|
||||||
git submodule update --init
|
|
||||||
|
|
||||||
# Codespace config
|
|
||||||
cp .devcontainer/codespace.config.php config/codespace.config.php
|
|
425
.drone.yml
425
.drone.yml
File diff suppressed because it is too large
Load Diff
|
@ -1,11 +0,0 @@
|
||||||
# Ignoring folders for eslint
|
|
||||||
node_modules/
|
|
||||||
3rdparty/
|
|
||||||
**/vendor/
|
|
||||||
**/l10n/
|
|
||||||
**/js/*
|
|
||||||
*.config.js
|
|
||||||
tests/lib/
|
|
||||||
|
|
||||||
# TODO: remove when comments files is not using handlebar templates anymore
|
|
||||||
apps/comments/src/templates.js
|
|
|
@ -8,7 +8,7 @@ module.exports = {
|
||||||
escapeHTML: true,
|
escapeHTML: true,
|
||||||
oc_userconfig: true,
|
oc_userconfig: true,
|
||||||
dayNames: true,
|
dayNames: true,
|
||||||
firstDay: true,
|
firstDay: true
|
||||||
},
|
},
|
||||||
extends: ['@nextcloud'],
|
extends: ['@nextcloud'],
|
||||||
rules: {
|
rules: {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
custom: https://nextcloud.com/include/
|
|
|
@ -1,8 +1,8 @@
|
||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: ❓ Community Support and Help
|
- name: ❓ Question
|
||||||
url: https://help.nextcloud.com/
|
url: https://help.nextcloud.com/
|
||||||
about: Configuration, webserver/proxy or performance issues and other questions
|
about: I have a question …
|
||||||
- name: 💼 Nextcloud Enterprise
|
- name: 💼 Nextcloud Enterprise
|
||||||
url: https://portal.nextcloud.com/
|
url: https://portal.nextcloud.com/
|
||||||
about: If you are a Nextcloud Enterprise customer, or need Professional support, so it can be resolved directly by our dedicated engineers more quickly
|
about: If you are a customer and are using Nextcloud Enterprise, please submit your issue directly in the Nextcloud Portal so it can be resolved by our dedicated engineers more quickly.
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
# Linting and coding style
|
|
||||||
- package-ecosystem: composer
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
|
|
||||||
# Main master npm
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
open-pull-requests-limit: 10
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
|
|
||||||
# Testing master npm
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: "/build"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
|
|
||||||
# Testing master composer
|
|
||||||
- package-ecosystem: composer
|
|
||||||
directory: "/build/integration"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
|
|
||||||
|
|
||||||
# Main stableXX npm
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
target-branch: stable19
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
ignore:
|
|
||||||
# ignore all GitHub linguist patch updates
|
|
||||||
- dependency-name: "*"
|
|
||||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
|
||||||
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
target-branch: stable20
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
ignore:
|
|
||||||
# ignore all GitHub linguist patch updates
|
|
||||||
- dependency-name: "*"
|
|
||||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
|
||||||
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
target-branch: stable21
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
ignore:
|
|
||||||
# ignore all GitHub linguist patch updates
|
|
||||||
- dependency-name: "*"
|
|
||||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
|
||||||
|
|
||||||
# Testing StableXX composer
|
|
||||||
- package-ecosystem: composer
|
|
||||||
directory: "/build/integration"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
target-branch: stable19
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
ignore:
|
|
||||||
# ignore all GitHub linguist patch updates
|
|
||||||
- dependency-name: "*"
|
|
||||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
|
||||||
|
|
||||||
- package-ecosystem: composer
|
|
||||||
directory: "/build/integration"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
target-branch: stable20
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
ignore:
|
|
||||||
# ignore all GitHub linguist patch updates
|
|
||||||
- dependency-name: "*"
|
|
||||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
|
||||||
|
|
||||||
- package-ecosystem: composer
|
|
||||||
directory: "/build/integration"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:00"
|
|
||||||
timezone: Europe/Paris
|
|
||||||
target-branch: stable21
|
|
||||||
labels:
|
|
||||||
- "3. to review"
|
|
||||||
- "feature: dependencies"
|
|
||||||
reviewers:
|
|
||||||
- "nextcloud/server-dependabot"
|
|
||||||
ignore:
|
|
||||||
# ignore all GitHub linguist patch updates
|
|
||||||
- dependency-name: "*"
|
|
||||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: Dependabot
|
name: Dependabot
|
||||||
on: pull_request_target
|
on: pull_request
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
auto-merge:
|
auto-merge:
|
||||||
|
@ -7,15 +7,13 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
# Default github action approve
|
# Default github action approve
|
||||||
- uses: hmarr/auto-approve-action@v2.0.0
|
- uses: hmarr/auto-approve-action@v2.0.0
|
||||||
if: github.ref == 'refs/heads/master' &&
|
if: github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]'
|
||||||
(github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]')
|
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
# Nextcloud bot approve and merge request
|
# Nextcloud bot approve and merge request
|
||||||
- uses: ahmadnassri/action-dependabot-auto-merge@v2
|
- uses: ahmadnassri/action-dependabot-auto-merge@v1
|
||||||
if: github.ref == 'refs/heads/master' &&
|
if: github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]'
|
||||||
(github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]')
|
|
||||||
with:
|
with:
|
||||||
target: minor
|
target: patch
|
||||||
github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }}
|
github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }}
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
name: Pull request checks
|
|
||||||
on: pull_request
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
commit-message-check:
|
|
||||||
name: Block fixup and squash commits
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Run check
|
|
||||||
uses: xt0rted/block-autosquash-commits-action@main
|
|
||||||
with:
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
@ -15,7 +15,6 @@ jobs:
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@master
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
extensions: ctype,curl,dom,fileinfo,gd,iconv,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
|
||||||
coverage: none
|
coverage: none
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: composer run lint
|
run: composer run lint
|
||||||
|
@ -30,7 +29,6 @@ jobs:
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@master
|
||||||
with:
|
with:
|
||||||
php-version: 7.4
|
php-version: 7.4
|
||||||
extensions: ctype,curl,dom,fileinfo,gd,iconv,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
|
||||||
coverage: none
|
coverage: none
|
||||||
tools: cs2pr
|
tools: cs2pr
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
@ -40,25 +38,3 @@ jobs:
|
||||||
composer run cs:check -- --format=checkstyle | cs2pr
|
composer run cs:check -- --format=checkstyle | cs2pr
|
||||||
composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 )
|
composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 )
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
node:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [12.x]
|
|
||||||
|
|
||||||
name: eslint node${{ matrix.node-version }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Set up node ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Lint
|
|
||||||
run: npm run lint
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ jobs:
|
||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@v2
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
extensions: ctype,curl,dom,fileinfo,gd,iconv,intl,json,mbstring,oci8,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, oci8
|
||||||
tools: phpunit:8.5.2
|
tools: phpunit:8.5.2
|
||||||
coverage: none
|
coverage: none
|
||||||
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
name: Psalm show github
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- stable*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
psalm:
|
|
||||||
name: Psalm
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
- name: Psalm
|
|
||||||
uses: docker://vimeo/psalm-github-actions
|
|
||||||
continue-on-error: true
|
|
||||||
with:
|
|
||||||
composer_ignore_platform_reqs: false
|
|
||||||
report_file: results.sarif
|
|
||||||
- name: Upload Analysis results to GitHub
|
|
||||||
uses: github/codeql-action/upload-sarif@v1
|
|
||||||
with:
|
|
||||||
sarif_file: results.sarif
|
|
|
@ -1,11 +1,10 @@
|
||||||
name: Psalm Security Analysis
|
name: Psalm Security Analysis
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
pull_request:
|
||||||
- master
|
schedule:
|
||||||
- stable*
|
- cron: '0 0 * * 0'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
psalm:
|
psalm:
|
||||||
|
@ -20,7 +19,6 @@ jobs:
|
||||||
uses: docker://vimeo/psalm-github-actions
|
uses: docker://vimeo/psalm-github-actions
|
||||||
with:
|
with:
|
||||||
security_analysis: true
|
security_analysis: true
|
||||||
composer_ignore_platform_reqs: false
|
|
||||||
report_file: results.sarif
|
report_file: results.sarif
|
||||||
- name: Upload Security Analysis results to GitHub
|
- name: Upload Security Analysis results to GitHub
|
||||||
uses: github/codeql-action/upload-sarif@v1
|
uses: github/codeql-action/upload-sarif@v1
|
||||||
|
|
|
@ -17,7 +17,6 @@ jobs:
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@master
|
||||||
with:
|
with:
|
||||||
php-version: 7.4
|
php-version: 7.4
|
||||||
extensions: ctype,curl,dom,fileinfo,gd,iconv,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
|
||||||
coverage: none
|
coverage: none
|
||||||
- name: Composer install
|
- name: Composer install
|
||||||
run: composer i
|
run: composer i
|
||||||
|
@ -43,7 +42,6 @@ jobs:
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@master
|
||||||
with:
|
with:
|
||||||
php-version: 7.4
|
php-version: 7.4
|
||||||
extensions: ctype,curl,dom,fileinfo,gd,iconv,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
|
||||||
coverage: none
|
coverage: none
|
||||||
- name: Composer install
|
- name: Composer install
|
||||||
run: composer i
|
run: composer i
|
||||||
|
|
|
@ -19,7 +19,6 @@ jobs:
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@master
|
||||||
with:
|
with:
|
||||||
php-version: 7.4
|
php-version: 7.4
|
||||||
extensions: ctype,curl,dom,fileinfo,gd,iconv,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
|
||||||
coverage: none
|
coverage: none
|
||||||
- name: Composer install
|
- name: Composer install
|
||||||
run: composer i
|
run: composer i
|
||||||
|
|
|
@ -9,15 +9,12 @@ use Nextcloud\CodingStandard\Config;
|
||||||
$config = new Config();
|
$config = new Config();
|
||||||
$config
|
$config
|
||||||
->getFinder()
|
->getFinder()
|
||||||
|
->ignoreVCSIgnored(true)
|
||||||
->exclude('config')
|
->exclude('config')
|
||||||
->exclude('data')
|
->exclude('data')
|
||||||
->notPath('3rdparty')
|
->notPath('3rdparty')
|
||||||
->notPath('build/integration/vendor')
|
|
||||||
->notPath('build/lib')
|
|
||||||
->notPath('build/node_modules')
|
|
||||||
->notPath('build/stubs')
|
->notPath('build/stubs')
|
||||||
->notPath('composer')
|
->notPath('composer')
|
||||||
->notPath('node_modules')
|
|
||||||
->notPath('vendor')
|
->notPath('vendor')
|
||||||
->in(__DIR__);
|
->in(__DIR__);
|
||||||
return $config;
|
return $config;
|
||||||
|
|
2
3rdparty
2
3rdparty
|
@ -1 +1 @@
|
||||||
Subproject commit 0d7c15582f5d2478f333c0487acf88ae881d9206
|
Subproject commit fbc872de93b18d3e87367d00e281982eab74c5b9
|
2
AUTHORS
2
AUTHORS
|
@ -133,7 +133,7 @@ Nextcloud is written by:
|
||||||
- Joel S <joel.devbox@protonmail.com>
|
- Joel S <joel.devbox@protonmail.com>
|
||||||
- Johan Björk <johanimon@gmail.com>
|
- Johan Björk <johanimon@gmail.com>
|
||||||
- Johannes Ernst <jernst@indiecomputing.com>
|
- Johannes Ernst <jernst@indiecomputing.com>
|
||||||
- Johannes Leuker <developers@hosting.de>
|
- Johannes Leuker <j.leuker@hosting.de>
|
||||||
- Johannes Riedel <joeried@users.noreply.github.com>
|
- Johannes Riedel <joeried@users.noreply.github.com>
|
||||||
- Johannes Schlichenmaier <johannes@schlichenmaier.info>
|
- Johannes Schlichenmaier <johannes@schlichenmaier.info>
|
||||||
- Johannes Willnecker <johannes@willnecker.com>
|
- Johannes Willnecker <johannes@willnecker.com>
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -1,7 +1,7 @@
|
||||||
all: clean dev-setup build-js-production
|
all: clean dev-setup build-js-production
|
||||||
|
|
||||||
# Dev env management
|
# Dev env management
|
||||||
dev-setup: clean npm-init
|
dev-setup: clean clean-dev npm-init
|
||||||
|
|
||||||
npm-init:
|
npm-init:
|
||||||
npm ci
|
npm ci
|
||||||
|
@ -43,6 +43,9 @@ clean:
|
||||||
rm -rf apps/workflowengine/js/
|
rm -rf apps/workflowengine/js/
|
||||||
rm -rf core/js/dist
|
rm -rf core/js/dist
|
||||||
|
|
||||||
|
clean-dev:
|
||||||
|
rm -rf node_modules
|
||||||
|
|
||||||
clean-git: clean
|
clean-git: clean
|
||||||
git checkout -- apps/accessibility/js/
|
git checkout -- apps/accessibility/js/
|
||||||
git checkout -- apps/comments/js/
|
git checkout -- apps/comments/js/
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="21" max-version="21"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<repair-steps>
|
<repair-steps>
|
||||||
|
|
|
@ -2,9 +2,8 @@
|
||||||
$color-main-text: #d8d8d8;
|
$color-main-text: #d8d8d8;
|
||||||
$color-main-background: #181818;
|
$color-main-background: #181818;
|
||||||
|
|
||||||
$color-background-hover: lighten($color-main-background, 4%);
|
$color-background-dark: lighten($color-main-background, 4%);
|
||||||
$color-background-dark: lighten($color-main-background, 7%);
|
$color-background-darker: lighten($color-main-background, 8%);
|
||||||
$color-background-darker: lighten($color-main-background, 14%);
|
|
||||||
|
|
||||||
$color-placeholder-light: lighten($color-main-background, 10%);
|
$color-placeholder-light: lighten($color-main-background, 10%);
|
||||||
$color-placeholder-dark: lighten($color-main-background, 20%);
|
$color-placeholder-dark: lighten($color-main-background, 20%);
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,9 +1,9 @@
|
||||||
OC.L10N.register(
|
OC.L10N.register(
|
||||||
"accessibility",
|
"accessibility",
|
||||||
{
|
{
|
||||||
"Dark theme" : "زمینه تیره",
|
"Dark theme" : "تم تاریک",
|
||||||
"Enable dark theme" : "فعالسازی زمینه تیره",
|
"Enable dark theme" : "فعالسازی تم تاریک",
|
||||||
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "یک زمینه تیره برای راحتی چشمهای شما با کاهش رویهمرفته درخشندگی و روشنایی. این امکان هنوز در حال توسعه میباشد، بنابراین در صورت مشاهده هرگونه ایراد، آن را گزارش کنید.",
|
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "تم تاریک برای با کاهش نور و نیز شفافیت برای راحتی بیشتر چشمان شما در استفاده از نکست کلود تعبیه دیده شده است و این امکان در حال توسعه می باشد،به همین دلیل هرگونه ایراد پیش آمده را گزارش دهید.",
|
||||||
"High contrast mode" : "حالت با کنتراست بالا",
|
"High contrast mode" : "حالت با کنتراست بالا",
|
||||||
"Enable high contrast mode" : "فعالسازی حالت کنتراست بالا",
|
"Enable high contrast mode" : "فعالسازی حالت کنتراست بالا",
|
||||||
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "یک حالت کنتراست بالا برای سهولت در پیمایش. کیفیت بصری کاهش می یابد اما وضوح افزایش می یابد.",
|
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "یک حالت کنتراست بالا برای سهولت در پیمایش. کیفیت بصری کاهش می یابد اما وضوح افزایش می یابد.",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{ "translations": {
|
{ "translations": {
|
||||||
"Dark theme" : "زمینه تیره",
|
"Dark theme" : "تم تاریک",
|
||||||
"Enable dark theme" : "فعالسازی زمینه تیره",
|
"Enable dark theme" : "فعالسازی تم تاریک",
|
||||||
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "یک زمینه تیره برای راحتی چشمهای شما با کاهش رویهمرفته درخشندگی و روشنایی. این امکان هنوز در حال توسعه میباشد، بنابراین در صورت مشاهده هرگونه ایراد، آن را گزارش کنید.",
|
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "تم تاریک برای با کاهش نور و نیز شفافیت برای راحتی بیشتر چشمان شما در استفاده از نکست کلود تعبیه دیده شده است و این امکان در حال توسعه می باشد،به همین دلیل هرگونه ایراد پیش آمده را گزارش دهید.",
|
||||||
"High contrast mode" : "حالت با کنتراست بالا",
|
"High contrast mode" : "حالت با کنتراست بالا",
|
||||||
"Enable high contrast mode" : "فعالسازی حالت کنتراست بالا",
|
"Enable high contrast mode" : "فعالسازی حالت کنتراست بالا",
|
||||||
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "یک حالت کنتراست بالا برای سهولت در پیمایش. کیفیت بصری کاهش می یابد اما وضوح افزایش می یابد.",
|
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "یک حالت کنتراست بالا برای سهولت در پیمایش. کیفیت بصری کاهش می یابد اما وضوح افزایش می یابد.",
|
||||||
|
|
|
@ -40,9 +40,9 @@ use OCP\AppFramework\Http;
|
||||||
use OCP\AppFramework\Http\DataDisplayResponse;
|
use OCP\AppFramework\Http\DataDisplayResponse;
|
||||||
use OCP\AppFramework\Utility\ITimeFactory;
|
use OCP\AppFramework\Utility\ITimeFactory;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\ILogger;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
use ScssPhp\ScssPhp\Compiler;
|
use ScssPhp\ScssPhp\Compiler;
|
||||||
use ScssPhp\ScssPhp\Exception\ParserException;
|
use ScssPhp\ScssPhp\Exception\ParserException;
|
||||||
use ScssPhp\ScssPhp\OutputStyle;
|
use ScssPhp\ScssPhp\OutputStyle;
|
||||||
|
@ -58,7 +58,7 @@ class AccessibilityController extends Controller {
|
||||||
/** @var IConfig */
|
/** @var IConfig */
|
||||||
private $config;
|
private $config;
|
||||||
|
|
||||||
/** @var LoggerInterface */
|
/** @var ILogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
/** @var ITimeFactory */
|
/** @var ITimeFactory */
|
||||||
|
@ -82,7 +82,7 @@ class AccessibilityController extends Controller {
|
||||||
public function __construct(string $appName,
|
public function __construct(string $appName,
|
||||||
IRequest $request,
|
IRequest $request,
|
||||||
IConfig $config,
|
IConfig $config,
|
||||||
LoggerInterface $logger,
|
ILogger $logger,
|
||||||
ITimeFactory $timeFactory,
|
ITimeFactory $timeFactory,
|
||||||
IUserSession $userSession,
|
IUserSession $userSession,
|
||||||
IAppManager $appManager,
|
IAppManager $appManager,
|
||||||
|
@ -145,12 +145,7 @@ class AccessibilityController extends Controller {
|
||||||
'@import "css-variables.scss";'
|
'@import "css-variables.scss";'
|
||||||
);
|
);
|
||||||
} catch (ParserException $e) {
|
} catch (ParserException $e) {
|
||||||
$this->logger->error($e->getMessage(),
|
$this->logger->error($e->getMessage(), ['app' => 'core']);
|
||||||
[
|
|
||||||
'app' => 'core',
|
|
||||||
'exception' => $e,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,12 +254,7 @@ class AccessibilityController extends Controller {
|
||||||
$scss->compile($variables);
|
$scss->compile($variables);
|
||||||
$this->injectedVariables = $variables;
|
$this->injectedVariables = $variables;
|
||||||
} catch (ParserException $e) {
|
} catch (ParserException $e) {
|
||||||
$this->logger->error($e->getMessage(),
|
$this->logger->logException($e, ['app' => 'core']);
|
||||||
[
|
|
||||||
'app' => 'core',
|
|
||||||
'exception' => $e,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return $variables;
|
return $variables;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ class ConfigController extends OCSController {
|
||||||
$highcontrast = [$this->accessibilityProvider->getHighContrast()];
|
$highcontrast = [$this->accessibilityProvider->getHighContrast()];
|
||||||
$fonts = $this->accessibilityProvider->getFonts();
|
$fonts = $this->accessibilityProvider->getFonts();
|
||||||
|
|
||||||
$availableOptions = array_map(function ($option): string {
|
$availableOptions = array_map(function ($option) {
|
||||||
return $option['id'];
|
return $option['id'];
|
||||||
}, array_merge($themes, $highcontrast, $fonts));
|
}, array_merge($themes, $highcontrast, $fonts));
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@ namespace OCA\Accessibility\Settings;
|
||||||
|
|
||||||
use OCA\Accessibility\AccessibilityProvider;
|
use OCA\Accessibility\AccessibilityProvider;
|
||||||
use OCP\AppFramework\Http\TemplateResponse;
|
use OCP\AppFramework\Http\TemplateResponse;
|
||||||
use OCP\AppFramework\Services\IInitialState;
|
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\IInitialStateService;
|
||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
use OCP\IURLGenerator;
|
use OCP\IURLGenerator;
|
||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
|
@ -55,16 +55,26 @@ class Personal implements ISettings {
|
||||||
/** @var AccessibilityProvider */
|
/** @var AccessibilityProvider */
|
||||||
private $accessibilityProvider;
|
private $accessibilityProvider;
|
||||||
|
|
||||||
/** @var IInitialState */
|
/** @var IInitialStateService */
|
||||||
private $initialStateService;
|
private $initialStateService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Settings constructor.
|
||||||
|
*
|
||||||
|
* @param string $appName
|
||||||
|
* @param IConfig $config
|
||||||
|
* @param IUserSession $userSession
|
||||||
|
* @param IL10N $l
|
||||||
|
* @param IURLGenerator $urlGenerator
|
||||||
|
* @param AccessibilityProvider $accessibilityProvider
|
||||||
|
*/
|
||||||
public function __construct(string $appName,
|
public function __construct(string $appName,
|
||||||
IConfig $config,
|
IConfig $config,
|
||||||
IUserSession $userSession,
|
IUserSession $userSession,
|
||||||
IL10N $l,
|
IL10N $l,
|
||||||
IURLGenerator $urlGenerator,
|
IURLGenerator $urlGenerator,
|
||||||
AccessibilityProvider $accessibilityProvider,
|
AccessibilityProvider $accessibilityProvider,
|
||||||
IInitialState $initialStateService) {
|
IInitialStateService $initialStateService) {
|
||||||
$this->appName = $appName;
|
$this->appName = $appName;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->userSession = $userSession;
|
$this->userSession = $userSession;
|
||||||
|
@ -78,7 +88,7 @@ class Personal implements ISettings {
|
||||||
* @return TemplateResponse returns the instance with all parameters set, ready to be rendered
|
* @return TemplateResponse returns the instance with all parameters set, ready to be rendered
|
||||||
* @since 9.1
|
* @since 9.1
|
||||||
*/
|
*/
|
||||||
public function getForm(): TemplateResponse {
|
public function getForm() {
|
||||||
Util::addScript('accessibility', 'accessibility');
|
Util::addScript('accessibility', 'accessibility');
|
||||||
Util::addStyle('accessibility', 'style');
|
Util::addStyle('accessibility', 'style');
|
||||||
|
|
||||||
|
@ -94,8 +104,8 @@ class Personal implements ISettings {
|
||||||
'font' => $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'font', false)
|
'font' => $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'font', false)
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->initialStateService->provideInitialState('available-config', $availableConfig);
|
$this->initialStateService->provideInitialState($this->appName, 'available-config', $availableConfig);
|
||||||
$this->initialStateService->provideInitialState('user-config', $userConfig);
|
$this->initialStateService->provideInitialState($this->appName, 'user-config', $userConfig);
|
||||||
|
|
||||||
return new TemplateResponse($this->appName, 'settings-personal');
|
return new TemplateResponse($this->appName, 'settings-personal');
|
||||||
}
|
}
|
||||||
|
@ -104,7 +114,7 @@ class Personal implements ISettings {
|
||||||
* @return string the section ID, e.g. 'sharing'
|
* @return string the section ID, e.g. 'sharing'
|
||||||
* @since 9.1
|
* @since 9.1
|
||||||
*/
|
*/
|
||||||
public function getSection(): string {
|
public function getSection() {
|
||||||
return $this->appName;
|
return $this->appName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,7 +126,7 @@ class Personal implements ISettings {
|
||||||
* E.g.: 70
|
* E.g.: 70
|
||||||
* @since 9.1
|
* @since 9.1
|
||||||
*/
|
*/
|
||||||
public function getPriority(): int {
|
public function getPriority() {
|
||||||
return 40;
|
return 40;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* @copyright Copyright (c) 2020 Roeland Jago Douma <roeland@famdouma.nl>
|
* @copyright Copyright (c) 2020 Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
*
|
*
|
||||||
* @author Jan C. Borchardt <hey@jancborchardt.net>
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||||
*
|
*
|
||||||
* @license GNU AGPL version 3 or any later version
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
@ -18,9 +18,7 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { loadState } from '@nextcloud/initial-state'
|
import { loadState } from '@nextcloud/initial-state'
|
||||||
|
|
||||||
OCA.Accessibility = loadState('accessibility', 'data')
|
OCA.Accessibility = loadState('accessibility', 'data')
|
||||||
|
|
|
@ -17,9 +17,7 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import { loadState } from '@nextcloud/initial-state'
|
import { loadState } from '@nextcloud/initial-state'
|
||||||
import App from './Accessibility.vue'
|
import App from './Accessibility.vue'
|
||||||
|
|
|
@ -1,25 +1,3 @@
|
||||||
/**
|
|
||||||
* @copyright Copyright (c) 2016 John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
*
|
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<category>monitoring</category>
|
<category>monitoring</category>
|
||||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="21" max-version="21"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<background-jobs>
|
<background-jobs>
|
||||||
<job>OCA\AdminAudit\BackgroundJobs\Rotate</job>
|
<job>OCA\AdminAudit\BackgroundJobs\Rotate</job>
|
||||||
|
|
|
@ -20,5 +20,4 @@ return array(
|
||||||
'OCA\\AdminAudit\\Actions\\Versions' => $baseDir . '/../lib/Actions/Versions.php',
|
'OCA\\AdminAudit\\Actions\\Versions' => $baseDir . '/../lib/Actions/Versions.php',
|
||||||
'OCA\\AdminAudit\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
'OCA\\AdminAudit\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||||
'OCA\\AdminAudit\\BackgroundJobs\\Rotate' => $baseDir . '/../lib/BackgroundJobs/Rotate.php',
|
'OCA\\AdminAudit\\BackgroundJobs\\Rotate' => $baseDir . '/../lib/BackgroundJobs/Rotate.php',
|
||||||
'OCA\\AdminAudit\\Listener\\CriticalActionPerformedEventListener' => $baseDir . '/../lib/Listener/CriticalActionPerformedEventListener.php',
|
|
||||||
);
|
);
|
||||||
|
|
|
@ -35,7 +35,6 @@ class ComposerStaticInitAdminAudit
|
||||||
'OCA\\AdminAudit\\Actions\\Versions' => __DIR__ . '/..' . '/../lib/Actions/Versions.php',
|
'OCA\\AdminAudit\\Actions\\Versions' => __DIR__ . '/..' . '/../lib/Actions/Versions.php',
|
||||||
'OCA\\AdminAudit\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
'OCA\\AdminAudit\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||||
'OCA\\AdminAudit\\BackgroundJobs\\Rotate' => __DIR__ . '/..' . '/../lib/BackgroundJobs/Rotate.php',
|
'OCA\\AdminAudit\\BackgroundJobs\\Rotate' => __DIR__ . '/..' . '/../lib/BackgroundJobs/Rotate.php',
|
||||||
'OCA\\AdminAudit\\Listener\\CriticalActionPerformedEventListener' => __DIR__ . '/..' . '/../lib/Listener/CriticalActionPerformedEventListener.php',
|
|
||||||
);
|
);
|
||||||
|
|
||||||
public static function getInitializer(ClassLoader $loader)
|
public static function getInitializer(ClassLoader $loader)
|
||||||
|
|
|
@ -2,6 +2,6 @@ OC.L10N.register(
|
||||||
"admin_audit",
|
"admin_audit",
|
||||||
{
|
{
|
||||||
"Auditing / Logging" : "Audit / journalisation",
|
"Auditing / Logging" : "Audit / journalisation",
|
||||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de journalisation pour Nextcloud telles que l'accès aux fichiers de journalisation ou des actions autrement sensibles."
|
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de journalisation pour Nextcloud telles que la journalisation des accès aux fichiers ou des actions autrement sensibles."
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n > 1);");
|
"nplurals=2; plural=(n > 1);");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{ "translations": {
|
{ "translations": {
|
||||||
"Auditing / Logging" : "Audit / journalisation",
|
"Auditing / Logging" : "Audit / journalisation",
|
||||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de journalisation pour Nextcloud telles que l'accès aux fichiers de journalisation ou des actions autrement sensibles."
|
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de journalisation pour Nextcloud telles que la journalisation des accès aux fichiers ou des actions autrement sensibles."
|
||||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
||||||
}
|
}
|
|
@ -2,6 +2,6 @@ OC.L10N.register(
|
||||||
"admin_audit",
|
"admin_audit",
|
||||||
{
|
{
|
||||||
"Auditing / Logging" : "Audyt/Logowanie",
|
"Auditing / Logging" : "Audyt/Logowanie",
|
||||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Zapewnia możliwość rejestrowania dla Nextcloud, takie jak rejestrowanie dostępu do pliku lub innych wrażliwych akcji."
|
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Zapewnia możliwość rejestrowania dla Nextcloud, takie jak rejestrowanie dostępu do plików lub innych wrażliwych akcji."
|
||||||
},
|
},
|
||||||
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
|
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{ "translations": {
|
{ "translations": {
|
||||||
"Auditing / Logging" : "Audyt/Logowanie",
|
"Auditing / Logging" : "Audyt/Logowanie",
|
||||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Zapewnia możliwość rejestrowania dla Nextcloud, takie jak rejestrowanie dostępu do pliku lub innych wrażliwych akcji."
|
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Zapewnia możliwość rejestrowania dla Nextcloud, takie jak rejestrowanie dostępu do plików lub innych wrażliwych akcji."
|
||||||
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
|
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
|
||||||
}
|
}
|
|
@ -1,7 +0,0 @@
|
||||||
OC.L10N.register(
|
|
||||||
"admin_audit",
|
|
||||||
{
|
|
||||||
"Auditing / Logging" : "Auditoria / registo",
|
|
||||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece a funcionalidade de registo ao Nextcloud como o registo de acesso a ficheiros ou acções sensíveis."
|
|
||||||
},
|
|
||||||
"nplurals=2; plural=(n != 1);");
|
|
|
@ -1,5 +0,0 @@
|
||||||
{ "translations": {
|
|
||||||
"Auditing / Logging" : "Auditoria / registo",
|
|
||||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece a funcionalidade de registo ao Nextcloud como o registo de acesso a ficheiros ou acções sensíveis."
|
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
|
||||||
}
|
|
|
@ -29,13 +29,16 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace OCA\AdminAudit\Actions;
|
namespace OCA\AdminAudit\Actions;
|
||||||
|
|
||||||
use Psr\Log\LoggerInterface;
|
use OCP\ILogger;
|
||||||
|
|
||||||
class Action {
|
class Action {
|
||||||
/** @var LoggerInterface */
|
/** @var ILogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
public function __construct(LoggerInterface $logger) {
|
/**
|
||||||
|
* @param ILogger $logger
|
||||||
|
*/
|
||||||
|
public function __construct(ILogger $logger) {
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +53,7 @@ class Action {
|
||||||
public function log(string $text,
|
public function log(string $text,
|
||||||
array $params,
|
array $params,
|
||||||
array $elements,
|
array $elements,
|
||||||
bool $obfuscateParameters = false): void {
|
bool $obfuscateParameters = false) {
|
||||||
foreach ($elements as $element) {
|
foreach ($elements as $element) {
|
||||||
if (!isset($params[$element])) {
|
if (!isset($params[$element])) {
|
||||||
if ($obfuscateParameters) {
|
if ($obfuscateParameters) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ class AppManagement extends Action {
|
||||||
/**
|
/**
|
||||||
* @param string $appName
|
* @param string $appName
|
||||||
*/
|
*/
|
||||||
public function enableApp(string $appName): void {
|
public function enableApp(string $appName) {
|
||||||
$this->log('App "%s" enabled',
|
$this->log('App "%s" enabled',
|
||||||
['app' => $appName],
|
['app' => $appName],
|
||||||
['app']
|
['app']
|
||||||
|
@ -43,7 +43,7 @@ class AppManagement extends Action {
|
||||||
* @param string $appName
|
* @param string $appName
|
||||||
* @param string[] $groups
|
* @param string[] $groups
|
||||||
*/
|
*/
|
||||||
public function enableAppForGroups(string $appName, array $groups): void {
|
public function enableAppForGroups(string $appName, array $groups) {
|
||||||
$this->log('App "%1$s" enabled for groups: %2$s',
|
$this->log('App "%1$s" enabled for groups: %2$s',
|
||||||
['app' => $appName, 'groups' => implode(', ', $groups)],
|
['app' => $appName, 'groups' => implode(', ', $groups)],
|
||||||
['app', 'groups']
|
['app', 'groups']
|
||||||
|
@ -53,7 +53,7 @@ class AppManagement extends Action {
|
||||||
/**
|
/**
|
||||||
* @param string $appName
|
* @param string $appName
|
||||||
*/
|
*/
|
||||||
public function disableApp(string $appName): void {
|
public function disableApp(string $appName) {
|
||||||
$this->log('App "%s" disabled',
|
$this->log('App "%s" disabled',
|
||||||
['app' => $appName],
|
['app' => $appName],
|
||||||
['app']
|
['app']
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace OCA\AdminAudit\Actions;
|
||||||
* @package OCA\AdminAudit\Actions
|
* @package OCA\AdminAudit\Actions
|
||||||
*/
|
*/
|
||||||
class Auth extends Action {
|
class Auth extends Action {
|
||||||
public function loginAttempt(array $params): void {
|
public function loginAttempt(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'Login attempt: "%s"',
|
'Login attempt: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -44,7 +44,7 @@ class Auth extends Action {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loginSuccessful(array $params): void {
|
public function loginSuccessful(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'Login successful: "%s"',
|
'Login successful: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -55,7 +55,7 @@ class Auth extends Action {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function logout(array $params): void {
|
public function logout(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'Logout occurred',
|
'Logout occurred',
|
||||||
[],
|
[],
|
||||||
|
|
|
@ -32,7 +32,7 @@ class Console extends Action {
|
||||||
/**
|
/**
|
||||||
* @param $arguments
|
* @param $arguments
|
||||||
*/
|
*/
|
||||||
public function runCommand(array $arguments): void {
|
public function runCommand(array $arguments) {
|
||||||
if (!isset($arguments[1]) || $arguments[1] === '_completion') {
|
if (!isset($arguments[1]) || $arguments[1] === '_completion') {
|
||||||
// Don't log autocompletion
|
// Don't log autocompletion
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -38,7 +38,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function read(array $params): void {
|
public function read(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'File accessed: "%s"',
|
'File accessed: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -53,7 +53,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function rename(array $params): void {
|
public function rename(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'File renamed: "%s" to "%s"',
|
'File renamed: "%s" to "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -69,7 +69,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function create(array $params): void {
|
public function create(array $params) {
|
||||||
if ($params['path'] === '/' || $params['path'] === '' || $params['path'] === null) {
|
if ($params['path'] === '/' || $params['path'] === '' || $params['path'] === null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function copy(array $params): void {
|
public function copy(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'File copied: "%s" to "%s"',
|
'File copied: "%s" to "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -104,7 +104,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function write(array $params): void {
|
public function write(array $params) {
|
||||||
if ($params['path'] === '/' || $params['path'] === '' || $params['path'] === null) {
|
if ($params['path'] === '/' || $params['path'] === '' || $params['path'] === null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function update(array $params): void {
|
public function update(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'File updated: "%s"',
|
'File updated: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -138,7 +138,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function delete(array $params): void {
|
public function delete(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'File deleted: "%s"',
|
'File deleted: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -153,7 +153,7 @@ class Files extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function preview(array $params): void {
|
public function preview(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'Preview accessed: "%s" (width: "%s", height: "%s" crop: "%s", mode: "%s")',
|
'Preview accessed: "%s" (width: "%s", height: "%s" crop: "%s", mode: "%s")',
|
||||||
$params,
|
$params,
|
||||||
|
|
|
@ -45,7 +45,7 @@ class GroupManagement extends Action {
|
||||||
* @param IGroup $group
|
* @param IGroup $group
|
||||||
* @param IUser $user
|
* @param IUser $user
|
||||||
*/
|
*/
|
||||||
public function addUser(IGroup $group, IUser $user): void {
|
public function addUser(IGroup $group, IUser $user) {
|
||||||
$this->log('User "%s" added to group "%s"',
|
$this->log('User "%s" added to group "%s"',
|
||||||
[
|
[
|
||||||
'group' => $group->getGID(),
|
'group' => $group->getGID(),
|
||||||
|
@ -63,7 +63,7 @@ class GroupManagement extends Action {
|
||||||
* @param IGroup $group
|
* @param IGroup $group
|
||||||
* @param IUser $user
|
* @param IUser $user
|
||||||
*/
|
*/
|
||||||
public function removeUser(IGroup $group, IUser $user): void {
|
public function removeUser(IGroup $group, IUser $user) {
|
||||||
$this->log('User "%s" removed from group "%s"',
|
$this->log('User "%s" removed from group "%s"',
|
||||||
[
|
[
|
||||||
'group' => $group->getGID(),
|
'group' => $group->getGID(),
|
||||||
|
@ -80,7 +80,7 @@ class GroupManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param IGroup $group
|
* @param IGroup $group
|
||||||
*/
|
*/
|
||||||
public function createGroup(IGroup $group): void {
|
public function createGroup(IGroup $group) {
|
||||||
$this->log('Group created: "%s"',
|
$this->log('Group created: "%s"',
|
||||||
[
|
[
|
||||||
'group' => $group->getGID()
|
'group' => $group->getGID()
|
||||||
|
@ -96,7 +96,7 @@ class GroupManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param IGroup $group
|
* @param IGroup $group
|
||||||
*/
|
*/
|
||||||
public function deleteGroup(IGroup $group): void {
|
public function deleteGroup(IGroup $group) {
|
||||||
$this->log('Group deleted: "%s"',
|
$this->log('Group deleted: "%s"',
|
||||||
[
|
[
|
||||||
'group' => $group->getGID()
|
'group' => $group->getGID()
|
||||||
|
|
|
@ -41,7 +41,7 @@ class Security extends Action {
|
||||||
* @param IUser $user
|
* @param IUser $user
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function twofactorFailed(IUser $user, array $params): void {
|
public function twofactorFailed(IUser $user, array $params) {
|
||||||
$params['uid'] = $user->getUID();
|
$params['uid'] = $user->getUID();
|
||||||
$params['displayName'] = $user->getDisplayName();
|
$params['displayName'] = $user->getDisplayName();
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ class Security extends Action {
|
||||||
* @param IUser $user
|
* @param IUser $user
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function twofactorSuccess(IUser $user, array $params): void {
|
public function twofactorSuccess(IUser $user, array $params) {
|
||||||
$params['uid'] = $user->getUID();
|
$params['uid'] = $user->getUID();
|
||||||
$params['displayName'] = $user->getDisplayName();
|
$params['displayName'] = $user->getDisplayName();
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ class Sharing extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function shared(array $params): void {
|
public function shared(array $params) {
|
||||||
if ($params['shareType'] === IShare::TYPE_LINK) {
|
if ($params['shareType'] === IShare::TYPE_LINK) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'The %s "%s" with ID "%s" has been shared via link with permissions "%s" (Share ID: %s)',
|
'The %s "%s" with ID "%s" has been shared via link with permissions "%s" (Share ID: %s)',
|
||||||
|
@ -168,7 +168,7 @@ class Sharing extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function unshare(array $params): void {
|
public function unshare(array $params) {
|
||||||
if ($params['shareType'] === IShare::TYPE_LINK) {
|
if ($params['shareType'] === IShare::TYPE_LINK) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'The %s "%s" with ID "%s" has been unshared (Share ID: %s)',
|
'The %s "%s" with ID "%s" has been unshared (Share ID: %s)',
|
||||||
|
@ -284,7 +284,7 @@ class Sharing extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function updatePermissions(array $params): void {
|
public function updatePermissions(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'The permissions of the shared %s "%s" with ID "%s" have been changed to "%s"',
|
'The permissions of the shared %s "%s" with ID "%s" have been changed to "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -302,7 +302,7 @@ class Sharing extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function updatePassword(array $params): void {
|
public function updatePassword(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'The password of the publicly shared %s "%s" with ID "%s" has been changed',
|
'The password of the publicly shared %s "%s" with ID "%s" has been changed',
|
||||||
$params,
|
$params,
|
||||||
|
@ -319,17 +319,7 @@ class Sharing extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function updateExpirationDate(array $params): void {
|
public function updateExpirationDate(array $params) {
|
||||||
if ($params['date'] === null) {
|
|
||||||
$this->log(
|
|
||||||
'The expiration date of the publicly shared %s with ID "%s" has been removed',
|
|
||||||
$params,
|
|
||||||
[
|
|
||||||
'itemType',
|
|
||||||
'itemSource',
|
|
||||||
]
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->log(
|
$this->log(
|
||||||
'The expiration date of the publicly shared %s with ID "%s" has been changed to "%s"',
|
'The expiration date of the publicly shared %s with ID "%s" has been changed to "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -340,14 +330,13 @@ class Sharing extends Action {
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs access of shared files
|
* Logs access of shared files
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function shareAccessed(array $params): void {
|
public function shareAccessed(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'The shared %s with the token "%s" by "%s" has been accessed.',
|
'The shared %s with the token "%s" by "%s" has been accessed.',
|
||||||
$params,
|
$params,
|
||||||
|
|
|
@ -29,13 +29,13 @@ declare(strict_types=1);
|
||||||
namespace OCA\AdminAudit\Actions;
|
namespace OCA\AdminAudit\Actions;
|
||||||
|
|
||||||
class Trashbin extends Action {
|
class Trashbin extends Action {
|
||||||
public function delete(array $params): void {
|
public function delete(array $params) {
|
||||||
$this->log('File "%s" deleted from trash bin.',
|
$this->log('File "%s" deleted from trash bin.',
|
||||||
['path' => $params['path']], ['path']
|
['path' => $params['path']], ['path']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function restore(array $params): void {
|
public function restore(array $params) {
|
||||||
$this->log('File "%s" restored from trash bin.',
|
$this->log('File "%s" restored from trash bin.',
|
||||||
['path' => $params['filePath']], ['path']
|
['path' => $params['filePath']], ['path']
|
||||||
);
|
);
|
||||||
|
|
|
@ -44,7 +44,7 @@ class UserManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function create(array $params): void {
|
public function create(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'User created: "%s"',
|
'User created: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -59,7 +59,7 @@ class UserManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param string $uid
|
* @param string $uid
|
||||||
*/
|
*/
|
||||||
public function assign(string $uid): void {
|
public function assign(string $uid) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'UserID assigned: "%s"',
|
'UserID assigned: "%s"',
|
||||||
[ 'uid' => $uid ],
|
[ 'uid' => $uid ],
|
||||||
|
@ -72,7 +72,7 @@ class UserManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function delete(array $params): void {
|
public function delete(array $params) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'User deleted: "%s"',
|
'User deleted: "%s"',
|
||||||
$params,
|
$params,
|
||||||
|
@ -87,7 +87,7 @@ class UserManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param string $uid
|
* @param string $uid
|
||||||
*/
|
*/
|
||||||
public function unassign(string $uid): void {
|
public function unassign(string $uid) {
|
||||||
$this->log(
|
$this->log(
|
||||||
'UserID unassigned: "%s"',
|
'UserID unassigned: "%s"',
|
||||||
[ 'uid' => $uid ],
|
[ 'uid' => $uid ],
|
||||||
|
@ -100,7 +100,7 @@ class UserManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
*/
|
*/
|
||||||
public function change(array $params): void {
|
public function change(array $params) {
|
||||||
switch ($params['feature']) {
|
switch ($params['feature']) {
|
||||||
case 'enabled':
|
case 'enabled':
|
||||||
$this->log(
|
$this->log(
|
||||||
|
@ -130,7 +130,7 @@ class UserManagement extends Action {
|
||||||
*
|
*
|
||||||
* @param IUser $user
|
* @param IUser $user
|
||||||
*/
|
*/
|
||||||
public function setPassword(IUser $user): void {
|
public function setPassword(IUser $user) {
|
||||||
if ($user->getBackendClassName() === 'Database') {
|
if ($user->getBackendClassName() === 'Database') {
|
||||||
$this->log(
|
$this->log(
|
||||||
'Password of user "%s" has been changed',
|
'Password of user "%s" has been changed',
|
||||||
|
|
|
@ -29,7 +29,7 @@ declare(strict_types=1);
|
||||||
namespace OCA\AdminAudit\Actions;
|
namespace OCA\AdminAudit\Actions;
|
||||||
|
|
||||||
class Versions extends Action {
|
class Versions extends Action {
|
||||||
public function rollback(array $params): void {
|
public function rollback(array $params) {
|
||||||
$this->log('Version "%s" of "%s" was restored.',
|
$this->log('Version "%s" of "%s" was restored.',
|
||||||
[
|
[
|
||||||
'version' => $params['revision'],
|
'version' => $params['revision'],
|
||||||
|
@ -39,7 +39,7 @@ class Versions extends Action {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete(array $params): void {
|
public function delete(array $params) {
|
||||||
$this->log('Version "%s" was deleted.',
|
$this->log('Version "%s" was deleted.',
|
||||||
['path' => $params['path']],
|
['path' => $params['path']],
|
||||||
['path']
|
['path']
|
||||||
|
|
|
@ -49,7 +49,6 @@ use OCA\AdminAudit\Actions\Sharing;
|
||||||
use OCA\AdminAudit\Actions\Trashbin;
|
use OCA\AdminAudit\Actions\Trashbin;
|
||||||
use OCA\AdminAudit\Actions\UserManagement;
|
use OCA\AdminAudit\Actions\UserManagement;
|
||||||
use OCA\AdminAudit\Actions\Versions;
|
use OCA\AdminAudit\Actions\Versions;
|
||||||
use OCA\AdminAudit\Listener\CriticalActionPerformedEventListener;
|
|
||||||
use OCP\App\ManagerEvent;
|
use OCP\App\ManagerEvent;
|
||||||
use OCP\AppFramework\App;
|
use OCP\AppFramework\App;
|
||||||
use OCP\AppFramework\Bootstrap\IBootContext;
|
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||||
|
@ -59,20 +58,19 @@ use OCP\Authentication\TwoFactorAuth\IProvider;
|
||||||
use OCP\Console\ConsoleEvent;
|
use OCP\Console\ConsoleEvent;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
use OCP\IGroupManager;
|
use OCP\IGroupManager;
|
||||||
|
use OCP\ILogger;
|
||||||
use OCP\IPreview;
|
use OCP\IPreview;
|
||||||
use OCP\IServerContainer;
|
use OCP\IServerContainer;
|
||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
use OCP\Log\Audit\CriticalActionPerformedEvent;
|
|
||||||
use OCP\Log\ILogFactory;
|
use OCP\Log\ILogFactory;
|
||||||
use OCP\Share;
|
use OCP\Share;
|
||||||
use OCP\Util;
|
use OCP\Util;
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||||
use Symfony\Component\EventDispatcher\GenericEvent;
|
use Symfony\Component\EventDispatcher\GenericEvent;
|
||||||
|
|
||||||
class Application extends App implements IBootstrap {
|
class Application extends App implements IBootstrap {
|
||||||
|
|
||||||
/** @var LoggerInterface */
|
/** @var ILogger */
|
||||||
protected $logger;
|
protected $logger;
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
|
@ -80,11 +78,10 @@ class Application extends App implements IBootstrap {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function register(IRegistrationContext $context): void {
|
public function register(IRegistrationContext $context): void {
|
||||||
$context->registerEventListener(CriticalActionPerformedEvent::class, CriticalActionPerformedEventListener::class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function boot(IBootContext $context): void {
|
public function boot(IBootContext $context): void {
|
||||||
/** @var LoggerInterface $logger */
|
/** @var ILogger $logger */
|
||||||
$logger = $context->injectFn(
|
$logger = $context->injectFn(
|
||||||
Closure::fromCallable([$this, 'getLogger'])
|
Closure::fromCallable([$this, 'getLogger'])
|
||||||
);
|
);
|
||||||
|
@ -97,22 +94,22 @@ class Application extends App implements IBootstrap {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLogger(IConfig $config,
|
private function getLogger(IConfig $config,
|
||||||
LoggerInterface $logger,
|
ILogger $logger,
|
||||||
ILogFactory $logFactory): LoggerInterface {
|
ILogFactory $logFactory): ILogger {
|
||||||
$default = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/audit.log';
|
$default = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/audit.log';
|
||||||
$logFile = $config->getAppValue('admin_audit', 'logfile', $default);
|
$logFile = $config->getAppValue('admin_audit', 'logfile', $default);
|
||||||
|
|
||||||
if ($logFile === null) {
|
if ($logFile === null) {
|
||||||
return $logger;
|
return $logger;
|
||||||
}
|
}
|
||||||
return $logFactory->getCustomPsrLogger($logFile);
|
return $logFactory->getCustomLogger($logFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register hooks in order to log them
|
* Register hooks in order to log them
|
||||||
*/
|
*/
|
||||||
private function registerHooks(LoggerInterface $logger,
|
private function registerHooks(ILogger $logger,
|
||||||
IServerContainer $serverContainer): void {
|
IServerContainer $serverContainer) {
|
||||||
$this->userManagementHooks($logger, $serverContainer->get(IUserSession::class));
|
$this->userManagementHooks($logger, $serverContainer->get(IUserSession::class));
|
||||||
$this->groupHooks($logger, $serverContainer->get(IGroupManager::class));
|
$this->groupHooks($logger, $serverContainer->get(IGroupManager::class));
|
||||||
$this->authHooks($logger);
|
$this->authHooks($logger);
|
||||||
|
@ -131,8 +128,8 @@ class Application extends App implements IBootstrap {
|
||||||
$this->securityHooks($logger, $eventDispatcher);
|
$this->securityHooks($logger, $eventDispatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function userManagementHooks(LoggerInterface $logger,
|
private function userManagementHooks(ILogger $logger,
|
||||||
IUserSession $userSession): void {
|
IUserSession $userSession) {
|
||||||
$userActions = new UserManagement($logger);
|
$userActions = new UserManagement($logger);
|
||||||
|
|
||||||
Util::connectHook('OC_User', 'post_createUser', $userActions, 'create');
|
Util::connectHook('OC_User', 'post_createUser', $userActions, 'create');
|
||||||
|
@ -145,8 +142,8 @@ class Application extends App implements IBootstrap {
|
||||||
$userSession->listen('\OC\User', 'postUnassignedUserId', [$userActions, 'unassign']);
|
$userSession->listen('\OC\User', 'postUnassignedUserId', [$userActions, 'unassign']);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function groupHooks(LoggerInterface $logger,
|
private function groupHooks(ILogger $logger,
|
||||||
IGroupManager $groupManager): void {
|
IGroupManager $groupManager) {
|
||||||
$groupActions = new GroupManagement($logger);
|
$groupActions = new GroupManagement($logger);
|
||||||
|
|
||||||
assert($groupManager instanceof GroupManager);
|
assert($groupManager instanceof GroupManager);
|
||||||
|
@ -156,7 +153,7 @@ class Application extends App implements IBootstrap {
|
||||||
$groupManager->listen('\OC\Group', 'postCreate', [$groupActions, 'createGroup']);
|
$groupManager->listen('\OC\Group', 'postCreate', [$groupActions, 'createGroup']);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function sharingHooks(LoggerInterface $logger): void {
|
private function sharingHooks(ILogger $logger) {
|
||||||
$shareActions = new Sharing($logger);
|
$shareActions = new Sharing($logger);
|
||||||
|
|
||||||
Util::connectHook(Share::class, 'post_shared', $shareActions, 'shared');
|
Util::connectHook(Share::class, 'post_shared', $shareActions, 'shared');
|
||||||
|
@ -168,7 +165,7 @@ class Application extends App implements IBootstrap {
|
||||||
Util::connectHook(Share::class, 'share_link_access', $shareActions, 'shareAccessed');
|
Util::connectHook(Share::class, 'share_link_access', $shareActions, 'shareAccessed');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function authHooks(LoggerInterface $logger): void {
|
private function authHooks(ILogger $logger) {
|
||||||
$authActions = new Auth($logger);
|
$authActions = new Auth($logger);
|
||||||
|
|
||||||
Util::connectHook('OC_User', 'pre_login', $authActions, 'loginAttempt');
|
Util::connectHook('OC_User', 'pre_login', $authActions, 'loginAttempt');
|
||||||
|
@ -176,8 +173,8 @@ class Application extends App implements IBootstrap {
|
||||||
Util::connectHook('OC_User', 'logout', $authActions, 'logout');
|
Util::connectHook('OC_User', 'logout', $authActions, 'logout');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function appHooks(LoggerInterface $logger,
|
private function appHooks(ILogger $logger,
|
||||||
EventDispatcherInterface $eventDispatcher): void {
|
EventDispatcherInterface $eventDispatcher) {
|
||||||
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function (ManagerEvent $event) use ($logger) {
|
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function (ManagerEvent $event) use ($logger) {
|
||||||
$appActions = new AppManagement($logger);
|
$appActions = new AppManagement($logger);
|
||||||
$appActions->enableApp($event->getAppID());
|
$appActions->enableApp($event->getAppID());
|
||||||
|
@ -192,16 +189,16 @@ class Application extends App implements IBootstrap {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private function consoleHooks(LoggerInterface $logger,
|
private function consoleHooks(ILogger $logger,
|
||||||
EventDispatcherInterface $eventDispatcher): void {
|
EventDispatcherInterface $eventDispatcher) {
|
||||||
$eventDispatcher->addListener(ConsoleEvent::EVENT_RUN, function (ConsoleEvent $event) use ($logger) {
|
$eventDispatcher->addListener(ConsoleEvent::EVENT_RUN, function (ConsoleEvent $event) use ($logger) {
|
||||||
$appActions = new Console($logger);
|
$appActions = new Console($logger);
|
||||||
$appActions->runCommand($event->getArguments());
|
$appActions->runCommand($event->getArguments());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private function fileHooks(LoggerInterface $logger,
|
private function fileHooks(ILogger $logger,
|
||||||
EventDispatcherInterface $eventDispatcher): void {
|
EventDispatcherInterface $eventDispatcher) {
|
||||||
$fileActions = new Files($logger);
|
$fileActions = new Files($logger);
|
||||||
$eventDispatcher->addListener(
|
$eventDispatcher->addListener(
|
||||||
IPreview::EVENT,
|
IPreview::EVENT,
|
||||||
|
@ -262,20 +259,20 @@ class Application extends App implements IBootstrap {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function versionsHooks(LoggerInterface $logger): void {
|
private function versionsHooks(ILogger $logger) {
|
||||||
$versionsActions = new Versions($logger);
|
$versionsActions = new Versions($logger);
|
||||||
Util::connectHook('\OCP\Versions', 'rollback', $versionsActions, 'rollback');
|
Util::connectHook('\OCP\Versions', 'rollback', $versionsActions, 'rollback');
|
||||||
Util::connectHook('\OCP\Versions', 'delete', $versionsActions, 'delete');
|
Util::connectHook('\OCP\Versions', 'delete', $versionsActions, 'delete');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function trashbinHooks(LoggerInterface $logger): void {
|
private function trashbinHooks(ILogger $logger) {
|
||||||
$trashActions = new Trashbin($logger);
|
$trashActions = new Trashbin($logger);
|
||||||
Util::connectHook('\OCP\Trashbin', 'preDelete', $trashActions, 'delete');
|
Util::connectHook('\OCP\Trashbin', 'preDelete', $trashActions, 'delete');
|
||||||
Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', $trashActions, 'restore');
|
Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', $trashActions, 'restore');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function securityHooks(LoggerInterface $logger,
|
private function securityHooks(ILogger $logger,
|
||||||
EventDispatcherInterface $eventDispatcher): void {
|
EventDispatcherInterface $eventDispatcher) {
|
||||||
$eventDispatcher->addListener(IProvider::EVENT_SUCCESS, function (GenericEvent $event) use ($logger) {
|
$eventDispatcher->addListener(IProvider::EVENT_SUCCESS, function (GenericEvent $event) use ($logger) {
|
||||||
$security = new Security($logger);
|
$security = new Security($logger);
|
||||||
$security->twofactorSuccess($event->getSubject(), $event->getArguments());
|
$security->twofactorSuccess($event->getSubject(), $event->getArguments());
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
* @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||||
*
|
*
|
||||||
|
@ -28,31 +25,26 @@ declare(strict_types=1);
|
||||||
namespace OCA\AdminAudit\BackgroundJobs;
|
namespace OCA\AdminAudit\BackgroundJobs;
|
||||||
|
|
||||||
use OC\BackgroundJob\TimedJob;
|
use OC\BackgroundJob\TimedJob;
|
||||||
use OCP\IConfig;
|
|
||||||
use OCP\Log\RotationTrait;
|
use OCP\Log\RotationTrait;
|
||||||
|
|
||||||
class Rotate extends TimedJob {
|
class Rotate extends TimedJob {
|
||||||
use RotationTrait;
|
use RotationTrait;
|
||||||
|
|
||||||
/** @var IConfig */
|
public function __construct() {
|
||||||
private $config;
|
|
||||||
|
|
||||||
public function __construct(IConfig $config) {
|
|
||||||
$this->config = $config;
|
|
||||||
|
|
||||||
$this->setInterval(60 * 60 * 3);
|
$this->setInterval(60 * 60 * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function run($argument) {
|
protected function run($argument) {
|
||||||
$default = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/audit.log';
|
$config = \OC::$server->getConfig();
|
||||||
$this->filePath = $this->config->getAppValue('admin_audit', 'logfile', $default);
|
$default = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/audit.log';
|
||||||
|
$this->filePath = $config->getAppValue('admin_audit', 'logfile', $default);
|
||||||
|
|
||||||
if ($this->filePath === '') {
|
if ($this->filePath === '') {
|
||||||
// default log file, nothing to do
|
// default log file, nothing to do
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->maxSize = $this->config->getSystemValue('log_rotate_size', 100 * 1024 * 1024);
|
$this->maxSize = $config->getSystemValue('log_rotate_size', 100 * 1024 * 1024);
|
||||||
|
|
||||||
if ($this->shouldRotateBySize()) {
|
if ($this->shouldRotateBySize()) {
|
||||||
$this->rotate();
|
$this->rotate();
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
/**
|
|
||||||
* @copyright Copyright (c) 2021 Joas Schilling <coding@schilljs.com>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OCA\AdminAudit\Listener;
|
|
||||||
|
|
||||||
use OCA\AdminAudit\Actions\Action;
|
|
||||||
use OCP\EventDispatcher\Event;
|
|
||||||
use OCP\EventDispatcher\IEventListener;
|
|
||||||
use OCP\Log\Audit\CriticalActionPerformedEvent;
|
|
||||||
|
|
||||||
class CriticalActionPerformedEventListener extends Action implements IEventListener {
|
|
||||||
public function handle(Event $event): void {
|
|
||||||
if (!($event instanceof CriticalActionPerformedEvent)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->log(
|
|
||||||
$event->getLogMessage(),
|
|
||||||
$event->getParameters(),
|
|
||||||
array_keys($event->getParameters()),
|
|
||||||
$event->getObfuscateParameters()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -28,12 +28,12 @@ declare(strict_types=1);
|
||||||
namespace OCA\AdminAudit\Tests\Actions;
|
namespace OCA\AdminAudit\Tests\Actions;
|
||||||
|
|
||||||
use OCA\AdminAudit\Actions\Security;
|
use OCA\AdminAudit\Actions\Security;
|
||||||
|
use OCP\ILogger;
|
||||||
use OCP\IUser;
|
use OCP\IUser;
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
use Test\TestCase;
|
use Test\TestCase;
|
||||||
|
|
||||||
class SecurityTest extends TestCase {
|
class SecurityTest extends TestCase {
|
||||||
/** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
|
/** @var ILogger|\PHPUnit\Framework\MockObject\MockObject */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
/** @var Security */
|
/** @var Security */
|
||||||
|
@ -45,7 +45,7 @@ class SecurityTest extends TestCase {
|
||||||
protected function setUp(): void {
|
protected function setUp(): void {
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
$this->logger = $this->createMock(LoggerInterface::class);
|
$this->logger = $this->createMock(ILogger::class);
|
||||||
$this->security = new Security($this->logger);
|
$this->security = new Security($this->logger);
|
||||||
|
|
||||||
$this->user = $this->createMock(IUser::class);
|
$this->user = $this->createMock(IUser::class);
|
||||||
|
|
|
@ -15,6 +15,6 @@
|
||||||
<category>files</category>
|
<category>files</category>
|
||||||
<bugs>https://github.com/nextcloud/cloud_federation/issues</bugs>
|
<bugs>https://github.com/nextcloud/cloud_federation/issues</bugs>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="21" max-version="21"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</info>
|
</info>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
OC.L10N.register(
|
OC.L10N.register(
|
||||||
"cloud_federation_api",
|
"cloud_federation_api",
|
||||||
{
|
{
|
||||||
"Cloud Federation API" : "Birleşik Bulut API",
|
"Cloud Federation API" : "Bulut Birleşim API",
|
||||||
"Enable clouds to communicate with each other and exchange data" : "Karşılıklı iletişim kurmak için bulut hizmetlerini kullanın",
|
"Enable clouds to communicate with each other and exchange data" : "Karşılıklı iletişim kurmak için bulut hizmetlerini kullanın",
|
||||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Birleşik Bulut API, farklı Nextcloud kopyalarının birbiri ile iletişim kurarak karşılıklı veri aktarmasını sağlar."
|
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Bulut Birleşim API farklı Nextcloud kopyalarının birbiri ile iletişim kurarak karşılıklı veri aktarmasını sağlar."
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n > 1);");
|
"nplurals=2; plural=(n > 1);");
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{ "translations": {
|
{ "translations": {
|
||||||
"Cloud Federation API" : "Birleşik Bulut API",
|
"Cloud Federation API" : "Bulut Birleşim API",
|
||||||
"Enable clouds to communicate with each other and exchange data" : "Karşılıklı iletişim kurmak için bulut hizmetlerini kullanın",
|
"Enable clouds to communicate with each other and exchange data" : "Karşılıklı iletişim kurmak için bulut hizmetlerini kullanın",
|
||||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Birleşik Bulut API, farklı Nextcloud kopyalarının birbiri ile iletişim kurarak karşılıklı veri aktarmasını sağlar."
|
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Bulut Birleşim API farklı Nextcloud kopyalarının birbiri ile iletişim kurarak karşılıklı veri aktarmasını sağlar."
|
||||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
||||||
}
|
}
|
|
@ -38,11 +38,11 @@ use OCP\Federation\ICloudFederationFactory;
|
||||||
use OCP\Federation\ICloudFederationProviderManager;
|
use OCP\Federation\ICloudFederationProviderManager;
|
||||||
use OCP\Federation\ICloudIdManager;
|
use OCP\Federation\ICloudIdManager;
|
||||||
use OCP\IGroupManager;
|
use OCP\IGroupManager;
|
||||||
|
use OCP\ILogger;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
use OCP\IURLGenerator;
|
use OCP\IURLGenerator;
|
||||||
use OCP\IUserManager;
|
use OCP\IUserManager;
|
||||||
use OCP\Share\Exceptions\ShareNotFound;
|
use OCP\Share\Exceptions\ShareNotFound;
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class RequestHandlerController
|
* Class RequestHandlerController
|
||||||
|
@ -53,7 +53,7 @@ use Psr\Log\LoggerInterface;
|
||||||
*/
|
*/
|
||||||
class RequestHandlerController extends Controller {
|
class RequestHandlerController extends Controller {
|
||||||
|
|
||||||
/** @var LoggerInterface */
|
/** @var ILogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
/** @var IUserManager */
|
/** @var IUserManager */
|
||||||
|
@ -79,7 +79,7 @@ class RequestHandlerController extends Controller {
|
||||||
|
|
||||||
public function __construct($appName,
|
public function __construct($appName,
|
||||||
IRequest $request,
|
IRequest $request,
|
||||||
LoggerInterface $logger,
|
ILogger $logger,
|
||||||
IUserManager $userManager,
|
IUserManager $userManager,
|
||||||
IGroupManager $groupManager,
|
IGroupManager $groupManager,
|
||||||
IURLGenerator $urlGenerator,
|
IURLGenerator $urlGenerator,
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<category>social</category>
|
<category>social</category>
|
||||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="21" max-version="21"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<activity>
|
<activity>
|
||||||
|
|
|
@ -16,10 +16,10 @@ return array(
|
||||||
'OCA\\Comments\\Collaboration\\CommentersSorter' => $baseDir . '/../lib/Collaboration/CommentersSorter.php',
|
'OCA\\Comments\\Collaboration\\CommentersSorter' => $baseDir . '/../lib/Collaboration/CommentersSorter.php',
|
||||||
'OCA\\Comments\\Controller\\Notifications' => $baseDir . '/../lib/Controller/Notifications.php',
|
'OCA\\Comments\\Controller\\Notifications' => $baseDir . '/../lib/Controller/Notifications.php',
|
||||||
'OCA\\Comments\\EventHandler' => $baseDir . '/../lib/EventHandler.php',
|
'OCA\\Comments\\EventHandler' => $baseDir . '/../lib/EventHandler.php',
|
||||||
|
'OCA\\Comments\\JSSettingsHelper' => $baseDir . '/../lib/JSSettingsHelper.php',
|
||||||
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => $baseDir . '/../lib/Listener/CommentsEntityEventListener.php',
|
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => $baseDir . '/../lib/Listener/CommentsEntityEventListener.php',
|
||||||
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => $baseDir . '/../lib/Listener/LoadAdditionalScripts.php',
|
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => $baseDir . '/../lib/Listener/LoadAdditionalScripts.php',
|
||||||
'OCA\\Comments\\Listener\\LoadSidebarScripts' => $baseDir . '/../lib/Listener/LoadSidebarScripts.php',
|
'OCA\\Comments\\Listener\\LoadSidebarScripts' => $baseDir . '/../lib/Listener/LoadSidebarScripts.php',
|
||||||
'OCA\\Comments\\MaxAutoCompleteResultsInitialState' => $baseDir . '/../lib/MaxAutoCompleteResultsInitialState.php',
|
|
||||||
'OCA\\Comments\\Notification\\Listener' => $baseDir . '/../lib/Notification/Listener.php',
|
'OCA\\Comments\\Notification\\Listener' => $baseDir . '/../lib/Notification/Listener.php',
|
||||||
'OCA\\Comments\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
|
'OCA\\Comments\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
|
||||||
'OCA\\Comments\\Search\\CommentsSearchProvider' => $baseDir . '/../lib/Search/CommentsSearchProvider.php',
|
'OCA\\Comments\\Search\\CommentsSearchProvider' => $baseDir . '/../lib/Search/CommentsSearchProvider.php',
|
||||||
|
|
|
@ -31,10 +31,10 @@ class ComposerStaticInitComments
|
||||||
'OCA\\Comments\\Collaboration\\CommentersSorter' => __DIR__ . '/..' . '/../lib/Collaboration/CommentersSorter.php',
|
'OCA\\Comments\\Collaboration\\CommentersSorter' => __DIR__ . '/..' . '/../lib/Collaboration/CommentersSorter.php',
|
||||||
'OCA\\Comments\\Controller\\Notifications' => __DIR__ . '/..' . '/../lib/Controller/Notifications.php',
|
'OCA\\Comments\\Controller\\Notifications' => __DIR__ . '/..' . '/../lib/Controller/Notifications.php',
|
||||||
'OCA\\Comments\\EventHandler' => __DIR__ . '/..' . '/../lib/EventHandler.php',
|
'OCA\\Comments\\EventHandler' => __DIR__ . '/..' . '/../lib/EventHandler.php',
|
||||||
|
'OCA\\Comments\\JSSettingsHelper' => __DIR__ . '/..' . '/../lib/JSSettingsHelper.php',
|
||||||
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => __DIR__ . '/..' . '/../lib/Listener/CommentsEntityEventListener.php',
|
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => __DIR__ . '/..' . '/../lib/Listener/CommentsEntityEventListener.php',
|
||||||
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalScripts.php',
|
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalScripts.php',
|
||||||
'OCA\\Comments\\Listener\\LoadSidebarScripts' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarScripts.php',
|
'OCA\\Comments\\Listener\\LoadSidebarScripts' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarScripts.php',
|
||||||
'OCA\\Comments\\MaxAutoCompleteResultsInitialState' => __DIR__ . '/..' . '/../lib/MaxAutoCompleteResultsInitialState.php',
|
|
||||||
'OCA\\Comments\\Notification\\Listener' => __DIR__ . '/..' . '/../lib/Notification/Listener.php',
|
'OCA\\Comments\\Notification\\Listener' => __DIR__ . '/..' . '/../lib/Notification/Listener.php',
|
||||||
'OCA\\Comments\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
|
'OCA\\Comments\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
|
||||||
'OCA\\Comments\\Search\\CommentsSearchProvider' => __DIR__ . '/..' . '/../lib/Search/CommentsSearchProvider.php',
|
'OCA\\Comments\\Search\\CommentsSearchProvider' => __DIR__ . '/..' . '/../lib/Search/CommentsSearchProvider.php',
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,24 +1,2 @@
|
||||||
!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/js/",n(n.s=706)}({706:function(e,n){
|
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=742)}({742:function(e,n){function r(e,n,t,r,o,i,u){try{var c=e[i](u),a=c.value}catch(e){return void t(e)}c.done?n(a):Promise.resolve(a).then(r,o)}var o=null,i=new OCA.Files.Sidebar.Tab({id:"comments",name:t("comments","Comments"),icon:"icon-comment",mount:function(e,n,t){return(i=regeneratorRuntime.mark((function r(){return regeneratorRuntime.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return o&&o.$destroy(),o=new OCA.Comments.View("files",{parent:t}),r.next=4,o.update(n.id);case 4:o.$mount(e);case 5:case"end":return r.stop()}}),r)})),function(){var e=this,n=arguments;return new Promise((function(t,o){var u=i.apply(e,n);function c(e){r(u,t,o,c,a,"next",e)}function a(e){r(u,t,o,c,a,"throw",e)}c(void 0)}))})();var i},update:function(e){o.update(e.id)},destroy:function(){o.$destroy(),o=null},scrollBottomReached:function(){o.onScrollBottomReached()}});window.addEventListener("DOMContentLoaded",(function(){OCA.Files&&OCA.Files.Sidebar&&OCA.Files.Sidebar.registerTab(i)}))}});
|
||||||
/**
|
|
||||||
* @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
*
|
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
let o=null;const r=new OCA.Files.Sidebar.Tab({id:"comments",name:t("comments","Comments"),icon:"icon-comment",async mount(e,t,n){o&&o.$destroy(),o=new OCA.Comments.View("files",{parent:n}),await o.update(t.id),o.$mount(e)},update(e){o.update(e.id)},destroy(){o.$destroy(),o=null},scrollBottomReached(){o.onScrollBottomReached()}});window.addEventListener("DOMContentLoaded",(function(){OCA.Files&&OCA.Files.Sidebar&&OCA.Files.Sidebar.registerTab(r)}))}});
|
|
||||||
//# sourceMappingURL=comments-tab.js.map
|
//# sourceMappingURL=comments-tab.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -31,10 +31,10 @@ use Closure;
|
||||||
use OCA\Comments\Capabilities;
|
use OCA\Comments\Capabilities;
|
||||||
use OCA\Comments\Controller\Notifications;
|
use OCA\Comments\Controller\Notifications;
|
||||||
use OCA\Comments\EventHandler;
|
use OCA\Comments\EventHandler;
|
||||||
|
use OCA\Comments\JSSettingsHelper;
|
||||||
use OCA\Comments\Listener\CommentsEntityEventListener;
|
use OCA\Comments\Listener\CommentsEntityEventListener;
|
||||||
use OCA\Comments\Listener\LoadAdditionalScripts;
|
use OCA\Comments\Listener\LoadAdditionalScripts;
|
||||||
use OCA\Comments\Listener\LoadSidebarScripts;
|
use OCA\Comments\Listener\LoadSidebarScripts;
|
||||||
use OCA\Comments\MaxAutoCompleteResultsInitialState;
|
|
||||||
use OCA\Comments\Notification\Notifier;
|
use OCA\Comments\Notification\Notifier;
|
||||||
use OCA\Comments\Search\LegacyProvider;
|
use OCA\Comments\Search\LegacyProvider;
|
||||||
use OCA\Comments\Search\CommentsSearchProvider;
|
use OCA\Comments\Search\CommentsSearchProvider;
|
||||||
|
@ -45,8 +45,10 @@ use OCP\AppFramework\Bootstrap\IBootContext;
|
||||||
use OCP\AppFramework\Bootstrap\IBootstrap;
|
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||||
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||||
use OCP\Comments\CommentsEntityEvent;
|
use OCP\Comments\CommentsEntityEvent;
|
||||||
|
use OCP\IConfig;
|
||||||
use OCP\ISearch;
|
use OCP\ISearch;
|
||||||
use OCP\IServerContainer;
|
use OCP\IServerContainer;
|
||||||
|
use OCP\Util;
|
||||||
|
|
||||||
class Application extends App implements IBootstrap {
|
class Application extends App implements IBootstrap {
|
||||||
public const APP_ID = 'comments';
|
public const APP_ID = 'comments';
|
||||||
|
@ -73,18 +75,22 @@ class Application extends App implements IBootstrap {
|
||||||
CommentsEntityEventListener::class
|
CommentsEntityEventListener::class
|
||||||
);
|
);
|
||||||
$context->registerSearchProvider(CommentsSearchProvider::class);
|
$context->registerSearchProvider(CommentsSearchProvider::class);
|
||||||
|
|
||||||
$context->registerInitialStateProvider(MaxAutoCompleteResultsInitialState::class);
|
|
||||||
|
|
||||||
$context->registerNotifierService(Notifier::class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function boot(IBootContext $context): void {
|
public function boot(IBootContext $context): void {
|
||||||
|
$context->injectFn(Closure::fromCallable([$this, 'registerNotifier']));
|
||||||
$context->injectFn(Closure::fromCallable([$this, 'registerCommentsEventHandler']));
|
$context->injectFn(Closure::fromCallable([$this, 'registerCommentsEventHandler']));
|
||||||
|
|
||||||
|
$jsSettingsHelper = new JSSettingsHelper($context->getAppContainer()->get(IConfig::class));
|
||||||
|
Util::connectHook('\OCP\Config', 'js', $jsSettingsHelper, 'extend');
|
||||||
|
|
||||||
$context->getServerContainer()->get(ISearch::class)->registerProvider(LegacyProvider::class, ['apps' => ['files']]);
|
$context->getServerContainer()->get(ISearch::class)->registerProvider(LegacyProvider::class, ['apps' => ['files']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function registerNotifier(IServerContainer $container) {
|
||||||
|
$container->getNotificationManager()->registerNotifierService(Notifier::class);
|
||||||
|
}
|
||||||
|
|
||||||
protected function registerCommentsEventHandler(IServerContainer $container) {
|
protected function registerCommentsEventHandler(IServerContainer $container) {
|
||||||
$container->getCommentsManager()->registerEventHandler(function () {
|
$container->getCommentsManager()->registerEventHandler(function () {
|
||||||
return $this->getContainer()->query(EventHandler::class);
|
return $this->getContainer()->query(EventHandler::class);
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @copyright Copyright (c) 2021 Roeland Jago Douma <roeland@famdouma.nl>
|
* @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||||
*
|
*
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||||
|
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||||
*
|
*
|
||||||
* @license GNU AGPL version 3 or any later version
|
* @license GNU AGPL version 3 or any later version
|
||||||
*
|
*
|
||||||
|
@ -26,23 +24,22 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace OCA\Comments;
|
namespace OCA\Comments;
|
||||||
|
|
||||||
use OCP\AppFramework\Services\InitialStateProvider;
|
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
|
||||||
class MaxAutoCompleteResultsInitialState extends InitialStateProvider {
|
class JSSettingsHelper {
|
||||||
|
|
||||||
/** @var IConfig */
|
/** @var IConfig */
|
||||||
private $config;
|
private $c;
|
||||||
|
|
||||||
public function __construct(IConfig $config) {
|
public function __construct(IConfig $c) {
|
||||||
$this->config = $config;
|
$this->c = $c;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getKey(): string {
|
public function extend(array $settings) {
|
||||||
return 'maxAutoCompleteResults';
|
$appConfig = json_decode($settings['array']['oc_appconfig'], true);
|
||||||
}
|
|
||||||
|
|
||||||
public function getData(): int {
|
$value = (int)$this->c->getAppValue('comments', 'maxAutoCompleteResults', 10);
|
||||||
return (int)$this->config->getAppValue('comments', 'maxAutoCompleteResults', '10');
|
$appConfig['comments']['maxAutoCompleteResults'] = $value;
|
||||||
|
|
||||||
|
$settings['array']['oc_appconfig'] = json_encode($appConfig);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -133,7 +133,7 @@ class Notifier implements INotifier {
|
||||||
if (strpos($path, '/' . $notification->getUser() . '/files/') === 0) {
|
if (strpos($path, '/' . $notification->getUser() . '/files/') === 0) {
|
||||||
// Remove /user/files/...
|
// Remove /user/files/...
|
||||||
$fullPath = $path;
|
$fullPath = $path;
|
||||||
[,,, $path] = explode('/', $fullPath, 4);
|
list(,,, $path) = explode('/', $fullPath, 4);
|
||||||
}
|
}
|
||||||
$subjectParameters = [
|
$subjectParameters = [
|
||||||
'file' => [
|
'file' => [
|
||||||
|
@ -155,7 +155,7 @@ class Notifier implements INotifier {
|
||||||
'name' => $displayName,
|
'name' => $displayName,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
[$message, $messageParameters] = $this->commentToRichMessage($comment);
|
list($message, $messageParameters) = $this->commentToRichMessage($comment);
|
||||||
$notification->setRichSubject($subject, $subjectParameters)
|
$notification->setRichSubject($subject, $subjectParameters)
|
||||||
->setParsedSubject($this->richToParsed($subject, $subjectParameters))
|
->setParsedSubject($this->richToParsed($subject, $subjectParameters))
|
||||||
->setRichMessage($message, $messageParameters)
|
->setRichMessage($message, $messageParameters)
|
||||||
|
|
|
@ -1,24 +1,11 @@
|
||||||
/**
|
/**
|
||||||
|
* @author Joas Schilling <coding@schilljs.com>
|
||||||
* Copyright (c) 2016
|
* Copyright (c) 2016
|
||||||
*
|
*
|
||||||
* @author Joas Schilling <coding@schilljs.com>
|
* This file is licensed under the Affero General Public License version 3
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
* or later.
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
*
|
||||||
|
* See the COPYING-README file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
|
@ -1,23 +1,10 @@
|
||||||
/**
|
/*
|
||||||
* Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
|
* Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
|
||||||
*
|
*
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
* This file is licensed under the Affero General Public License version 3
|
||||||
* @author Vincent Petry <vincent@nextcloud.com>
|
* or later.
|
||||||
*
|
*
|
||||||
* @license GNU AGPL version 3 or any later version
|
* See the COPYING-README file.
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,3 @@
|
||||||
/**
|
|
||||||
* @copyright Copyright (c) 2016 Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import './app'
|
import './app'
|
||||||
import './templates'
|
import './templates'
|
||||||
import './filesplugin'
|
import './filesplugin'
|
||||||
|
|
|
@ -66,12 +66,11 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Message editor -->
|
<!-- Message editor -->
|
||||||
<div v-if="editor || editing" class="comment__editor ">
|
<div class="comment__editor " v-if="editor || editing">
|
||||||
<RichContenteditable ref="editor"
|
<RichContenteditable ref="editor"
|
||||||
|
v-model="localMessage"
|
||||||
:auto-complete="autoComplete"
|
:auto-complete="autoComplete"
|
||||||
:contenteditable="!loading"
|
:contenteditable="!loading"
|
||||||
:value="localMessage"
|
|
||||||
@update:value="updateLocalMessage"
|
|
||||||
@submit="onSubmit" />
|
@submit="onSubmit" />
|
||||||
<input v-tooltip="t('comments', 'Post comment')"
|
<input v-tooltip="t('comments', 'Post comment')"
|
||||||
:class="loading ? 'icon-loading-small' :'icon-confirm'"
|
:class="loading ? 'icon-loading-small' :'icon-confirm'"
|
||||||
|
|
|
@ -1,26 +1,10 @@
|
||||||
/**
|
/*
|
||||||
* Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
|
* Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
|
||||||
*
|
*
|
||||||
* @author Joas Schilling <coding@schilljs.com>
|
* This file is licensed under the Affero General Public License version 3
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
* or later.
|
||||||
* @author Michael Jobst <mjobst+github@tecratech.de>
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
* @author Vincent Petry <vincent@nextcloud.com>
|
|
||||||
*
|
*
|
||||||
* @license GNU AGPL version 3 or any later version
|
* See the COPYING-README file.
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>
|
* @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
|
||||||
*
|
*
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||||
*
|
*
|
||||||
|
@ -20,19 +20,18 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { createClient, getPatcher } from 'webdav'
|
import webdav from 'webdav'
|
||||||
import axios from '@nextcloud/axios'
|
import axios from '@nextcloud/axios'
|
||||||
|
|
||||||
import { getRootPath } from '../utils/davUtils'
|
import { getRootPath } from '../utils/davUtils'
|
||||||
|
|
||||||
// Add this so the server knows it is an request from the browser
|
// Add this so the server knows it is an request from the browser
|
||||||
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
|
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
|
||||||
|
|
||||||
// force our axios
|
// force our axios
|
||||||
const patcher = getPatcher()
|
const patcher = webdav.getPatcher()
|
||||||
patcher.patch('request', axios)
|
patcher.patch('request', axios)
|
||||||
|
|
||||||
// init webdav client
|
// init webdav client
|
||||||
const client = createClient(getRootPath())
|
const client = webdav.createClient(getRootPath())
|
||||||
|
|
||||||
export default client
|
export default client
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { parseXML, prepareFileFromProps } from 'webdav/dist/node/tools/dav'
|
import { parseXML, prepareFileFromProps } from 'webdav/dist/node/interface/dav'
|
||||||
import { processResponsePayload } from 'webdav/dist/node/response'
|
import { processResponsePayload } from 'webdav/dist/node/response'
|
||||||
import client from './DavClient'
|
import client from './DavClient'
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,123 @@
|
||||||
(function() {
|
(function() {
|
||||||
var template = Handlebars.template, templates = OCA.Comments.Templates = OCA.Comments.Templates || {};
|
var template = Handlebars.template, templates = OCA.Comments.Templates = OCA.Comments.Templates || {};
|
||||||
templates['filesplugin'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
|
templates['comment'] = template({"1":function(container,depth0,helpers,partials,data) {
|
||||||
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
return " unread";
|
||||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
},"3":function(container,depth0,helpers,partials,data) {
|
||||||
return parent[propertyName];
|
return " collapsed";
|
||||||
}
|
},"5":function(container,depth0,helpers,partials,data) {
|
||||||
return undefined
|
return " currentUser";
|
||||||
};
|
},"7":function(container,depth0,helpers,partials,data) {
|
||||||
|
var helper;
|
||||||
|
|
||||||
|
return "data-username=\""
|
||||||
|
+ container.escapeExpression(((helper = (helper = helpers.actorId || (depth0 != null ? depth0.actorId : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"actorId","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\"";
|
||||||
|
},"9":function(container,depth0,helpers,partials,data) {
|
||||||
|
return " <a href=\"#\" class=\"action more icon icon-more has-tooltip\"></a>\n <div class=\"deleteLoading icon-loading-small hidden\"></div>\n";
|
||||||
|
},"11":function(container,depth0,helpers,partials,data) {
|
||||||
|
return " <div class=\"message-overlay\"></div>\n";
|
||||||
|
},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;
|
||||||
|
|
||||||
|
return "<li class=\"comment"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isUnread : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isLong : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ "\" data-id=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"id","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\">\n <div class=\"authorRow\">\n <div class=\"avatar"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isUserAuthor : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ "\" "
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.actorId : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ "> </div>\n <div class=\"author"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isUserAuthor : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ "\">"
|
||||||
|
+ alias4(((helper = (helper = helpers.actorDisplayName || (depth0 != null ? depth0.actorDisplayName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"actorDisplayName","hash":{},"data":data}) : helper)))
|
||||||
|
+ "</div>\n"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isUserAuthor : depth0),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ " <div class=\"date has-tooltip live-relative-timestamp\" data-timestamp=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.timestamp || (depth0 != null ? depth0.timestamp : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"timestamp","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\" title=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.altDate || (depth0 != null ? depth0.altDate : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altDate","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\">"
|
||||||
|
+ alias4(((helper = (helper = helpers.date || (depth0 != null ? depth0.date : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"date","hash":{},"data":data}) : helper)))
|
||||||
|
+ "</div>\n </div>\n <div class=\"message\">"
|
||||||
|
+ ((stack1 = ((helper = (helper = helpers.formattedMessage || (depth0 != null ? depth0.formattedMessage : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"formattedMessage","hash":{},"data":data}) : helper))) != null ? stack1 : "")
|
||||||
|
+ "</div>\n"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isLong : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ "</li>\n";
|
||||||
|
},"useData":true});
|
||||||
|
templates['commentsmodifymenu'] = template({"1":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;
|
||||||
|
|
||||||
|
return " <li>\n <a href=\"#\" class=\"menuitem action "
|
||||||
|
+ alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper)))
|
||||||
|
+ " permanent\" data-action=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\">\n"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.iconClass : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(4, data, 0),"data":data})) != null ? stack1 : "")
|
||||||
|
+ " <span>"
|
||||||
|
+ alias4(((helper = (helper = helpers.displayName || (depth0 != null ? depth0.displayName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data}) : helper)))
|
||||||
|
+ "</span>\n </a>\n </li>\n";
|
||||||
|
},"2":function(container,depth0,helpers,partials,data) {
|
||||||
|
var helper;
|
||||||
|
|
||||||
|
return " <span class=\"icon "
|
||||||
|
+ container.escapeExpression(((helper = (helper = helpers.iconClass || (depth0 != null ? depth0.iconClass : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\"></span>\n";
|
||||||
|
},"4":function(container,depth0,helpers,partials,data) {
|
||||||
|
return " <span class=\"no-icon\"></span>\n";
|
||||||
|
},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1;
|
||||||
|
|
||||||
|
return "<ul>\n"
|
||||||
|
+ ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ "</ul>\n";
|
||||||
|
},"useData":true});
|
||||||
|
templates['edit_comment'] = template({"1":function(container,depth0,helpers,partials,data) {
|
||||||
|
var helper;
|
||||||
|
|
||||||
|
return " <div class=\"action-container\">\n <a href=\"#\" class=\"action cancel icon icon-close has-tooltip\" title=\""
|
||||||
|
+ container.escapeExpression(((helper = (helper = helpers.cancelText || (depth0 != null ? depth0.cancelText : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"cancelText","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\"></a>\n </div>\n";
|
||||||
|
},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;
|
||||||
|
|
||||||
|
return "<"
|
||||||
|
+ alias4(((helper = (helper = helpers.tag || (depth0 != null ? depth0.tag : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tag","hash":{},"data":data}) : helper)))
|
||||||
|
+ " class=\"newCommentRow comment\" data-id=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"id","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\">\n <div class=\"authorRow\">\n <div class=\"avatar currentUser\" data-username=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.actorId || (depth0 != null ? depth0.actorId : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"actorId","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\"></div>\n <div class=\"author currentUser\">"
|
||||||
|
+ alias4(((helper = (helper = helpers.actorDisplayName || (depth0 != null ? depth0.actorDisplayName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"actorDisplayName","hash":{},"data":data}) : helper)))
|
||||||
|
+ "</div>\n"
|
||||||
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isEditMode : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
+ " </div>\n <form class=\"newCommentForm\">\n <div contentEditable=\"true\" class=\"message\" data-placeholder=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.newMessagePlaceholder || (depth0 != null ? depth0.newMessagePlaceholder : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"newMessagePlaceholder","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\">"
|
||||||
|
+ alias4(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"message","hash":{},"data":data}) : helper)))
|
||||||
|
+ "</div>\n <input class=\"submit icon-confirm has-tooltip\" type=\"submit\" value=\"\" title=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.submitText || (depth0 != null ? depth0.submitText : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"submitText","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\"/>\n <div class=\"submitLoading icon-loading-small hidden\"></div>\n </form>\n</"
|
||||||
|
+ alias4(((helper = (helper = helpers.tag || (depth0 != null ? depth0.tag : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tag","hash":{},"data":data}) : helper)))
|
||||||
|
+ ">\n";
|
||||||
|
},"useData":true});
|
||||||
|
templates['filesplugin'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||||
|
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;
|
||||||
|
|
||||||
return "<a class=\"action action-comment permanent\" title=\""
|
return "<a class=\"action action-comment permanent\" title=\""
|
||||||
+ alias4(((helper = (helper = lookupProperty(helpers,"countMessage") || (depth0 != null ? lookupProperty(depth0,"countMessage") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"countMessage","hash":{},"data":data,"loc":{"start":{"line":1,"column":50},"end":{"line":1,"column":66}}}) : helper)))
|
+ alias4(((helper = (helper = helpers.countMessage || (depth0 != null ? depth0.countMessage : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"countMessage","hash":{},"data":data}) : helper)))
|
||||||
+ "\" href=\"#\">\n <img class=\"svg\" src=\""
|
+ "\" href=\"#\">\n <img class=\"svg\" src=\""
|
||||||
+ alias4(((helper = (helper = lookupProperty(helpers,"iconUrl") || (depth0 != null ? lookupProperty(depth0,"iconUrl") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconUrl","hash":{},"data":data,"loc":{"start":{"line":2,"column":23},"end":{"line":2,"column":34}}}) : helper)))
|
+ alias4(((helper = (helper = helpers.iconUrl || (depth0 != null ? depth0.iconUrl : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconUrl","hash":{},"data":data}) : helper)))
|
||||||
+ "\"/>\n</a>\n";
|
+ "\"/>\n</a>\n";
|
||||||
},"useData":true});
|
},"useData":true});
|
||||||
|
templates['view'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||||
|
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;
|
||||||
|
|
||||||
|
return "<ul class=\"comments\">\n</ul>\n<div class=\"emptycontent hidden\"><div class=\"icon-comment\"></div>\n <p>"
|
||||||
|
+ alias4(((helper = (helper = helpers.emptyResultLabel || (depth0 != null ? depth0.emptyResultLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"emptyResultLabel","hash":{},"data":data}) : helper)))
|
||||||
|
+ "</p></div>\n<input type=\"button\" class=\"showMore hidden\" value=\""
|
||||||
|
+ alias4(((helper = (helper = helpers.moreLabel || (depth0 != null ? depth0.moreLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"moreLabel","hash":{},"data":data}) : helper)))
|
||||||
|
+ "\" name=\"show-more\" id=\"show-more\" />\n<div class=\"loading hidden\" style=\"height: 50px\"></div>\n";
|
||||||
|
},"useData":true});
|
||||||
})();
|
})();
|
|
@ -70,7 +70,6 @@
|
||||||
<script>
|
<script>
|
||||||
import { generateOcsUrl } from '@nextcloud/router'
|
import { generateOcsUrl } from '@nextcloud/router'
|
||||||
import { getCurrentUser } from '@nextcloud/auth'
|
import { getCurrentUser } from '@nextcloud/auth'
|
||||||
import { loadState } from '@nextcloud/initial-state'
|
|
||||||
import axios from '@nextcloud/axios'
|
import axios from '@nextcloud/axios'
|
||||||
import VTooltip from 'v-tooltip'
|
import VTooltip from 'v-tooltip'
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
@ -227,7 +226,7 @@ export default {
|
||||||
itemType: 'files',
|
itemType: 'files',
|
||||||
itemId: this.ressourceId,
|
itemId: this.ressourceId,
|
||||||
sorter: 'commenters|share-recipients',
|
sorter: 'commenters|share-recipients',
|
||||||
limit: loadState('comments', 'maxAutoCompleteResults'),
|
limit: OC.appConfig?.comments?.maxAutoCompleteResults || 25,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
return callback(results.data.ocs.data)
|
return callback(results.data.ocs.data)
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||||
|
*
|
||||||
|
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||||
|
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||||
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCA\Comments\Tests\Unit;
|
||||||
|
|
||||||
|
use OCA\Comments\JSSettingsHelper;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
use Test\TestCase;
|
||||||
|
|
||||||
|
class JSSettingsHelperTest extends TestCase {
|
||||||
|
/** @var IConfig|MockObject */
|
||||||
|
protected $c;
|
||||||
|
/** @var JSSettingsHelper */
|
||||||
|
protected $helper;
|
||||||
|
|
||||||
|
protected function setUp(): void {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->c = $this->createMock(IConfig::class);
|
||||||
|
|
||||||
|
$this->helper = new JSSettingsHelper($this->c);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testExtend() {
|
||||||
|
$this->c->expects($this->once())
|
||||||
|
->method('getAppValue')
|
||||||
|
->with('comments', 'maxAutoCompleteResults')
|
||||||
|
->willReturn(13);
|
||||||
|
|
||||||
|
$config = [
|
||||||
|
'oc_appconfig' => json_encode([
|
||||||
|
'anotherapp' => [
|
||||||
|
'foo' => 'bar',
|
||||||
|
'foobar' => true
|
||||||
|
]
|
||||||
|
])
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->helper->extend(['array' => &$config]);
|
||||||
|
|
||||||
|
$appConfig = json_decode($config['oc_appconfig'], true);
|
||||||
|
$this->assertTrue(isset($appConfig['comments']));
|
||||||
|
$this->assertTrue(isset($appConfig['anotherapp']));
|
||||||
|
$this->assertSame(2, count($appConfig['anotherapp']));
|
||||||
|
$this->assertSame(13, $appConfig['comments']['maxAutoCompleteResults']);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,23 +1,10 @@
|
||||||
/**
|
/*
|
||||||
* Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
|
* Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
|
||||||
*
|
*
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
* This file is licensed under the Affero General Public License version 3
|
||||||
* @author Vincent Petry <vincent@nextcloud.com>
|
* or later.
|
||||||
*
|
*
|
||||||
* @license GNU AGPL version 3 or any later version
|
* See the COPYING-README file.
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,3 @@
|
||||||
/**
|
|
||||||
* @copyright Copyright (c) 2016 John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
*
|
|
||||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<category>social</category>
|
<category>social</category>
|
||||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="21" max-version="21"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<background-jobs>
|
<background-jobs>
|
||||||
<job>OCA\ContactsInteraction\BackgroundJob\CleanupJob</job>
|
<job>OCA\ContactsInteraction\BackgroundJob\CleanupJob</job>
|
||||||
|
|
|
@ -170,7 +170,7 @@ class AddressBook extends ExternalAddressBook implements IACL {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getUid(): string {
|
private function getUid(): string {
|
||||||
[, $uid] = \Sabre\Uri\split($this->principalUri);
|
list(, $uid) = \Sabre\Uri\split($this->principalUri);
|
||||||
return $uid;
|
return $uid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,6 @@ A reference to why it was very difficult to actually find good background pictur
|
||||||
- We need to have a good balance of different motives, e.g. not too many landscape pics.
|
- We need to have a good balance of different motives, e.g. not too many landscape pics.
|
||||||
- Same for a good balance of different colors.
|
- Same for a good balance of different colors.
|
||||||
- The photo needs to work as a background. Photos with objects focused in the middle don’t really work as they will be overlapped by the widgets anyway.
|
- The photo needs to work as a background. Photos with objects focused in the middle don’t really work as they will be overlapped by the widgets anyway.
|
||||||
- Especially the top part cannot have too much differing contrast, as then it’s not possible to see the navigation icons.
|
- Especially the top part can’t have too much differing contrast, as then it’s not possible to see the navigation icons.
|
||||||
- We serve the pictures at 4k resolution and most of the selected images are also available in 6k or higher so it is future-proof.
|
- We serve the pictures at 4k resolution and most of the selected images are also available in 6k or higher so it is future-proof.
|
||||||
- For the search of course we had to limit to CC0, CC By and CC By-Sa. Only CC0 would have been practically impossible cause there’s just not so many good ones which fit.
|
- For the search of course we had to limit to CC0, CC By and CC By-Sa. Only CC0 would have been practically impossible cause there’s just not so many good ones which fit.
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="21" max-version="21"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<navigations>
|
<navigations>
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -6,6 +6,7 @@ OC.L10N.register(
|
||||||
"Show something" : "أظهر شي ما",
|
"Show something" : "أظهر شي ما",
|
||||||
"Customize" : "تعديل",
|
"Customize" : "تعديل",
|
||||||
"Edit widgets" : "تعديل الودجات",
|
"Edit widgets" : "تعديل الودجات",
|
||||||
|
"Get more widgets from the app store" : "احصل على ودجات من متجر التطبيقات",
|
||||||
"Change background image" : "تغييرصورة الخلفية",
|
"Change background image" : "تغييرصورة الخلفية",
|
||||||
"Weather service" : "خدمة احوال الطقس",
|
"Weather service" : "خدمة احوال الطقس",
|
||||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "لخصوصيتك، يتم استدعاء بيانات احوال الطقس عبر خادم نكست كلاود الخاص بك نيابه عنك ولذلك خدمة احوال الطقس لا تشارك المعلومات الشخصية.",
|
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "لخصوصيتك، يتم استدعاء بيانات احوال الطقس عبر خادم نكست كلاود الخاص بك نيابه عنك ولذلك خدمة احوال الطقس لا تشارك المعلومات الشخصية.",
|
||||||
|
@ -26,7 +27,6 @@ OC.L10N.register(
|
||||||
"Default images" : "الصور الإفتراضية",
|
"Default images" : "الصور الإفتراضية",
|
||||||
"Plain background" : "خلفية سادة",
|
"Plain background" : "خلفية سادة",
|
||||||
"Insert from {productName}" : "اضف من {productName}",
|
"Insert from {productName}" : "اضف من {productName}",
|
||||||
"Get more widgets from the app store" : "احصل على ودجات من متجر التطبيقات",
|
|
||||||
"Good night, {name}" : "تصبح على خير، {name}",
|
"Good night, {name}" : "تصبح على خير، {name}",
|
||||||
"Good night" : "تصبح على خير",
|
"Good night" : "تصبح على خير",
|
||||||
"Pick from files" : "اختر من الملفات"
|
"Pick from files" : "اختر من الملفات"
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
"Show something" : "أظهر شي ما",
|
"Show something" : "أظهر شي ما",
|
||||||
"Customize" : "تعديل",
|
"Customize" : "تعديل",
|
||||||
"Edit widgets" : "تعديل الودجات",
|
"Edit widgets" : "تعديل الودجات",
|
||||||
|
"Get more widgets from the app store" : "احصل على ودجات من متجر التطبيقات",
|
||||||
"Change background image" : "تغييرصورة الخلفية",
|
"Change background image" : "تغييرصورة الخلفية",
|
||||||
"Weather service" : "خدمة احوال الطقس",
|
"Weather service" : "خدمة احوال الطقس",
|
||||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "لخصوصيتك، يتم استدعاء بيانات احوال الطقس عبر خادم نكست كلاود الخاص بك نيابه عنك ولذلك خدمة احوال الطقس لا تشارك المعلومات الشخصية.",
|
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "لخصوصيتك، يتم استدعاء بيانات احوال الطقس عبر خادم نكست كلاود الخاص بك نيابه عنك ولذلك خدمة احوال الطقس لا تشارك المعلومات الشخصية.",
|
||||||
|
@ -24,7 +25,6 @@
|
||||||
"Default images" : "الصور الإفتراضية",
|
"Default images" : "الصور الإفتراضية",
|
||||||
"Plain background" : "خلفية سادة",
|
"Plain background" : "خلفية سادة",
|
||||||
"Insert from {productName}" : "اضف من {productName}",
|
"Insert from {productName}" : "اضف من {productName}",
|
||||||
"Get more widgets from the app store" : "احصل على ودجات من متجر التطبيقات",
|
|
||||||
"Good night, {name}" : "تصبح على خير، {name}",
|
"Good night, {name}" : "تصبح على خير، {name}",
|
||||||
"Good night" : "تصبح على خير",
|
"Good night" : "تصبح على خير",
|
||||||
"Pick from files" : "اختر من الملفات"
|
"Pick from files" : "اختر من الملفات"
|
||||||
|
|
|
@ -6,6 +6,7 @@ OC.L10N.register(
|
||||||
"Show something" : "Покажи нещо",
|
"Show something" : "Покажи нещо",
|
||||||
"Customize" : "Персонизиране",
|
"Customize" : "Персонизиране",
|
||||||
"Edit widgets" : "Редактиране на изпълнимите модули",
|
"Edit widgets" : "Редактиране на изпълнимите модули",
|
||||||
|
"Get more widgets from the app store" : "Вземете повече приспособления от app store",
|
||||||
"Change background image" : "Промяна на фоновото изображение",
|
"Change background image" : "Промяна на фоновото изображение",
|
||||||
"Weather service" : "Метеорологична услуга",
|
"Weather service" : "Метеорологична услуга",
|
||||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За вашата поверителност данните за времето се изискват от Nextcloud сървъра ви от ваше име, така че метеорологичната служба не получава лична информация.",
|
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За вашата поверителност данните за времето се изискват от Nextcloud сървъра ви от ваше име, така че метеорологичната служба не получава лична информация.",
|
||||||
|
@ -26,7 +27,6 @@ OC.L10N.register(
|
||||||
"Default images" : "Изображения по подразбиране",
|
"Default images" : "Изображения по подразбиране",
|
||||||
"Plain background" : "Обикновен фон",
|
"Plain background" : "Обикновен фон",
|
||||||
"Insert from {productName}" : "Вмъкване от {productName}",
|
"Insert from {productName}" : "Вмъкване от {productName}",
|
||||||
"Get more widgets from the app store" : "Вземете повече приспособления от app store",
|
|
||||||
"Good night, {name}" : "Лека нощ, {name}",
|
"Good night, {name}" : "Лека нощ, {name}",
|
||||||
"Good night" : "Лека нощ",
|
"Good night" : "Лека нощ",
|
||||||
"Pick from files" : "Избери от Файловете"
|
"Pick from files" : "Избери от Файловете"
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
"Show something" : "Покажи нещо",
|
"Show something" : "Покажи нещо",
|
||||||
"Customize" : "Персонизиране",
|
"Customize" : "Персонизиране",
|
||||||
"Edit widgets" : "Редактиране на изпълнимите модули",
|
"Edit widgets" : "Редактиране на изпълнимите модули",
|
||||||
|
"Get more widgets from the app store" : "Вземете повече приспособления от app store",
|
||||||
"Change background image" : "Промяна на фоновото изображение",
|
"Change background image" : "Промяна на фоновото изображение",
|
||||||
"Weather service" : "Метеорологична услуга",
|
"Weather service" : "Метеорологична услуга",
|
||||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За вашата поверителност данните за времето се изискват от Nextcloud сървъра ви от ваше име, така че метеорологичната служба не получава лична информация.",
|
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За вашата поверителност данните за времето се изискват от Nextcloud сървъра ви от ваше име, така че метеорологичната служба не получава лична информация.",
|
||||||
|
@ -24,7 +25,6 @@
|
||||||
"Default images" : "Изображения по подразбиране",
|
"Default images" : "Изображения по подразбиране",
|
||||||
"Plain background" : "Обикновен фон",
|
"Plain background" : "Обикновен фон",
|
||||||
"Insert from {productName}" : "Вмъкване от {productName}",
|
"Insert from {productName}" : "Вмъкване от {productName}",
|
||||||
"Get more widgets from the app store" : "Вземете повече приспособления от app store",
|
|
||||||
"Good night, {name}" : "Лека нощ, {name}",
|
"Good night, {name}" : "Лека нощ, {name}",
|
||||||
"Good night" : "Лека нощ",
|
"Good night" : "Лека нощ",
|
||||||
"Pick from files" : "Избери от Файловете"
|
"Pick from files" : "Избери от Файловете"
|
||||||
|
|
|
@ -6,6 +6,7 @@ OC.L10N.register(
|
||||||
"Show something" : "Mostra alguna cosa",
|
"Show something" : "Mostra alguna cosa",
|
||||||
"Customize" : "Personalitza",
|
"Customize" : "Personalitza",
|
||||||
"Edit widgets" : "Edita els ginys",
|
"Edit widgets" : "Edita els ginys",
|
||||||
|
"Get more widgets from the app store" : "Obtenir més ginys de la botiga d'aplicacions",
|
||||||
"Change background image" : "Canvia la imatge de fons",
|
"Change background image" : "Canvia la imatge de fons",
|
||||||
"Weather service" : "Servei meteorològic",
|
"Weather service" : "Servei meteorològic",
|
||||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per a la seva privacitat, les dades meteorològiques les sol·licita el seu servidor Nextcloud en el seu lloc perquè el servei meteorològic no rebi cap informació personal.",
|
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per a la seva privacitat, les dades meteorològiques les sol·licita el seu servidor Nextcloud en el seu lloc perquè el servei meteorològic no rebi cap informació personal.",
|
||||||
|
@ -26,7 +27,6 @@ OC.L10N.register(
|
||||||
"Default images" : "Imatges predeterminades",
|
"Default images" : "Imatges predeterminades",
|
||||||
"Plain background" : "Fons senzill",
|
"Plain background" : "Fons senzill",
|
||||||
"Insert from {productName}" : "Insereix des de {productName}",
|
"Insert from {productName}" : "Insereix des de {productName}",
|
||||||
"Get more widgets from the app store" : "Obtenir més ginys de la botiga d'aplicacions",
|
|
||||||
"Good night, {name}" : "Bona nit, {name}",
|
"Good night, {name}" : "Bona nit, {name}",
|
||||||
"Good night" : "Bona nit",
|
"Good night" : "Bona nit",
|
||||||
"Pick from files" : "Tria entre fitxers"
|
"Pick from files" : "Tria entre fitxers"
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue