Compare commits
386 Commits
release-20
...
master
Author | SHA1 | Date |
---|---|---|
johndoh | 279ae66120 | 4 years ago |
johndoh | 13a066b24f | 4 years ago |
William Rankin | 40250563e3 | 4 years ago |
Aleksander Machniak | b22f1c9a1b | 4 years ago |
Aleksander Machniak | ec2e713ecb | 4 years ago |
Gianluca Giacometti | 4ada2c3f13 | 4 years ago |
Aleksander Machniak | 98881a0cbd | 4 years ago |
Aleksander Machniak | 1c76c8440f | 4 years ago |
Aleksander Machniak | 731be15d46 | 4 years ago |
Aleksander Machniak | 9ee1f4b636 | 4 years ago |
Aleksander Machniak | 51eb8a6a68 | 4 years ago |
Aleksander Machniak | 9508acf249 | 4 years ago |
Aleksander Machniak | 30610e867e | 4 years ago |
johndoh | 9dbe666d4c | 4 years ago |
Aleksander Machniak | 86d34960c8 | 4 years ago |
Théo | 61185b9362 | 4 years ago |
William Rankin | 13b03c3953 | 4 years ago |
Kent Varmedal | b4dabff26c | 4 years ago |
Aleksander Machniak | 278cf3c18e | 4 years ago |
Aleksander Machniak | e9c592a6e8 | 4 years ago |
Aleksander Machniak | bb06645b8f | 4 years ago |
Aleksander Machniak | 9b8ed0dfeb | 4 years ago |
Aleksander Machniak | 218cd2ab4a | 4 years ago |
Aleksander Machniak | 4e00237cc4 | 4 years ago |
Aleksander Machniak | eaebae1e54 | 4 years ago |
Aleksander Machniak | 77174ff9ff | 4 years ago |
Aleksander Machniak | 25772702ac | 4 years ago |
Aleksander Machniak | af0e98759d | 4 years ago |
Aleksander Machniak | cd76046237 | 4 years ago |
Aleksander Machniak | 46d3cae2ff | 4 years ago |
Aleksander Machniak | bda02002de | 4 years ago |
Aleksander Machniak | ecabb1e667 | 4 years ago |
Aleksander Machniak | 31249d932d | 4 years ago |
Aleksander Machniak | e05c69afab | 4 years ago |
Aleksander Machniak | 6436c22d2d | 4 years ago |
Aleksander Machniak | da2bb8af6d | 4 years ago |
Aleksander Machniak | f6586c7cf7 | 4 years ago |
Aleksander Machniak | 82ee69df15 | 4 years ago |
johndoh | 34a0af8964 | 4 years ago |
Aleksander Machniak | 30d31c323b | 4 years ago |
Aleksander Machniak | a47c558df4 | 4 years ago |
Aleksander Machniak | 14a8a99ee2 | 4 years ago |
Christopher Gurnee | 40ecd47f90 | 4 years ago |
Aleksander Machniak | 06a1964ef6 | 4 years ago |
Christopher Gurnee | 24d0cf5d34 | 4 years ago |
Christopher Gurnee | c3d4598985 | 4 years ago |
Aleksander Machniak | 7dcba95605 | 4 years ago |
vaaguirre | 9bec8dd506 | 4 years ago |
Aleksander Machniak | 663f7a8c58 | 4 years ago |
johndoh | 3af6303ad7 | 4 years ago |
Aleksander Machniak | 35c29be9b2 | 4 years ago |
Aleksander Machniak | 87f42677c2 | 4 years ago |
Aleksander Machniak | 7ead0bb227 | 4 years ago |
Aleksander Machniak | 014659b600 | 4 years ago |
Aleksander Machniak | f0f6234a1a | 4 years ago |
Aleksander Machniak | 87ca7a09dc | 4 years ago |
Aleksander Machniak | 377239fa8e | 4 years ago |
Aleksander Machniak | a2ee9f7eab | 4 years ago |
Aleksander Machniak | 1aebb1985c | 4 years ago |
Aleksander Machniak | 09848515fe | 4 years ago |
Sander Nilsen | 0efa899d6c | 4 years ago |
Aleksander Machniak | 55343ffd7d | 4 years ago |
johndoh | ec86e3cb7f | 4 years ago |
Aleksander Machniak | 8fac36e2c2 | 4 years ago |
Aleksander Machniak | 3d2bb47f8d | 4 years ago |
Aleksander Machniak | c39081b6a1 | 4 years ago |
Aleksander Machniak | 12d4705935 | 4 years ago |
Tomasz Chiliński | 0b09b24a55 | 4 years ago |
Aleksander Machniak | 8344f07d7f | 4 years ago |
Aleksander Machniak | 219e353ac1 | 4 years ago |
Aleksander Machniak | 4951d6603a | 4 years ago |
Aleksander Machniak | 87e4cd0cf2 | 4 years ago |
Tomasz Chiliński | 8db9b8b6e2 | 4 years ago |
Tomasz Chiliński | 682cea5cc5 | 4 years ago |
Tomasz Chiliński | aae1189dbf | 4 years ago |
Tomasz Chiliński | 6f8663f7ef | 4 years ago |
Aleksander Machniak | 6b5fc8db95 | 4 years ago |
Aleksander Machniak | b35b5a1a26 | 4 years ago |
Aleksander Machniak | bf34e8cf9c | 4 years ago |
Aleksander Machniak | 36532345df | 4 years ago |
Aleksander Machniak | 30b5803ee4 | 4 years ago |
Aleksander Machniak | cb9b22dcc1 | 4 years ago |
Aleksander Machniak | 3e9aefceef | 4 years ago |
Aleksander Machniak | 15ee34a438 | 4 years ago |
Aleksander Machniak | 4a5efe09f9 | 4 years ago |
Aleksander Machniak | 43456db922 | 4 years ago |
Aleksander Machniak | 32fac136db | 4 years ago |
Aleksander Machniak | 9ddb57f5bb | 4 years ago |
Aleksander Machniak | 679cb1833c | 4 years ago |
Aleksander Machniak | ae687d7a7a | 4 years ago |
Aleksander Machniak | cb8c07843b | 4 years ago |
PhilW | ace991946f | 4 years ago |
Aleksander Machniak | e0b56aeb4d | 4 years ago |
Aleksander Machniak | 7d97c5b215 | 4 years ago |
johndoh | 77e2ee9c9e | 4 years ago |
Aleksander Machniak | c2b12d2b2b | 4 years ago |
Aleksander Machniak | e84dc4c385 | 4 years ago |
Aleksander Machniak | b771cccbaa | 4 years ago |
dessert1 | e66ffae856 | 4 years ago |
Aleksander Machniak | 3d4a02a3a6 | 4 years ago |
Aleksander Machniak | 2965e60c1f | 4 years ago |
Aleksander Machniak | f9c84e2646 | 4 years ago |
Aleksander Machniak | 7df358d64e | 4 years ago |
Aleksander Machniak | f0ec65ee70 | 4 years ago |
Christoph Langguth | 81839093bb | 4 years ago |
Aleksander Machniak | 005da225f6 | 4 years ago |
Aleksander Machniak | c26ba1ee5d | 4 years ago |
johndoh | 81dcf4a7de | 4 years ago |
Aleksander Machniak | 84505edac5 | 4 years ago |
johndoh | 11aa9633b1 | 4 years ago |
Aleksander Machniak | 623a642457 | 4 years ago |
Aleksander Machniak | 68350bd385 | 4 years ago |
Aleksander Machniak | 3c8b270d8d | 4 years ago |
Aleksander Machniak | be7770b5a9 | 4 years ago |
Christoph Langguth | a70baca3ae | 4 years ago |
johndoh | 97732d5de7 | 4 years ago |
Aleksander Machniak | dc1ce546b9 | 4 years ago |
Aleksander Machniak | 2c1a22d283 | 4 years ago |
Aleksander Machniak | 0fbd184294 | 4 years ago |
Aleksander Machniak | b3b5b9665d | 4 years ago |
Aleksander Machniak | a748214595 | 4 years ago |
Aleksander Machniak | e5247e855e | 4 years ago |
Aleksander Machniak | d194b238c7 | 4 years ago |
Christoph Langguth | 370789c8c9 | 4 years ago |
Mildred Ki'Lya | 88577119d7 | 4 years ago |
Aleksander Machniak | 088714619e | 4 years ago |
Aleksander Machniak | f452d33d44 | 4 years ago |
Aleksander Machniak | b2391417b3 | 4 years ago |
Aleksander Machniak | 68c8ee0a2b | 4 years ago |
Aleksander Machniak | b7410ffe89 | 4 years ago |
Aleksander Machniak | 80a244756d | 4 years ago |
Aleksander Machniak | 38d6659384 | 4 years ago |
Aleksander Machniak | e58c6547ca | 4 years ago |
Aleksander Machniak | 770d818dd9 | 4 years ago |
Aleksander Machniak | 4b219792a7 | 4 years ago |
Aleksander Machniak | f94b871aa6 | 4 years ago |
Aleksander Machniak | db5ab6d3f6 | 4 years ago |
PhilW | 65a6a511a6 | 4 years ago |
Aleksander Machniak | f2328bbe6b | 4 years ago |
Aleksander Machniak | b80171f37b | 4 years ago |
Aleksander Machniak | 4e2e876101 | 4 years ago |
Paul J. Dorn | 305c9355ee | 4 years ago |
Aleksander Machniak | 32b37fba33 | 4 years ago |
Aleksander Machniak | ea2d0ad458 | 4 years ago |
Aleksander Machniak | b606d81cdf | 4 years ago |
MrSorcus | 706912e534 | 4 years ago |
Aleksander Machniak | 50d6ea30e0 | 4 years ago |
Aleksander Machniak | 60c8dd2e23 | 4 years ago |
Aleksander Machniak | 0b02e87afe | 4 years ago |
Aleksander Machniak | fe796d4040 | 4 years ago |
Aleksander Machniak | 3478b002f8 | 4 years ago |
Aleksander Machniak | 4114dc932d | 4 years ago |
Aleksander Machniak | a075616fb2 | 4 years ago |
Aleksander Machniak | d594ce2483 | 4 years ago |
Aleksander Machniak | d340f18295 | 4 years ago |
Aleksander Machniak | 8080eb2c71 | 4 years ago |
Aleksander Machniak | 84aa5d93f1 | 4 years ago |
Aleksander Machniak | c6392f2168 | 4 years ago |
Aleksander Machniak | 6c1e8e1efe | 4 years ago |
Aleksander Machniak | cbcebad9c1 | 4 years ago |
Eli Schiff | b6db3e4ad7 | 4 years ago |
Aleksander Machniak | bdf0a6539e | 4 years ago |
Aleksander Machniak | 8793baa006 | 4 years ago |
Aleksander Machniak | 97e6065897 | 4 years ago |
Aleksander Machniak | 1613f3ab4c | 4 years ago |
Aleksander Machniak | e4281ae6d4 | 4 years ago |
Aleksander Machniak | d1b61410fc | 4 years ago |
Aleksander Machniak | d979aa0584 | 4 years ago |
Aleksander Machniak | 1376b5a647 | 4 years ago |
Aleksander Machniak | b536e18d97 | 4 years ago |
Aleksander Machniak | 2f20f43cbb | 4 years ago |
Aleksander Machniak | 93519df826 | 4 years ago |
Aleksander Machniak | 689c761026 | 4 years ago |
Aleksander Machniak | e89376709c | 4 years ago |
Aleksander Machniak | 6e63db6487 | 4 years ago |
Aleksander Machniak | c2c85b0a76 | 4 years ago |
Aleksander Machniak | 2037f2612b | 4 years ago |
Aleksander Machniak | b6e75ebea7 | 4 years ago |
Aleksander Machniak | c138567ab5 | 4 years ago |
Aleksander Machniak | 4258acf57f | 4 years ago |
Max Bosse | 3faa976fc8 | 4 years ago |
Aleksander Machniak | 5005c6c3e3 | 4 years ago |
Aleksander Machniak | 5a6606a245 | 4 years ago |
Aleksander Machniak | 4f47ac0405 | 4 years ago |
Aleksander Machniak | 700031b3b7 | 4 years ago |
Aleksander Machniak | 62fb938260 | 4 years ago |
Aleksander Machniak | 38116c1ae5 | 4 years ago |
Aleksander Machniak | 5c73848499 | 4 years ago |
Aleksander Machniak | c2e348067e | 4 years ago |
Aleksander Machniak | 47089e9265 | 4 years ago |
Aleksander Machniak | f93857fbab | 4 years ago |
ssodk | 10ec313034 | 4 years ago |
Aleksander Machniak | 9311c49cf4 | 4 years ago |
Aleksander Machniak | 470e91e615 | 4 years ago |
Aleksander Machniak | c4f114fa84 | 4 years ago |
Aleksander Machniak | 7d2b4f8d15 | 4 years ago |
Aleksander Machniak | d8ebf290b2 | 4 years ago |
Aleksander Machniak | b26340c271 | 4 years ago |
Aleksander Machniak | 646e0b99ea | 4 years ago |
Aleksander Machniak | e3556986a1 | 4 years ago |
Aleksander Machniak | 355ff138fd | 4 years ago |
Aleksander Machniak | 5d025609d3 | 4 years ago |
Aleksander Machniak | a646b13715 | 4 years ago |
Aleksander Machniak | 31b0275573 | 4 years ago |
Aleksander Machniak | a9abe62d58 | 4 years ago |
Aleksander Machniak | fded360d84 | 4 years ago |
Aleksander Machniak | 3cab0ad493 | 4 years ago |
Aleksander Machniak | 0eb4674216 | 4 years ago |
Aleksander Machniak | 1b376517e8 | 4 years ago |
johndoh | 51a9dd631f | 4 years ago |
Aleksander Machniak | 5236f40823 | 4 years ago |
Aleksander Machniak | e8e8c31eb3 | 4 years ago |
Aleksander Machniak | 245e1aa9f9 | 4 years ago |
johndoh | d51352b9cb | 4 years ago |
Aleksander Machniak | 530b53d92f | 4 years ago |
jelle van der Waa | 11e5c1af4f | 4 years ago |
Théo | 5a1a33752e | 4 years ago |
Aleksander Machniak | 094da1e653 | 4 years ago |
Aleksander Machniak | e2bd4548ed | 4 years ago |
Aleksander Machniak | 2c0dd762ed | 4 years ago |
Aleksander Machniak | cf8277ea3e | 4 years ago |
Aleksander Machniak | f72054e761 | 4 years ago |
Aleksander Machniak | 1edd7a4b3f | 4 years ago |
Aleksander Machniak | 57162ef481 | 4 years ago |
Aleksander Machniak | 421dbf5271 | 4 years ago |
Aleksander Machniak | 564287d6c8 | 4 years ago |
Aleksander Machniak | accb5f63e2 | 4 years ago |
Aleksander Machniak | 9a0e71ddee | 4 years ago |
Aleksander Machniak | 934382c91f | 4 years ago |
Aleksander Machniak | a32e2b4c6f | 4 years ago |
Aleksander Machniak | 59e1efb595 | 4 years ago |
Aleksander Machniak | 7abd4f2c15 | 4 years ago |
Aleksander Machniak | 5defccb919 | 4 years ago |
Aleksander Machniak | 7911c75b1e | 4 years ago |
Aleksander Machniak | ef0d23241a | 4 years ago |
Aleksander Machniak | f32b9ae51d | 4 years ago |
Aleksander Machniak | 581bc6886b | 4 years ago |
Aleksander Machniak | 724f5c740c | 4 years ago |
Aleksander Machniak | 31b33c0f39 | 4 years ago |
Aleksander Machniak | 15885055ca | 4 years ago |
Aleksander Machniak | 9d1e4b4828 | 4 years ago |
Aleksander Machniak | 87304c29d1 | 4 years ago |
Aleksander Machniak | 53a111f8c3 | 4 years ago |
Aleksander Machniak | 1f656e5a07 | 4 years ago |
Aleksander Machniak | 895b6f54f3 | 4 years ago |
Aleksander Machniak | a88798ab18 | 4 years ago |
Aleksander Machniak | 7ebc159780 | 4 years ago |
Aleksander Machniak | 0ea8e9c289 | 4 years ago |
Aleksander Machniak | dd7b51bcd3 | 4 years ago |
Aleksander Machniak | d67b288cbc | 4 years ago |
Aleksander Machniak | eac409ac4a | 4 years ago |
Aleksander Machniak | 0b9ff6426e | 4 years ago |
Aleksander Machniak | 47d9ed6d0c | 4 years ago |
Aleksander Machniak | ad84b2df3f | 5 years ago |
Aleksander Machniak | f610707554 | 5 years ago |
Aleksander Machniak | df2acc5eb8 | 5 years ago |
Aleksander Machniak | 9bb95471bf | 5 years ago |
Aleksander Machniak | 226097fc3f | 5 years ago |
Aleksander Machniak | 52caed0d66 | 5 years ago |
Aleksander Machniak | 37cfa0a43b | 5 years ago |
Aleksander Machniak | 5f30dc68a3 | 5 years ago |
Aleksander Machniak | eadbe91c92 | 5 years ago |
Aleksander Machniak | 29defb82e9 | 5 years ago |
Aleksander Machniak | cf90c69ad7 | 5 years ago |
Aleksander Machniak | 545ea62dfc | 5 years ago |
Aleksander Machniak | 34e2507aac | 5 years ago |
Aleksander Machniak | 93c0e02f07 | 5 years ago |
Aleksander Machniak | d8d29241a6 | 5 years ago |
Aleksander Machniak | 0aa5eca1fd | 5 years ago |
Aleksander Machniak | db4bf5573e | 5 years ago |
Aleksander Machniak | a5b15da155 | 5 years ago |
Aleksander Machniak | 0b45c3c6b0 | 5 years ago |
Aleksander Machniak | df7b76b023 | 5 years ago |
Aleksander Machniak | a51beef56c | 5 years ago |
Aleksander Machniak | f3381f12d3 | 5 years ago |
Aleksander Machniak | 3fda927858 | 5 years ago |
Sebastiaan Lokhorst | 259b7fa065 | 5 years ago |
Hiroshi Shirosaki | a335102e47 | 5 years ago |
Hiroshi Shirosaki | d9667295d8 | 5 years ago |
Hiroshi Shirosaki | 869d1d1eaf | 5 years ago |
Aleksander Machniak | 8471930652 | 5 years ago |
Aleksander Machniak | 5b253fb498 | 5 years ago |
Aleksander Machniak | 90781bff3b | 5 years ago |
Aleksander Machniak | 58aea024b4 | 5 years ago |
Aleksander Machniak | 94c795b539 | 5 years ago |
Aleksander Machniak | e7cb9bf604 | 5 years ago |
Aleksander Machniak | e3c6989494 | 5 years ago |
Aleksander Machniak | 3b3dd0cf7a | 5 years ago |
Aleksander Machniak | 35101ca44a | 5 years ago |
Aleksander Machniak | 57476c09f9 | 5 years ago |
Aleksander Machniak | 604e814898 | 5 years ago |
Aleksander Machniak | 9219f4cd65 | 5 years ago |
Christian Weiske | 1c1a73e4d5 | 5 years ago |
Sebastiaan Lokhorst | 511e99ee1a | 5 years ago |
Aleksander Machniak | 2321bce469 | 5 years ago |
Aleksander Machniak | 04aff2efa3 | 5 years ago |
Aleksander Machniak | 2f928a516d | 5 years ago |
Aleksander Machniak | fa34e5ebcd | 5 years ago |
Aleksander Machniak | 006f7d1087 | 5 years ago |
Aleksander Machniak | ffeebff3f9 | 5 years ago |
Aleksander Machniak | 45546508d2 | 5 years ago |
Aleksander Machniak | 8d81df7dc3 | 5 years ago |
Aleksander Machniak | dbc2b5e11c | 5 years ago |
Aleksander Machniak | 4485940d0e | 5 years ago |
Aleksander Machniak | 4cf2363f43 | 5 years ago |
johndoh | b68c141e1d | 5 years ago |
Aleksander Machniak | e0574d909e | 5 years ago |
Aleksander Machniak | 8a25ddbf53 | 5 years ago |
Aleksander Machniak | feb4ecdf51 | 5 years ago |
Aleksander Machniak | 022a1b683f | 5 years ago |
Aleksander Machniak | d4a8642d5a | 5 years ago |
Aleksander Machniak | d2738d1e8b | 5 years ago |
Aleksander Machniak | ba83042b1a | 5 years ago |
Aleksander Machniak | ea3ad31ce0 | 5 years ago |
Aleksander Machniak | 47f72303ac | 5 years ago |
Aleksander Machniak | 4b607e2ed3 | 5 years ago |
Aleksander Machniak | fecff809fe | 5 years ago |
Aleksander Machniak | 0113ea9602 | 5 years ago |
Aleksander Machniak | 2e2028ae78 | 5 years ago |
Aleksander Machniak | b6810cc163 | 5 years ago |
Aleksander Machniak | f4722cb451 | 5 years ago |
Aleksander Machniak | d0dd042b73 | 5 years ago |
Aleksander Machniak | b63bc1ae22 | 5 years ago |
Aleksander Machniak | 81bccd00ad | 5 years ago |
Aleksander Machniak | 22d629a0e9 | 5 years ago |
Aleksander Machniak | 110eebdd1b | 5 years ago |
Aleksander Machniak | ee1f01a0df | 5 years ago |
Aleksander Machniak | 157edd72bb | 5 years ago |
Aleksander Machniak | b4b400c91d | 5 years ago |
Aleksander Machniak | 1eb50c7cd3 | 5 years ago |
Aleksander Machniak | 71bcf2e245 | 5 years ago |
Aleksander Machniak | b63d549834 | 5 years ago |
Aleksander Machniak | 4b24ba1372 | 5 years ago |
Aleksander Machniak | 4cf8952afa | 5 years ago |
Aleksander Machniak | 338b25dec9 | 5 years ago |
Aleksander Machniak | 03cee8f554 | 5 years ago |
Aleksander Machniak | 8aaf7d35c1 | 5 years ago |
Aleksander Machniak | 30af42be87 | 5 years ago |
Aleksander Machniak | 757d5fc1b1 | 5 years ago |
Thomas Bruederli | 9ebba7c2ce | 5 years ago |
Aleksander Machniak | 6aab238773 | 5 years ago |
Aleksander Machniak | c5c5a9325c | 5 years ago |
Aleksander Machniak | 508e83470c | 5 years ago |
Aleksander Machniak | f768ff1464 | 5 years ago |
PhilW | 75125cbac1 | 5 years ago |
PhilW | 97001e9221 | 5 years ago |
Aleksander Machniak | 727f8f04d8 | 5 years ago |
Aleksander Machniak | 52c755207d | 5 years ago |
Aleksander Machniak | 3a097e6836 | 5 years ago |
Aleksander Machniak | df414aa30c | 5 years ago |
Aleksander Machniak | 5543240e67 | 5 years ago |
Aleksander Machniak | 5a0843de4b | 5 years ago |
Aleksander Machniak | 5b6a50a4e4 | 5 years ago |
Aleksander Machniak | 6f4c2cf231 | 5 years ago |
Aleksander Machniak | bdce0ba3f2 | 5 years ago |
Aleksander Machniak | 3cd3d8eecb | 5 years ago |
Aleksander Machniak | bd21d43ac9 | 5 years ago |
Aleksander Machniak | 90738d7a36 | 5 years ago |
Aleksander Machniak | 40aef395bb | 5 years ago |
Aleksander Machniak | 67898b23e4 | 5 years ago |
Aleksander Machniak | 2e26aee2b6 | 5 years ago |
Aleksander Machniak | f2c878c82b | 5 years ago |
Aleksander Machniak | 814db5a33e | 5 years ago |
Aleksander Machniak | 294683b390 | 5 years ago |
Aleksander Machniak | a269e7c106 | 5 years ago |
Aleksander Machniak | 4d54074ad2 | 5 years ago |
Aleksander Machniak | c2bd60f1aa | 5 years ago |
Aleksander Machniak | a80d73602f | 5 years ago |
Aleksander Machniak | b8555ce4f3 | 5 years ago |
Aleksander Machniak | 4e840c7669 | 5 years ago |
Aleksander Machniak | 7f6dd16479 | 5 years ago |
Aleksander Machniak | 98c71ee62e | 5 years ago |
Aleksander Machniak | c734f3e1ab | 5 years ago |
Aleksander Machniak | 3c01f472e0 | 5 years ago |
Aleksander Machniak | 4cc20eef72 | 5 years ago |
Aleksander Machniak | 700cc5a055 | 5 years ago |
Aleksander Machniak | 58850f0b93 | 5 years ago |
Aleksander Machniak | 5677b2fc9d | 5 years ago |
Aleksander Machniak | 8a726316bb | 5 years ago |
Aleksander Machniak | 57aa69206a | 5 years ago |
Aleksander Machniak | 358f647273 | 5 years ago |
Thomas Bruederli | 8db933e440 | 5 years ago |
Aleksander Machniak | 0e2d3789ce | 5 years ago |
Aleksander Machniak | 959654c0c2 | 5 years ago |
Aleksander Machniak | 9f1d185c44 | 5 years ago |
PhilW | 32775f0e43 | 5 years ago |
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
$config = array();
|
||||
|
||||
// Database configuration
|
||||
$config['db_dsnw'] = 'sqlite:////tmp/sqlite.db?mode=0646';
|
||||
|
||||
// Test user credentials
|
||||
$config['tests_username'] = 'test';
|
||||
$config['tests_password'] = 'test';
|
||||
|
||||
// GreenMail
|
||||
$config['smtp_port'] = 25;
|
||||
|
||||
// Settings required by the tests
|
||||
|
||||
$config['create_default_folders'] = true;
|
||||
$config['skin'] = 'elastic';
|
||||
$config['support_url'] = 'http://support.url';
|
||||
|
||||
// Plugins with tests
|
||||
|
||||
$config['plugins'] = [
|
||||
'archive',
|
||||
'attachment_reminder',
|
||||
'markasjunk',
|
||||
'zipdownload'
|
||||
];
|
||||
|
||||
$config['archive_mbox'] = 'Archive';
|
@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script is intended for use on Travis with Trusty distribution
|
||||
|
||||
DIR=$(dirname $0)
|
||||
|
||||
# Enable xdebug for code coverage
|
||||
if [ "$CODE_COVERAGE" != 1 ]; then phpenv config-rm xdebug.ini || true; fi
|
||||
|
||||
cd $DIR/..
|
||||
|
||||
cp composer.json-dist composer.json
|
||||
|
||||
# Add laravel/dusk for Browser tests
|
||||
if [ "$BROWSER_TESTS" = 1 ]; then composer require "laravel/dusk:~5.9.1" --no-update; fi
|
||||
|
||||
# Remove qr-code as it requires php-gd which is not always available on Travis
|
||||
# and we don't really need it for tests
|
||||
composer remove endroid/qr-code --no-update
|
||||
|
||||
# Install PHP dependencies
|
||||
composer install --prefer-dist
|
@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script is intended for use on Travis with Trusty distribution
|
||||
# It executes unit and functional tests
|
||||
|
||||
DIR=$(dirname $0)
|
||||
cd $DIR/..
|
||||
|
||||
if [ "$CODE_COVERAGE" = 1 ]
|
||||
then
|
||||
CODE_COVERAGE_ARGS="--coverage-text"
|
||||
fi
|
||||
|
||||
vendor/bin/phpunit -c tests/phpunit.xml $CODE_COVERAGE_ARGS
|
||||
|
||||
if [ "$BROWSER_TESTS" = 1 ] && [ $? = 0 ]
|
||||
then
|
||||
.ci/setup.sh \
|
||||
&& echo "TESTS_MODE: DESKTOP" \
|
||||
&& TESTS_MODE=desktop vendor/bin/phpunit -c tests/Browser/phpunit.xml \
|
||||
&& echo "TESTS_MODE: PHONE" \
|
||||
&& TESTS_MODE=phone vendor/bin/phpunit -c tests/Browser/phpunit.xml \
|
||||
&& echo "TESTS_MODE: TABLET" \
|
||||
&& TESTS_MODE=tablet vendor/bin/phpunit -c tests/Browser/phpunit.xml
|
||||
fi
|
@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script is intended for use on Travis with Trusty distribution
|
||||
# It installs in-browser tests dependencies and prepares Roundcube instance
|
||||
|
||||
GMV=1.5.11
|
||||
CHROMEVERSION=$(google-chrome-stable --version | tr -cd [:digit:]. | cut -d . -f 1)
|
||||
GMARGS="-Dgreenmail.setup.all -Dgreenmail.users=test:test -Dgreenmail.startup.timeout=3000"
|
||||
|
||||
# Roundcube tests and instance configuration
|
||||
cp .ci/config-test.inc.php config/config-test.inc.php
|
||||
|
||||
# Make temp and logs writeable
|
||||
sudo chmod 777 temp logs
|
||||
|
||||
# Install javascript dependencies
|
||||
bin/install-jsdeps.sh
|
||||
|
||||
# Compile Elastic's styles
|
||||
lessc skins/elastic/styles/styles.less > skins/elastic/styles/styles.css
|
||||
lessc skins/elastic/styles/print.less > skins/elastic/styles/print.css
|
||||
lessc skins/elastic/styles/embed.less > skins/elastic/styles/embed.css
|
||||
|
||||
# Install proper WebDriver version for installed Chrome browser
|
||||
php tests/Browser/install.php $CHROMEVERSION
|
||||
|
||||
# GreenMail server download, setup and start
|
||||
wget https://repo1.maven.org/maven2/com/icegreen/greenmail-standalone/$GMV/greenmail-standalone-$GMV.jar \
|
||||
&& (sudo java $GMARGS -jar greenmail-standalone-$GMV.jar &) \
|
||||
&& sleep 5
|
@ -0,0 +1,4 @@
|
||||
ALTER TABLE [dbo].[users] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[dictionary] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NOT NULL
|
||||
GO
|
@ -0,0 +1,2 @@
|
||||
ALTER TABLE `users` MODIFY `language` varchar(16);
|
||||
ALTER TABLE `dictionary` MODIFY `language` varchar(16) NOT NULL;
|
@ -0,0 +1,21 @@
|
||||
ALTER TABLE `session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_shared` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_index` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_thread` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `contacts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `contactgroups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `identities` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `dictionary` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `filestore` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `system` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
ALTER TABLE `users` CHANGE `username` `username` varchar(128) BINARY NOT NULL;
|
||||
ALTER TABLE `cache` CHANGE `cache_key` `cache_key` varchar(128) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_shared` CHANGE `cache_key` `cache_key` varchar(255) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_index` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_thread` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_messages` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
|
@ -0,0 +1,2 @@
|
||||
ALTER TABLE "users" MODIFY "language" varchar(16) NOT NULL;
|
||||
ALTER TABLE "dictionary" MODIFY "language" varchar(16);
|
@ -0,0 +1 @@
|
||||
-- empty
|
@ -0,0 +1,2 @@
|
||||
ALTER TABLE "dictionary" ALTER COLUMN "language" TYPE varchar(16);
|
||||
ALTER TABLE "users" ALTER COLUMN "language" TYPE varchar(16);
|
@ -0,0 +1 @@
|
||||
-- empty
|
@ -0,0 +1,57 @@
|
||||
CREATE TABLE tmp_users (
|
||||
user_id integer NOT NULL PRIMARY KEY,
|
||||
username varchar(128) NOT NULL default '',
|
||||
mail_host varchar(128) NOT NULL default '',
|
||||
created datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
last_login datetime DEFAULT NULL,
|
||||
failed_login datetime DEFAULT NULL,
|
||||
failed_login_counter integer DEFAULT NULL,
|
||||
language varchar(16),
|
||||
preferences text NOT NULL default ''
|
||||
);
|
||||
|
||||
INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences)
|
||||
SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM users;
|
||||
|
||||
DROP TABLE users;
|
||||
|
||||
CREATE TABLE users (
|
||||
user_id integer NOT NULL PRIMARY KEY,
|
||||
username varchar(128) NOT NULL default '',
|
||||
mail_host varchar(128) NOT NULL default '',
|
||||
created datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
last_login datetime DEFAULT NULL,
|
||||
failed_login datetime DEFAULT NULL,
|
||||
failed_login_counter integer DEFAULT NULL,
|
||||
language varchar(16),
|
||||
preferences text NOT NULL default ''
|
||||
);
|
||||
|
||||
INSERT INTO users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences)
|
||||
SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM tmp_users;
|
||||
|
||||
CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
|
||||
|
||||
DROP TABLE tmp_users;
|
||||
|
||||
DROP TABLE users;
|
||||
|
||||
CREATE TABLE tmp_dictionary (
|
||||
user_id integer DEFAULT NULL,
|
||||
language varchar(16) NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO tmp_dictionary (user_id, language, data) SELECT user_id, language, data FROM dictionary;
|
||||
|
||||
CREATE TABLE dictionary (
|
||||
user_id integer DEFAULT NULL,
|
||||
language varchar(16) NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO dictionary (user_id, language, data) SELECT user_id, language, data FROM tmp_dictionary;
|
||||
|
||||
CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, language);
|
||||
|
||||
DROP TABLE tmp_dictionary;
|
@ -0,0 +1 @@
|
||||
-- empty
|
@ -1,27 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| Roundcube Webmail Selenium Tests Entry Point |
|
||||
| |
|
||||
| Copyright (C) The Roundcube Dev Team |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| This is the public entry point for all HTTP requests to the |
|
||||
| Roundcube webmail application loading the 'tests' environment. |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <thomas@roundcube.net> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__) . '/');
|
||||
|
||||
$GLOBALS['env'] = 'test';
|
||||
|
||||
// include index.php from application root directory
|
||||
include INSTALL_PATH . 'index.php';
|
||||
|
Before Width: | Height: | Size: 653 B After Width: | Height: | Size: 653 B |
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 637 B |
Before Width: | Height: | Size: 565 B After Width: | Height: | Size: 565 B |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 3.7 KiB |
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Browser\Plugins\Archive;
|
||||
|
||||
use Tests\Browser\Components\Popupmenu;
|
||||
|
||||
class MailTest extends \Tests\Browser\TestCase
|
||||
{
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
\bootstrap::init_db();
|
||||
\bootstrap::init_imap();
|
||||
\bootstrap::purge_mailbox('INBOX');
|
||||
\bootstrap::purge_mailbox('Archive');
|
||||
|
||||
// import single email messages
|
||||
foreach (glob(TESTS_DIR . 'data/mail/list_00.eml') as $f) {
|
||||
\bootstrap::import_message($f, 'INBOX');
|
||||
}
|
||||
}
|
||||
|
||||
public function testMailUI()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
$browser->go('mail');
|
||||
|
||||
if (!$browser->isDesktop()) {
|
||||
$browser->click('.back-sidebar-button');
|
||||
}
|
||||
|
||||
// Folders list
|
||||
$browser->whenAvailable('#mailboxlist', function ($browser) {
|
||||
$browser->assertVisible('li.mailbox.archive')
|
||||
->assertMissing('li.mailbox.archive .unreadcount');
|
||||
});
|
||||
|
||||
if (!$browser->isDesktop()) {
|
||||
$browser->click('.back-list-button');
|
||||
}
|
||||
|
||||
// Toolbar menu (Archive button inactive)
|
||||
$browser->assertToolbarMenu([], ['archive']);
|
||||
|
||||
$browser->whenAvailable('#messagelist tbody', function ($browser) {
|
||||
$browser->ctrlClick('tr:last-child');
|
||||
});
|
||||
|
||||
$browser->clickToolbarMenuItem('archive')
|
||||
->waitForMessage('confirmation', 'Successfully archived')
|
||||
->closeMessage('confirmation');
|
||||
|
||||
if (!$browser->isDesktop()) {
|
||||
$browser->click('.back-sidebar-button');
|
||||
}
|
||||
|
||||
// Folders list
|
||||
$browser->whenAvailable('#mailboxlist', function ($browser) {
|
||||
$browser->assertSeeIn('li.mailbox.archive .unreadcount', '1')
|
||||
->click('li.mailbox.archive')
|
||||
->waitUntilNotBusy();
|
||||
});
|
||||
|
||||
// Messages list contains the moved message
|
||||
$browser->assertElementsCount('#messagelist tbody tr', 1);
|
||||
|
||||
// Toolbar menu (Archive button inactive again)
|
||||
$browser->assertToolbarMenu([], ['archive']);
|
||||
|
||||
// Test archive class on folder in folder selector
|
||||
$browser->ctrlClick('#messagelist tbody tr')
|
||||
->clickToolbarMenuItem('more')
|
||||
->with(new Popupmenu('message-menu'), function ($browser) {
|
||||
$browser->clickMenuItem('move');
|
||||
})
|
||||
->with(new Popupmenu('folder-selector'), function ($browser) {
|
||||
$browser->assertVisible('li.archive')
|
||||
->assertSeeIn('li.archive', 'Archive');
|
||||
})
|
||||
->click(); // close menus
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,149 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Browser\Plugins\Archive;
|
||||
|
||||
class SettingsTest extends \Tests\Browser\TestCase
|
||||
{
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
\bootstrap::init_db();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Folders UI
|
||||
*/
|
||||
public function testFolders()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
$browser->go('settings', 'folders');
|
||||
|
||||
// Folders list
|
||||
$browser->with('#subscription-table', function ($browser) {
|
||||
$browser->assertHasClass('li:nth-child(7)', 'archive')
|
||||
->assertSeeIn('li:nth-child(7)', 'Archive')
|
||||
->assertPresent('li:nth-child(7) [type=checkbox][disabled]');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Preferences UI
|
||||
*/
|
||||
public function testPreferences()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
$browser->go('settings');
|
||||
|
||||
if (!$browser->isDesktop()) {
|
||||
$browser->click('#settings-menu li.preferences')
|
||||
->waitFor('#sections-table');
|
||||
}
|
||||
|
||||
$browser->click('#sections-table tr.folders');
|
||||
|
||||
if ($browser->isPhone()) {
|
||||
$browser->waitFor('#layout-content .footer a.button.submit:not(.disabled)');
|
||||
}
|
||||
|
||||
$browser->withinFrame('#preferences-frame', function ($browser) {
|
||||
if (!$browser->isPhone()) {
|
||||
$browser->waitFor('.formbuttons button.submit');
|
||||
}
|
||||
|
||||
// Main Options fieldset
|
||||
$browser->with('form.propform fieldset.main', function ($browser) {
|
||||
$browser->assertSeeIn('legend', 'Main Options');
|
||||
|
||||
$browser->assertSeeIn('label[for=_archive_mbox]', 'Archive')
|
||||
->assertVisible('select[name=_archive_mbox]')
|
||||
->assertSelected('select[name=_archive_mbox]', 'Archive');
|
||||
|
||||
$browser->select('_archive_mbox', 'Drafts');
|
||||
});
|
||||
|
||||
// Archive fieldset
|
||||
$browser->with('form.propform fieldset.archive', function ($browser) {
|
||||
$browser->assertSeeIn('legend', 'Archive');
|
||||
|
||||
$browser->assertSeeIn('label[for=ff_archive_type]', 'Divide archive by')
|
||||
->assertVisible('select[name=_archive_type]')
|
||||
->assertSelected('select[name=_archive_type]', '')
|
||||
->with('select[name=_archive_type]', function ($browser) {
|
||||
$browser->assertValue('option:nth-child(1)', '')
|
||||
->assertSeeIn('option:nth-child(1)', 'None')
|
||||
->assertValue('option:nth-child(2)', 'year')
|
||||
->assertSeeIn('option:nth-child(2)', 'Year (e.g. Archive/2012)')
|
||||
->assertValue('option:nth-child(3)', 'month')
|
||||
->assertSeeIn('option:nth-child(3)', 'Month (e.g. Archive/2012/06)')
|
||||
->assertValue('option:nth-child(4)', 'tbmonth')
|
||||
->assertSeeIn('option:nth-child(4)', 'Month - Thunderbird compatible (e.g. Archive/2012/2012-06)')
|
||||
->assertValue('option:nth-child(5)', 'sender')
|
||||
->assertSeeIn('option:nth-child(5)', 'Sender email')
|
||||
->assertValue('option:nth-child(6)', 'folder')
|
||||
->assertSeeIn('option:nth-child(6)', 'Original folder');
|
||||
});
|
||||
|
||||
$browser->select('_archive_type', 'year');
|
||||
});
|
||||
|
||||
// Submit form
|
||||
if (!$browser->isPhone()) {
|
||||
$browser->click('.formbuttons button.submit');
|
||||
}
|
||||
});
|
||||
|
||||
if ($browser->isPhone()) {
|
||||
$browser->click('#layout-content .footer a.submit');
|
||||
}
|
||||
|
||||
$browser->waitForMessage('confirmation', 'Successfully saved');
|
||||
|
||||
// Verify if every option has been updated
|
||||
$browser->withinFrame('#preferences-frame', function ($browser) {
|
||||
$browser->assertSelected('_archive_mbox', 'Drafts');
|
||||
$browser->assertSelected('_archive_type', 'year');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Preferences UI (Server Settings)
|
||||
*/
|
||||
public function testServerSettings()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
$browser->go('settings', 'preferences');
|
||||
|
||||
$browser->click('#sections-table tr.server');
|
||||
|
||||
$browser->withinFrame('#preferences-frame', function ($browser) {
|
||||
if (!$browser->isPhone()) {
|
||||
$browser->waitFor('.formbuttons button.submit');
|
||||
}
|
||||
|
||||
// Main Options fieldset
|
||||
$browser->with('form.propform fieldset.main', function ($browser) {
|
||||
$browser->assertSeeIn('label[for=ff_read_on_archive]', 'Mark the message as read on archive')
|
||||
->assertCheckboxState('_read_on_archive', false)
|
||||
->setCheckboxState('_read_on_archive', true);
|
||||
});
|
||||
|
||||
// Submit form
|
||||
if (!$browser->isPhone()) {
|
||||
$browser->click('.formbuttons button.submit');
|
||||
}
|
||||
});
|
||||
|
||||
if ($browser->isPhone()) {
|
||||
$browser->click('#layout-content .footer a.submit');
|
||||
}
|
||||
|
||||
$browser->waitForMessage('confirmation', 'Successfully saved');
|
||||
|
||||
// Verify if every option has been updated
|
||||
$browser->withinFrame('#preferences-frame', function ($browser) {
|
||||
$browser->assertCheckboxState('_read_on_archive', true);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Browser\Plugins\AttachmentReminder;
|
||||
|
||||
use Tests\Browser\Components\Dialog;
|
||||
|
||||
class PluginTest extends \Tests\Browser\TestCase
|
||||
{
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
\bootstrap::init_db();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Preferences UI (Composing Messages)
|
||||
*/
|
||||
public function testPreferences()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
$browser->go('settings', 'preferences');
|
||||
|
||||
$browser->click('#sections-table tr.compose');
|
||||
|
||||
$browser->withinFrame('#preferences-frame', function ($browser) {
|
||||
if (!$browser->isPhone()) {
|
||||
$browser->waitFor('.formbuttons button.submit');
|
||||
}
|
||||
|
||||
// Main Options fieldset
|
||||
$browser->with('form.propform fieldset.main', function ($browser) {
|
||||
$browser->assertSeeIn('label[for=rcmfd_attachment_reminder]', 'Remind about forgotten attachments')
|
||||
->assertCheckboxState('_attachment_reminder', false)
|
||||
->setCheckboxState('_attachment_reminder', true);
|
||||
});
|
||||
|
||||
// Submit form
|
||||
if (!$browser->isPhone()) {
|
||||
$browser->click('.formbuttons button.submit');
|
||||
}
|
||||
});
|
||||
|
||||
if ($browser->isPhone()) {
|
||||
$browser->click('#layout-content .footer a.submit');
|
||||
}
|
||||
|
||||
$browser->waitForMessage('confirmation', 'Successfully saved');
|
||||
|
||||
// Verify if every option has been updated
|
||||
$browser->withinFrame('#preferences-frame', function ($browser) {
|
||||
$browser->assertCheckboxState('_attachment_reminder', true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Mail Compose page
|
||||
*
|
||||
* @depends testPreferences
|
||||
*/
|
||||
public function testMailCompose()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
$send_btn = $browser->isPhone() ? '.buttons a.send' : '.formbuttons button.send';
|
||||
|
||||
$browser->go('mail', 'compose');
|
||||
|
||||
$browser->waitFor('#compose_to')
|
||||
->type('#compose_to input', 'test@domain.tld')
|
||||
->type('#compose-subject', 'subject')
|
||||
->type('#composebody', 'File attached')
|
||||
->click($send_btn);
|
||||
|
||||
// Expect a dialog, Click "Attach a file" button
|
||||
$browser->with(new Dialog(), function ($browser) {
|
||||
$browser->assertDialogTitle('Missing attachment?')
|
||||
->assertDialogContent('Did you forget to attach a file?')
|
||||
->assertButton('mainaction.attach', 'Attach a file')
|
||||
->assertButton('send', 'Send')
|
||||
->clickButton('mainaction.attach');
|
||||
});
|
||||
|
||||
// Click the Send button again
|
||||
$browser->click($send_btn);
|
||||
|
||||
// Expect the dialog again, click Send button (in the dialog)
|
||||
$browser->with(new Dialog(), function ($browser) {
|
||||
$browser->assertDialogTitle('Missing attachment?')
|
||||
->clickButton('send');
|
||||
});
|
||||
|
||||
$browser->waitForMessage('confirmation', 'Message sent successfully.');
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,188 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| This file is part of the Roundcube Webmail client |
|
||||
| |
|
||||
| Copyright (C) The Roundcube Dev Team |
|
||||
| Copyright (C) Kolab Systems AG |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Import keys from Enigma's homedir into database for multihost |
|
||||
| support. |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Aleksander Machniak <alec@alec.pl> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/../../../') . '/');
|
||||
|
||||
require INSTALL_PATH . 'program/include/clisetup.php';
|
||||
|
||||
$rcmail = rcube::get_instance();
|
||||
|
||||
// get arguments
|
||||
$args = rcube_utils::get_opt(array(
|
||||
'u' => 'user',
|
||||
'h' => 'host',
|
||||
'd' => 'dir',
|
||||
'x' => 'dry-run',
|
||||
));
|
||||
|
||||
if ($_SERVER['argv'][1] == 'help') {
|
||||
print_usage();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (empty($args['dir'])) {
|
||||
rcube::raise_error("--dir argument is required", true);
|
||||
}
|
||||
|
||||
$host = get_host($args);
|
||||
$dirs = array();
|
||||
|
||||
// Read the homedir and iterate over all subfolders (as users)
|
||||
if (empty($args['user'])) {
|
||||
if ($dh = opendir($args['dir'])) {
|
||||
while (($dir = readdir($dh)) !== false) {
|
||||
if ($dir != '.' && $dir != '..') {
|
||||
$dirs[$args['dir'] . '/' . $dir] = $dir;
|
||||
}
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
}
|
||||
// a single user
|
||||
else {
|
||||
$dirs = array($args['dir'] => $args['user']);
|
||||
}
|
||||
|
||||
foreach ($dirs as $dir => $user) {
|
||||
echo "Importing keys from $dir\n";
|
||||
|
||||
if ($user_id = get_user_id($user, $host)) {
|
||||
reset_state($user_id, !empty($args['dry-run']));
|
||||
import_dir($user_id, $dir, !empty($args['dry-run']));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function print_usage()
|
||||
{
|
||||
print "Usage: import.sh [options]\n";
|
||||
print "Options:\n";
|
||||
print " --user=username User, if not set --dir subfolders will be iterated\n";
|
||||
print " --host=host The IMAP hostname or IP the given user is related to\n";
|
||||
print " --dir=path Location of the gpg homedir\n";
|
||||
print " --dry-run Do nothing, just list found user/files\n";
|
||||
}
|
||||
|
||||
function get_host($args)
|
||||
{
|
||||
global $rcmail;
|
||||
|
||||
if (empty($args['host'])) {
|
||||
$hosts = $rcmail->config->get('default_host', '');
|
||||
if (is_string($hosts)) {
|
||||
$args['host'] = $hosts;
|
||||
}
|
||||
else if (is_array($hosts) && count($hosts) == 1) {
|
||||
$args['host'] = reset($hosts);
|
||||
}
|
||||
else {
|
||||
rcube::raise_error("Specify a host name", true);
|
||||
}
|
||||
|
||||
// host can be a URL like tls://192.168.12.44
|
||||
$host_url = parse_url($args['host']);
|
||||
if ($host_url['host']) {
|
||||
$args['host'] = $host_url['host'];
|
||||
}
|
||||
}
|
||||
|
||||
return $args['host'];
|
||||
}
|
||||
|
||||
function get_user_id($username, $host)
|
||||
{
|
||||
global $rcmail;
|
||||
|
||||
$db = $rcmail->get_dbh();
|
||||
|
||||
// find user in local database
|
||||
$user = rcube_user::query($username, $host);
|
||||
|
||||
if (empty($user)) {
|
||||
rcube::raise_error("User does not exist: $username");
|
||||
}
|
||||
|
||||
return $user->ID;
|
||||
}
|
||||
|
||||
function reset_state($user_id, $dry_run = false)
|
||||
{
|
||||
global $rcmail;
|
||||
|
||||
if ($dry_run) {
|
||||
return;
|
||||
}
|
||||
|
||||
$db = $rcmail->get_dbh();
|
||||
|
||||
$db->query("DELETE FROM " . $db->table_name('filestore', true)
|
||||
. " WHERE `user_id` = ? AND `context` = ?",
|
||||
$user_id, 'enigma');
|
||||
}
|
||||
|
||||
function import_dir($user_id, $dir, $dry_run = false)
|
||||
{
|
||||
global $rcmail;
|
||||
|
||||
$db = $rcmail->get_dbh();
|
||||
$table = $db->table_name('filestore', true);
|
||||
$db_files = array('pubring.gpg', 'secring.gpg', 'pubring.kbx');
|
||||
$maxsize = min($db->get_variable('max_allowed_packet', 1048500), 4*1024*1024) - 2000;
|
||||
|
||||
foreach (glob("$dir/private-keys-v1.d/*.key") as $file) {
|
||||
$db_files[] = substr($file, strlen($dir) + 1);
|
||||
}
|
||||
|
||||
foreach ($db_files as $file) {
|
||||
if ($mtime = @filemtime("$dir/$file")) {
|
||||
$data = file_get_contents("$dir/$file");
|
||||
$data = base64_encode($data);
|
||||
$datasize = strlen($data);
|
||||
|
||||
if ($datasize > $maxsize) {
|
||||
rcube::raise_error(array(
|
||||
'code' => 605, 'line' => __LINE__, 'file' => __FILE__,
|
||||
'message' => "Enigma: Failed to save $file. Size exceeds max_allowed_packet."
|
||||
), true, false);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
echo "* $file\n";
|
||||
|
||||
if ($dry_run) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = $db->query(
|
||||
"INSERT INTO $table (`user_id`, `context`, `filename`, `mtime`, `data`)"
|
||||
. " VALUES(?, 'enigma', ?, ?, ?)",
|
||||
$user_id, $file, $mtime, $data);
|
||||
|
||||
if ($db->is_error($result)) {
|
||||
rcube::raise_error(array(
|
||||
'code' => 605, 'line' => __LINE__, 'file' => __FILE__,
|
||||
'message' => "Enigma: Failed to save $file into database."
|
||||
), true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|