Compare commits

...

1475 Commits
6.1.3 ... 7.0.0

Author SHA1 Message Date
Yuri Kuznetsov
ef260784ac cleanup 2021-10-01 15:24:24 +03:00
Yuri Kuznetsov
bc7be925e2 fix 2021-10-01 15:18:02 +03:00
Yuri Kuznetsov
9091e49650 fix test 2021-10-01 12:54:52 +03:00
Yuri Kuznetsov
5a8dd95565 orm fix 2021-10-01 12:19:13 +03:00
Yuri Kuznetsov
23df87a8c3 v 2021-10-01 11:36:00 +03:00
Yuri Kuznetsov
3781d10cb6 Merge branch 'stable' 2021-10-01 11:32:08 +03:00
Yuri Kuznetsov
f1d505330c v 2021-10-01 10:59:45 +03:00
Yuri Kuznetsov
fc9fbd25fe fix invitation from address 2021-09-30 17:15:31 +03:00
Yuri Kuznetsov
b3e5003e0c ref 2021-09-30 16:47:53 +03:00
Yuri Kuznetsov
be9fd29023 cleanup 2021-09-30 15:18:32 +03:00
Yuri Kuznetsov
22bb9cfe09 Merge branch 'hotfix/6.1.10' 2021-09-30 11:35:45 +03:00
Yuri Kuznetsov
02238b4000 fix test 2021-09-30 11:35:19 +03:00
Yuri Kuznetsov
2f9bf085fa fix test 2021-09-30 11:34:14 +03:00
Yuri Kuznetsov
11010f274f order converter change 2021-09-30 11:32:14 +03:00
Taras Machyshyn
9f2c57c3f1 Upgrade script 2021-09-30 10:59:04 +03:00
Yuri Kuznetsov
41d815103c fix notifications 2021-09-29 16:26:32 +03:00
Yuri Kuznetsov
967c48f6d7 fix 2021-09-29 14:27:05 +03:00
Yuri Kuznetsov
c4d0d0fba7 Merge branch 'hotfix/6.1.10' 2021-09-29 14:07:26 +03:00
Yuri Kuznetsov
9a720e9c82 fix fiscal quarter 2021-09-29 14:06:53 +03:00
Yuri Kuznetsov
c41522ab67 fix fiscal quarter 2021-09-29 14:03:37 +03:00
Yuri Kuznetsov
501a4b3415 chmod upgrade 2021-09-28 13:15:30 +03:00
Yuri Kuznetsov
7af59ac7ec Merge branch 'hotfix/6.1.10' 2021-09-28 12:05:51 +03:00
Yuri Kuznetsov
c16a4707b5 fix daemon 2021-09-28 12:05:02 +03:00
Yuri Kuznetsov
0a86ea65ed fix daemon long running jobs blocking 2021-09-28 12:03:16 +03:00
Yuri Kuznetsov
273ab1fe54 list expanded re render on edit 2021-09-27 13:16:42 +03:00
Yuri Kuznetsov
1b9622e6dd cs fix 2021-09-27 13:10:00 +03:00
Yuri Kuznetsov
7209184636 cs fix 2021-09-27 13:00:39 +03:00
Yuri Kuznetsov
b4c0b264b9 rename 2021-09-24 20:26:39 +03:00
Yuri Kuznetsov
2e13e758b8 lang fixes 2021-09-24 16:27:19 +03:00
Yuri Kuznetsov
5359eb85e1 lang fix 2021-09-24 16:23:33 +03:00
Yuri Kuznetsov
e42e758150 lang fixes 2021-09-24 16:21:39 +03:00
Yuri Kuznetsov
340fd9a324 swedish lang 2021-09-24 16:20:04 +03:00
Yuri Kuznetsov
1e277e5681 fix 2021-09-24 15:59:32 +03:00
Yuri Kuznetsov
2534176b8d renaming 2021-09-24 15:51:16 +03:00
Yuri Kuznetsov
4f1c547f77 renaming 2021-09-24 15:47:04 +03:00
Yuri Kuznetsov
4698b2a0e7 renaming 2021-09-24 15:10:47 +03:00
Yuri Kuznetsov
cb76c9762c login renaming 2021-09-24 12:01:43 +03:00
Yuri Kuznetsov
496890357a renaming 2021-09-24 11:37:33 +03:00
Yuri Kuznetsov
fc7dba6c91 all of filter 2021-09-23 17:03:20 +03:00
Yuri Kuznetsov
67efbdc6e9 fix array filter 2021-09-23 16:43:54 +03:00
Yuri Kuznetsov
d660137e7e refactoring 2021-09-23 15:29:54 +03:00
Yuri Kuznetsov
15ae14d4a1 fix test 2021-09-23 13:11:13 +03:00
Yuri Kuznetsov
111524b6c6 job refactoring 2021-09-23 12:56:57 +03:00
Yuri Kuznetsov
ce806c5aa8 renaming 2021-09-23 11:40:09 +03:00
Yuri Kuznetsov
b244f613ee ref 2021-09-22 22:33:37 +03:00
Yuri Kuznetsov
ad5cb35260 cleanup 2021-09-22 21:50:01 +03:00
Yuri Kuznetsov
c0ca2174b6 ref 2021-09-22 21:48:20 +03:00
Yuri Kuznetsov
c3c1398a2d renaming 5 2021-09-22 21:45:16 +03:00
Yuri Kuznetsov
1fbdd2edf4 job preparator 2021-09-22 16:55:16 +03:00
Yuri Kuznetsov
a64a66912f renaming 4 2021-09-22 15:38:20 +03:00
Yuri Kuznetsov
61bbb23e7a renaming 3 2021-09-22 13:23:41 +03:00
Yuri Kuznetsov
e8d62ecc22 renaming 2 2021-09-22 13:07:12 +03:00
Yuri Kuznetsov
7db64e9375 renaming 1 2021-09-22 12:59:48 +03:00
Yuri Kuznetsov
0a320cb3b3 templete helper interface 2021-09-22 11:58:02 +03:00
Yuri Kuznetsov
50d38d127c Merge branch 'hotfix/6.1.10' 2021-09-20 15:51:46 +03:00
Yuri Kuznetsov
1ad42423bf google map pdf fix 2021-09-20 15:51:25 +03:00
Yuri Kuznetsov
273c9b2f18 fix google map pdf 2021-09-20 15:45:36 +03:00
Yuri Kuznetsov
90260bbed5 acl tryCheck 2021-09-20 13:38:47 +03:00
Yuri Kuznetsov
833804c7b4 fix test 2021-09-20 13:36:18 +03:00
Yuri Kuznetsov
206f4bc2bb entity setters and getters 2021-09-20 12:38:36 +03:00
Yuri Kuznetsov
5280bdab86 htmlizer fixes 2021-09-20 11:54:33 +03:00
Yuri Kuznetsov
ce0113cd6c cleanup 2021-09-19 20:11:07 +03:00
Yuri Kuznetsov
24885853fd fix 2021-09-19 18:51:07 +03:00
Yuri Kuznetsov
1f4ce20c8b template renderer 2021-09-19 18:47:15 +03:00
Yuri Kuznetsov
5629682a9a cleanup 2021-09-19 14:29:50 +03:00
Yuri Kuznetsov
826e335611 comment 2021-09-19 13:42:13 +03:00
Yuri Kuznetsov
06c0a425cd select text filter ref 2021-09-19 13:40:47 +03:00
Yuri Kuznetsov
dc9b4bbb20 amend 2021-09-19 10:29:29 +03:00
Yuri Kuznetsov
4e951bcb98 refactoring 2021-09-19 10:27:59 +03:00
Yuri Kuznetsov
428cafeb7d import result fetch limit 2021-09-18 19:15:32 +03:00
Yuri Kuznetsov
e145e461fa cs fix 2021-09-18 13:15:35 +03:00
Yuri Kuznetsov
7bfd268793 cs fix 2021-09-18 13:12:52 +03:00
Yuri Kuznetsov
2bc2d4ed26 fix import 2021-09-18 11:06:09 +03:00
Yuri Kuznetsov
185d006a61 fix css 2021-09-17 13:38:28 +03:00
Yuri Kuznetsov
42068c8a95 updateDuplicateCheck param 2021-09-17 12:50:55 +03:00
Yuri Kuznetsov
cb4e86886a ref 2021-09-17 12:37:20 +03:00
Yuri Kuznetsov
02f6b1850c sms provider fix 2021-09-17 12:30:34 +03:00
Yuri Kuznetsov
a667380d7a fix 2021-09-17 12:30:27 +03:00
Yuri Kuznetsov
21be67f025 parent reserved word 2021-09-17 11:24:24 +03:00
Yuri Kuznetsov
7d3fbcc7d0 mail sender attachment hint 2021-09-17 11:24:24 +03:00
Yuri Kuznetsov
cbbfc2227c fix 2021-09-16 18:00:20 +03:00
Yuri Kuznetsov
9add3fa538 sms 2021-09-16 17:35:32 +03:00
Yuri Kuznetsov
ef13bffcb9 fix 2021-09-16 13:48:53 +03:00
Yuri Kuznetsov
a40c9d2b11 fix 2021-09-16 13:25:20 +03:00
Yuri Kuznetsov
ddaa4c056d fix 2021-09-16 13:10:50 +03:00
Yuri Kuznetsov
8f0b34c2de settings improvement 2021-09-16 13:04:19 +03:00
Yuri Kuznetsov
5ff145ff12 dashboard 12 columns 2021-09-14 16:18:40 +03:00
Yuri Kuznetsov
6e8a3fa05d cs 2021-09-14 16:12:27 +03:00
Yuri Kuznetsov
2d3816e3ae cs fix 2021-09-14 15:25:44 +03:00
Yuri Kuznetsov
4c9441a690 email load addresses 2021-09-14 11:09:30 +03:00
Yuri Kuznetsov
035523b426 c 2021-09-14 10:50:12 +03:00
Yuri Kuznetsov
93179a21b2 refactoring 2021-09-14 10:46:03 +03:00
Yuri Kuznetsov
53534cf3d5 ref 2021-09-14 10:34:42 +03:00
Yuri Kuznetsov
8bb6c4012a ref 2021-09-14 10:30:53 +03:00
Yuri Kuznetsov
57960111f7 job fixes 2021-09-14 10:03:35 +03:00
Yuri Kuznetsov
165e6322fc comment fix 2021-09-13 19:29:45 +03:00
Yuri Kuznetsov
2afc157c24 email getFromAddress 2021-09-13 16:32:43 +03:00
Yuri Kuznetsov
9822bb94a1 fix 2021-09-13 15:44:08 +03:00
Yuri Kuznetsov
bf72c8a4cc 2fa-email 2021-09-13 13:09:09 +03:00
Yuri Kuznetsov
f6c8281c9e remove hook 2021-09-11 16:52:42 +03:00
Yuri Kuznetsov
dcc2b2cb31 onFailSecondStep hook 2021-09-11 11:45:39 +03:00
Yuri Kuznetsov
e9d3127932 rename 2021-09-11 09:19:30 +03:00
Yuri Kuznetsov
c5d6b7d053 rename 2021-09-11 08:57:34 +03:00
Yuri Kuznetsov
9bb0950c12 email factory 2021-09-10 21:55:00 +03:00
Yuri Kuznetsov
b2d6bd58e6 email methods 2021-09-10 21:50:19 +03:00
Yuri Kuznetsov
4fdcdec802 email methods 2021-09-10 21:24:57 +03:00
Yuri Kuznetsov
0873b17894 comments 2021-09-10 21:13:22 +03:00
Yuri Kuznetsov
48957d33b6 datetime fields impr 2021-09-10 21:09:05 +03:00
Yuri Kuznetsov
48675f1875 fix 2021-09-10 17:05:51 +03:00
Yuri Kuznetsov
ef4377c77b naming fix 2021-09-10 12:57:52 +03:00
Yuri Kuznetsov
4394e0fca1 refactoring 2021-09-10 12:40:54 +03:00
Yuri Kuznetsov
fc7b15042c 2fa refactoring 2021-09-10 12:25:43 +03:00
Yuri Kuznetsov
bbaa119617 fix 2021-09-09 22:30:40 +03:00
Yuri Kuznetsov
88f4797f0b formula word wrap 2021-09-09 17:11:23 +03:00
Yuri Kuznetsov
fa35e32578 refactoring 2021-09-09 14:57:01 +03:00
Yuri Kuznetsov
c40cbc6cc2 fix 2021-09-09 12:45:57 +03:00
Yuri Kuznetsov
8fcd6c2ff9 fixes and refactoring 2021-09-09 11:51:11 +03:00
Yuri Kuznetsov
30c6a713d6 change 2021-09-08 15:55:01 +03:00
Yuri Kuznetsov
029a18ff1a fixes 2021-09-08 13:53:22 +03:00
Yuri Kuznetsov
45049ae176 cs fix 2021-09-08 13:38:44 +03:00
Yuri Kuznetsov
01f59521af email fix 2021-09-08 13:13:25 +03:00
Yuri Kuznetsov
0f3cd9dd24 cs fix 2021-09-08 13:02:33 +03:00
Yuri Kuznetsov
ba4619df21 fixes 2021-09-08 12:58:11 +03:00
Yuri Kuznetsov
f7aa5aaf0b refactoring 2021-09-08 11:53:01 +03:00
Yuri Kuznetsov
d3f0553c65 fix 2021-09-08 10:59:18 +03:00
Yuri Kuznetsov
601d7729bc refactoring 2021-09-07 18:53:46 +03:00
Yuri Kuznetsov
ac464b4036 refactoring 2021-09-07 18:41:33 +03:00
Yuri Kuznetsov
5f220bc364 comment 2021-09-07 16:17:30 +03:00
Yuri Kuznetsov
962ea50c44 fix 2021-09-07 16:16:29 +03:00
Yuri Kuznetsov
742fda24c6 bc fix 2021-09-07 16:04:55 +03:00
Yuri Kuznetsov
e0c10f3564 fix 2021-09-07 15:45:27 +03:00
Yuri Kuznetsov
5a94143fd7 fix 2021-09-07 15:39:58 +03:00
Yuri Kuznetsov
c5ba226fa0 fix 2021-09-06 15:57:17 +03:00
Yuri Kuznetsov
be8dff3de7 fix 2021-09-06 15:57:10 +03:00
Yuri Kuznetsov
0582fd680d rebuild actionClassNameList 2021-09-06 14:04:47 +03:00
Yuri Kuznetsov
c93a5e5299 fix 2021-09-06 12:16:28 +03:00
Yuri Kuznetsov
c5229f1100 fix 2021-09-06 11:53:21 +03:00
Yuri Kuznetsov
d78023f388 refactoring 2021-09-06 11:31:22 +03:00
Yuri Kuznetsov
f15b63fd66 cleanup 2021-09-06 11:18:32 +03:00
Yuri Kuznetsov
0ff236edbc refactoring 2021-09-06 11:13:16 +03:00
Yuri Kuznetsov
9d23f3bdd0 refactoring 2021-09-05 18:11:53 +03:00
Yuri Kuznetsov
dd74aac117 fix clone 2021-09-05 18:11:37 +03:00
Yuri Kuznetsov
d49b713ccd fixes 2021-09-05 17:05:39 +03:00
Yuri Kuznetsov
d6431cbcc4 fix 2021-09-05 16:56:24 +03:00
Yuri Kuznetsov
392748db57 refactoring 2021-09-05 16:54:24 +03:00
Yuri Kuznetsov
70cc8fb9e3 ref 2021-09-05 12:37:42 +03:00
Yuri Kuznetsov
bbabe672d8 refactoring 2021-09-05 12:14:39 +03:00
Yuri Kuznetsov
447732bf9c fix import 2021-09-05 12:14:25 +03:00
Yuri Kuznetsov
29f60b5199 rename 2021-09-05 09:57:33 +03:00
Yuri Kuznetsov
94fa7b17ff rename 2021-09-04 20:37:36 +03:00
Yuri Kuznetsov
b5ec93e571 fix 2021-09-04 19:15:06 +03:00
Yuri Kuznetsov
132e762c7e refactoring 2021-09-04 18:37:52 +03:00
Yuri Kuznetsov
8ef94890a9 fix 2021-09-04 18:34:22 +03:00
Yuri Kuznetsov
b6c9ef990f refactoring 2021-09-04 17:48:55 +03:00
Yuri Kuznetsov
b19ce60e74 notification refactoring 2021-09-04 16:59:24 +03:00
Yuri Kuznetsov
632e1ecb5c stream refactoring 2021-09-04 12:27:11 +03:00
Yuri Kuznetsov
fa3ec522ca cs fixes and cleanup 2021-09-03 20:20:42 +03:00
Yuri Kuznetsov
4615cea8a6 more auth hooks 2021-09-03 15:35:47 +03:00
Yuri Kuznetsov
3c5dc1672a auth hooks 2021-09-03 14:25:13 +03:00
Yuri Kuznetsov
768c68df49 cleanup 2021-09-01 20:27:37 +03:00
Yuri Kuznetsov
c44731bd97 fix test 2021-09-01 20:27:13 +03:00
Yuri Kuznetsov
9450cf9447 response change 2021-09-01 20:23:52 +03:00
Yuri Kuznetsov
1cfb60d65b fix 2021-09-01 19:48:55 +03:00
Yuri Kuznetsov
64519d6310 docs 2021-09-01 19:48:30 +03:00
Yuri Kuznetsov
3d9b5852f8 cs fix 2021-09-01 19:43:32 +03:00
Yuri Kuznetsov
dc6109c530 fix broadcast channel 2021-09-01 19:41:49 +03:00
Yuri Kuznetsov
7fe1e27667 fix 2021-09-01 19:40:23 +03:00
Yuri Kuznetsov
e24209438c get header as array 2021-09-01 16:13:15 +03:00
Yuri Kuznetsov
ee2a3c9bea fix x-skip-duplicate-check header 2021-09-01 15:51:46 +03:00
Yuri Kuznetsov
5861aa11c1 Merge branch 'master' of github.com:espocrm/espocrm 2021-09-01 12:08:18 +03:00
Yuri Kuznetsov
0041c11aae fix show hide panel 2021-09-01 11:11:23 +03:00
Yuri Kuznetsov
ed8def4ece ref 2021-09-01 10:57:57 +03:00
Yuri Kuznetsov
7f08cc9cf0 cs fix 2021-09-01 10:36:22 +03:00
Yuri Kuznetsov
981e477bd0 ref 2021-09-01 10:23:05 +03:00
Yuri Kuznetsov
01bf39764a ref 2021-09-01 09:58:03 +03:00
Yuri Kuznetsov
b4a2ad646b cs fix 2021-09-01 09:52:05 +03:00
dependabot[bot]
79d557542b Bump tar from 6.1.2 to 6.1.9 (#2064)
Bumps [tar](https://github.com/npm/node-tar) from 6.1.2 to 6.1.9.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.2...v6.1.9)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-31 20:07:56 +03:00
Yuri Kuznetsov
26d411c94d array field fix 2021-08-31 11:24:40 +03:00
Yuri Kuznetsov
8d3ae2ef00 refactoring 2021-08-30 13:55:01 +03:00
Yuri Kuznetsov
f28854b7f2 fix css 2021-08-30 12:58:47 +03:00
Yuri Kuznetsov
5a24771d3c fix tests 2021-08-30 12:13:30 +03:00
Yuri Kuznetsov
84830d6aef refactoring 2021-08-30 12:00:51 +03:00
Yuri Kuznetsov
134cd53f45 Merge branch 'hotfix/6.1.9' 2021-08-30 10:58:36 +03:00
Yuri Kuznetsov
717b9db4af v 2021-08-30 10:49:36 +03:00
Yuri Kuznetsov
87c313c933 update markdown 2021-08-30 10:46:57 +03:00
Yuri Kuznetsov
928320c1bd refactoring 2021-08-29 16:22:55 +03:00
Yuri Kuznetsov
bba4ad55da refactoring 2021-08-29 16:13:35 +03:00
Yuri Kuznetsov
23604fba25 refactoring 2021-08-29 14:37:51 +03:00
Yuri Kuznetsov
112c51d6e3 refactoring 2021-08-29 11:00:54 +03:00
Yuri Kuznetsov
9339a15d18 route refactoring 2021-08-28 22:34:30 +03:00
Yuri Kuznetsov
a4b65ba0c7 comment fix 2021-08-28 14:11:54 +03:00
Yuri Kuznetsov
00dfe2599e refactoring 2021-08-28 13:47:55 +03:00
Yuri Kuznetsov
dcf6ec5612 cs fix 2021-08-28 13:45:40 +03:00
Yuri Kuznetsov
0acd47fba0 email notification handler interface 2021-08-28 13:42:26 +03:00
Yuri Kuznetsov
4e718ff879 update markdown 2021-08-28 13:37:40 +03:00
Yuri Kuznetsov
1205462620 notificationDefs 2021-08-28 09:03:17 +03:00
Yuri Kuznetsov
75344a4ed2 refactoring 2021-08-27 23:00:34 +03:00
Yuri Kuznetsov
6dae15155a runner parameterized 2021-08-27 22:22:59 +03:00
Yuri Kuznetsov
338922099d cleanup interface 2021-08-27 17:05:33 +03:00
Yuri Kuznetsov
0c840de187 css fix 2021-08-27 17:05:26 +03:00
Yuri Kuznetsov
16755831bc css color fix 2021-08-27 13:19:01 +03:00
Yuri Kuznetsov
4c64b7e456 refactoring 2021-08-27 13:03:39 +03:00
Yuri Kuznetsov
28a56c0bd7 folder color 2021-08-27 10:50:03 +03:00
Yuri Kuznetsov
894f99aa66 fix ics import 2021-08-26 19:15:44 +03:00
Yuri Kuznetsov
450d785a58 email fix 2021-08-26 18:59:37 +03:00
Yuri Kuznetsov
a26be8e7f0 pdfDefs hide 2021-08-26 18:31:40 +03:00
Yuri Kuznetsov
d2f982fccb pdf data loader params 2021-08-26 17:35:53 +03:00
Yuri Kuznetsov
4b38f81384 fix 2021-08-26 16:13:07 +03:00
Yuri Kuznetsov
20bc336036 htmlizer fix data 2021-08-26 14:03:49 +03:00
Yuri Kuznetsov
cec4585538 rename 2021-08-26 13:34:12 +03:00
Yuri Kuznetsov
8b4635ffaa fix 2021-08-26 13:26:43 +03:00
Yuri Kuznetsov
3dc53c5436 sp v change 2021-08-26 13:07:14 +03:00
Yuri Kuznetsov
7265b3c4b6 fix 2021-08-26 13:04:36 +03:00
Yuri Kuznetsov
49033dec1a cleanup 2021-08-26 13:03:24 +03:00
Yuri Kuznetsov
9b632f582f pdf data loader framework 2021-08-26 13:02:31 +03:00
Yuri Kuznetsov
a989c8a6d1 upgrade sp version change 2021-08-26 10:41:20 +03:00
Yuri Kuznetsov
e5c0427e68 select applier change 2021-08-25 18:26:52 +03:00
Yuri Kuznetsov
c5811749cb fix order 2021-08-25 16:35:04 +03:00
Yuri Kuznetsov
5e925865a7 fix 2021-08-25 15:56:03 +03:00
Yuri Kuznetsov
175f837f3d fix inbox dashlet 2021-08-25 15:33:40 +03:00
Yuri Kuznetsov
b28d3816c0 kanban fix 2021-08-25 13:31:40 +03:00
Yuri Kuznetsov
3ad66acb20 cs fix 2021-08-25 11:47:43 +03:00
Yuri Kuznetsov
958b44af15 cs fix 2021-08-25 11:43:34 +03:00
Yuri Kuznetsov
99b20f6724 fix kanban 2021-08-25 11:39:11 +03:00
Yuri Kuznetsov
4eec64e811 cs fix 2021-08-25 11:24:44 +03:00
Yuri Kuznetsov
052548fda7 fix 2021-08-25 09:59:25 +03:00
Yuri Kuznetsov
98e7218cf5 fix 2021-08-25 09:58:35 +03:00
Yuri Kuznetsov
374c3786df fix findByEmailAddress function 2021-08-24 18:09:54 +03:00
Yuri Kuznetsov
a9a3f4381a extension list 2021-08-24 17:46:06 +03:00
Yuri Kuznetsov
b845ad6d3c refactoring 2021-08-24 17:34:22 +03:00
Yuri Kuznetsov
7c8d3caba6 fix 2021-08-24 12:43:28 +03:00
Yuri Kuznetsov
fcddc472e1 run job changes 2021-08-24 12:25:20 +03:00
Yuri Kuznetsov
1c18348475 app-info jobs 2021-08-24 12:18:11 +03:00
Yuri Kuznetsov
c6c74bd7b9 refactoring 2021-08-24 11:56:12 +03:00
Yuri Kuznetsov
0775edd29e fix email notifications on duplicate 2021-08-24 11:50:43 +03:00
Yuri Kuznetsov
52017e5281 refactoring 2021-08-24 11:42:57 +03:00
Yuri Kuznetsov
af3aecc3f8 manual merge 2021-08-23 13:10:13 +03:00
Eymen Elkum
eaf6b511d0 fix meeting send invitation (#2058) 2021-08-23 09:52:18 +03:00
Yuri Kuznetsov
e13d0248ae css fix logo 2021-08-21 11:11:35 +03:00
Yuri Kuznetsov
e3d563a556 command refactoring 2021-08-21 10:31:07 +03:00
Yuri Kuznetsov
e2078bba84 help command fix 2021-08-21 09:54:39 +03:00
M3sca
017af8a383 edit: Fix label in Account.json for italian translate (#2057) 2021-08-20 18:26:06 +03:00
Yuri Kuznetsov
0739e9f655 preload fix 2021-08-20 12:14:11 +03:00
Yuri Kuznetsov
6f2904eb9a command help 2021-08-17 13:03:45 +03:00
Yuri Kuznetsov
4003977ce3 fix 2021-08-16 17:49:41 +03:00
Yuri Kuznetsov
d058bb7c3b cs fix 2021-08-16 15:59:25 +03:00
Yuri Kuznetsov
139dfc5b81 permissions 2021-08-16 11:34:19 +03:00
Yuri Kuznetsov
152a5b5a7b bin command 2021-08-14 15:47:52 +03:00
Yuri Kuznetsov
ad54fa2ace fix 2021-08-13 19:30:54 +03:00
Yuri Kuznetsov
d2e15f52c3 fix test 2021-08-13 15:59:05 +03:00
Yuri Kuznetsov
f670f382cd refresh entity 2021-08-13 15:56:42 +03:00
Yuri Kuznetsov
1ebedaf791 auth result data 2021-08-13 11:32:23 +03:00
Yuri Kuznetsov
2879f426e0 cs fix 2021-08-13 11:32:14 +03:00
Yuri Kuznetsov
d7c2cd8d2a fix 2021-08-13 11:19:27 +03:00
Yuri Kuznetsov
78814dedd3 fix modal 2021-08-12 16:52:15 +03:00
Yuri Kuznetsov
4865cf2202 upgrade mailchimp check 2021-08-12 15:24:48 +03:00
Yuri Kuznetsov
239c533137 fix 2021-08-12 13:33:19 +03:00
Yuri Kuznetsov
55bf893228 cs fix and ref 2021-08-12 12:45:55 +03:00
Yuri Kuznetsov
349cb32c5f cleanup 2021-08-12 12:19:57 +03:00
Yuri Kuznetsov
1545305d43 merge 2021-08-12 12:19:50 +03:00
Yuri Kuznetsov
0f84c6eaaa upgrade outlook version check 2021-08-12 12:14:28 +03:00
Yuri Kuznetsov
df94b38019 job backward compatibility 2021-08-12 11:28:02 +03:00
Yuri Kuznetsov
e8451f9648 wysiwig link insert scroll fix 2021-08-11 16:29:58 +03:00
Yuri Kuznetsov
b42ed51c5e real estate version check 2021-08-11 15:48:31 +03:00
Yuri Kuznetsov
9ed9ccbe4a fix typo 2021-08-11 11:26:44 +03:00
Yuri Kuznetsov
b4d0343992 fix record tree 2021-08-11 11:26:44 +03:00
dependabot[bot]
4b0604a183 Bump path-parse from 1.0.6 to 1.0.7 (#2054)
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-11 08:50:18 +03:00
Yuri Kuznetsov
8d50ae1f46 fix orm 2021-08-10 16:45:59 +03:00
Yuri Kuznetsov
6ed4b60ebb ics create event 2021-08-10 14:08:44 +03:00
Yuri Kuznetsov
86e0c502ae email reply fix 2021-08-10 14:08:31 +03:00
Yuri Kuznetsov
c1936cf46b ics fixes 2021-08-10 12:52:42 +03:00
Yuri Kuznetsov
973910b837 fix pdf 2021-08-10 12:52:02 +03:00
Yuri Kuznetsov
590918ac6d fix upgrade 2021-08-10 11:54:02 +03:00
Yuri Kuznetsov
b9e1efbe00 email replied id in references 2021-08-09 16:38:52 +03:00
Yuri Kuznetsov
2ca6870c6a fix 2021-08-09 12:21:53 +03:00
Yuri Kuznetsov
ca3bedeeb4 fix xlsx 2021-08-09 11:34:19 +03:00
Yuri Kuznetsov
f85d56ac4d xlsx refactoring 2021-08-07 16:39:31 +03:00
Yuri Kuznetsov
9a522f7922 pdf contents stream 2021-08-07 14:57:05 +03:00
Yuri Kuznetsov
f453077796 refactoring 2021-08-07 14:39:47 +03:00
Yuri Kuznetsov
387029c5a6 pdf title name-placeholder 2021-08-07 09:39:57 +03:00
dependabot[bot]
f3b74696c0 Bump tar from 6.0.5 to 6.1.2 (#2049)
Bumps [tar](https://github.com/npm/node-tar) from 6.0.5 to 6.1.2.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.0.5...v6.1.2)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-06 18:48:54 +03:00
Yuri Kuznetsov
f946adb6d1 fix metadata module list 2021-08-06 17:15:27 +03:00
Yuri Kuznetsov
dc3174747b lang 2021-08-06 14:38:34 +03:00
Yuri Kuznetsov
837ad89502 module clear cache 2021-08-06 13:36:38 +03:00
Yuri Kuznetsov
58ffd93961 fix webhooks 2021-08-06 11:17:46 +03:00
Yuri Kuznetsov
579c392a09 fix css 2021-08-05 16:36:44 +03:00
Yuri Kuznetsov
81fd1f522f upgrade script 2021-08-05 16:35:52 +03:00
Yuri Kuznetsov
e30dcac465 v 2021-08-05 16:14:51 +03:00
Yuri Kuznetsov
ee54cf2ebb collection maxMaxSize 2021-08-05 15:56:52 +03:00
Yuri Kuznetsov
f47ead51ca cs fix 2021-08-05 15:14:00 +03:00
Yuri Kuznetsov
ab425e0492 cs fix 2021-08-05 15:05:35 +03:00
Yuri Kuznetsov
95134b9ab8 cs fix 2021-08-05 14:15:08 +03:00
Yuri Kuznetsov
7ccac9aa79 fix ldap 2021-08-05 12:35:30 +03:00
Yuri Kuznetsov
69f221a424 config tests and refactoring 2021-08-05 11:01:31 +03:00
Yuri Kuznetsov
3c6eabaef8 install config fix 2021-08-04 20:57:11 +03:00
Yuri Kuznetsov
76361d1ca9 fix 2021-08-04 20:00:14 +03:00
Yuri Kuznetsov
de69cf7ceb installer fix 2021-08-04 19:37:13 +03:00
Yuri Kuznetsov
3fd894df50 refactoring config access 2021-08-04 17:35:20 +03:00
Yuri Kuznetsov
ddbed22a6f config internal 2021-08-04 16:41:18 +03:00
Yuri Kuznetsov
f51140f361 fix comment 2021-08-04 13:37:28 +03:00
Yuri Kuznetsov
1876667db1 config refactoring 2021-08-04 12:54:42 +03:00
Yuri Kuznetsov
2587c2e372 websocket binding factory usage 2021-08-03 12:03:10 +03:00
Yuri Kuznetsov
4f6dfe3132 binding factory 2021-08-03 12:02:56 +03:00
Yuri Kuznetsov
58dbd7868a websocket refactoring 2021-08-02 16:59:43 +03:00
Yuri Kuznetsov
3d1245bee6 cs fix 2021-08-02 16:31:23 +03:00
Yuri Kuznetsov
2df012fb97 fix cache api catch error 2021-08-02 16:06:17 +03:00
Yuri Kuznetsov
83d5f74e19 fix 2021-08-02 14:32:21 +03:00
Yuri Kuznetsov
4dfac05fcb cs fix 2021-08-02 12:36:29 +03:00
Yuri Kuznetsov
3548e3e8cd fix modal button click 2021-08-02 12:36:17 +03:00
Yuri Kuznetsov
862ebe7d48 cs fix 2021-07-31 14:47:54 +03:00
Yuri Kuznetsov
a56acf553c pdf title 2021-07-30 17:19:47 +03:00
Yuri Kuznetsov
0658f5b7fa ics fix 2021-07-30 16:59:39 +03:00
Yuri Kuznetsov
972e154a75 link manager quick search 2021-07-30 13:26:07 +03:00
Yuri Kuznetsov
70b0bedf9b link manager improvements 2021-07-30 13:11:07 +03:00
Yuri Kuznetsov
d843f719c8 field manager quick search 2021-07-30 12:49:52 +03:00
Yuri Kuznetsov
edf8d8a463 entity manager quick search 2021-07-29 18:10:51 +03:00
Yuri Kuznetsov
8c3e61c6a0 field manager ui improvements 2021-07-29 17:03:27 +03:00
Yuri Kuznetsov
6de1d45246 index.php change 2021-07-29 15:38:25 +03:00
Yuri Kuznetsov
5488870267 css fix 2021-07-29 13:49:00 +03:00
Yuri Kuznetsov
a3845187b3 index change 2021-07-29 13:47:21 +03:00
Yuri Kuznetsov
2955a61a5c fix 2021-07-29 13:44:44 +03:00
Yuri Kuznetsov
0f11730181 change index 2021-07-29 13:11:06 +03:00
Yuri Kuznetsov
75255d80cd cleanup 2021-07-28 16:32:40 +03:00
Yuri Kuznetsov
2d88f5966c inline edit & dynamlic logic interop 2021-07-28 16:18:13 +03:00
Yuri Kuznetsov
2984b755d5 increase max select attribute length 2021-07-28 13:41:48 +03:00
Yuri Kuznetsov
7362db833b query builders create method 2021-07-28 13:29:34 +03:00
Yuri Kuznetsov
7b9bbd5be4 refactoring 2021-07-28 13:25:42 +03:00
Yuri Kuznetsov
11d4687794 test fix 2021-07-28 13:14:36 +03:00
Yuri Kuznetsov
ef7c94f4e0 repository inteface 2021-07-28 13:04:14 +03:00
Yuri Kuznetsov
676e516f73 css prevent menu item drag 2021-07-27 17:07:06 +03:00
Yuri Kuznetsov
d83d3982cd refactoring 2021-07-27 17:01:48 +03:00
Yuri Kuznetsov
a24bf2d1d7 cleanup 2021-07-27 16:39:05 +03:00
Yuri Kuznetsov
db46faef29 orm gr protected 2021-07-27 16:36:48 +03:00
Yuri Kuznetsov
64e7c1081b select usage 2021-07-27 16:08:50 +03:00
Yuri Kuznetsov
56bfd6a069 select usage 2021-07-27 15:44:10 +03:00
Yuri Kuznetsov
18ac071c5d orm pdo provider 2021-07-27 12:41:12 +03:00
Yuri Kuznetsov
b44790c15f refactoring 2021-07-27 11:58:28 +03:00
Yuri Kuznetsov
e04f0eb98b sf 2021-07-27 11:33:14 +03:00
Yuri Kuznetsov
2278a1217b orm refactoring and comments 2021-07-27 11:26:18 +03:00
Yuri Kuznetsov
183205b8d4 rename 2021-07-27 11:07:31 +03:00
Yuri Kuznetsov
435bb7b65b rename 2021-07-27 11:06:04 +03:00
Yuri Kuznetsov
52159093dd applicationDescription param 2021-07-26 16:12:46 +03:00
Yuri Kuznetsov
c7056efe69 websocket DSN params 2021-07-26 15:37:36 +03:00
Yuri Kuznetsov
1b69ffe9e0 select where item builder 2021-07-26 14:15:18 +03:00
Yuri Kuznetsov
04203312bf orm groupBy => group 2021-07-26 13:40:17 +03:00
Yuri Kuznetsov
57bb2a3978 remove 2021-07-26 13:03:43 +03:00
Yuri Kuznetsov
c32cea8f8a orm fix 2021-07-26 13:03:35 +03:00
Yuri Kuznetsov
6ba62abd88 move tests 2021-07-26 12:42:33 +03:00
Yuri Kuznetsov
a31bf4e48e gr order by int usage 2021-07-26 12:12:53 +03:00
Yuri Kuznetsov
fab113db25 orm order refactoring 2021-07-25 18:30:50 +03:00
Yuri Kuznetsov
2858fd4fa8 orm refactoring join class 2021-07-25 12:37:23 +03:00
Yuri Kuznetsov
49f12ac82f orm refactoring 2021-07-25 10:15:00 +03:00
Yuri Kuznetsov
bf943cc706 orm order 2021-07-24 17:09:54 +03:00
Yuri Kuznetsov
09d8c550b5 orm order expression class 2021-07-24 15:39:28 +03:00
Yuri Kuznetsov
dadcee8fe2 orm refactoring 2021-07-24 15:16:57 +03:00
Yuri Kuznetsov
9dacaf7ddf test fix 2021-07-24 11:08:12 +03:00
Yuri Kuznetsov
622cf46858 orm order expression fix 2021-07-24 11:01:55 +03:00
Yuri Kuznetsov
0c6f8bb52d orm: select item 2021-07-23 16:37:32 +03:00
Yuri Kuznetsov
cccf05db39 rename boolean => bool 2021-07-23 15:17:24 +03:00
Yuri Kuznetsov
f4ca5290ce orm test 2021-07-23 15:04:34 +03:00
Yuri Kuznetsov
2380b6aa76 test rename 2021-07-23 15:02:04 +03:00
Yuri Kuznetsov
215ccb70bc fix categories 2021-07-23 14:53:36 +03:00
Yuri Kuznetsov
3d5376889f fix categories 2021-07-23 14:14:55 +03:00
Yuri Kuznetsov
6053e3be64 select usage 2021-07-23 14:05:10 +03:00
Yuri Kuznetsov
51f6d27edf orm relation filter in clone 2021-07-23 14:04:53 +03:00
Yuri Kuznetsov
e46a2089dd select usage 2021-07-23 12:13:33 +03:00
Yuri Kuznetsov
d5dd918fde select usage and refactoring 2021-07-22 16:10:25 +03:00
Yuri Kuznetsov
bf855c8b4c select usage and refactoring 2021-07-22 14:07:38 +03:00
Yuri Kuznetsov
4d273b34f7 avatar save refresh fix 2021-07-21 16:04:31 +03:00
Yuri Kuznetsov
eb82a8afda refactoring 2021-07-21 15:59:08 +03:00
Yuri Kuznetsov
73c4204ee9 cs fixes 2021-07-21 15:51:59 +03:00
Yuri Kuznetsov
8fbbd0e714 stream attachment type storing 2021-07-21 13:59:48 +03:00
Yuri Kuznetsov
438daf82b4 image refactoring and svg support 2021-07-21 13:50:19 +03:00
Yuri Kuznetsov
7066098957 email folder field entity 2021-07-21 12:40:17 +03:00
Yuri Kuznetsov
4e2b1cf4ce upgrade script 2021-07-21 12:36:47 +03:00
Yuri Kuznetsov
8e36b55e40 upgrade version change 2021-07-21 12:24:37 +03:00
Yuri Kuznetsov
e8df572503 cron info style fix 2021-07-21 12:18:54 +03:00
Yuri Kuznetsov
3e9556e1ef ics event changes 2021-07-21 12:11:15 +03:00
Yuri Kuznetsov
ceef3e690d merge 2021-07-21 11:13:37 +03:00
Yuri Kuznetsov
3e6bc02256 v 2021-07-20 15:17:28 +03:00
Yuri Kuznetsov
6cc1d7f721 fix test 2021-07-19 15:27:21 +03:00
Yuri Kuznetsov
53dba06764 typo fix 2021-07-19 15:26:04 +03:00
Yuri Kuznetsov
e514a34e60 email to meeting 2021-07-19 15:14:22 +03:00
Yuri Kuznetsov
3efe76dc71 fix doc 2021-07-16 11:13:31 +03:00
Yuri Kuznetsov
571e7e3333 doc 2021-07-16 11:06:12 +03:00
Yuri Kuznetsov
6b4d955d7c orm: ssl verify disabled param 2021-07-15 17:05:06 +03:00
Yuri Kuznetsov
da0b4ca25d css fix 2021-07-15 15:48:32 +03:00
Yuri Kuznetsov
3b093f5da3 task service 2021-07-15 12:14:41 +03:00
Yuri Kuznetsov
570c02ae55 fix mass action 2021-07-14 12:07:57 +03:00
Yuri Kuznetsov
81ff4f2c8a fix module 2021-07-13 15:16:21 +03:00
Yuri Kuznetsov
34b0402bc1 bc fixes 2021-07-13 12:54:38 +03:00
Yuri Kuznetsov
469b75624d fix 2021-07-13 12:02:10 +03:00
Yuri Kuznetsov
59e239118c fix 2021-07-13 12:02:04 +03:00
Yuri Kuznetsov
10957b5fdf fix tree 2021-07-12 16:29:55 +03:00
Yuri Kuznetsov
bc9f66008d bc fix 2021-07-12 15:59:51 +03:00
Yuri Kuznetsov
76b798d6e2 install fix 2021-07-12 15:52:02 +03:00
Yuri Kuznetsov
7717a15fc2 trailing nl 2021-07-12 13:54:37 +03:00
Yuri Kuznetsov
e0ef0a38a5 fix 2021-07-12 12:11:13 +03:00
Yuri Kuznetsov
b21eea1568 fix installer 2021-07-12 12:06:43 +03:00
Yuri Kuznetsov
ac73f8d6b6 htaccess dev replace 2021-07-12 11:59:30 +03:00
Yuri Kuznetsov
7d95969f03 searchParams in json 2021-07-10 13:17:41 +03:00
Yuri Kuznetsov
f67b06be88 cleanup 2021-07-10 13:00:55 +03:00
Yuri Kuznetsov
fa5effe1a9 refactoring 2021-07-10 12:55:37 +03:00
Yuri Kuznetsov
1f4dcb5a38 cs fix 2021-07-09 10:59:18 +03:00
Yuri Kuznetsov
949149ea4d cleanup and cs fixes 2021-07-09 10:57:16 +03:00
Yuri Kuznetsov
8ff262456b record id generator 2021-07-09 10:48:05 +03:00
HungNguyenPTN
03cf443b14 Fix issue #2009 (#2035)
* ISSUE #2009:
-Fix loadAdditionalFields does not work for email templates
-Similar to PDF template

* Update EmailTemplate.php
2021-07-09 09:08:04 +03:00
Yuri Kuznetsov
2681fdabec binding container builder 2021-07-08 17:34:24 +03:00
Yuri Kuznetsov
678c9779ce cs fix 2021-07-08 17:09:06 +03:00
Yuri Kuznetsov
1728f5d9f0 cs fix 2021-07-08 16:00:00 +03:00
Yuri Kuznetsov
b71312b8eb url allow any protocol 2021-07-06 17:01:25 +03:00
Yuri Kuznetsov
ebe27c499e cs fix 2021-07-06 16:44:40 +03:00
Yuri Kuznetsov
fbc164df8c entity inteface getValueMap 2021-07-06 16:42:06 +03:00
Yuri Kuznetsov
d419da1cac calendar sharedViewModeList 2021-07-06 16:35:38 +03:00
Yuri Kuznetsov
67e6e29994 cs fix 2021-07-06 16:31:10 +03:00
Yuri Kuznetsov
3059e60096 cs fix 2021-07-06 16:30:01 +03:00
Yuri Kuznetsov
8a4a0f6bdc fix 2021-07-06 16:14:19 +03:00
Yuri Kuznetsov
a1ea97950e cleanup 2021-07-06 15:14:07 +03:00
Yuri Kuznetsov
2d58361620 cs fix 2021-07-06 15:12:00 +03:00
Yuri Kuznetsov
a98262338a fix 2021-07-06 15:07:16 +03:00
Yuri Kuznetsov
47cd8b71f7 bundle fix 2021-07-06 15:06:25 +03:00
Yuri Kuznetsov
36d6a72317 public folder 2021-07-06 13:46:49 +03:00
Yuri Kuznetsov
1da5f7e223 fix portal attachment acl 2021-07-06 09:47:49 +03:00
Yuri Kuznetsov
29398de678 custom modules support 2021-07-02 12:11:33 +03:00
Yuri Kuznetsov
d95d562843 cs fix 2021-07-02 11:55:07 +03:00
Yuri Kuznetsov
cb51839eb9 module path refactoring 2021-07-01 17:16:57 +03:00
Yuri Kuznetsov
ec31075fae bypass filter resolver 2021-07-01 15:37:49 +03:00
Yuri Kuznetsov
b30a845a65 update summernote 2021-07-01 13:45:13 +03:00
Yuri Kuznetsov
9667c2fc5a fix category tree 2021-07-01 13:11:17 +03:00
Yuri Kuznetsov
7df4084d45 category tree show panel 2021-07-01 12:59:13 +03:00
Yuri Kuznetsov
d91c9f45c3 fix 2021-07-01 11:43:29 +03:00
Yuri Kuznetsov
840b3940cd fix categore tree 2021-07-01 10:56:51 +03:00
Yuri Kuznetsov
8a1e875020 add broadcast-channel to bundle 2021-06-30 14:02:16 +03:00
Yuri Kuznetsov
8c43d3f378 admin changes update current and other tabs 2021-06-30 12:55:07 +03:00
Yuri Kuznetsov
d67ebbe683 fix 2021-06-30 12:53:31 +03:00
Yuri Kuznetsov
16d9845027 cs fix 2021-06-30 12:36:43 +03:00
Yuri Kuznetsov
5591b49c8d cs fix 2021-06-30 12:17:48 +03:00
Yuri Kuznetsov
e67d140af0 cs fix 2021-06-30 11:53:22 +03:00
Yuri Kuznetsov
d8252fc769 cs fix 2021-06-30 10:22:28 +03:00
Yuri Kuznetsov
dfb50ab7ee remove loadLib 2021-06-30 10:04:19 +03:00
Yuri Kuznetsov
fcc2271e83 move 2021-06-29 18:12:06 +03:00
Yuri Kuznetsov
ae25a48d4e move 2021-06-29 18:11:07 +03:00
Yuri Kuznetsov
b703c6a0ae Update config.yml 2021-06-29 17:54:08 +03:00
Yuri Kuznetsov
c8ae67aba8 Update bug_report.md 2021-06-29 17:53:53 +03:00
Yuri Kuznetsov
9e68c32f96 Update bug_report.md 2021-06-29 17:52:50 +03:00
Yuri Kuznetsov
5887480b29 Update config.yml 2021-06-29 17:52:11 +03:00
Yuri Kuznetsov
edabd603b3 Update config.yml 2021-06-29 17:48:29 +03:00
Yuri Kuznetsov
1131af8283 Create config.yml 2021-06-29 17:46:18 +03:00
Yuri Kuznetsov
59e69ac1cc cs fix 2021-06-29 17:38:00 +03:00
Yuri Kuznetsov
25281d0c6f stream update note access control 2021-06-29 17:27:12 +03:00
Yuri Kuznetsov
0ab3da1512 comment 2021-06-29 16:12:33 +03:00
Yuri Kuznetsov
80d4799073 cs fix 2021-06-29 13:50:26 +03:00
Yuri Kuznetsov
71353042c3 cs fix 2021-06-29 13:13:45 +03:00
Yuri Kuznetsov
b5c3fb16cb wider buttons 2021-06-29 12:55:39 +03:00
Yuri Kuznetsov
3e3159f03b fix 2021-06-29 12:25:26 +03:00
Yuri Kuznetsov
97a2044f5e cs fix 2021-06-29 11:56:11 +03:00
Yuri Kuznetsov
fd1093180f cs fix 2021-06-29 11:48:06 +03:00
dependabot[bot]
68f3d6c056 Bump league/flysystem from 2.0.4 to 2.1.1 (#2029)
Bumps [league/flysystem](https://github.com/thephpleague/flysystem) from 2.0.4 to 2.1.1.
- [Release notes](https://github.com/thephpleague/flysystem/releases)
- [Changelog](https://github.com/thephpleague/flysystem/blob/2.x/CHANGELOG.md)
- [Commits](https://github.com/thephpleague/flysystem/compare/2.0.4...2.1.1)

---
updated-dependencies:
- dependency-name: league/flysystem
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-29 11:46:49 +03:00
Yuri Kuznetsov
6002e73a59 Update issue templates 2021-06-29 11:45:13 +03:00
Yuri Kuznetsov
1e0fd60d4e Update issue templates 2021-06-29 11:41:32 +03:00
Yuri Kuznetsov
f0d5cda1c5 fix 2021-06-28 16:12:00 +03:00
Yuri Kuznetsov
04f8630d96 tpl fixes 2021-06-28 16:01:25 +03:00
Yuri Kuznetsov
440db9ba7e composer changes 2021-06-27 12:07:23 +03:00
Yuri Kuznetsov
44fca49e3f fix 2021-06-26 19:21:08 +03:00
Yuri Kuznetsov
061220263c namespace loader log 2021-06-26 19:20:45 +03:00
Yuri Kuznetsov
428f8a68bf diff: indlude composer changes 2021-06-26 19:13:54 +03:00
Yuri Kuznetsov
03f3e4595e psr4 usage 2021-06-26 18:58:32 +03:00
Yuri Kuznetsov
21fe26d042 npm-install ignore output 2021-06-26 18:51:35 +03:00
Yuri Kuznetsov
38f79e9244 refactoring 2021-06-26 18:40:30 +03:00
Yuri Kuznetsov
2ff4ec81ac module service 2021-06-26 15:09:20 +03:00
Yuri Kuznetsov
3d24f63fd7 refactoring 2021-06-26 11:26:18 +03:00
Yuri Kuznetsov
e8c66db876 refactoring 2021-06-26 11:07:04 +03:00
Yuri Kuznetsov
f38811ae9d fix 2021-06-26 10:51:02 +03:00
Yuri Kuznetsov
74693c5f6e hooks refactoring 2021-06-26 10:48:19 +03:00
Yuri Kuznetsov
3f2560655e cleanup 2021-06-25 16:20:48 +03:00
Yuri Kuznetsov
bac596ff5b module refactoring 2021-06-25 16:11:28 +03:00
Yuri Kuznetsov
b7561b6cfc fix 2021-06-25 16:03:41 +03:00
Yuri Kuznetsov
afb41ebc05 fix 2021-06-25 15:56:07 +03:00
Yuri Kuznetsov
4961f4859e cleanup 2021-06-25 14:21:26 +03:00
Yuri Kuznetsov
0b18e1ae88 route refactoring 2021-06-25 14:18:47 +03:00
Yuri Kuznetsov
217fcaaddc refactoring 2021-06-25 13:01:22 +03:00
Yuri Kuznetsov
f77c23f781 fix naming 2021-06-25 11:45:43 +03:00
Yuri Kuznetsov
639c7bb876 fix comment 2021-06-25 11:43:28 +03:00
Yuri Kuznetsov
b9a5498279 refactoring 2021-06-25 11:43:28 +03:00
Taras Machyshyn
3a8e98bb82 Merge branch 'hotfix/6.1.8' 2021-06-24 18:28:40 +03:00
Yuri Kuznetsov
f2e5e66383 template file manager use file reader 2021-06-24 17:55:54 +03:00
Taras Machyshyn
2a52d3c52e NamespaceLoader bug fixes 2021-06-24 17:47:57 +03:00
Yuri Kuznetsov
7332d0aa37 layout use file reader 2021-06-24 16:06:19 +03:00
Yuri Kuznetsov
1e7f248d28 rename QueryParams => Query 2021-06-24 12:30:24 +03:00
Yuri Kuznetsov
a381eb3d5a orm parts => part 2021-06-24 11:50:29 +03:00
Yuri Kuznetsov
70f2d82963 fix grunt 2021-06-24 11:49:48 +03:00
Yuri Kuznetsov
2dc0a6bc95 installer libs 2021-06-24 11:34:13 +03:00
Yuri Kuznetsov
b37a458a1d cleanup 2021-06-24 11:22:40 +03:00
Yuri Kuznetsov
e2257c5046 cs fix 2021-06-24 10:57:26 +03:00
Yuri Kuznetsov
e3ee433b49 change html 2021-06-24 10:50:55 +03:00
Yuri Kuznetsov
16e4b2ae40 fixes 2021-06-24 10:37:21 +03:00
Yuri Kuznetsov
0a513fe088 change 2021-06-23 16:24:21 +03:00
Yuri Kuznetsov
f0cd18e711 fix 2021-06-23 16:02:51 +03:00
Yuri Kuznetsov
9559e9fff3 libs config 2021-06-23 15:45:51 +03:00
Yuri Kuznetsov
e6c869a438 fix 2021-06-23 13:57:37 +03:00
Yuri Kuznetsov
f701a142c8 grunt changes 2021-06-23 13:06:26 +03:00
Yuri Kuznetsov
f02cfc5a1a lib minify 2021-06-23 12:58:25 +03:00
Yuri Kuznetsov
14e5446696 dif fix 2021-06-23 11:03:52 +03:00
Yuri Kuznetsov
61dc029867 diff changes 2021-06-23 10:43:06 +03:00
Yuri Kuznetsov
9f00055454 refactoring 2021-06-23 10:27:04 +03:00
Yuri Kuznetsov
bf4a01971d refactoring 2021-06-22 22:24:23 +03:00
Yuri Kuznetsov
5b1d060e5a deprecated comments 2021-06-22 20:35:13 +03:00
Yuri Kuznetsov
8582f74e3e diff dev 2021-06-22 17:31:31 +03:00
Yuri Kuznetsov
fcfeacdd82 fix 2021-06-22 16:17:02 +03:00
Yuri Kuznetsov
78902caf30 refactoring 2021-06-22 16:15:52 +03:00
Yuri Kuznetsov
03d5a8357a fix install lib 2021-06-22 15:46:07 +03:00
Yuri Kuznetsov
c8f6f1b4f2 fix 2021-06-22 15:26:53 +03:00
Yuri Kuznetsov
519df8c33b cs fix 2021-06-22 13:58:00 +03:00
Yuri Kuznetsov
14205b4145 fix modal 2021-06-22 13:34:11 +03:00
Yuri Kuznetsov
cf6eadcc8c selectize in bundle 2021-06-22 13:14:20 +03:00
Yuri Kuznetsov
ab5e9c8344 libs dev 2021-06-22 12:51:38 +03:00
Yuri Kuznetsov
c1f9a86dd3 libs 2021-06-22 12:34:29 +03:00
Yuri Kuznetsov
5204a34031 libs 2021-06-22 12:25:54 +03:00
Yuri Kuznetsov
4c980e64ac libs 2021-06-22 11:48:25 +03:00
Yuri Kuznetsov
ad772b7706 cleanup 2021-06-22 08:46:35 +03:00
Yuri Kuznetsov
471299bd21 fix installer 2021-06-22 08:46:29 +03:00
Yuri Kuznetsov
fc945fbab9 libs 2021-06-21 21:00:06 +03:00
Yuri Kuznetsov
defc97dc35 cleanup 2021-06-21 18:52:17 +03:00
Yuri Kuznetsov
e239cb551d flotr lib 2021-06-21 18:40:22 +03:00
Yuri Kuznetsov
bceecbf377 lib 2021-06-21 17:23:22 +03:00
Yuri Kuznetsov
6bdbfe4aa0 lib 2021-06-21 17:09:53 +03:00
Yuri Kuznetsov
243fab3a05 libs 2021-06-21 16:46:38 +03:00
Yuri Kuznetsov
24470ffe11 cleanup 2021-06-21 14:29:53 +03:00
Yuri Kuznetsov
cb04731319 libs 2021-06-21 14:22:31 +03:00
Yuri Kuznetsov
16db12231a lib usage 2021-06-21 14:14:06 +03:00
Yuri Kuznetsov
9e6385c00a tpl fix 2021-06-21 13:18:57 +03:00
Yuri Kuznetsov
5d79dfa6be tpl fixes 2021-06-21 13:13:10 +03:00
Yuri Kuznetsov
6ccc65a85a libs 2021-06-21 11:48:53 +03:00
Yuri Kuznetsov
58d2a2460b lib building 2021-06-21 11:08:05 +03:00
Yuri Kuznetsov
df887cba61 lib devPath 2021-06-19 19:35:22 +03:00
Yuri Kuznetsov
e68ad67070 fix 2021-06-19 18:54:21 +03:00
Yuri Kuznetsov
8c9a4f9d3b grunt run npm install 2021-06-19 18:48:42 +03:00
Yuri Kuznetsov
d853f0e7f9 lib updates 2021-06-19 18:29:27 +03:00
Yuri Kuznetsov
5e60f65711 fix 2021-06-19 17:41:46 +03:00
Yuri Kuznetsov
ad72465a04 lib upgrades 2021-06-19 17:27:23 +03:00
Yuri Kuznetsov
df75bc04f8 libs 2021-06-19 15:04:47 +03:00
Yuri Kuznetsov
442c5870c4 lib updates 2021-06-19 14:34:55 +03:00
Yuri Kuznetsov
08495a3cb2 fix 2021-06-19 14:34:14 +03:00
Yuri Kuznetsov
06de76ed58 fix datetime 2021-06-19 14:02:52 +03:00
Yuri Kuznetsov
23f3ca2c5c cs fix 2021-06-19 13:55:23 +03:00
Yuri Kuznetsov
4939c281aa cs fix 2021-06-19 13:43:14 +03:00
Yuri Kuznetsov
02d15211fa npm usage for client libs 2021-06-19 13:39:08 +03:00
Yuri Kuznetsov
be6f7671c8 footer link changes 2021-06-18 20:57:37 +03:00
Yuri Kuznetsov
76cd1b9cad fix 2021-06-18 15:37:58 +03:00
Yuri Kuznetsov
57cfa6f5a0 refactoring 2021-06-18 15:33:28 +03:00
Yuri Kuznetsov
aa5bcf97d2 resource finder 2021-06-18 15:17:21 +03:00
Yuri Kuznetsov
fbf05d5263 refactoring 2021-06-18 13:03:08 +03:00
Yuri Kuznetsov
f54a8002a7 naming fix 2021-06-18 12:03:51 +03:00
Yuri Kuznetsov
c25b10bb78 refactoring 2021-06-18 12:01:38 +03:00
Yuri Kuznetsov
703279a2f8 refactoring 2021-06-18 11:44:33 +03:00
Yuri Kuznetsov
beae99c71b cs fix 2021-06-17 23:33:37 +03:00
Yuri Kuznetsov
7478a323ab rename 2021-06-17 18:40:18 +03:00
Yuri Kuznetsov
31a273446b fix 2021-06-17 18:07:38 +03:00
Yuri Kuznetsov
e1e51eb124 deprecate getPDO 2021-06-17 18:05:03 +03:00
Yuri Kuznetsov
95327fd3a3 gr getPDO usage 2021-06-17 18:02:03 +03:00
Yuri Kuznetsov
533eed11f0 button larger 2021-06-17 14:17:31 +03:00
Yuri Kuznetsov
eb68a43544 config not extending model offline 2021-06-17 14:13:38 +03:00
Yuri Kuznetsov
7bd1156cda requirements page fixes 2021-06-17 13:50:37 +03:00
Yuri Kuznetsov
0c7e33b2f1 Merge branch 'hotfix/6.1.8' 2021-06-17 13:28:45 +03:00
Yuri Kuznetsov
a9623ff698 hotfix cache clear on login 2021-06-17 13:19:59 +03:00
Yuri Kuznetsov
44d97b64b9 cache issue fix 2021-06-17 13:10:07 +03:00
Yuri Kuznetsov
e4778dea36 fix 2021-06-17 12:56:53 +03:00
Yuri Kuznetsov
c3421b42c7 refactoring 2021-06-17 11:55:42 +03:00
Yuri Kuznetsov
10bbe516d7 cleanup 2021-06-17 10:54:36 +03:00
Yuri Kuznetsov
771e33109d fix 2021-06-16 13:35:05 +03:00
Yuri Kuznetsov
ec81d5a964 fix 2021-06-16 13:30:38 +03:00
Yuri Kuznetsov
ee1628dbdf scheduled job populating change 2021-06-16 13:13:59 +03:00
Yuri Kuznetsov
a1c2c9efbd job group length 2021-06-16 12:54:13 +03:00
Yuri Kuznetsov
f2070332e9 test job scheduler 2021-06-16 12:50:59 +03:00
Yuri Kuznetsov
5079ece2dc job scheduler change 2021-06-16 12:46:04 +03:00
Yuri Kuznetsov
6a791713ea job group processing 2021-06-16 12:43:26 +03:00
Yuri Kuznetsov
41c9568d80 job target group running check 2021-06-16 11:40:43 +03:00
Yuri Kuznetsov
698f3d2821 update laminas service manager 2021-06-16 11:13:29 +03:00
Yuri Kuznetsov
a86ea5d12f fix filters enum 2021-06-16 10:15:22 +03:00
Yuri Kuznetsov
fea9837f30 select item converter any, none filters 2021-06-16 10:15:05 +03:00
Yuri Kuznetsov
72a11e51a2 layout change 2021-06-16 09:42:01 +03:00
Yuri Kuznetsov
b9e1406f5b fix 2021-06-16 09:41:00 +03:00
Yuri Kuznetsov
564b425b8f job changes 2021-06-15 22:55:27 +03:00
Yuri Kuznetsov
532dd78aa8 fix naming 2021-06-15 21:04:46 +03:00
Yuri Kuznetsov
5f969c703f fix 2021-06-15 20:01:49 +03:00
Yuri Kuznetsov
675b0a39fc fix 2021-06-15 18:51:41 +03:00
Yuri Kuznetsov
0a62472840 fix comment 2021-06-15 18:51:00 +03:00
Yuri Kuznetsov
faa8545fcf fixes and tests 2021-06-15 18:48:42 +03:00
Yuri Kuznetsov
7d98a01e9a comment fix 2021-06-15 18:07:01 +03:00
Yuri Kuznetsov
d74d3b282d job scheduler 2021-06-15 18:06:02 +03:00
Yuri Kuznetsov
747e9438c9 renaming 2021-06-15 16:27:09 +03:00
Yuri Kuznetsov
b6ae809b56 job ui fix 2021-06-15 16:06:16 +03:00
Yuri Kuznetsov
c999ae9da4 job groups 2021-06-15 16:01:10 +03:00
Yuri Kuznetsov
61eff01008 refactoring 2021-06-15 12:34:33 +03:00
Yuri Kuznetsov
f2ee9afa88 refactoring 2021-06-15 11:59:47 +03:00
Yuri Kuznetsov
dc5ac7b3a3 refactoring 2021-06-15 11:51:34 +03:00
Yuri Kuznetsov
612fbf8f38 refactoring 2021-06-15 11:37:10 +03:00
Yuri Kuznetsov
f97a8728fd fix comment 2021-06-14 15:52:29 +03:00
Yuri Kuznetsov
1c1ddaf3d0 refactoring 2021-06-14 15:40:32 +03:00
Yuri Kuznetsov
30316222f3 job with class name 2021-06-14 15:36:07 +03:00
Yuri Kuznetsov
d53e6b767c test 2021-06-14 15:11:21 +03:00
Yuri Kuznetsov
661a1b5839 fix 2021-06-14 15:07:47 +03:00
Yuri Kuznetsov
cb2485ae3d job refactoring 2021-06-14 14:25:07 +03:00
Yuri Kuznetsov
fa70bf3ff8 refactoring 2021-06-14 12:05:14 +03:00
Yuri Kuznetsov
a32419d07d refactoring 2021-06-14 11:21:26 +03:00
Yuri Kuznetsov
c2e806e318 cleanup 2021-06-13 16:41:17 +03:00
Yuri Kuznetsov
ba8bbc462d refactoring 2021-06-13 16:40:46 +03:00
Yuri Kuznetsov
c4a04d3dca cs fix 2021-06-13 11:48:40 +03:00
Yuri Kuznetsov
1135458d60 cs fix 2021-06-13 10:51:25 +03:00
Yuri Kuznetsov
3d2aa17cf2 cs fix 2021-06-12 21:20:10 +03:00
Yuri Kuznetsov
3baf1f17bf orm refactoring 2021-06-12 14:50:13 +03:00
Yuri Kuznetsov
f8ecbb7806 refactor loader 2021-06-12 12:13:19 +03:00
Yuri Kuznetsov
8f3f2a20c1 cs fix 2021-06-12 11:37:09 +03:00
Yuri Kuznetsov
7935644115 cs fix 2021-06-12 11:13:21 +03:00
Yuri Kuznetsov
dde3eca10e cs fix 2021-06-12 10:28:49 +03:00
Yuri Kuznetsov
ae60a08baa cs fix 2021-06-11 21:29:27 +03:00
Yuri Kuznetsov
676e4a2cd4 webhook test 2021-06-11 16:12:30 +03:00
Yuri Kuznetsov
7f66d4690e webhook test 2021-06-11 16:01:55 +03:00
Yuri Kuznetsov
40fccc57ed webhook refactoring and test 2021-06-11 15:44:21 +03:00
Yuri Kuznetsov
df44cc0779 webhook test 2021-06-11 13:20:02 +03:00
Yuri Kuznetsov
d29e2f3994 cs fix 2021-06-11 13:04:08 +03:00
Yuri Kuznetsov
3c6b485321 renaming 2021-06-11 11:00:57 +03:00
Yuri Kuznetsov
4e08c0f3cf cs fix 2021-06-11 10:55:49 +03:00
Yuri Kuznetsov
c9c45ec8d1 cs fix 2021-06-11 10:48:42 +03:00
Yuri Kuznetsov
af4d1e650c cs fix 2021-06-10 17:01:54 +03:00
Yuri Kuznetsov
3412cb6e45 grid usage 2021-06-10 16:19:00 +03:00
Yuri Kuznetsov
9cbf9f3942 email image detecting 2021-06-10 15:53:24 +03:00
Yuri Kuznetsov
837e5764b8 cs fix 2021-06-10 15:22:36 +03:00
Yuri Kuznetsov
491c27cd74 disable kanban order in portal 2021-06-10 15:15:43 +03:00
Yuri Kuznetsov
bddb517583 fix assignment checker 2021-06-10 15:12:56 +03:00
Yuri Kuznetsov
843cc89547 fix 2021-06-10 15:02:33 +03:00
Yuri Kuznetsov
4324b8dfc5 pdf apply default order for relations 2021-06-10 12:23:40 +03:00
Yuri Kuznetsov
078a65a8bf cleanup 2021-06-10 11:19:41 +03:00
Yuri Kuznetsov
17aa37f17b hook tests 2021-06-10 11:18:25 +03:00
Yuri Kuznetsov
d30d951494 update npm dep 2021-06-10 09:30:50 +03:00
Yuri Kuznetsov
7bc76bdee4 uglify harmony usage 2021-06-10 09:22:50 +03:00
Yuri Kuznetsov
4fc1a87ead fix 2021-06-10 09:20:53 +03:00
Yuri Kuznetsov
4b8e157098 fix grunt 2021-06-10 09:20:22 +03:00
Yuri Kuznetsov
8fef756172 fix 2fa password 2021-06-09 21:52:33 +03:00
Yuri Kuznetsov
7aab27a60f fix tests 2021-06-09 16:13:21 +03:00
Yuri Kuznetsov
2ebcc52358 fix 2021-06-09 16:13:17 +03:00
Yuri Kuznetsov
7e83bad920 fix link multiple factory 2021-06-09 16:07:46 +03:00
Yuri Kuznetsov
052ea72e87 fix comment 2021-06-09 16:07:26 +03:00
Yuri Kuznetsov
37dd04746b uglify es 2021-06-09 15:37:26 +03:00
Yuri Kuznetsov
c0a815f36e record hook 2021-06-09 15:34:36 +03:00
Yuri Kuznetsov
8fa1e3dd79 cs fix 2021-06-09 15:26:42 +03:00
Yuri Kuznetsov
61c9bdea92 fix composer 2021-06-09 15:23:26 +03:00
Yuri Kuznetsov
d804ca40f4 fix composer temp 2021-06-09 14:21:15 +03:00
Yuri Kuznetsov
aa3d09a55c deprecate createCollection 2021-06-08 17:20:09 +03:00
Yuri Kuznetsov
5a65ee5254 field invalid dynamic logic 2021-06-06 19:14:16 +03:00
Yuri Kuznetsov
a50c7d34ff cs fix 2021-06-06 18:03:14 +03:00
Yuri Kuznetsov
b98ab87ae7 nl lang 2021-06-05 15:40:18 +03:00
Yuri Kuznetsov
f90f1ec7c0 update lock 2021-06-05 14:41:25 +03:00
Yuri Kuznetsov
b8edecc092 ignore ext-ldap, ext-zmq deps 2021-06-05 14:33:41 +03:00
Yuri Kuznetsov
3b73e3d49d update laminas libs 2021-06-05 14:32:23 +03:00
Yuri Kuznetsov
580afb5a21 update symfony deps 2021-06-05 14:19:20 +03:00
Yuri Kuznetsov
a673756664 update slim/psr7 2021-06-05 14:07:04 +03:00
Yuri Kuznetsov
0499639473 update fig/http-message-util 2021-06-05 14:03:58 +03:00
Yuri Kuznetsov
69dd14682c update cron expression lib 2021-06-05 14:02:22 +03:00
Yuri Kuznetsov
d9fa110156 dynamic logic improvements 2021-06-05 12:15:24 +03:00
Yuri Kuznetsov
3f9fc67ab4 entity manager check link name matches entity type 2021-06-04 16:01:38 +03:00
Yuri Kuznetsov
43c82fb028 fix 2021-06-03 19:50:07 +03:00
Yuri Kuznetsov
01c0fa9563 fix css 2021-06-03 19:45:00 +03:00
Yuri Kuznetsov
ffce78808e bind client manager 2021-06-02 16:14:59 +03:00
Yuri Kuznetsov
e4d5ffb281 fix 2021-06-01 15:59:14 +03:00
Yuri Kuznetsov
b8422e7299 dev 2021-06-01 15:56:12 +03:00
Yuri Kuznetsov
d7641455d4 view setup handlers and document drop 2021-06-01 14:49:21 +03:00
Yuri Kuznetsov
b6e56ae42c cs fix 2021-06-01 10:28:38 +03:00
Yuri Kuznetsov
52cfa061c4 entity type const usage 2021-05-31 14:08:00 +03:00
Yuri Kuznetsov
9208debb1a entity type const 2021-05-31 14:03:21 +03:00
Yuri Kuznetsov
5da4e9f4a8 attachment edit view download 2021-05-31 13:31:32 +03:00
Yuri Kuznetsov
f30bfb20ef fix 2021-05-31 12:57:51 +03:00
Yuri Kuznetsov
798eee940c import ui fix 2021-05-31 12:41:56 +03:00
Yuri Kuznetsov
9c44356d5a email account monitored folders as array 2021-05-31 12:25:51 +03:00
Yuri Kuznetsov
e241ad349a cs fix 2021-05-31 11:18:14 +03:00
Yuri Kuznetsov
25f5b82cff move 2021-05-29 15:07:49 +03:00
Yuri Kuznetsov
5776f56f7b monitoref fodler max length 2021-05-29 12:06:56 +03:00
Yuri Kuznetsov
20da15c931 refactoring 2021-05-29 12:06:47 +03:00
Yuri Kuznetsov
0b68dd0e85 refactoring 2021-05-29 11:49:12 +03:00
Yuri Kuznetsov
4e49e69c16 fix 2021-05-28 22:39:35 +03:00
Yuri Kuznetsov
8c775896b2 refactoring 2021-05-28 16:15:32 +03:00
Yuri Kuznetsov
9af1168004 refactoring 2021-05-28 16:12:39 +03:00
Yuri Kuznetsov
c1986623ed fix attachment mail import 2021-05-28 15:38:44 +03:00
Yuri Kuznetsov
700a39f4c5 formula test 2021-05-28 15:15:26 +03:00
Yuri Kuznetsov
738cae727e cleanup 2021-05-28 15:14:08 +03:00
Yuri Kuznetsov
08536f0850 cleanup 2021-05-28 15:08:18 +03:00
Yuri Kuznetsov
ddca72e8bd tests 2021-05-28 15:07:20 +03:00
Yuri Kuznetsov
3ddbf3aca7 fix entity manager 2021-05-28 13:47:05 +03:00
Yuri Kuznetsov
52ed21cae5 duplicate finder refactoring 2021-05-28 13:41:57 +03:00
Yuri Kuznetsov
f7dd5d92ac fix 2021-05-27 23:00:20 +03:00
Yuri Kuznetsov
4d3e1c713a fix 2021-05-27 13:45:18 +03:00
Yuri Kuznetsov
b54f6310f3 fromula autocomplete impr 2021-05-27 13:42:43 +03:00
Yuri Kuznetsov
008bdfdad5 more formula insert items 2021-05-27 13:12:30 +03:00
Yuri Kuznetsov
ffa6c115e1 fix css wysiwyg 2021-05-27 12:39:29 +03:00
Yuri Kuznetsov
ae3d59fc47 cleanup 2021-05-27 12:09:12 +03:00
Yuri Kuznetsov
3207aeb741 entity manager tool refactoring and fixes 2021-05-27 12:03:32 +03:00
Yuri Kuznetsov
b3949aa3cc fix 2021-05-27 11:22:58 +03:00
Yuri Kuznetsov
6e9d29937d Optimistic concurrency control 2021-05-26 14:09:45 +03:00
Yuri Kuznetsov
96dca60a2b cs fix 2021-05-26 13:39:10 +03:00
Yuri Kuznetsov
8d3a7f2526 save error handlers 2021-05-25 13:55:02 +03:00
Yuri Kuznetsov
ac9f51a0f3 fix person name select 2021-05-25 13:23:32 +03:00
Yuri Kuznetsov
8ffd06025e cleanup 2021-05-25 13:18:58 +03:00
Yuri Kuznetsov
576f424bc0 client save refactoring 2021-05-25 13:02:50 +03:00
Yuri Kuznetsov
ec5c92e369 create update params 2021-05-25 11:40:33 +03:00
Yuri Kuznetsov
6a97b3dee5 cs fix 2021-05-25 11:08:05 +03:00
Yuri Kuznetsov
70070daf1c cs fix 2021-05-24 12:42:52 +03:00
Yuri Kuznetsov
482e4097d8 manual merge 2021-05-24 12:35:51 +03:00
Yuri Kuznetsov
f774b4bbcf queue optimization 2021-05-24 12:20:40 +03:00
Yuri Kuznetsov
47938a1072 job queue optimization 2021-05-24 12:13:18 +03:00
Yuri Kuznetsov
93449c9320 fix webhook 2021-05-24 11:02:44 +03:00
Yuri Kuznetsov
e93310b9bf tcpdf relocation 2021-05-21 18:26:06 +03:00
Yuri Kuznetsov
9a26889fc7 cs fix 2021-05-21 15:39:07 +03:00
Yuri Kuznetsov
106fdc72c4 cs fix 2021-05-21 15:35:39 +03:00
Yuri Kuznetsov
6224d8fbbe fix notification 2021-05-21 15:14:37 +03:00
Yuri Kuznetsov
b1a195c67e fix preferences 2021-05-21 15:13:35 +03:00
Yuri Kuznetsov
607fbb609c fix loading notification 2021-05-21 15:09:27 +03:00
Yuri Kuznetsov
13e186576b fix 2021-05-21 15:06:35 +03:00
Yuri Kuznetsov
d30041dfe7 iframe disabled 2021-05-21 15:04:42 +03:00
Yuri Kuznetsov
dc14024dd7 cs fix 2021-05-21 14:01:44 +03:00
Yuri Kuznetsov
bd95bc12ba update ace 2021-05-21 13:54:48 +03:00
Yuri Kuznetsov
0b67883de8 formula autocomplete 2021-05-21 13:37:15 +03:00
Yuri Kuznetsov
64e1d6b27e cs fix 2021-05-21 13:27:33 +03:00
Yuri Kuznetsov
7a840f1a6e cs fix 2021-05-21 13:21:45 +03:00
Yuri Kuznetsov
35ac4e91f6 cs fix 2021-05-21 11:24:31 +03:00
Yuri Kuznetsov
9a03074283 fixes 2021-05-20 23:03:10 +03:00
Arkady
0ed68957db fix typo (#1988)
Co-authored-by: Yuri Kuznetsov <yurikuzn@users.noreply.github.com>
2021-05-20 22:51:18 +03:00
Yuri Kuznetsov
44d4e4f78f pl lang fixes 2021-05-20 22:42:57 +03:00
Yuri Kuznetsov
4506f06b01 test 2021-05-20 19:57:46 +03:00
Yuri Kuznetsov
813e3227ad email refactoring 2021-05-20 19:50:48 +03:00
Yuri Kuznetsov
3bbccf2c3c rename 2021-05-20 18:31:23 +03:00
Yuri Kuznetsov
810677014c options usage 2021-05-20 18:22:57 +03:00
Yuri Kuznetsov
f81ef16012 fix mail 2021-05-20 18:03:25 +03:00
Yuri Kuznetsov
c33a9ea975 fix 2021-05-20 17:51:25 +03:00
Yuri Kuznetsov
f672231eec cleanup 2021-05-20 14:37:24 +03:00
Yuri Kuznetsov
9876189c64 autoreply improvements 2021-05-20 14:34:20 +03:00
Yuri Kuznetsov
2f84ac6fee fix email template 2021-05-20 13:59:35 +03:00
Yuri Kuznetsov
692904dc5e fix 2021-05-20 13:38:02 +03:00
Yuri Kuznetsov
c02aceeead email import refactoring and fixes 2021-05-20 13:34:11 +03:00
Yuri Kuznetsov
ee24b58a2c job fix 2021-05-20 12:28:00 +03:00
Yuri Kuznetsov
29d1cda756 fix 2021-05-20 12:04:36 +03:00
Yuri Kuznetsov
343df3f97c auto reply changes 2021-05-19 16:08:38 +03:00
Yuri Kuznetsov
089eeb2956 Merge branch 'hotfix/6.1.8' 2021-05-19 15:55:51 +03:00
Yuri Kuznetsov
da2e2dbf20 fix typo 2021-05-19 15:55:38 +03:00
Yuri Kuznetsov
8501a0b818 Merge branch 'hotfix/6.1.8' 2021-05-19 15:44:42 +03:00
Yuri Kuznetsov
59a9f73872 auto-reply headeres 2021-05-19 15:44:19 +03:00
Yuri Kuznetsov
b3438ccc86 email in reply to header 2021-05-19 15:37:36 +03:00
Yuri Kuznetsov
72a57edaa3 save and new, save and continue editing 2021-05-19 14:34:54 +03:00
Yuri Kuznetsov
b19a63f69a base record view fix 2021-05-19 14:30:43 +03:00
Yuri Kuznetsov
71a600e308 cs fix 2021-05-19 14:10:35 +03:00
Yuri Kuznetsov
ebb9758d28 cs fix 2021-05-19 14:03:23 +03:00
Yuri Kuznetsov
e9e25f8800 cs fix 2021-05-19 13:58:37 +03:00
Yuri Kuznetsov
b42226c490 cs fix 2021-05-19 13:48:24 +03:00
Yuri Kuznetsov
15965cd1b1 fix avatar flicking 2021-05-19 13:15:40 +03:00
Yuri Kuznetsov
8fef564297 cleanup 2021-05-19 12:55:03 +03:00
Yuri Kuznetsov
81f01996db cleanup 2021-05-19 12:50:46 +03:00
Yuri Kuznetsov
00c378ad94 cs fix 2021-05-19 12:37:43 +03:00
Yuri Kuznetsov
85eefe9a54 select access filter bind acl 2021-05-19 12:17:53 +03:00
Yuri Kuznetsov
43cbc44941 header rootLinkDisabled prop 2021-05-19 11:38:03 +03:00
Yuri Kuznetsov
f7540e7e36 cs fix 2021-05-19 11:28:54 +03:00
Yuri Kuznetsov
c0a8c02c26 select usage 2021-05-19 11:21:54 +03:00
Eymen Elkum
c054712828 config param emailAutoReplaySuppressPeriod (#1998) 2021-05-19 10:14:23 +03:00
Yuri Kuznetsov
f20616e6b7 frontend acl cloning array 2021-05-19 09:44:19 +03:00
Yuri Kuznetsov
e518c146f0 orm defs relocation 2021-05-18 18:19:58 +03:00
Yuri Kuznetsov
602115266a orm select builder where no default 2021-05-18 17:59:08 +03:00
Yuri Kuznetsov
4e074af139 select usage 2021-05-18 17:52:42 +03:00
Yuri Kuznetsov
cceaf2bc02 select usage 2021-05-18 17:02:30 +03:00
Yuri Kuznetsov
acb49d2b69 fix import 2021-05-18 16:56:58 +03:00
Yuri Kuznetsov
4d84924da0 link multiple vo addition 2021-05-18 15:49:20 +03:00
Yuri Kuznetsov
cc94913e16 more functions 2021-05-18 13:39:20 +03:00
Yuri Kuznetsov
13459bd136 cleanup 2021-05-18 13:16:44 +03:00
Yuri Kuznetsov
b285b1c17f dev 2021-05-18 13:02:37 +03:00
Yuri Kuznetsov
05c18658a0 select bool filter refactoring 2021-05-14 14:16:24 +03:00
Yuri Kuznetsov
f1a52f55d9 gr select managers 2021-05-14 13:23:22 +03:00
Yuri Kuznetsov
ea05052677 last viewed fix and list layout params 2021-05-14 12:24:42 +03:00
Yuri Kuznetsov
13311c374f select access control mandatory filter 2021-05-13 22:19:10 +03:00
Yuri Kuznetsov
daa288c1cc visibility fix 2021-05-13 17:42:20 +03:00
Yuri Kuznetsov
38b613ac5f refactoring 2021-05-13 17:33:17 +03:00
Yuri Kuznetsov
7429f454eb fix test 2021-05-13 16:50:45 +03:00
Yuri Kuznetsov
3c119fe3e8 fix test 2021-05-13 16:39:51 +03:00
Yuri Kuznetsov
428525e1bd cleanup 2021-05-13 16:31:36 +03:00
Yuri Kuznetsov
e07dbf374c cleanup 2021-05-13 16:31:10 +03:00
Yuri Kuznetsov
f1306dfbee refactoring 2021-05-13 14:43:55 +03:00
Yuri Kuznetsov
db4663cbf9 mail sender params 2021-05-13 12:29:34 +03:00
Yuri Kuznetsov
3760275937 orm select builder improvement 2021-05-13 11:20:27 +03:00
Yuri Kuznetsov
b4afeac71f renaming 2021-05-13 11:08:49 +03:00
Arkady
b19c543988 fix cs (#1995)
* remove leading slashes in `use` clauses

* remove spaces inside parenthesis

* ensure one blank line after the `use` statement

* ensure cast are written in lower case

* fix whitespace around the keyword of a class

* remove spaces after function call

* remove trailing whitespace

* standardize spaces around ternary operator

* ensure php keywords are in lower case

* remove whitespace before closing semicolon

* ensure whitespace after each comma in array

* ensure `true`, `false`, and `null` are lower case
2021-05-12 23:53:11 +03:00
Yuri Kuznetsov
0a5ce00878 fix 2021-05-12 23:26:14 +03:00
Arkady
bfe256c578 remove duplicate object key (#1994) 2021-05-12 22:42:29 +03:00
Yuri Kuznetsov
af31c84982 cleanup 2021-05-12 14:37:15 +03:00
Yuri Kuznetsov
67a2ad241a comment 2021-05-12 13:42:22 +03:00
Arkady
8a9449e240 remove duplicate object key (#1993) 2021-05-12 12:26:07 +03:00
Yuri Kuznetsov
95ef59be68 export refactoring and tests 2021-05-12 12:10:51 +03:00
Yuri Kuznetsov
8463fb402e export field processing 2021-05-11 22:36:29 +03:00
Yuri Kuznetsov
0f4391bdd1 pdf refactoring and fixes 2021-05-11 18:18:41 +03:00
Yuri Kuznetsov
2738019c3f move 2021-05-11 15:59:04 +03:00
Yuri Kuznetsov
ce3e76aa3d move 2021-05-11 15:44:38 +03:00
Yuri Kuznetsov
9d76b6c5cc fix panel btn style 2021-05-11 15:34:46 +03:00
Yuri Kuznetsov
6e023222de assignment checking refactoring 2021-05-11 15:29:16 +03:00
Yuri Kuznetsov
6b62fc7963 fix tests 2021-05-11 15:28:28 +03:00
Yuri Kuznetsov
d38962868b panel style conditions 2021-05-11 12:53:58 +03:00
Yuri Kuznetsov
3a0ee7de94 fix 2021-05-11 12:53:58 +03:00
Yuri Kuznetsov
dff21145d0 cs fix 2021-05-11 12:53:58 +03:00
Yuri Kuznetsov
81bf80d8b0 css fix 2021-05-11 12:53:58 +03:00
Yuri Kuznetsov
d2e1b556ba type hint fix 2021-05-11 10:19:31 +03:00
Yuri Kuznetsov
97b263cf57 cs fix 2021-05-11 10:14:26 +03:00
Yuri Kuznetsov
fa140f09fc relation table id bigint 2021-05-10 13:07:16 +03:00
Arkady
2cb824c1e1 FileStorage\Factory small fix (#1989)
* fix use of unknown class

* fix use of unassigned variable
2021-05-09 23:11:04 +03:00
Yuri Kuznetsov
9dc5c60100 renaming 2021-05-09 15:46:07 +03:00
Yuri Kuznetsov
8212810276 Merge branch 'hotfix/6.1.8' 2021-05-09 15:24:15 +03:00
Yuri Kuznetsov
44d772a32f fix typo 2021-05-09 15:23:59 +03:00
Yuri Kuznetsov
fbe3e1b44f search params fetcher fix 2021-05-09 15:22:02 +03:00
Yuri Kuznetsov
d56fe9f9b0 cs fix 2021-05-09 15:21:51 +03:00
Yuri Kuznetsov
9d3d347fb7 fix 2021-05-09 15:08:00 +03:00
Yuri Kuznetsov
30fcab6626 typo fixes 2021-05-09 15:07:22 +03:00
Yuri Kuznetsov
44f25f7497 typo fixes and cleanup 2021-05-09 14:40:40 +03:00
Yuri Kuznetsov
53c4a74074 select refactoring 2021-05-09 10:51:46 +03:00
Yuri Kuznetsov
a126c8f06d cs fix 2021-05-09 10:12:36 +03:00
Yuri Kuznetsov
2ed81ef9be fix 2021-05-08 23:08:05 +03:00
Yuri Kuznetsov
3a844767f0 refactoring and cs fixes 2021-05-08 22:53:56 +03:00
Yuri Kuznetsov
3667b72634 fix test 2021-05-08 20:11:37 +03:00
Yuri Kuznetsov
3f8d272eee address vo changes 2021-05-08 20:09:17 +03:00
Yuri Kuznetsov
a15daa87c5 cleanup 2021-05-08 16:51:47 +03:00
Yuri Kuznetsov
d6092fc3eb categories loading flicking fix 2021-05-08 16:33:02 +03:00
Yuri Kuznetsov
4d2c7bd776 ui fixes 2021-05-08 12:33:15 +03:00
Yuri Kuznetsov
78947d51dc export fix 2021-05-08 12:16:47 +03:00
Yuri Kuznetsov
8d7e482219 fix mass action 2021-05-08 11:40:45 +03:00
Yuri Kuznetsov
14d313686c export refactoring 2021-05-08 11:33:50 +03:00
dependabot[bot]
b79bd9a30e Bump lodash from 4.17.20 to 4.17.21 (#1986)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-08 09:10:54 +03:00
Yuri Kuznetsov
891885fcb3 fix css 2021-05-07 20:58:18 +03:00
Yuri Kuznetsov
e1986612d5 css fix 2021-05-07 16:39:07 +03:00
Yuri Kuznetsov
4c9435594d category list changes 2021-05-07 15:54:15 +03:00
Yuri Kuznetsov
cc353f5956 Merge branch 'hotfix/6.1.8' 2021-05-07 15:53:10 +03:00
Yuri Kuznetsov
a90971b762 not held event strikethrough 2021-05-07 10:34:38 +03:00
Yuri Kuznetsov
f32edcde74 refactoring 2021-05-06 19:57:27 +03:00
Yuri Kuznetsov
177a7d3054 record service in core 2021-05-06 19:02:53 +03:00
Yuri Kuznetsov
c693146e15 gr gloabls 2021-05-06 17:11:02 +03:00
Yuri Kuznetsov
296358e473 gr globals 2021-05-06 17:02:24 +03:00
Yuri Kuznetsov
06d5628180 fix tests 2021-05-06 16:51:25 +03:00
Yuri Kuznetsov
9085bbff96 external account refactoring 2021-05-06 16:41:26 +03:00
Yuri Kuznetsov
0171ce64e4 cleanup 2021-05-06 15:33:59 +03:00
Yuri Kuznetsov
222ff4a6de gr globals 2021-05-06 15:29:51 +03:00
Yuri Kuznetsov
1c46f2436c gr globals 2021-05-06 15:27:07 +03:00
Yuri Kuznetsov
65654fdef2 gr gloabals 2021-05-06 15:18:43 +03:00
Yuri Kuznetsov
9035d68d96 refactoring 2021-05-06 15:16:32 +03:00
Yuri Kuznetsov
41b2d2bce7 gr globals 2021-05-06 15:11:52 +03:00
Yuri Kuznetsov
b67c2dc625 refactoring 2021-05-06 15:09:21 +03:00
Yuri Kuznetsov
ec0d738e9f gr global log 2021-05-06 14:58:58 +03:00
Yuri Kuznetsov
028da06b34 refactoring 2021-05-06 14:56:58 +03:00
Yuri Kuznetsov
dd5037cb07 refactoring 2021-05-06 14:04:15 +03:00
Yuri Kuznetsov
5406c0156a fix test 2021-05-06 13:45:55 +03:00
Yuri Kuznetsov
2f97583289 gr global log 2021-05-06 13:22:32 +03:00
Yuri Kuznetsov
fcde65eaee log dependency 2021-05-06 13:14:57 +03:00
Yuri Kuznetsov
8fccdae675 log dependency 2021-05-06 12:51:07 +03:00
Yuri Kuznetsov
50cb0528c6 fix tests 2021-05-06 12:22:24 +03:00
Yuri Kuznetsov
3cf0c2f804 fix find followers 2021-05-06 10:57:01 +03:00
Yuri Kuznetsov
fad9e8516e refactoring 2021-05-06 09:50:18 +03:00
Yuri Kuznetsov
7b3d4739aa fix findLinked methods 2021-05-06 09:39:24 +03:00
Yuri Kuznetsov
e9f7046a05 fix request get content type 2021-05-06 09:26:16 +03:00
Yuri Kuznetsov
9ce7239308 cs fix 2021-05-05 22:30:00 +03:00
Yuri Kuznetsov
acc5a88a27 comment 2021-05-05 22:04:41 +03:00
Yuri Kuznetsov
1cc99231ae cleanup 2021-05-05 22:02:15 +03:00
Yuri Kuznetsov
39e0784714 cs fix 2021-05-05 21:59:46 +03:00
Yuri Kuznetsov
9f0569cd0b refactoring 2021-05-05 21:53:25 +03:00
Yuri Kuznetsov
d455ef3e33 fixes 2021-05-05 15:48:25 +03:00
Yuri Kuznetsov
691918cfc8 cleanup 2021-05-05 15:44:59 +03:00
Yuri Kuznetsov
df294eee15 fix search params 2021-05-05 15:43:18 +03:00
Yuri Kuznetsov
3a94ea35f6 cs fix 2021-05-05 15:34:11 +03:00
Yuri Kuznetsov
4f711d8a34 fix test 2021-05-05 15:31:24 +03:00
Yuri Kuznetsov
c5ec653215 search params building 2021-05-05 15:17:55 +03:00
Yuri Kuznetsov
937b83d776 refactoring 2021-05-05 13:49:37 +03:00
Yuri Kuznetsov
8b585a06e7 cleanup 2021-05-05 13:25:23 +03:00
Yuri Kuznetsov
a53f88cbaf controllers refactoring 2021-05-05 13:24:59 +03:00
Yuri Kuznetsov
604a9212ca Merge branch 'stable' 2021-05-05 12:22:50 +03:00
Yuri Kuznetsov
09d7e8abde search apply button fixes 2021-05-05 11:54:24 +03:00
Yuri Kuznetsov
1ddfcff441 version 2021-05-05 11:17:35 +03:00
Yuri Kuznetsov
08eb168f06 refactoring 2021-05-04 19:01:04 +03:00
Yuri Kuznetsov
f0f6fd6887 export refactoring 2021-05-04 18:54:16 +03:00
Yuri Kuznetsov
892df7bd0c merge 2021-05-04 16:13:21 +03:00
Yuri Kuznetsov
1a672a8aa3 escaping 2021-05-04 16:08:35 +03:00
Yuri Kuznetsov
8ec9a8ae22 orm create entity default array 2021-05-04 11:16:32 +03:00
Yuri Kuznetsov
defa18724c merge test and fix 2021-05-04 11:15:30 +03:00
Yuri Kuznetsov
f56f965d06 merge action 2021-05-02 18:23:55 +03:00
Yuri Kuznetsov
1ea488024b metadata json syntax error logging 2021-05-01 18:10:02 +03:00
Yuri Kuznetsov
4f85734de5 cs fixes 2021-05-01 17:50:49 +03:00
Yuri Kuznetsov
a3b6e6f161 refactoring 2021-05-01 17:18:15 +03:00
Yuri Kuznetsov
ff1e851143 tests 2021-05-01 15:40:26 +03:00
Yuri Kuznetsov
95f19bde45 refactoring 2021-05-01 14:51:40 +03:00
Yuri Kuznetsov
457110fa62 remove setTimezone method 2021-05-01 13:26:17 +03:00
Yuri Kuznetsov
23195e03b8 date time refactoring 2021-05-01 13:23:11 +03:00
Yuri Kuznetsov
c9feaa7074 installer fixes 2021-05-01 11:33:04 +03:00
Yuri Kuznetsov
6ec5df9309 fix email sent message 2021-05-01 10:40:08 +03:00
Yuri Kuznetsov
892e5fab1f actions allowance 2021-05-01 10:28:26 +03:00
Yuri Kuznetsov
15424a2617 integration tests 2021-05-01 10:21:16 +03:00
Yuri Kuznetsov
5188c0f473 actions allowance 2021-05-01 09:45:55 +03:00
Yuri Kuznetsov
c91552339c fix layout 2021-05-01 09:36:15 +03:00
Yuri Kuznetsov
8565b74510 fix 2021-05-01 09:34:10 +03:00
Yuri Kuznetsov
7524bc3bc3 actions allowed 2021-04-30 22:36:45 +03:00
Yuri Kuznetsov
038d0e038b fix 2021-04-30 22:04:11 +03:00
Yuri Kuznetsov
077e1a697b removal 2021-04-30 16:15:57 +03:00
Yuri Kuznetsov
f5053bbc22 actions disabled and kanban disabled 2021-04-30 15:44:15 +03:00
Yuri Kuznetsov
baf61c0bdb fix 2021-04-30 15:35:09 +03:00
Yuri Kuznetsov
e3dcfb9136 refactoring 2021-04-30 15:19:35 +03:00
Yuri Kuznetsov
e4c71fb3e4 acl fix 2021-04-30 14:25:28 +03:00
Yuri Kuznetsov
44e947ac8a acl fixes 2021-04-30 13:56:11 +03:00
Yuri Kuznetsov
fc7e2400cf acl always do checkScope 2021-04-30 13:38:01 +03:00
Yuri Kuznetsov
e30e164ba3 acl fixes 2021-04-30 12:42:40 +03:00
Yuri Kuznetsov
007e013514 fix 2021-04-30 11:47:28 +03:00
Yuri Kuznetsov
10b5d2c4f7 fix 2021-04-30 11:28:40 +03:00
Yuri Kuznetsov
ef9b15d924 move record service container 2021-04-30 11:25:59 +03:00
Yuri Kuznetsov
a44bc68e81 action and mass action separate services 2021-04-30 11:15:06 +03:00
Yuri Kuznetsov
ec75d17bcf Aware setters comments and fix 2021-04-30 10:32:26 +03:00
Yuri Kuznetsov
ad5f9a3762 refactoring 2021-04-30 10:19:40 +03:00
Yuri Kuznetsov
a720065a45 fixes 2021-04-30 09:50:30 +03:00
Yuri Kuznetsov
6342e0b243 fix 2021-04-29 19:39:27 +03:00
Yuri Kuznetsov
e9814504db refactoring 2021-04-29 19:35:38 +03:00
Yuri Kuznetsov
145cf9820a fix 2021-04-29 17:21:47 +03:00
Yuri Kuznetsov
d7fae910fb refactoring 2021-04-29 17:19:39 +03:00
Yuri Kuznetsov
d15474c243 controllers refactoring 2021-04-29 17:16:11 +03:00
Yuri Kuznetsov
805f377459 controllers refactoring 2021-04-29 15:33:23 +03:00
Yuri Kuznetsov
bf320261f9 entity interface more methods 2021-04-29 12:08:11 +03:00
Yuri Kuznetsov
fb94597409 field processing fix 2021-04-29 11:47:34 +03:00
Yuri Kuznetsov
93e4bd8cd0 fixes 2021-04-29 11:23:30 +03:00
Yuri Kuznetsov
dfa839526c action disabled 2021-04-29 11:23:19 +03:00
Yuri Kuznetsov
0d1f138459 fix 2021-04-29 11:07:02 +03:00
Yuri Kuznetsov
ace47d6515 cs fix 2021-04-29 09:57:58 +03:00
Yuri Kuznetsov
87c1808b7e reminder test 2021-04-28 14:12:34 +03:00
Yuri Kuznetsov
95627f3617 reminder saver 2021-04-28 12:49:54 +03:00
Yuri Kuznetsov
9c20ac68f5 saver framework 2021-04-28 11:49:57 +03:00
Yuri Kuznetsov
ed1665d625 field processing refactoring 2021-04-28 11:17:35 +03:00
Yuri Kuznetsov
c6de70f57f cs fix 2021-04-28 10:41:39 +03:00
Yuri Kuznetsov
28dcfd714e cs fix 2021-04-28 10:33:27 +03:00
Yuri Kuznetsov
1ed6099878 cleanup 2021-04-28 10:31:03 +03:00
Yuri Kuznetsov
5e9c2fc255 cleanup 2021-04-28 10:30:39 +03:00
Yuri Kuznetsov
f9a4e3c9fc field loading usage 2021-04-28 10:27:46 +03:00
Yuri Kuznetsov
9d7582caa6 field loading usage and changes 2021-04-28 10:06:30 +03:00
Yuri Kuznetsov
f9d47de8f2 cleanup 2021-04-28 09:48:59 +03:00
Yuri Kuznetsov
e057b64055 cleanup 2021-04-28 09:47:16 +03:00
Yuri Kuznetsov
5968e3d065 field loading usage 2021-04-28 09:46:22 +03:00
Yuri Kuznetsov
b22bb295af cs fix 2021-04-28 09:33:13 +03:00
Yuri Kuznetsov
fb3ecd4cf7 field loading usage 2021-04-27 19:42:16 +03:00
Yuri Kuznetsov
65b4454f2c field loading usage 2021-04-27 19:25:08 +03:00
Yuri Kuznetsov
3e5f178c4d renaming 2021-04-27 19:11:04 +03:00
Yuri Kuznetsov
35f87f6361 cs fix 2021-04-27 18:59:17 +03:00
Yuri Kuznetsov
c2141dc034 field loading usage 2021-04-27 18:56:22 +03:00
Yuri Kuznetsov
6e460c5584 field loader usage 2021-04-27 16:50:49 +03:00
Yuri Kuznetsov
3a523a514c renaming 2021-04-27 15:45:05 +03:00
Yuri Kuznetsov
e1e654c6b7 field load processing changes 2021-04-27 13:28:59 +03:00
Yuri Kuznetsov
161009c4ac cleanup load additional fields 2021-04-27 11:52:27 +03:00
Yuri Kuznetsov
6cb2649981 cs fix 2021-04-26 15:33:15 +03:00
Yuri Kuznetsov
6089e2e267 cs fix 2021-04-26 15:27:06 +03:00
Yuri Kuznetsov
ac6bf02b2d refactoring 2021-04-26 15:21:52 +03:00
Yuri Kuznetsov
365bbaf2ad list load processing 2021-04-26 15:17:11 +03:00
Yuri Kuznetsov
f320ef4721 field loading 2021-04-26 13:47:35 +03:00
Yuri Kuznetsov
87a34f2fbb field loading 2021-04-26 12:46:58 +03:00
Yuri Kuznetsov
defdd904c8 fix 2021-04-26 12:15:02 +03:00
Yuri Kuznetsov
3f91c33eae fix comments 2021-04-26 11:45:49 +03:00
Yuri Kuznetsov
2e3642671f fix test 2021-04-26 10:59:16 +03:00
Yuri Kuznetsov
02e2f42481 refacoring 2021-04-25 12:12:52 +03:00
Yuri Kuznetsov
168f37dc8a doc fix 2021-04-25 11:25:45 +03:00
Yuri Kuznetsov
38aeda6d83 comment fixes 2021-04-24 23:55:20 +03:00
Yuri Kuznetsov
eb29b626d0 refactoring 2021-04-24 18:58:10 +03:00
Yuri Kuznetsov
e50839b7cc refactoring 2021-04-24 18:47:03 +03:00
Yuri Kuznetsov
082086ffa3 doc fix 2021-04-24 17:53:40 +03:00
Yuri Kuznetsov
7327b995e1 doc fix 2021-04-24 17:52:55 +03:00
Eymen Elkum
a6fb23302e typo fix (#1974) 2021-04-24 16:59:32 +03:00
Yuri Kuznetsov
055518da79 dev 2021-04-24 15:47:16 +03:00
Yuri Kuznetsov
6d903a526b refactoring 2021-04-24 15:17:22 +03:00
Yuri Kuznetsov
8d0c230c30 dev 2021-04-24 14:45:41 +03:00
Yuri Kuznetsov
440e71d983 refactoring 2021-04-24 14:32:58 +03:00
Yuri Kuznetsov
328cc89e39 refactoring 2021-04-24 14:28:21 +03:00
Yuri Kuznetsov
e4fd5d7293 refactoring 2021-04-24 13:51:53 +03:00
Yuri Kuznetsov
77d8fbbfc5 refactoring 2021-04-24 13:38:57 +03:00
Yuri Kuznetsov
fd4f484bab refactoring 2021-04-24 13:11:02 +03:00
Yuri Kuznetsov
e116c52ea9 refactoring 2021-04-24 12:58:51 +03:00
Yuri Kuznetsov
46fbd93d9b cleanup 2021-04-24 11:03:08 +03:00
Yuri Kuznetsov
bd1805750b refactoring 2021-04-24 10:56:40 +03:00
Yuri Kuznetsov
114663836c refactoring 2021-04-24 10:35:33 +03:00
Yuri Kuznetsov
82c5e88c4a refactoring 2021-04-24 10:11:51 +03:00
Yuri Kuznetsov
a0ec26a755 refactoring 2021-04-23 22:39:25 +03:00
Yuri Kuznetsov
a29386c7a1 refactoring 2021-04-23 16:27:29 +03:00
Yuri Kuznetsov
0ea25b46f7 fixes and refactoring 2021-04-23 15:42:51 +03:00
Yuri Kuznetsov
63b471780d next number refactoring 2021-04-23 12:19:22 +03:00
Yuri Kuznetsov
25065a66aa event select defs 2021-04-23 12:00:56 +03:00
Yuri Kuznetsov
60c64fcb6c refactoring 2021-04-22 23:35:53 +03:00
Yuri Kuznetsov
e5f8a83c7f orm refactoring 2021-04-22 19:30:25 +03:00
Yuri Kuznetsov
39811e7a2e comment 2021-04-22 18:50:43 +03:00
Yuri Kuznetsov
04cb611183 orm refactoring 2021-04-22 18:45:50 +03:00
Yuri Kuznetsov
f15a73200f typo fix 2021-04-22 17:59:20 +03:00
Yuri Kuznetsov
a6f3c879a5 orm refactoring 2021-04-22 17:58:06 +03:00
Yuri Kuznetsov
811e5479f4 refactoring 2021-04-22 16:09:03 +03:00
Yuri Kuznetsov
13af95f600 refactoring 2021-04-22 15:45:01 +03:00
Yuri Kuznetsov
b6743725e0 refactoring 2021-04-22 15:38:00 +03:00
Yuri Kuznetsov
d3579218f2 htmlizer refactoring 2021-04-22 15:31:43 +03:00
Yuri Kuznetsov
ff003d9603 orm refactoring 2021-04-22 14:21:32 +03:00
Yuri Kuznetsov
805b27074c orm refactoring 2021-04-22 13:57:54 +03:00
Yuri Kuznetsov
22e34da132 orm refactoring 2021-04-22 13:55:21 +03:00
Yuri Kuznetsov
71119b8d81 orm refactoring 2021-04-22 13:46:29 +03:00
Yuri Kuznetsov
ef2886ffc7 orm refactoring 2021-04-22 13:39:55 +03:00
Yuri Kuznetsov
770b85ebd2 orm refactoring 2021-04-22 13:33:28 +03:00
Yuri Kuznetsov
f75f992a59 orm refactoring 2021-04-22 13:14:02 +03:00
Yuri Kuznetsov
113f1fac6a cs fix 2021-04-22 13:03:30 +03:00
Yuri Kuznetsov
de58da6dab cs fix 2021-04-22 13:01:31 +03:00
Yuri Kuznetsov
256eeb863c cs fix 2021-04-22 12:46:23 +03:00
Yuri Kuznetsov
7420f2ff98 orm refactoring using injectable factory for entities 2021-04-22 12:33:45 +03:00
Yuri Kuznetsov
b2b968f915 test cleanup 2021-04-22 12:07:25 +03:00
Yuri Kuznetsov
12d89d8c4a select manager select builder usage 2021-04-22 11:44:59 +03:00
Yuri Kuznetsov
476e64c389 cs fix 2021-04-21 15:54:56 +03:00
Yuri Kuznetsov
e183f39dfd cs fix 2021-04-21 15:19:37 +03:00
Yuri Kuznetsov
f9e34ce9d5 cs fix 2021-04-21 15:02:38 +03:00
Yuri Kuznetsov
6bdd976209 cs fix 2021-04-21 14:19:47 +03:00
Yuri Kuznetsov
efd64ecded cs fix 2021-04-21 14:13:08 +03:00
Yuri Kuznetsov
50db978fa2 cs fix 2021-04-21 13:57:18 +03:00
Yuri Kuznetsov
de410bf75f injectable factory change and comment 2021-04-21 13:10:20 +03:00
Yuri Kuznetsov
2ff7825b34 repositories cleanup and cs fix 2021-04-21 13:03:53 +03:00
Yuri Kuznetsov
9b1ae75a00 field processing and database repository refactoring 2021-04-21 12:55:49 +03:00
Yuri Kuznetsov
e7f0911f8b file processing array 2021-04-21 12:33:44 +03:00
Yuri Kuznetsov
c004beab02 file field processing 2021-04-21 12:21:08 +03:00
Yuri Kuznetsov
fa758c51ee fix attachment 2021-04-21 12:14:13 +03:00
Yuri Kuznetsov
1aa2282321 cs fix 2021-04-21 12:00:20 +03:00
Yuri Kuznetsov
9094c44b07 test fix 2021-04-21 10:29:21 +03:00
Yuri Kuznetsov
c46036761c abolishment of acl non-strict mode 2021-04-21 10:25:08 +03:00
Yuri Kuznetsov
5d2f3cd2a7 acl admin mandatory 2021-04-21 09:36:56 +03:00
Yuri Kuznetsov
76f1902cae test code cs fix 2021-04-21 09:32:41 +03:00
Yuri Kuznetsov
5801c329b2 datetime refactoring 2021-04-20 19:27:12 +03:00
Yuri Kuznetsov
302833eb22 refactor database repository 2021-04-20 19:24:20 +03:00
Yuri Kuznetsov
f30b25e23f field processing tests 2021-04-20 18:23:56 +03:00
Yuri Kuznetsov
211e8c438a fix comment 2021-04-20 18:08:50 +03:00
Yuri Kuznetsov
4a33ed8fc2 cleanup 2021-04-20 18:03:21 +03:00
Yuri Kuznetsov
556ea8754c relation save processing refactoring 2021-04-20 18:02:15 +03:00
Yuri Kuznetsov
d2fdd37084 field processing fix 2021-04-20 13:20:30 +03:00
Yuri Kuznetsov
12e2f146bf fix 2021-04-20 13:13:54 +03:00
Yuri Kuznetsov
eae701012a cs fix 2021-04-20 13:08:56 +03:00
Yuri Kuznetsov
c4ae2c5c1b cs fix 2021-04-20 13:07:23 +03:00
Yuri Kuznetsov
fb52bf3984 field processing 2021-04-20 13:00:29 +03:00
Yuri Kuznetsov
6c0ae235f0 acl refactoring 2021-04-19 15:48:49 +03:00
Yuri Kuznetsov
399f867016 cs fix 2021-04-19 15:29:34 +03:00
Yuri Kuznetsov
bb947ac0a9 acl refactoring 2021-04-19 15:29:30 +03:00
Yuri Kuznetsov
30813f5efc cs fix 2021-04-19 12:19:34 +03:00
Yuri Kuznetsov
411e6720e1 cs fix 2021-04-19 11:59:32 +03:00
Yuri Kuznetsov
1255dc03b2 injectable factory test 2021-04-19 11:45:03 +03:00
Yuri Kuznetsov
61e060b8ef fix test 2021-04-19 11:42:25 +03:00
Yuri Kuznetsov
18b009f6af fix action processor 2021-04-19 11:42:14 +03:00
Yuri Kuznetsov
d4b246e37f action processor 2021-04-19 11:31:16 +03:00
Yuri Kuznetsov
4da052279e acl fix 2021-04-19 11:06:12 +03:00
Yuri Kuznetsov
12a9afe2fe cs fix 2021-04-18 22:17:16 +03:00
Yuri Kuznetsov
e2a0314742 cs fix 2021-04-18 20:32:02 +03:00
Yuri Kuznetsov
bdd4df9dd7 cs fix 2021-04-18 20:20:36 +03:00
Yuri Kuznetsov
491a28c03e cs fix 2021-04-18 20:07:12 +03:00
Yuri Kuznetsov
dc389e0f41 cs fix 2021-04-18 19:57:56 +03:00
Yuri Kuznetsov
121f9b547c fox 2021-04-18 19:56:22 +03:00
Yuri Kuznetsov
6c03a00f57 cs fix 2021-04-18 19:43:54 +03:00
Yuri Kuznetsov
58ec18f47d new acl usage 2021-04-17 15:16:32 +03:00
Yuri Kuznetsov
973a92886b new acl usage 2021-04-17 13:06:36 +03:00
Yuri Kuznetsov
4497c4be66 new acl usage 2021-04-17 12:47:48 +03:00
Yuri Kuznetsov
33ec8d0041 fix stream acl 2021-04-17 12:47:23 +03:00
Yuri Kuznetsov
215867ae21 acl portal trait 2021-04-17 11:16:40 +03:00
Yuri Kuznetsov
4711c0f785 new acl usage 2021-04-17 11:03:57 +03:00
Yuri Kuznetsov
ad1dece946 new acl usage 2021-04-17 10:33:26 +03:00
Yuri Kuznetsov
dc202f987a injectable factory test 2021-04-16 15:35:44 +03:00
Yuri Kuznetsov
12fbee8597 injectable factory cleanup 2021-04-16 14:25:58 +03:00
Yuri Kuznetsov
856621a8a7 new acl usage 2021-04-16 13:12:43 +03:00
Yuri Kuznetsov
2c4bda882f new acl usage 2021-04-16 12:28:18 +03:00
Yuri Kuznetsov
7f524153a6 injectable factory use binding for implementation resolved 2021-04-16 12:05:38 +03:00
Yuri Kuznetsov
6652f8cb65 select access all filter 2021-04-16 11:23:12 +03:00
Yuri Kuznetsov
b00dfb6135 select use binding 2021-04-15 18:13:03 +03:00
Yuri Kuznetsov
93960dd1b8 select factories refactoring and fixes 2021-04-15 16:58:33 +03:00
Yuri Kuznetsov
d105045b75 bindInstance usage 2021-04-15 14:20:50 +03:00
Yuri Kuznetsov
49d21bbba8 test change 2021-04-15 14:03:05 +03:00
Yuri Kuznetsov
b1f05c38b3 fix tests 2021-04-15 13:59:11 +03:00
Yuri Kuznetsov
9f7ed802ea binder bind instance method 2021-04-15 13:57:43 +03:00
Yuri Kuznetsov
9b7313ce95 docs fix 2021-04-15 12:42:17 +03:00
Yuri Kuznetsov
d42896a19c disable spellcheck for some fields 2021-04-15 12:37:17 +03:00
Yuri Kuznetsov
2729b8ece8 imap get size manual merge 2021-04-15 12:23:16 +03:00
Yuri Kuznetsov
85ed99a1dc email get size error fix 2021-04-15 11:40:06 +03:00
Yuri Kuznetsov
aa7959b91c acl recactoring 2021-04-15 09:18:06 +03:00
Yuri Kuznetsov
781d9dd440 fix 2021-04-14 10:36:12 +03:00
Yuri Kuznetsov
483a346faa Merge branch 'stable' 2021-04-12 12:53:46 +03:00
Yuri Kuznetsov
6e9f368a0a version 2021-04-12 10:42:26 +03:00
Yuri Kuznetsov
84a3688525 scheduler honor eventAssignedUserIsAttendeeDisabled 2021-04-12 10:40:06 +03:00
Yuri Kuznetsov
3c08986889 cs fix 2021-04-12 10:37:07 +03:00
Yuri Kuznetsov
477828beb9 fix get entity followers 2021-04-12 10:31:47 +03:00
Eymen Elkum
fadc6c46ba fix (#1969) 2021-04-12 10:31:29 +03:00
Yuri Kuznetsov
3111166f89 acl refactoring 2021-04-10 17:32:24 +03:00
Yuri Kuznetsov
f7c8b62f6c grand acl refactoring 2021-04-10 16:25:40 +03:00
Yuri Kuznetsov
e6edc6ae03 select fix 2021-04-09 15:46:21 +03:00
Yuri Kuznetsov
3bc0799091 select refactoring 2021-04-09 15:36:44 +03:00
Yuri Kuznetsov
1285955e32 cleanup 2021-04-08 10:48:30 +03:00
Yuri Kuznetsov
5fdc8cb32c injectable factory create with binding 2021-04-08 10:27:47 +03:00
Yuri Kuznetsov
8538a77db7 fix comment 2021-04-08 10:20:10 +03:00
Yuri Kuznetsov
329b84f7b5 comment fix 2021-04-08 09:52:19 +03:00
Yuri Kuznetsov
4dcb7acd58 fix 2021-04-08 09:51:27 +03:00
Yuri Kuznetsov
d91f9cf29f refactoring and cs fix 2021-04-07 15:53:10 +03:00
Yuri Kuznetsov
1a04dec97b binding refactoring 2021-04-07 15:34:42 +03:00
Yuri Kuznetsov
c6f95a9030 acl scope data no access to properties 2021-04-06 12:15:28 +03:00
Yuri Kuznetsov
62d2157fd8 fix orm sub query entity type 2021-04-06 12:07:02 +03:00
Yuri Kuznetsov
d0c61ea5fa cleanup 2021-04-05 15:49:38 +03:00
Yuri Kuznetsov
b9c7d108e5 auth token refactoring 2021-04-05 14:00:48 +03:00
Yuri Kuznetsov
20a8597b45 refactoring 2021-04-04 23:02:17 +03:00
Yuri Kuznetsov
9a1ada97ec fix acl 2021-04-04 22:44:06 +03:00
Yuri Kuznetsov
0ebe32228d acl refactoring 2021-04-04 22:40:20 +03:00
Yuri Kuznetsov
ad5da12154 acl refactoring 2021-04-04 22:26:27 +03:00
Yuri Kuznetsov
cdd2e0dd1d fix 2021-04-04 21:08:50 +03:00
Yuri Kuznetsov
3fe10212d5 cs fix 2021-04-04 20:12:18 +03:00
Yuri Kuznetsov
97e97a6cfc cs fix 2021-04-04 20:08:50 +03:00
Yuri Kuznetsov
9cb8d9d65e refactoring 2021-04-04 19:55:12 +03:00
Yuri Kuznetsov
eadf3b46e0 acl table apply highest 2021-04-04 13:35:42 +03:00
Yuri Kuznetsov
5d97a16d75 acl refactoring 2021-04-04 13:17:39 +03:00
Yuri Kuznetsov
e13ca70143 cleanup 2021-04-03 22:52:14 +03:00
Yuri Kuznetsov
732493d663 acl refactoring 2021-04-03 21:21:02 +03:00
Yuri Kuznetsov
569284ef60 comments 2021-04-03 20:05:45 +03:00
Yuri Kuznetsov
85a1891b8c fix test 2021-04-03 19:53:59 +03:00
Yuri Kuznetsov
6a67344643 acl test and fix 2021-04-03 19:52:53 +03:00
Yuri Kuznetsov
0bff0a7878 acl refactoring 2021-04-03 19:15:27 +03:00
Yuri Kuznetsov
925d26f02b cleanup 2021-04-03 19:00:04 +03:00
Yuri Kuznetsov
45539289fd acl refactoring 2021-04-03 18:39:54 +03:00
Yuri Kuznetsov
4cbcddf3c0 acl fix 2021-04-03 17:57:02 +03:00
Yuri Kuznetsov
304d63c6a2 fe cs fixes, link field selectFilterList 2021-04-03 16:25:40 +03:00
Yuri Kuznetsov
ec784b4a98 cs fixes and comments 2021-04-03 14:50:20 +03:00
Yuri Kuznetsov
1b899f2228 acl refactoring 2021-04-03 14:41:29 +03:00
Yuri Kuznetsov
a8d437720b stream fix 2021-04-03 13:04:45 +03:00
Yuri Kuznetsov
fc7c9e1c0a cs fix 2021-04-03 13:02:21 +03:00
Yuri Kuznetsov
514607a731 cs fixes 2021-04-03 12:52:54 +03:00
Yuri Kuznetsov
9344e08d7b Merge branch 'master' of https://github.com/espocrm/espocrm 2021-04-03 12:16:42 +03:00
Yuri Kuznetsov
13cec0dd31 attachment fix 2021-04-02 15:37:30 +03:00
Yuri Kuznetsov
b80e890fd6 attachment fix 2021-04-02 15:31:20 +03:00
Yuri Kuznetsov
e54c07325e scope data class 2021-04-01 19:03:14 +03:00
Yuri Kuznetsov
3107705e25 cleanup 2021-04-01 17:18:53 +03:00
Yuri Kuznetsov
62db7b8382 cleanup 2021-04-01 17:16:20 +03:00
Yuri Kuznetsov
8e8fefef36 refactoring 2021-04-01 17:03:03 +03:00
Yuri Kuznetsov
0c178ec71f refactoring 2021-04-01 16:52:23 +03:00
Yuri Kuznetsov
3c9c3cb709 email template int disable formatting 2021-04-01 14:06:34 +03:00
Yuri Kuznetsov
2ebfd108ea refactoring 2021-04-01 14:00:48 +03:00
Yuri Kuznetsov
31df3927c5 Merge branch 'hotfix/6.1.6' 2021-04-01 13:28:00 +03:00
Yuri Kuznetsov
c1b7e06308 remove noJoin 2021-04-01 13:27:42 +03:00
Yuri Kuznetsov
8368eb4541 follower management permission 2021-04-01 12:53:14 +03:00
Yuri Kuznetsov
ce995a9380 follower management for portal permission 2021-04-01 12:02:28 +03:00
Yuri Kuznetsov
110d773e3c fix orm entity 2021-04-01 11:25:57 +03:00
Yuri Kuznetsov
6965591e7b refactoring 2021-04-01 11:08:40 +03:00
Yuri Kuznetsov
4b47cfda57 refactoring 2021-03-31 23:27:03 +03:00
Yuri Kuznetsov
e7db4d6b67 refactoring 2021-03-31 22:41:08 +03:00
Yuri Kuznetsov
c8a63044af cs fix 2021-03-31 22:37:38 +03:00
Yuri Kuznetsov
622b27448f cs fixes 2021-03-31 20:04:27 +03:00
Yuri Kuznetsov
e2814141d4 fix 2021-03-31 16:29:58 +03:00
Yuri Kuznetsov
1a0f70c56b acl refactoring 2021-03-31 16:14:31 +03:00
Taras Machyshyn
e86ec32dd7 Hide permission warnings 2021-03-31 15:12:46 +03:00
Yuri Kuznetsov
4667a14080 followers fix check permission 2021-03-31 14:46:32 +03:00
Taras Machyshyn
c8bd2ec1a1 Time format fixes 2021-03-31 14:39:47 +03:00
Yuri Kuznetsov
933625011c followers admin access check 2021-03-31 13:12:08 +03:00
Yuri Kuznetsov
c032541f69 followers portal access check 2021-03-31 13:11:43 +03:00
Yuri Kuznetsov
78b9bf9823 followers check access to user 2021-03-31 13:00:04 +03:00
Taras Machyshyn
3cf94bb728 Notification fixes 2021-03-31 12:17:18 +03:00
Yuri Kuznetsov
ae1ee69d25 cs fix 2021-03-31 12:15:40 +03:00
Yuri Kuznetsov
bf6bb93829 cs fix 2021-03-31 12:00:58 +03:00
Yuri Kuznetsov
61ef7dfc75 refacoring 2021-03-31 11:48:38 +03:00
Yuri Kuznetsov
82948e56d2 entity refactoring 2021-03-31 00:05:21 +03:00
Yuri Kuznetsov
2338c5a4fa fix 2021-03-31 00:03:23 +03:00
Yuri Kuznetsov
63b60999f8 orm entity refactoring and cloning 2021-03-30 19:39:50 +03:00
Yuri Kuznetsov
5857a3aed7 comment 2021-03-30 15:44:08 +03:00
Yuri Kuznetsov
364d41737f refactoring 2021-03-30 13:05:47 +03:00
Yuri Kuznetsov
31c69477f4 fixes 2021-03-30 12:56:08 +03:00
Yuri Kuznetsov
d1e9477fb4 refactoring 2021-03-30 12:52:15 +03:00
Yuri Kuznetsov
f325b778a9 refactoring and comments 2021-03-30 12:33:45 +03:00
Yuri Kuznetsov
a7270f7510 refactoring 2021-03-30 12:02:04 +03:00
Yuri Kuznetsov
5da493713f validation test 2021-03-30 11:22:14 +03:00
Yuri Kuznetsov
ca0a7689be validation test 2021-03-30 11:18:49 +03:00
Yuri Kuznetsov
6efe19d50c fix tests 2021-03-30 11:07:40 +03:00
Yuri Kuznetsov
08ce7c9186 fix test 2021-03-30 10:51:58 +03:00
Yuri Kuznetsov
cd25f0c723 field validation refactoring 2021-03-29 16:24:53 +03:00
Yuri Kuznetsov
fd6554658b fix 2021-03-29 16:01:24 +03:00
Yuri Kuznetsov
8abc8ab0e4 filter resolver interface 2021-03-29 14:05:49 +03:00
Yuri Kuznetsov
7a16e7743e cleanup 2021-03-29 13:13:19 +03:00
Yuri Kuznetsov
aac3cf2b69 notificator refactoring 2021-03-29 13:09:26 +03:00
Yuri Kuznetsov
c30a5e437f fix 2021-03-29 11:42:15 +03:00
Yuri Kuznetsov
473c63267f refactorig 2021-03-28 23:50:38 +03:00
Yuri Kuznetsov
318d8f8ccc mail refactoring 2021-03-28 19:21:08 +03:00
Yuri Kuznetsov
ee24ab8f6e runners refactoring 2021-03-28 17:45:39 +03:00
Yuri Kuznetsov
e89ca133cd fix validator 2021-03-28 13:51:34 +03:00
Yuri Kuznetsov
c1292e5a52 remove test 2021-03-28 13:50:34 +03:00
Yuri Kuznetsov
a236b1f9da test fix 2021-03-28 13:49:47 +03:00
Yuri Kuznetsov
c9c7794e73 select refactoring 2021-03-28 13:43:16 +03:00
Yuri Kuznetsov
29c5717e79 comment 2021-03-28 13:19:03 +03:00
Yuri Kuznetsov
ccc8e704b4 fix 2021-03-28 13:17:37 +03:00
Yuri Kuznetsov
5991afc1f0 login refactoring 2021-03-28 11:55:33 +03:00
Yuri Kuznetsov
58329fd61f refactoring 2021-03-27 15:28:10 +02:00
Yuri Kuznetsov
b7ed8ec246 refactoring 2021-03-27 12:27:02 +02:00
Yuri Kuznetsov
c975ab7b05 field validation refactoring 2021-03-27 12:20:38 +02:00
Yuri Kuznetsov
fdf11d144f fix comment 2021-03-25 20:50:30 +02:00
Yuri Kuznetsov
99f1821215 supporting all week starts 2021-03-25 17:37:38 +02:00
Yuri Kuznetsov
3d14646548 enum translation support array 2021-03-25 17:26:03 +02:00
Yuri Kuznetsov
b826b1928e Merge branch 'master' of github.com:espocrm/espocrm 2021-03-25 16:15:37 +02:00
Yuri Kuznetsov
b6038285f4 merge with hotfix 2021-03-25 16:14:22 +02:00
Yuri Kuznetsov
0f8621d923 spatie async update 2021-03-25 16:11:30 +02:00
Yuri Kuznetsov
2d9e9a5e93 async downgrade 2021-03-25 15:38:50 +02:00
Yuri Kuznetsov
abeb5fc0e3 v 2021-03-25 15:14:57 +02:00
Taras Machyshyn
47e61cecdd Upgrade scripts 2021-03-25 15:14:22 +02:00
Taras Machyshyn
17aaf08717 Installation: code changes 2021-03-25 13:23:23 +02:00
Taras Machyshyn
89e849d851 Installation: bug fixes 2021-03-25 13:06:19 +02:00
Yuri Kuznetsov
42098f477a fix oauth client 2021-03-25 12:14:22 +02:00
Taras Machyshyn
e44ee9ca03 Installation: corrected languages 2021-03-25 11:10:18 +02:00
Yuri Kuznetsov
e7831ac960 comment 2021-03-24 19:47:46 +02:00
Yuri Kuznetsov
8a48b71a0f small refactoring 2021-03-24 16:14:50 +02:00
Yuri Kuznetsov
2e4d50c7b5 small refactoring 2021-03-24 16:13:41 +02:00
Yuri Kuznetsov
df501e42b9 cs fix 2021-03-24 15:31:43 +02:00
Yuri Kuznetsov
1d14d37c1d websocket refacroring 2021-03-24 14:23:34 +02:00
Yuri Kuznetsov
0d728ed4ce cs fix 2021-03-24 12:04:21 +02:00
Yuri Kuznetsov
4e2ff445e0 container and loaders refactoring 2021-03-24 11:59:21 +02:00
Yuri Kuznetsov
f3818803fd method rename 2021-03-23 21:38:20 +02:00
Yuri Kuznetsov
329668322f comment 2021-03-23 20:54:08 +02:00
Yuri Kuznetsov
0ffd0c1530 authentication refactoring 2021-03-23 20:50:29 +02:00
Yuri Kuznetsov
7b7c6fbfae runner fix 2021-03-23 20:08:49 +02:00
Yuri Kuznetsov
b946228ee2 portal api runner fix 2021-03-23 20:07:33 +02:00
Yuri Kuznetsov
61177901e8 fix duration 2021-03-23 18:08:26 +02:00
Yuri Kuznetsov
bb4f8b0d78 cs fix 2021-03-23 17:02:30 +02:00
Yuri Kuznetsov
1a4e701f98 cs fix 2021-03-23 16:30:41 +02:00
Yuri Kuznetsov
968ee917fc add url field to dynamic logic 2021-03-23 16:14:18 +02:00
Yuri Kuznetsov
bbc01c0be9 fix loader 2021-03-23 16:03:56 +02:00
Yuri Kuznetsov
3387b41841 icon fix 2021-03-23 16:02:56 +02:00
Yuri Kuznetsov
d36a578708 fix job page 2021-03-23 16:02:44 +02:00
Yuri Kuznetsov
36d42ab8ba cleanup 2021-03-23 15:45:06 +02:00
Yuri Kuznetsov
ba71f10dee cleanup 2021-03-23 15:44:00 +02:00
Yuri Kuznetsov
7bb1857d0c job settings in admin panel 2021-03-23 15:40:36 +02:00
Yuri Kuznetsov
999ce51178 job manager test 2021-03-23 15:19:43 +02:00
Yuri Kuznetsov
a2ebf69551 fix auth 2021-03-23 14:08:05 +02:00
Yuri Kuznetsov
9ef3ba9342 job refactoring 2021-03-23 13:26:15 +02:00
Eymen Elkum
88e82a511b integration fields view param (#1949) 2021-03-23 09:57:31 +02:00
Yuri Kuznetsov
495c49f277 websocket reconnect 2021-03-22 15:59:49 +02:00
Yuri Kuznetsov
0459091a52 refacroring 2021-03-22 15:10:53 +02:00
Yuri Kuznetsov
ba67529d62 job refactoring 2021-03-22 14:49:05 +02:00
Yuri Kuznetsov
9bd16c0b5c refactoring 2021-03-22 12:04:32 +02:00
Yuri Kuznetsov
a0c76052cc Merge branch 'hotfix/6.1.5' 2021-03-22 09:17:08 +02:00
Yuri Kuznetsov
c4861c5efa fix exceptions 2021-03-22 09:16:45 +02:00
Yuri Kuznetsov
6b8f46bf81 refactor email reminder sending 2021-03-21 14:38:24 +02:00
Yuri Kuznetsov
1a71f43c54 job refactoring 2021-03-21 14:22:10 +02:00
Yuri Kuznetsov
b4d732656f jobs refactoring 2021-03-21 11:25:43 +02:00
Yuri Kuznetsov
6a335269f4 jobs refactoring 2021-03-20 16:13:33 +02:00
Yuri Kuznetsov
c51f2fa401 comment 2021-03-20 11:55:47 +02:00
Yuri Kuznetsov
69072cf0ca entry point traits namespace 2021-03-20 11:52:52 +02:00
Yuri Kuznetsov
b023964aec comments 2021-03-20 09:45:52 +02:00
Yuri Kuznetsov
59321dbd56 Core EntryPoint namespace 2021-03-19 22:02:49 +02:00
Yuri Kuznetsov
f1c282451b application runner interface 2021-03-19 21:41:13 +02:00
Yuri Kuznetsov
ff0c34c0b8 fix import command 2021-03-18 21:23:13 +02:00
Taras Machyshyn
4380175c8b Upgrade scripts 2021-03-18 17:39:32 +02:00
Yuri Kuznetsov
439598d7ee cleanup 2021-03-18 16:28:39 +02:00
Yuri Kuznetsov
08fa24b095 app-info command fix 2021-03-18 16:23:42 +02:00
Yuri Kuznetsov
c836548fc7 command old interface support 2021-03-18 15:59:34 +02:00
Yuri Kuznetsov
f109146379 Merge branch 'hotfix/6.1.5' 2021-03-18 15:47:57 +02:00
Yuri Kuznetsov
8ff46bba74 diff: removing git folder in vendor 2021-03-18 15:47:40 +02:00
Yuri Kuznetsov
af7f4e3bc4 Merge branch 'hotfix/6.1.5' 2021-03-18 15:29:49 +02:00
Yuri Kuznetsov
06f1305f23 removing git folder in vendor on build 2021-03-18 15:29:21 +02:00
Yuri Kuznetsov
ddc299fa08 fix extension command 2021-03-18 15:05:51 +02:00
Yuri Kuznetsov
43df9d25f0 new command interface 2021-03-18 13:39:14 +02:00
Yuri Kuznetsov
250ac0e8ba fix 2021-03-18 13:23:06 +02:00
Yuri Kuznetsov
29d960878c cs fix 2021-03-17 13:06:25 +02:00
Yuri Kuznetsov
8e6634ff0f value object framework 2021-03-17 12:55:30 +02:00
Yuri Kuznetsov
15b5cf9750 using cache api 2021-03-16 22:23:41 +02:00
Yuri Kuznetsov
c001c4b5bd Merge branch 'hotfix/6.1.5' 2021-03-16 11:37:00 +02:00
Eymen Elkum
43723697f7 fix (#1944) 2021-03-15 14:20:42 +02:00
Yuri Kuznetsov
99d6a0ab32 local storage cache exceeded no error 2021-03-15 13:52:01 +02:00
Yuri Kuznetsov
c2809ca091 no lib cache 2021-03-15 13:44:31 +02:00
Yuri Kuznetsov
108432c268 cs fix 2021-03-15 13:43:49 +02:00
Yuri Kuznetsov
aa0db4b665 manual merge 2021-03-12 14:54:10 +02:00
Yuri Kuznetsov
cda62b8a3e duration field fixes 2021-03-11 11:51:34 +02:00
Yuri Kuznetsov
970242e860 cs fixes 2021-03-10 16:05:38 +02:00
Yuri Kuznetsov
9c741da4e8 fix image 2021-03-09 17:27:55 +02:00
Yuri Kuznetsov
2dfd43c8ba fix index defs 2021-03-09 17:25:50 +02:00
Yuri Kuznetsov
5536687d90 fix metadata provider 2021-03-08 22:17:26 +02:00
Yuri Kuznetsov
34c421733e email address phone number group factory fix 2021-03-07 15:35:55 +02:00
Yuri Kuznetsov
b0b29443a5 value objects from email address and phone number 2021-03-07 11:54:56 +02:00
Yuri Kuznetsov
a637dcd28d fix test 2021-03-06 19:56:09 +02:00
Yuri Kuznetsov
b6b3ec04be fix test 2021-03-06 19:54:15 +02:00
Yuri Kuznetsov
6586f51791 fix formula 2021-03-06 19:52:12 +02:00
Yuri Kuznetsov
dff2e344a4 fix formula modulo 2021-03-06 16:25:13 +02:00
Taras Machyshyn
92e4e81788 Test fixes 2021-03-04 13:23:11 +02:00
Yuri Kuznetsov
aa9ee7e1af attribute extractor fix 2021-03-04 13:02:38 +02:00
Taras Machyshyn
2d3f2f4b36 Fix test warning 2021-03-04 13:01:02 +02:00
Yuri Kuznetsov
73fe4d68f1 config param thumbImageCacheDisabled 2021-03-04 11:43:12 +02:00
Taras Machyshyn
d244602818 Fix test warning 2021-03-04 11:38:25 +02:00
Yuri Kuznetsov
67d9c6ed4e move crm formula functins 2021-03-04 11:26:00 +02:00
Yuri Kuznetsov
55f8932495 remove flystem from composer 2021-03-04 09:54:39 +02:00
Eymen Elkum
24617f4a41 variable name typo (#1937) 2021-03-04 09:25:31 +02:00
Taras Machyshyn
5d47009e07 Database test fixes 2021-03-03 15:55:05 +02:00
Yuri Kuznetsov
c46acc1ad4 aws s3 using temp when upload 2021-03-03 12:16:03 +02:00
Yuri Kuznetsov
20051a835b switch to async aws 2021-03-03 12:03:07 +02:00
Taras Machyshyn
2ae0f36241 LDAP bug fixes 2021-03-03 10:57:01 +02:00
Yuri Kuznetsov
873e33a04f attachment storage filter 2021-03-03 10:02:11 +02:00
Yuri Kuznetsov
e33c5d7cbc fix file storage manager and image entry point 2021-03-03 09:45:25 +02:00
Yuri Kuznetsov
b729ec1a85 s3 storage 2021-03-02 23:13:57 +02:00
Yuri Kuznetsov
9b18ecf072 cleanup 2021-03-02 23:07:13 +02:00
Yuri Kuznetsov
88c4ae5721 mass email refactoring 2021-03-02 14:11:08 +02:00
Yuri Kuznetsov
d2b94955d1 mass email refactoring 2021-03-02 13:40:45 +02:00
Yuri Kuznetsov
dbcc00fe1a cs fixes 2021-03-02 12:41:51 +02:00
Yuri Kuznetsov
b56ae68854 request interface fixes 2021-03-02 12:27:02 +02:00
Yuri Kuznetsov
312ea7d962 fix api response wrapper 2021-03-02 11:49:00 +02:00
Yuri Kuznetsov
ceb3b562e6 file storage changes 2021-03-02 11:45:25 +02:00
Yuri Kuznetsov
b211009e91 Merge branch 'hotfix/6.1.5' 2021-03-02 11:42:18 +02:00
Yuri Kuznetsov
eec372c6df fix css 2021-03-02 11:39:26 +02:00
Yuri Kuznetsov
011e83fac6 update selectize 2021-03-02 11:37:07 +02:00
Yuri Kuznetsov
70fa577e10 manual merge 2021-03-01 14:50:45 +02:00
Yuri Kuznetsov
dd8e55c2ac restpore tcpdf 2021-03-01 14:34:38 +02:00
Yuri Kuznetsov
b8f3f53d56 team position list as list 2021-03-01 14:24:24 +02:00
Yuri Kuznetsov
d5623dabb6 comment fix 2021-02-26 14:10:25 +02:00
Yuri Kuznetsov
db50687a1e Merge branch 'hotfix/6.1.5' 2021-02-26 12:33:05 +02:00
Yuri Kuznetsov
00fcd5a9b6 fix tcpdf page number 2021-02-26 12:32:48 +02:00
Yuri Kuznetsov
272fd58481 pdf changes 2021-02-26 12:23:46 +02:00
Yuri Kuznetsov
ecbde48f63 manual merge 2021-02-26 10:42:53 +02:00
Yuri Kuznetsov
3dda43c70a update tcpdf 2021-02-26 10:38:46 +02:00
Yuri Kuznetsov
39827e449b update async 2021-02-26 09:33:43 +02:00
Yuri Kuznetsov
44d0c78077 manual merge 2021-02-26 09:32:09 +02:00
Yuri Kuznetsov
34029c6f6f update composer deps 2021-02-26 09:26:40 +02:00
Yuri Kuznetsov
929b8c2d50 field and entity manager fixes 2021-02-25 20:01:52 +02:00
Yuri Kuznetsov
b71a64c214 cs fixes 2021-02-25 19:53:46 +02:00
Yuri Kuznetsov
66c5d408c6 fixes in field manager 2021-02-25 19:37:16 +02:00
Yuri Kuznetsov
ab1dbd0d5c cs fix 2021-02-25 19:24:39 +02:00
Yuri Kuznetsov
cc307e3217 cleanup 2021-02-25 16:40:42 +02:00
Yuri Kuznetsov
e3c45a5039 hide reset to default field for custom entities 2021-02-25 16:39:33 +02:00
Yuri Kuznetsov
6754efc486 fix calendar query 2021-02-25 13:44:35 +02:00
Yuri Kuznetsov
1e5d9d314b remove tests depending on db from unit 2021-02-25 13:28:31 +02:00
Yuri Kuznetsov
cea6aaf7ff fix composer dependency 2021-02-25 12:58:09 +02:00
Yuri Kuznetsov
c1f019e71c update async 2021-02-25 11:54:50 +02:00
Yuri Kuznetsov
c00b511c17 update slim 2021-02-25 11:37:12 +02:00
Yuri Kuznetsov
51c6067c17 udpdate composer phar 2021-02-25 11:33:19 +02:00
Yuri Kuznetsov
c032e74e58 drop php 7.2 2021-02-25 11:28:26 +02:00
Yuri Kuznetsov
412d40d041 Merge branch 'hotfix/6.1.5' 2021-02-25 11:16:05 +02:00
Yuri Kuznetsov
2cc69a0725 fix related list sync 2021-02-24 12:39:50 +02:00
Yuri Kuznetsov
89b3b6da61 cs fix 2021-02-24 12:20:13 +02:00
Yuri Kuznetsov
77a7fffcb2 rename field utils to fields 2021-02-24 10:58:42 +02:00
Yuri Kuznetsov
30a9c8c90e foreign type 2021-02-23 18:50:24 +02:00
Yuri Kuznetsov
abd52c7a42 orm fixes 2021-02-23 16:59:43 +02:00
Yuri Kuznetsov
9bb164246e cleanup 2021-02-23 14:24:57 +02:00
Yuri Kuznetsov
87d0e18696 move jobs 2021-02-23 14:24:13 +02:00
Yuri Kuznetsov
e8f5864dd9 job refactoring 2021-02-23 14:13:04 +02:00
Yuri Kuznetsov
51d7b3f413 case fixes 2021-02-23 13:32:58 +02:00
Yuri Kuznetsov
fb3de84aa4 layout change 2021-02-23 13:24:17 +02:00
Yuri Kuznetsov
4a2aa91b6d email notification refactoring 2021-02-23 13:13:24 +02:00
Yuri Kuznetsov
a4edac59c6 refactoring 2021-02-23 10:10:14 +02:00
suparpat
19af59b301 Add Thai Language Support (#1920)
* Add Thai Language Support
2021-02-23 09:12:23 +02:00
Yuri Kuznetsov
d1b27dfd9d tcpdf refactoring 2021-02-22 15:19:31 +02:00
Yuri Kuznetsov
274fb0f380 view followers list portal 2021-02-22 15:14:12 +02:00
Yuri Kuznetsov
8e70567688 follow entity support another user portal 2021-02-22 14:27:22 +02:00
Yuri Kuznetsov
7cbc24feb8 v 2021-02-22 10:52:07 +02:00
Yuri Kuznetsov
2bdcf3919e fix tests 2021-02-20 10:55:12 +02:00
Yuri Kuznetsov
8214f4ba20 cleanup 2021-02-19 15:31:08 +02:00
Yuri Kuznetsov
d0a5fc24b1 dev 2021-02-19 15:30:22 +02:00
Yuri Kuznetsov
c8084c670a fix tests 2021-02-19 14:53:07 +02:00
Yuri Kuznetsov
82a9779b09 renaming 2021-02-19 14:28:57 +02:00
Yuri Kuznetsov
fdb887e43a fix test 2021-02-19 14:18:32 +02:00
Yuri Kuznetsov
7761244eec update composer 2021-02-19 14:10:57 +02:00
Yuri Kuznetsov
6580334bdd Merge branch 'hotfix/6.1.4' 2021-02-19 14:02:51 +02:00
Yuri Kuznetsov
e2f7a22457 fix comment 2021-02-19 10:47:13 +02:00
Yuri Kuznetsov
494382f5cb value fix 2021-02-18 21:35:32 +02:00
Yuri Kuznetsov
2ff248a4c4 use forked lighrncandy 2021-02-18 15:35:01 +02:00
Yuri Kuznetsov
7ed15a2dbc cleanup 2021-02-18 12:21:55 +02:00
Yuri Kuznetsov
3d1725054a field utils refactoring 2021-02-18 12:17:23 +02:00
Yuri Kuznetsov
d6e37f9f13 cleanup 2021-02-18 10:56:29 +02:00
Yuri Kuznetsov
2c78bef505 fieldUtil additions 2021-02-18 10:52:03 +02:00
Yuri Kuznetsov
d60b9706b3 cs fix 2021-02-18 08:58:55 +02:00
Yuri Kuznetsov
d20996d788 Merge branch 'hotfix/6.1.4' 2021-02-18 08:55:32 +02:00
Yuri Kuznetsov
0010976803 attachment download calculating actual filesize 2021-02-18 08:54:03 +02:00
Eymen Elkum
bd422323ee fix typo (#1924) 2021-02-18 08:44:40 +02:00
Eymen Elkum
6a66d99017 add missing import (#1923) 2021-02-18 08:34:24 +02:00
Yuri Kuznetsov
f1d87da9b6 comments fix 2021-02-17 20:17:52 +02:00
Yuri Kuznetsov
ac8674a8b3 cs fixes and cleanup 2021-02-17 16:44:31 +02:00
Yuri Kuznetsov
c2af7914e3 fix 2021-02-17 16:40:27 +02:00
Yuri Kuznetsov
102db4c937 merge 2021-02-17 16:38:09 +02:00
Yuri Kuznetsov
1f7d92b209 return type fix 2021-02-17 16:36:15 +02:00
Yuri Kuznetsov
555cc74312 cs fix 2021-02-17 16:31:49 +02:00
Yuri Kuznetsov
761319c13d entity setAsNotNew and refactoring 2021-02-17 16:12:53 +02:00
Yuri Kuznetsov
828e867ac9 remove tests 2021-02-17 13:23:55 +02:00
Yuri Kuznetsov
6a7b4f107e fix syntax 2021-02-17 13:10:31 +02:00
Yuri Kuznetsov
c0df364b4f Merge branch 'hotfix/6.1.4' 2021-02-17 09:10:27 +02:00
Yuri Kuznetsov
71c72136f6 attachment proper size calculation 2021-02-17 09:09:52 +02:00
Yuri Kuznetsov
ec5f8fc4f5 fix test 2021-02-16 22:52:39 +02:00
Yuri Kuznetsov
f5e6ed914d cs fixes 2021-02-16 22:50:43 +02:00
Yuri Kuznetsov
2e7bc894f1 refactoring 2021-02-16 21:27:00 +02:00
Yuri Kuznetsov
18537b9cdb some orm fixes 2021-02-14 21:25:40 +02:00
Yuri Kuznetsov
ed5cb715da Merge branch 'hotfix/6.1.3' 2021-02-13 19:27:47 +02:00
Yuri Kuznetsov
32cf86ede5 refactoring and cs fixes 2021-02-13 18:24:31 +02:00
Yuri Kuznetsov
97f320c9a7 ceanup 2021-02-13 17:55:23 +02:00
Yuri Kuznetsov
7c6dd75a23 cleanup 2021-02-13 17:52:44 +02:00
Yuri Kuznetsov
6a59355514 refactoring 2021-02-13 17:51:18 +02:00
Yuri Kuznetsov
91c3413c57 refactoring and cleanup 2021-02-13 14:33:30 +02:00
Yuri Kuznetsov
717f5f6e2e refactoring 2021-02-13 13:45:19 +02:00
Yuri Kuznetsov
f48efae82d entity manager getDefs 2021-02-13 13:45:04 +02:00
Yuri Kuznetsov
5f372ebee3 cs fix 2021-02-13 11:14:57 +02:00
Yuri Kuznetsov
5b27fad3aa Merge branch 'hotfix/6.1.3' 2021-02-13 11:04:16 +02:00
Yuri Kuznetsov
6149a951bd cs fix 2021-02-13 10:59:22 +02:00
Yuri Kuznetsov
2529205359 orm defs usage 2021-02-13 10:54:00 +02:00
Yuri Kuznetsov
81b71a7676 orm defs fixes 2021-02-13 10:18:35 +02:00
Yuri Kuznetsov
29c80f7845 entity manager get rdb repository 2021-02-12 17:17:59 +02:00
Yuri Kuznetsov
05372fc4a4 cs fix 2021-02-12 17:11:03 +02:00
Yuri Kuznetsov
50e433aba0 cs fix 2021-02-12 16:59:28 +02:00
Yuri Kuznetsov
ac4797a943 Merge branch 'hotfix/6.1.3' 2021-02-12 16:54:08 +02:00
Yuri Kuznetsov
3c7baa7237 cs fix 2021-02-12 16:53:34 +02:00
Yuri Kuznetsov
3f9d6e48b5 cs fix 2021-02-12 16:21:41 +02:00
Yuri Kuznetsov
79adfe70a4 mass update copy attachments 2021-02-12 16:18:45 +02:00
Yuri Kuznetsov
ae8b616fed cs fix 2021-02-12 15:49:15 +02:00
Yuri Kuznetsov
0b8b2db41e cs fix 2021-02-12 15:24:18 +02:00
Yuri Kuznetsov
63183b33f1 cs fix 2021-02-12 15:21:50 +02:00
Yuri Kuznetsov
de09d1dbd2 cs fix 2021-02-12 14:30:46 +02:00
Yuri Kuznetsov
b59e318444 Merge branch 'hotfix/6.1.3' 2021-02-12 14:18:52 +02:00
Yuri Kuznetsov
0a65da2fc4 Merge branch 'hotfix/6.1.3' 2021-02-12 12:54:19 +02:00
Yuri Kuznetsov
e46be54688 fix app 2021-02-12 11:16:11 +02:00
Yuri Kuznetsov
e4f8a51df8 front end action improvements 2021-02-12 10:59:34 +02:00
Yuri Kuznetsov
a51f48f060 cs fix 2021-02-12 09:48:54 +02:00
Yuri Kuznetsov
32df0c1730 cs fix 2021-02-12 09:43:57 +02:00
Yuri Kuznetsov
530c8818b7 cs fix 2021-02-12 09:40:10 +02:00
Yuri Kuznetsov
6c99f73596 refactoring, action framework 2021-02-11 16:49:25 +02:00
Yuri Kuznetsov
61acaaa054 cleanup 2021-02-11 15:09:37 +02:00
Yuri Kuznetsov
25b695bc32 dev 2021-02-11 13:33:20 +02:00
Yuri Kuznetsov
0f41cb5ad4 grand refactoring, mass actions 2021-02-11 13:29:19 +02:00
Yuri Kuznetsov
40e57e3a54 Merge branch 'hotfix/6.1.3' 2021-02-10 10:45:20 +02:00
Yuri Kuznetsov
113b05ed05 fix 2021-02-10 09:51:30 +02:00
Yuri Kuznetsov
824ce88914 mass action refactoring 2021-02-09 18:43:24 +02:00
Yuri Kuznetsov
a1e243714e cs fix 2021-02-07 22:29:43 +02:00
Yuri Kuznetsov
1c0ed64f67 fix 2021-02-07 22:12:44 +02:00
Yuri Kuznetsov
1f1cd1b6d7 refactoring 2021-02-07 22:01:58 +02:00
Yuri Kuznetsov
e81725eb16 cs fix 2021-02-07 18:56:14 +02:00
Yuri Kuznetsov
ee4220e1ce cs fixes 2021-02-07 18:46:19 +02:00
Yuri Kuznetsov
a733c6c68d comment 2021-02-07 18:38:51 +02:00
Yuri Kuznetsov
d7c7619218 entry points refactoring 2021-02-07 18:31:07 +02:00
Yuri Kuznetsov
77066ba7e5 cs fix 2021-02-07 12:59:06 +02:00
Yuri Kuznetsov
35c5919c44 cs fix 2021-02-07 12:56:00 +02:00
Yuri Kuznetsov
fcdd286965 refactoring 2021-02-07 12:40:24 +02:00
Yuri Kuznetsov
e84fa1d636 Merge branch 'hotfix/6.1.3' 2021-02-07 12:29:39 +02:00
Yuri Kuznetsov
bfe9bad905 fix stream query 2021-02-05 14:34:45 +02:00
Yuri Kuznetsov
459b6bc6fe attachment storage readonly 2021-02-05 14:06:53 +02:00
Yuri Kuznetsov
332211fb13 Merge branch 'hotfix/6.1.3' 2021-02-05 13:58:13 +02:00
Yuri Kuznetsov
e5d42cf0eb manual merge 2021-02-01 19:17:04 +02:00
Yuri Kuznetsov
424df8d4fe request parsed body cloning 2021-01-30 14:06:11 +02:00
Yuri Kuznetsov
2f4422f719 auth error msg 2021-01-29 18:40:19 +02:00
Yuri Kuznetsov
831611af1e cs fix 2021-01-29 18:26:33 +02:00
Yuri Kuznetsov
c302d362a4 cs fix 2021-01-29 15:59:05 +02:00
Yuri Kuznetsov
69d4b1096f cs fix 2021-01-29 15:52:43 +02:00
Yuri Kuznetsov
2514a89286 fix diff 2021-01-29 15:44:12 +02:00
Yuri Kuznetsov
2034055148 acl refactoring 2021-01-29 15:28:25 +02:00
Yuri Kuznetsov
3a3b1007b9 Merge branch 'stable' 2021-01-29 13:38:38 +02:00
Yuri Kuznetsov
09a83b36ff cleanup 2021-01-28 23:35:16 +02:00
Yuri Kuznetsov
32cc59228d auth refactoring 2021-01-28 23:29:08 +02:00
Yuri Kuznetsov
31b2413953 icon quick search 2021-01-28 20:20:04 +02:00
Yuri Kuznetsov
c8eb643818 theme param global 2021-01-28 18:10:39 +02:00
Yuri Kuznetsov
11b251003e fix protal config 2021-01-28 18:10:19 +02:00
Yuri Kuznetsov
28bb0e99cb cs fix 2021-01-28 18:04:18 +02:00
Yuri Kuznetsov
5c9c686317 cs fix 2021-01-28 17:51:40 +02:00
Yuri Kuznetsov
098425bdbf cs fix 2021-01-28 16:04:16 +02:00
Yuri Kuznetsov
5189f6b392 cs fixes 2021-01-28 16:02:47 +02:00
Yuri Kuznetsov
f487479b1d fixes 2021-01-28 15:51:17 +02:00
Yuri Kuznetsov
03224cc4f6 fixes 2021-01-28 15:39:38 +02:00
Yuri Kuznetsov
482754eddb container prevent setting twice 2021-01-28 14:30:08 +02:00
Yuri Kuznetsov
7fcf6874e3 deprecation msg 2021-01-28 14:24:46 +02:00
Yuri Kuznetsov
a3e0eee8d4 Merge branch 'hotfix/6.1.1' 2021-01-28 14:12:24 +02:00
Yuri Kuznetsov
b7ffb06f9c fix auth 2021-01-28 13:51:50 +02:00
Yuri Kuznetsov
35a209bcb6 installer fix 2021-01-28 13:43:36 +02:00
Yuri Kuznetsov
c3a2a15608 fix auth 2021-01-28 13:39:40 +02:00
Yuri Kuznetsov
9acdfe5dcf config writer 2021-01-28 13:14:40 +02:00
Yuri Kuznetsov
9ec8056d89 dev 2021-01-28 12:38:52 +02:00
Yuri Kuznetsov
b9c2cc2c4f user type filter fix 2021-01-28 10:32:48 +02:00
Yuri Kuznetsov
675a2811d4 redactoring 2021-01-28 00:10:18 +02:00
Yuri Kuznetsov
b1df5f533b fix typo 2021-01-27 23:56:54 +02:00
Yuri Kuznetsov
a61cf3f889 fix 2021-01-27 13:11:27 +02:00
Yuri Kuznetsov
ace09646c6 auth refactoring 2021-01-27 13:10:47 +02:00
Yuri Kuznetsov
d2113c4379 auth refactoring 2021-01-27 11:23:40 +02:00
Yuri Kuznetsov
9e60778075 Merge branch 'hotfix/6.1.1' 2021-01-26 18:38:54 +02:00
Yuri Kuznetsov
4e78e4019f auth refactoring 2021-01-26 18:09:28 +02:00
Yuri Kuznetsov
823d13af34 cs fix 2021-01-26 17:38:47 +02:00
Yuri Kuznetsov
4007870bfb auth refactoring 2021-01-26 17:24:00 +02:00
Yuri Kuznetsov
5d92f98548 Merge branch 'hotfix/6.1.1' 2021-01-26 17:02:19 +02:00
Yuri Kuznetsov
cbbff69003 auth refactoring 2021-01-26 17:00:53 +02:00
Yuri Kuznetsov
f40240d8cb Auth refacoring 2021-01-26 15:08:59 +02:00
Yuri Kuznetsov
9671599fc9 fix method trailing comma 2021-01-26 15:08:43 +02:00
Yuri Kuznetsov
e1be421410 Merge branch 'master' into version/6.2 2021-01-26 14:56:24 +02:00
Taras Machyshyn
f4a80ed856 2021 license 2021-01-25 16:46:11 +02:00
Taras Machyshyn
39610bce24 Merge branch 'master' of https://github.com/espocrm/espocrm into version/6.2 2021-01-25 16:41:36 +02:00
Yuri Kuznetsov
18e0044373 orm defs 2021-01-21 10:36:37 +02:00
Yuri Kuznetsov
a9759a20c2 Merge branch 'master' into version/6.2 2021-01-19 17:47:20 +02:00
Yuri Kuznetsov
f5b9673044 Select builder 2021-01-19 17:43:33 +02:00
2953 changed files with 172032 additions and 90874 deletions

30
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,30 @@
---
name: Bug report
about: Create a bug report
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. ...
2. ...
3. ...
...
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**EspoCRM version**
Specify the EspoCRM version (or versions) on which the bug occurs.
**Additional context**
Add any other context about the problem here.

4
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,4 @@
contact_links:
- name: EspoCRM forum
url: https://forum.espocrm.com/
about: Please use our forum to ask questions not related to product development

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for EspoCRM
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is.
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

4
.gitignore vendored
View File

@@ -4,6 +4,7 @@
/data/preferences/*
/data/.backup/*
/data/config.php
/data/config-internal.php
/data/tmp/*
/build
/node_modules
@@ -18,4 +19,7 @@
/composer.phar
/vendor/
/custom/Espo/Custom/*
/custom/Espo/Modules/*
!/custom/Espo/Custom/.htaccess
!/custom/Espo/Modules/.htaccess
/install/config.php

View File

@@ -1,24 +1,44 @@
<ifModule mod_headers.c>
Header always set Access-Control-Allow-Methods "POST, GET, PUT, PATCH, DELETE"
Header always set Access-Control-Allow-Methods "POST, GET, PUT, PATCH, DELETE"
</ifModule>
DirectoryIndex index.php index.html
DirectoryIndex index.php
Options -Indexes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteEngine On
# PROTECTED DIRECTORIES
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^/?(api|client)/ - [F]
# Forbid access. Not actual as redirect to `public` is applied.
# An extra security measure if redirect not fired.
RewriteRule ^/?data/ - [F]
RewriteRule ^/?application/ - [F]
RewriteRule ^/?custom/ - [F]
RewriteRule ^/?vendor/ - [F]
RewriteRule /?web\.config - [F]
RewriteRule ^/?data/ - [F]
RewriteRule ^/?application/ - [F]
RewriteRule ^/?custom/ - [F]
RewriteRule ^/?vendor/ - [F]
RewriteRule ^/?client/?$ - [F]
#END PROTECTED DIRECTORIES
# Forbid `public` dir.
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteRule ^/?public/? - [F,L]
RewriteRule .* - [E=HTTP_ESPO_CGI_AUTH:%{HTTP:Authorization}]
# Skip redirect for `client` dir.
RewriteRule ^client/ - [L]
RewriteRule /?web\.config - [F]
</IfModule>
# {#dev}
# Skip redirect for `node_modules` dir. Actual only for dev environment.
RewriteRule ^node_modules/ - [L]
# {/dev}
# Store base path.
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]
# Add trailing slash.
RewriteCond %{DOCUMENT_ROOT}/%{ENV:BASE}/public/$1 -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=301,NE]
# Rewrite to `public` dir.
RewriteRule ^((?!public/).*)$ %{ENV:BASE}/public/$1 [L,NC]
RewriteRule .* - [E=HTTP_ESPO_CGI_AUTH:%{HTTP:Authorization}]
</IfModule>

View File

@@ -19,113 +19,67 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
/**
* * `grunt` - full build
* * `grunt dev` - build only items needed for development (takes less time)
* * `grunt offline` - build but skip *composer install*
* * `grant release` - full build plus upgrade packages`
* * `grant test` - build for test running
* * `grant run-tests` - build and run unit and integratino tests
*/
/**
* * `grunt` - full build
* * `grunt dev` - build only items needed for development (takes less time)
* * `grunt offline` - build but skip *composer install*
* * `grant release` - full build plus upgrade packages`
* * `grant test` - build for tests running
* * `grant run-tests` - build and run unit and integration tests
*/
module.exports = function (grunt) {
const fs = require('fs');
const cp = require('child_process');
const path = require('path');
var jsFilesToMinify = [
'client/lib/jquery-2.1.4.min.js',
'client/lib/underscore-min.js',
'client/lib/es6-promise.min.js',
'client/lib/backbone-min.js',
'client/lib/handlebars.js',
'client/lib/base64.js',
'client/lib/jquery-ui.min.js',
'client/lib/jquery.ui.touch-punch.min.js',
'client/lib/moment.min.js',
'client/lib/moment-timezone.min.js',
'client/lib/moment-timezone-data.js',
'client/lib/jquery.timepicker.min.js',
'client/lib/jquery.autocomplete.js',
'client/lib/bootstrap.min.js',
'client/lib/bootstrap-datepicker.js',
'client/lib/bull.js',
'client/lib/marked.min.js',
'client/lib/autobahn.js',
'client/lib/gridstack.all.js',
module.exports = grunt => {
'client/src/namespace.js',
'client/src/exceptions.js',
'client/src/loader.js',
'client/src/utils.js',
const pkg = grunt.file.readJSON('package.json');
const bundleConfig = require('./frontend/bundle-config.json');
'client/src/acl.js',
'client/src/model.js',
'client/src/model-offline.js',
'client/src/ajax.js',
'client/src/controller.js',
let jsFilesToBundle = getBundleLibList().concat(bundleConfig.jsFiles);
let jsFilesToCopy = getCopyLibDataList();
'client/src/ui.js',
'client/src/acl-manager.js',
'client/src/cache.js',
'client/src/storage.js',
'client/src/models/settings.js',
'client/src/language.js',
'client/src/metadata.js',
'client/src/field-manager.js',
'client/src/models/user.js',
'client/src/models/preferences.js',
'client/src/model-factory.js',
'client/src/collection-factory.js',
'client/src/pre-loader.js',
'client/src/controllers/base.js',
'client/src/router.js',
'client/src/date-time.js',
'client/src/layout-manager.js',
'client/src/theme-manager.js',
'client/src/session-storage.js',
'client/src/view-helper.js',
'client/src/page-title.js',
let libFilesToMinify = jsFilesToCopy
.filter(item => item.minify)
.reduce((map, item) => (
map[item.dest] = item.dest,
map
), {});
'client/src/app.js'
];
let currentPath = path.dirname(fs.realpathSync(__filename));
function camelCaseToHyphen (string){
if (string == null) {
return string;
}
return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
}
let themeList = [];
var fs = require('fs');
var cp = require('child_process');
var path = require('path');
var currentPath = path.dirname(fs.realpathSync(__filename));
var themeList = [];
fs.readdirSync('application/Espo/Resources/metadata/themes').forEach(function (file) {
fs.readdirSync('application/Espo/Resources/metadata/themes').forEach(file => {
themeList.push(file.substr(0, file.length - 5));
});
var cssminFilesData = {};
var lessData = {};
themeList.forEach(function (theme) {
var name = camelCaseToHyphen(theme);
var files = {};
let cssminFilesData = {};
let lessData = {};
themeList.forEach(theme => {
let name = camelCaseToHyphen(theme);
let files = {};
files['client/css/espo/'+name+'.css'] = 'frontend/less/'+name+'/main.less';
files['client/css/espo/'+name+'-iframe.css'] = 'frontend/less/'+name+'/iframe/main.less';
cssminFilesData['client/css/espo/'+name+'.css'] = 'client/css/espo/'+name+'.css';
cssminFilesData['client/css/espo/'+name+'-iframe.css'] = 'client/css/espo/'+name+'-iframe.css';
var o = {
let o = {
options: {
yuicompress: true,
},
files: files
files: files,
};
lessData[theme] = o;
});
var pkg = grunt.file.readJSON('package.json');
grunt.initConfig({
pkg: pkg,
@@ -135,11 +89,11 @@ module.exports = function (grunt) {
mode: 0755,
create: [
'build/tmp',
]
},
],
}
}
},
clean: {
start: ['build/EspoCRM-*'],
final: ['build/tmp'],
@@ -147,27 +101,48 @@ module.exports = function (grunt) {
beforeFinal: {
src: [
'build/tmp/custom/Espo/Custom/*',
'build/tmp/custom/Espo/Modules/*',
'!build/tmp/custom/Espo/Custom/.htaccess',
'!build/tmp/custom/Espo/Modules/.htaccess',
'build/tmp/install/config.php',
'build/tmp/vendor/*/*/.git',
'build/tmp/custom/Espo/Custom/*',
'build/tmp/client/custom/*',
'!build/tmp/client/custom/modules',
'build/tmp/client/custom/modules/*',
]
}
},
less: lessData,
cssmin: {
themes: {
files: cssminFilesData
}
files: cssminFilesData,
},
},
uglify: {
options: {
mangle: false,
mangle: true,
sourceMap: true,
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
output: {
comments: /^!/,
},
},
bundle: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
},
files: {
'build/tmp/client/espo.min.js': jsFilesToBundle,
},
},
lib: {
files: libFilesToMinify,
},
'build/tmp/client/espo.min.js': jsFilesToMinify.map(function (item) {
return '' + item;
})
},
copy: {
options: {
mode: true,
@@ -184,11 +159,14 @@ module.exports = function (grunt) {
'img/**',
'css/**',
'sounds/**',
'custom/**'
'custom/**',
],
dest: 'build/tmp/client',
},
frontendLib: {
files: jsFilesToCopy,
},
frontendCommitedLib: {
expand: true,
dot: true,
cwd: 'client/lib',
@@ -199,14 +177,14 @@ module.exports = function (grunt) {
expand: true,
dot: true,
src: [
'api/**',
'application/**',
'custom/**',
'data/.data',
'install/**',
'portal/**',
'vendor/**',
'html/**',
'public/**',
'install/**',
'bin/**',
'bootstrap.php',
'cron.php',
'daemon.php',
@@ -217,7 +195,6 @@ module.exports = function (grunt) {
'extension.php',
'websocket.php',
'command.php',
'oauth-callback.php',
'index.php',
'LICENSE.txt',
'.htaccess',
@@ -233,6 +210,7 @@ module.exports = function (grunt) {
dest: 'build/EspoCRM-<%= pkg.version %>/',
},
},
chmod: {
php: {
options: {
@@ -248,20 +226,20 @@ module.exports = function (grunt) {
'build/EspoCRM-<%= pkg.version %>/client/**/*.tpl',
'build/EspoCRM-<%= pkg.version %>/**/*.html',
'build/EspoCRM-<%= pkg.version %>/**/*.txt',
]
],
},
folders: {
options: {
mode: '755'
},
src: [
'build/EspoCRM-<%= pkg.version %>/install',
'build/EspoCRM-<%= pkg.version %>/portal',
'build/EspoCRM-<%= pkg.version %>/api',
'build/EspoCRM-<%= pkg.version %>/api/v1',
'build/EspoCRM-<%= pkg.version %>/api/v1/portal-access',
'build/EspoCRM-<%= pkg.version %>/public/install',
'build/EspoCRM-<%= pkg.version %>/public/portal',
'build/EspoCRM-<%= pkg.version %>/public/api',
'build/EspoCRM-<%= pkg.version %>/public/api/v1',
'build/EspoCRM-<%= pkg.version %>/public/api/v1/portal-access',
'build/EspoCRM-<%= pkg.version %>',
]
],
},
foldersWritable: {
options: {
@@ -277,83 +255,125 @@ module.exports = function (grunt) {
'build/EspoCRM-<%= pkg.version %>/application/Espo/Modules',
]
},
executable: {
options: {
mode: '754'
},
src: [
'build/EspoCRM-<%= pkg.version %>/bin/*',
],
},
},
replace: {
version: {
options: {
patterns: [
{
match: 'version',
replacement: '<%= pkg.version %>'
replacement: '<%= pkg.version %>',
}
]
},
files: [
{
src: 'build/tmp/application/Espo/Resources/defaults/config.php',
dest: 'build/tmp/application/Espo/Resources/defaults/config.php'
dest: 'build/tmp/application/Espo/Resources/defaults/config.php',
}
]
}
],
},
dev: {
options: {
patterns: [
{
match: /\# \{\#dev\}(.*)\{\/dev\}/gs,
replacement: '',
}
]
},
files: [
{
src: 'build/tmp/.htaccess',
dest: 'build/tmp/.htaccess',
}
],
},
},
});
grunt.registerTask("chmod-folders", function() {
cp.execSync("find . -type d -exec chmod 755 {} + ", {stdio: 'ignore', cwd: 'build/EspoCRM-' + pkg.version});
grunt.registerTask('chmod-folders', () => {
cp.execSync(
"find . -type d -exec chmod 755 {} + ",
{
stdio: 'ignore',
cwd: 'build/EspoCRM-' + pkg.version,
}
);
});
grunt.registerTask("composer", function() {
cp.execSync("composer install --ignore-platform-reqs --no-dev", {stdio: 'ignore'});
grunt.registerTask('composer-install', () => {
cp.execSync("composer install --no-dev", {stdio: 'ignore'});
});
grunt.registerTask("composer-dev", function() {
cp.execSync("composer install --ignore-platform-reqs", {stdio: 'ignore'});
grunt.registerTask('composer-install-dev', () => {
cp.execSync("composer install", {stdio: 'ignore'});
});
grunt.registerTask("upgrade", function() {
grunt.registerTask('upgrade', () => {
cp.execSync("node diff --all --vendor", {stdio: 'inherit'});
});
grunt.registerTask("unit-tests-run", function() {
grunt.registerTask('unit-tests-run', () => {
cp.execSync("vendor/bin/phpunit ./tests/unit", {stdio: 'inherit'});
});
grunt.registerTask("integration-tests-run", function() {
grunt.registerTask('integration-tests-run', () => {
cp.execSync("vendor/bin/phpunit ./tests/integration", {stdio: 'inherit'});
});
grunt.registerTask("zip", function() {
var fs = require('fs');
grunt.registerTask('zip', () => {
const archiver = require('archiver');
var resolve = this.async();
let resolve = this.async();
var folder = 'EspoCRM-' + pkg.version;
let folder = 'EspoCRM-' + pkg.version;
var zipPath = 'build/' + folder +'.zip';
if (fs.existsSync(zipPath)) fs.unlinkSync(zipPath);
let zipPath = 'build/' + folder +'.zip';
var archiver = require('archiver');
var archive = archiver('zip');
if (fs.existsSync(zipPath)) {
fs.unlinkSync(zipPath);
}
archive.on('error', function (err) {
let archive = archiver('zip');
archive.on('error', err => {
grunt.fail.warn(err);
});
var zipOutput = fs.createWriteStream(zipPath);
zipOutput.on('close', function () {
let zipOutput = fs.createWriteStream(zipPath);
zipOutput.on('close', () => {
console.log("EspoCRM package has been built.");
resolve();
});
archive.directory(currentPath + '/build/' + folder, folder).pipe(zipOutput);
archive
.directory(currentPath + '/build/' + folder, folder)
.pipe(zipOutput)
.finalize();
});
archive.finalize();
grunt.registerTask('npm-install', () => {
cp.execSync("npm install", {stdio: 'ignore'});
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-mkdir');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-uglify-es');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-replace');
grunt.loadNpmTasks('grunt-chmod');
@@ -363,10 +383,12 @@ module.exports = function (grunt) {
'mkdir:tmp',
'less',
'cssmin',
'uglify',
'uglify:bundle',
'copy:frontendFolders',
'copy:frontendLib',
'copy:frontendCommitedLib',
'copy:backend',
'uglify:lib',
'replace',
'clean:beforeFinal',
'copy:final',
@@ -374,16 +396,22 @@ module.exports = function (grunt) {
'chmod:php',
'chmod:folders',
'chmod:foldersWritable',
'chmod:executable',
'clean:final',
]);
grunt.registerTask('default', [
'composer',
grunt.registerTask('build', [
'composer-install',
'npm-install',
'offline',
]);
grunt.registerTask('default', [
'build',
]);
grunt.registerTask('release', [
'default',
'build',
'upgrade',
'zip',
'clean:release',
@@ -396,7 +424,7 @@ module.exports = function (grunt) {
]);
grunt.registerTask('run-unit-tests', [
'composer-dev',
'composer-install-dev',
'unit-tests-run',
]);
@@ -406,12 +434,87 @@ module.exports = function (grunt) {
]);
grunt.registerTask('dev', [
'composer-dev',
'composer-install-dev',
'less',
]);
grunt.registerTask('test', [
'composer-dev',
'composer-install-dev',
'npm-install',
'offline',
]);
};
function getBundleLibList() {
const libs = require('./frontend/libs.json');
let list = [];
libs.forEach(item => {
if (!item.bundle) {
return;
}
if (item.files) {
item.files.forEach(item => {
list.push(item.src);
});
return;
}
if (!item.src) {
throw new Error("No lib src.");
}
list.push(item.src);
});
return list;
}
function getCopyLibDataList() {
const libs = require('./frontend/libs.json');
let list = [];
libs.forEach(item => {
if (item.bundle) {
return;
}
let minify = item.minify;
if (item.files) {
item.files.forEach(item => {
list.push({
src: item.src,
dest: 'build/tmp/' + (item.dest || 'client/lib/' + item.src.split('/').pop()),
minify: minify,
});
});
return;
}
if (!item.src) {
throw new Error("No lib src.");
}
list.push({
src: item.src,
dest: 'build/tmp/' + (item.dest || 'client/lib/' + item.src.split('/').pop()),
minify: minify,
});
});
return list;
}
function camelCaseToHyphen(string){
if (string === null) {
return string;
}
return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
}

View File

@@ -8,7 +8,7 @@ It's a web application with a frontend designed as a single page application and
### Requirements
* PHP 7.2 and later (with pdo, json, gd, openssl, zip, imap, mbstring, curl extensions);
* PHP 7.3 and later (with pdo, json, gd, openssl, zip, imap, mbstring, curl extensions);
* MySQL 5.7 (and later), or MariaDB 10.1 (and later).
For more information about server configuration see [this article](https://docs.espocrm.com/administration/server-configuration/).

View File

@@ -1,92 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
class Attachment extends \Espo\Core\Acl\Acl
{
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
{
if ($user->isAdmin()) {
return true;
}
if ($entity->get('parentType') === 'Settings') {
return true;
}
$parent = null;
$hasParent = false;
if ($entity->get('parentId') && $entity->get('parentType')) {
$hasParent = true;
$parent = $this->getEntityManager()->getEntity($entity->get('parentType'), $entity->get('parentId'));
} else if ($entity->get('relatedId') && $entity->get('relatedType')) {
$hasParent = true;
$parent = $this->getEntityManager()->getEntity($entity->get('relatedType'), $entity->get('relatedId'));
}
if ($hasParent) {
if ($parent) {
if ($parent->getEntityType() === 'Note') {
if ($parent->get('parentId') && $parent->get('parentType')) {
$parentOfParent = $this->getEntityManager()->getEntity($parent->get('parentType'), $parent->get('parentId'));
if ($parentOfParent && $this->getAclManager()->checkEntity($user, $parentOfParent)) {
return true;
}
} else {
return true;
}
} else {
if ($this->getAclManager()->checkEntity($user, $parent)) {
return true;
}
}
}
} else {
return true;
}
if ($this->checkEntity($user, $entity, $data, 'read')) {
return true;
}
return false;
}
public function checkIsOwner(EntityUser $user, Entity $entity)
{
if ($user->id === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -1,64 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
class EmailAddress extends \Espo\Core\Acl\Acl
{
public function checkEditInEntity(EntityUser $user, Entity $entity, Entity $excludeEntity)
{
$id = $entity->id;
$isFobidden = false;
$repository = $this->getEntityManager()->getRepository('EmailAddress');
if (!$user->isAdmin()) {
$entityWithSameAddressList = $repository->getEntityListByAddressId($id, $excludeEntity);
foreach ($entityWithSameAddressList as $e) {
if (!$this->getAclManager()->check($user, $e, 'edit')) {
$isFobidden = true;
if (
$e->getEntityType() === 'User' &&
$e->isPortal() &&
$excludeEntity->getEntityType() === 'Contact' &&
$e->get('contactId') === $excludeEntity->id
) {
$isFobidden = false;
}
if ($isFobidden) break;
}
}
}
return !$isFobidden;
}
}

View File

@@ -1,119 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
class Note extends \Espo\Core\Acl\Acl
{
protected $deleteThresholdPeriod = '1 month';
protected $editThresholdPeriod = '7 days';
public function checkIsOwner(EntityUser $user, Entity $entity)
{
if ($entity->get('type') === 'Post' && $user->id === $entity->get('createdById')) {
return true;
}
return false;
}
public function checkEntityCreate(EntityUser $user, Entity $entity, $data)
{
if ($entity->get('parentId') && $entity->get('parentType')) {
$parent = $this->getEntityManager()->getEntity($entity->get('parentType'), $entity->get('parentId'));
if ($parent) {
if ($this->getAclManager()->checkEntity($user, $parent, 'stream')) {
return true;
}
}
return false;
}
return true;
}
public function checkEntityEdit(EntityUser $user, Entity $entity, $data)
{
if ($user->isAdmin()) {
return true;
}
if ($this->checkEntity($user, $entity, $data, 'edit')) {
if ($this->checkIsOwner($user, $entity)) {
$createdAt = $entity->get('createdAt');
if ($createdAt) {
$noteEditThresholdPeriod = '-' . $this->getConfig()->get('noteEditThresholdPeriod', $this->editThresholdPeriod);
$dt = new \DateTime();
$dt->modify($noteEditThresholdPeriod);
try {
if ($dt->format('U') > (new \DateTime($createdAt))->format('U')) {
return false;
}
} catch (\Exception $e) {
return false;
}
}
}
return true;
}
return false;
}
public function checkEntityDelete(EntityUser $user, Entity $entity, $data)
{
if ($user->isAdmin()) {
return true;
}
if ($this->checkEntity($user, $entity, $data, 'delete')) {
if ($this->checkIsOwner($user, $entity)) {
$createdAt = $entity->get('createdAt');
if ($createdAt) {
$deleteThresholdPeriod = '-' . $this->getConfig()->get('noteDeleteThresholdPeriod', $this->deleteThresholdPeriod);
$dt = new \DateTime();
$dt->modify($deleteThresholdPeriod);
try {
if ($dt->format('U') > (new \DateTime($createdAt))->format('U')) {
return false;
}
} catch (\Exception $e) {
return false;
}
}
}
return true;
}
return false;
}
}

View File

@@ -1,65 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
class PhoneNumber extends \Espo\Core\Acl\Acl
{
public function checkEditInEntity(EntityUser $user, Entity $entity, Entity $excludeEntity)
{
$id = $entity->id;
$isFobidden = false;
$repository = $this->getEntityManager()->getRepository('PhoneNumber');
if (!$user->isAdmin()) {
$entityWithSameNumberList = $repository->getEntityListByPhoneNumberId($id, $excludeEntity);
foreach ($entityWithSameNumberList as $e) {
if (!$this->getAclManager()->check($user, $e, 'edit')) {
$isFobidden = true;
if (
$e->getEntityType() === 'User' &&
$e->isPortal() &&
$excludeEntity->getEntityType() === 'Contact' &&
$e->get('contactId') === $excludeEntity->id
) {
$isFobidden = false;
}
if ($isFobidden) break;
}
}
}
return !$isFobidden;
}
}

View File

@@ -1,93 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\AclPortal;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
class Attachment extends \Espo\Core\AclPortal\Base
{
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
{
if ($user->isAdmin()) {
return true;
}
if ($entity->get('parentType') === 'Settings') {
return true;
}
$parent = null;
$hasParent = false;
if ($entity->get('parentId') && $entity->get('parentType')) {
$hasParent = true;
$parent = $this->getEntityManager()->getEntity($entity->get('parentType'), $entity->get('parentId'));
} else if ($entity->get('relatedId') && $entity->get('relatedType')) {
$hasParent = true;
$parent = $this->getEntityManager()->getEntity($entity->get('relatedType'), $entity->get('relatedId'));
}
if ($hasParent) {
if ($parent) {
if ($parent->getEntityType() === 'Note') {
if ($parent->get('parentId') && $parent->get('parentType')) {
$parentOfParent = $this->getEntityManager()->getEntity($parent->get('parentType'), $parent->get('parentId'));
if ($parentOfParent && $this->getAclManager()->checkEntity($user, $parentOfParent)) {
return true;
}
} else {
return true;
}
} else {
if ($this->getAclManager()->checkEntity($user, $parent)) {
return true;
}
}
}
} else {
return true;
}
if ($this->checkEntity($user, $entity, $data, 'read')) {
return true;
}
return false;
}
public function checkIsOwner(EntityUser $user, Entity $entity)
{
if ($user->id === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,46 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\ActionHistoryRecord;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkOwn(User $user, Entity $entity): bool
{
return $entity->get('userId') === $user->getId();
}
}

View File

@@ -0,0 +1,153 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Attachment;
use Espo\Entities\{
User,
Note,
};
use Espo\ORM\Entity;
use Espo\Core\{
ORM\EntityManager,
AclManager,
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDChecker,
Acl\Traits\DefaultAccessCheckerDependency,
};
class AccessChecker implements AccessEntityCREDChecker
{
use DefaultAccessCheckerDependency;
private $aclManager;
private $entityManager;
public function __construct(
DefaultAccessChecker $defaultAccessChecker,
AclManager $aclManager,
EntityManager $entityManager
) {
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
$this->entityManager = $entityManager;
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('parentType') === 'Settings') {
return true;
}
$parent = null;
$hasParent = false;
if ($entity->get('parentId') && $entity->get('parentType')) {
$hasParent = true;
$parent = $this->entityManager->getEntity($entity->get('parentType'), $entity->get('parentId'));
}
else if ($entity->get('relatedId') && $entity->get('relatedType')) {
$hasParent = true;
$parent = $this->entityManager->getEntity($entity->get('relatedType'), $entity->get('relatedId'));
}
if (!$parent || !$hasParent) {
if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) {
return true;
}
return false;
}
if ($parent->getEntityType() === 'Note') {
$result = $this->checkEntityReadNoteParent($user, $parent);
if ($result !== null) {
return $result;
}
}
else if ($this->aclManager->checkEntity($user, $parent)) {
return true;
}
if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) {
return true;
}
return false;
}
private function checkEntityReadNoteParent(User $user, Note $note): ?bool
{
if ($note->getTargetType() === Note::TARGET_TEAMS) {
$intersect = array_intersect(
$note->getLinkMultipleIdList('teams'),
$user->getLinkMultipleIdList('teams')
);
if (count($intersect)) {
return true;
}
return null;
}
if ($note->getTargetType() === Note::TARGET_USERS) {
$isRelated = $this->entityManager
->getRDBRepository('Note')
->getRelation($note, 'users')
->isRelated($user);
if ($isRelated) {
return true;
}
return null;
}
if (!$note->getParentId() || !$note->getParentType()) {
return null;
}
$parent = $this->entityManager->getEntity($note->getParentType(), $note->getParentId());
if ($parent && $this->aclManager->checkEntity($user, $parent)) {
return true;
}
return null;
}
}

View File

@@ -27,23 +27,26 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Modules\Crm\AclPortal;
namespace Espo\Classes\Acl\Attachment;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\AclPortal\Acl;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class Account extends Acl
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkInAccount(User $user, Entity $entity)
private const ATTR_CREATED_BY_ID = 'createdById';
public function checkOwn(User $user, Entity $entity): bool
{
$accountIdList = $user->getLinkMultipleIdList('accounts');
if (count($accountIdList)) {
if (in_array($entity->id, $accountIdList)) {
return true;
}
if ($user->getId() === $entity->get(self::ATTR_CREATED_BY_ID)) {
return true;
}
return false;
}
}

View File

@@ -27,26 +27,30 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
namespace Espo\Classes\Acl\AuthToken;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
use Espo\Entities\User;
class Import extends \Espo\Core\Acl\Acl
use Espo\Core\{
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDChecker,
Acl\Traits\DefaultAccessCheckerDependency,
};
class AccessChecker implements AccessEntityCREDChecker
{
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
{
if ($user->isAdmin()) return true;
if ($user->id === $entity->get('createdById')) return true;
use DefaultAccessCheckerDependency;
return false;
private $defaultAccessChecker;
public function __construct(DefaultAccessChecker $defaultAccessChecker)
{
$this->defaultAccessChecker = $defaultAccessChecker;
}
public function checkEntityDelete(EntityUser $user, Entity $entity, $data)
public function checkCreate(User $user, ScopeData $data): bool
{
if ($user->isAdmin()) return true;
if ($user->id === $entity->get('createdById')) return true;
return false;
}
}

View File

@@ -27,93 +27,101 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
namespace Espo\Classes\Acl\Email;
use Espo\Entities\User;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
class Email extends \Espo\Core\Acl\Acl
{
protected $ownerUserIdAttribute = 'usersIds';
use Espo\Core\{
Acl\Table,
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDSChecker,
Acl\Traits\DefaultAccessCheckerDependency,
};
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
class AccessChecker implements AccessEntityCREDSChecker
{
use DefaultAccessCheckerDependency;
public function __construct(DefaultAccessChecker $defaultAccessChecker)
{
if ($this->checkEntity($user, $entity, $data, 'read')) {
$this->defaultAccessChecker = $defaultAccessChecker;
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) {
return true;
}
if ($data === false) {
if ($data->isFalse()) {
return false;
}
if (is_object($data)) {
if ($data->read === false || $data->read === 'no') {
return false;
}
if ($data->getRead() === Table::LEVEL_NO) {
return false;
}
if (!$entity->has('usersIds')) {
$entity->loadLinkMultipleField('users');
}
$userIdList = $entity->get('usersIds');
if (is_array($userIdList) && in_array($user->id, $userIdList)) {
return true;
}
return false;
}
public function checkIsOwner(EntityUser $user, Entity $entity)
{
if ($user->id === $entity->get('assignedUserId')) {
return true;
}
if ($user->id === $entity->get('createdById')) {
return true;
}
if ($entity->hasLinkMultipleId('assignedUsers', $user->id)) {
if (is_array($userIdList) && in_array($user->getId(), $userIdList)) {
return true;
}
return false;
}
public function checkEntityDelete(EntityUser $user, Entity $entity, $data)
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if ($data === false) {
if ($data->isFalse()) {
return false;
}
if ($data->delete === 'own') {
if ($user->id === $entity->get('assignedUserId')) {
if ($data->getDelete() === Table::LEVEL_OWN) {
if ($user->getId() === $entity->get('assignedUserId')) {
return true;
}
if ($user->id === $entity->get('createdById')) {
if ($user->getId() === $entity->get('createdById')) {
return true;
}
$assignedUserIdList = $entity->getLinkMultipleIdList('assignedUsers');
if (count($assignedUserIdList) === 1 && $entity->hasLinkMultipleId('assignedUsers', $user->id)) {
if (
count($assignedUserIdList) === 1 &&
$entity->hasLinkMultipleId('assignedUsers', $user->getId())
) {
return true;
}
return false;
}
if ($this->checkEntity($user, $entity, $data, 'delete')) {
if ($this->defaultAccessChecker->checkEntityDelete($user, $entity, $data)) {
return true;
}
if ($data->edit !== 'no' || $data->create !== 'no') {
if ($entity->get('createdById') === $user->id) {
if ($entity->get('status') !== 'Sent' && $entity->get('status') !== 'Archived') {
return true;
}
}
if ($data->getEdit() === Table::LEVEL_NO && $data->getCreate() === Table::LEVEL_NO) {
return false;
}
if ($entity->get('createdById') !== $user->getId()) {
return false;
}
if ($entity->get('status') !== 'Sent' && $entity->get('status') !== 'Archived') {
return true;
}
return false;

View File

@@ -0,0 +1,51 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Email;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\DefaultAssignmentChecker,
};
class AssignmentChecker extends DefaultAssignmentChecker
{
protected function isPermittedAssignedUser(User $user, Entity $entity): bool
{
return true;
}
protected function isPermittedAssignedUsers(User $user, Entity $entity): bool
{
return true;
}
}

View File

@@ -27,46 +27,46 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\AclPortal;
namespace Espo\Classes\Acl\Email;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
use Espo\Entities\User;
class Email extends \Espo\Core\AclPortal\Base
use Espo\ORM\Entity;
use Espo\Core\{
Acl\DefaultOwnershipChecker,
Acl\OwnershipOwnChecker,
Acl\OwnershipTeamChecker,
};
class OwnershipChecker implements OwnershipOwnChecker, OwnershipTeamChecker
{
protected $ownerUserIdAttribute = 'usersIds';
private $defaultOwnershipChecker;
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
public function __construct(DefaultOwnershipChecker $defaultOwnershipChecker)
{
if ($this->checkEntity($user, $entity, $data, 'read')) {
$this->defaultOwnershipChecker = $defaultOwnershipChecker;
}
public function checkOwn(User $user, Entity $entity): bool
{
if ($user->getId() === $entity->get('assignedUserId')) {
return true;
}
if ($data === false) {
return false;
}
if (is_object($data)) {
if ($data->read === false || $data->read === 'no') {
return false;
}
}
if (!$entity->has('usersIds')) {
$entity->loadLinkMultipleField('users');
}
$userIdList = $entity->get('usersIds');
if (is_array($userIdList) && in_array($user->id, $userIdList)) {
if ($user->getId() === $entity->get('createdById')) {
return true;
}
if ($entity->hasLinkMultipleId('assignedUsers', $user->getId())) {
return true;
}
return false;
}
public function checkIsOwner(EntityUser $user, Entity $entity)
public function checkTeam(User $user, Entity $entity): bool
{
if ($user->id === $entity->get('createdById')) {
return true;
}
return false;
return $this->defaultOwnershipChecker->checkTeam($user, $entity);
}
}

View File

@@ -27,57 +27,53 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Authentication\TwoFactor\Methods;
namespace Espo\Classes\Acl\EmailFilter;
use Espo\Entities\User;
use Espo\ORM\EntityManager;
use Espo\Core\Authentication\TwoFactor\Utils\Totp as TotpUtils;
use Espo\ORM\Entity;
use StdClass;
use Espo\Core\{
Acl\OwnershipOwnChecker,
ORM\EntityManager,
};
class Totp implements CodeVerify
class OwnershipChecker implements OwnershipOwnChecker
{
protected $entityManager;
protected $totp;
private $entityManager;
public function __construct(EntityManager $entityManager, TotpUtils $totp)
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
$this->totp = $totp;
}
public function verifyCode(User $user, string $code) : bool
public function checkOwn(User $user, Entity $entity): bool
{
$userData = $this->entityManager
->getRepository('UserData')
->getByUserId($user->id);
if (!$userData) {
if (!$entity->has('parentId') || !$entity->has('parentType')) {
return false;
}
if (!$userData->get('auth2FA')) {
$parentType = $entity->get('parentType');
$parentId = $entity->get('parentId');
if (!$parentType || !$parentId) {
return false;
}
if ($userData->get('auth2FAMethod') != 'Totp') {
$parent = $this->entityManager->getEntity($parentType, $parentId);
if (!$parent) {
return false;
}
$secret = $userData->get('auth2FATotpSecret');
if (!$secret) {
return false;
if ($parent->getEntityType() === 'User') {
return $parent->getId() === $user->getId();
}
return $this->totp->verifyCode($secret, $code);
}
if ($parent->has('assignedUserId') && $parent->get('assignedUserId') === $user->getId()) {
return true;
}
public function getLoginData(User $user) : StdClass
{
return (object) [
'message' => 'enterTotpCode',
];
return false;
}
}

View File

@@ -0,0 +1,84 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Import;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\ScopeData,
Acl\AccessEntityReadChecker,
Acl\AccessEntityDeleteChecker,
};
class AccessChecker implements AccessEntityReadChecker, AccessEntityDeleteChecker
{
public function check(User $user, ScopeData $data): bool
{
return $data->isTrue();
}
public function checkRead(User $user, ScopeData $data): bool
{
return $data->isTrue();
}
public function checkDelete(User $user, ScopeData $data): bool
{
return $data->isTrue();
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if ($user->getId() === $entity->get('createdById')) {
return true;
}
return false;
}
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if ($user->getId() === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,172 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Note;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDChecker,
Acl\Traits\DefaultAccessCheckerDependency,
AclManager,
ORM\EntityManager,
Utils\Config,
};
use DateTime;
use Exception;
class AccessChecker implements AccessEntityCREDChecker
{
use DefaultAccessCheckerDependency;
private const EDIT_PERIOD = '7 days';
private const DELETE_PERIOD = '1 month';
private $defaultAccessChecker;
private $aclManager;
private $entityManager;
private $config;
public function __construct(
DefaultAccessChecker $defaultAccessChecker,
AclManager $aclManager,
EntityManager $entityManager,
Config $config
) {
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
$this->entityManager = $entityManager;
$this->config = $config;
}
public function checkEntityCreate(User $user, Entity $entity, ScopeData $data): bool
{
$parentId = $entity->get('parentId');
$parentType = $entity->get('parentType');
if (!$parentId || !$parentType) {
return true;
}
$parent = $this->entityManager->getEntity($parentType, $parentId);
if ($parent && $this->aclManager->checkEntityStream($user, $parent)) {
return true;
}
return false;
}
public function checkEntityEdit(User $user, Entity $entity, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if (!$this->defaultAccessChecker->checkEntityEdit($user, $entity, $data)) {
return false;
}
if (!$this->aclManager->checkOwnershipOwn($user, $entity)) {
return true;
}
$createdAt = $entity->get('createdAt');
if (!$createdAt) {
return true;
}
$noteEditThresholdPeriod =
'-' . $this->config->get('noteEditThresholdPeriod', self::EDIT_PERIOD);
$dt = new DateTime();
$dt->modify($noteEditThresholdPeriod);
try {
if ($dt->format('U') > (new DateTime($createdAt))->format('U')) {
return false;
}
}
catch (Exception $e) {
return false;
}
return true;
}
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if (!$this->defaultAccessChecker->checkEntityDelete($user, $entity, $data)) {
return false;
}
if (!$this->aclManager->checkOwnershipOwn($user, $entity)) {
return true;
}
$createdAt = $entity->get('createdAt');
if (!$createdAt) {
return true;
}
$deleteThresholdPeriod =
'-' . $this->config->get('noteDeleteThresholdPeriod', self::DELETE_PERIOD);
$dt = new DateTime();
$dt->modify($deleteThresholdPeriod);
try {
if ($dt->format('U') > (new DateTime($createdAt))->format('U')) {
return false;
}
}
catch (Exception $e) {
return false;
}
return true;
}
}

View File

@@ -0,0 +1,51 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Note;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkOwn(User $user, Entity $entity): bool
{
if ($entity->get('type') === 'Post' && $user->getId() === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -27,18 +27,24 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
namespace Espo\Classes\Acl\Notification;
use Espo\Entities\User;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
class Notification extends \Espo\Core\Acl\Acl
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkIsOwner(EntityUser $user, Entity $entity)
public function checkOwn(User $user, Entity $entity): bool
{
if ($user->id === $entity->get('userId')) {
if ($user->getId() === $entity->get('userId')) {
return true;
}
return false;
}
}

View File

@@ -27,41 +27,37 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
namespace Espo\Classes\Acl\Portal;
use Espo\Entities\User;
use Espo\Core\{
Jobs\Job,
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDChecker,
Acl\Traits\DefaultAccessCheckerDependency,
Acl\Table,
AclManager,
Utils\Config,
ORM\EntityManager,
Webhook\Sender,
Webhook\Queue,
};
class ProcessWebhookQueue implements Job
class AccessChecker implements AccessEntityCREDChecker
{
protected $config;
protected $entityManager;
protected $aclManager;
use DefaultAccessCheckerDependency;
public function __construct(Config $config, EntityManager $entityManager, AclManager $aclManager)
private $defaultAccessChecker;
private $aclManager;
public function __construct(DefaultAccessChecker $defaultAccessChecker, AclManager $aclManager)
{
$this->config = $config;
$this->entityManager = $entityManager;
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
}
public function run()
public function check(User $user, ScopeData $data): bool
{
$sender = new Sender($this->config);
$level = $this->aclManager->getPermissionLevel($user, 'portal');
$webhookQueue = new Queue(
$sender,
$this->config,
$this->entityManager,
$this->aclManager
);
$webhookQueue->process();
return $level === Table::LEVEL_YES;
}
}

View File

@@ -0,0 +1,89 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\ScheduledJob;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDChecker,
Acl\Traits\DefaultAccessCheckerDependency,
};
class AccessChecker implements AccessEntityCREDChecker
{
use DefaultAccessCheckerDependency;
private $defaultAccessChecker;
public function __construct(DefaultAccessChecker $defaultAccessChecker)
{
$this->defaultAccessChecker = $defaultAccessChecker;
}
public function checkEntityCreate(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('isInternal')) {
return false;
}
return $this->defaultAccessChecker->checkEntityCreate($user, $entity, $data);
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('isInternal')) {
return false;
}
return $this->defaultAccessChecker->checkEntityRead($user, $entity, $data);
}
public function checkEntityEdit(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('isInternal')) {
return false;
}
return $this->defaultAccessChecker->checkEntityEdit($user, $entity, $data);
}
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('isInternal')) {
return false;
}
return $this->defaultAccessChecker->checkEntityDelete($user, $entity, $data);
}
}

View File

@@ -27,17 +27,22 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
namespace Espo\Classes\Acl\Team;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Entities\User as UserEntity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class Team extends \Espo\Core\Acl\Acl
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkInTeam(UserEntity $user, Entity $entity)
public function checkOwn(User $user, Entity $entity): bool
{
$userTeamIdList = $user->getLinkMultipleIdList('teams');
return in_array($entity->id, $userTeamIdList);
return in_array($entity->getId(), $userTeamIdList);
}
}

View File

@@ -27,72 +27,103 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Acl;
namespace Espo\Classes\Acl\User;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Entities\User as EntityUser;
class User extends \Espo\Core\Acl\Acl
use Espo\Core\{
Acl\Table,
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDSChecker,
Acl\Traits\DefaultAccessCheckerDependency,
AclManager,
};
class AccessChecker implements AccessEntityCREDSChecker
{
public function checkIsOwner(EntityUser $user, Entity $entity)
use DefaultAccessCheckerDependency;
private $defaultAccessChecker;
private $aclManager;
public function __construct(DefaultAccessChecker $defaultAccessChecker, AclManager $aclManager)
{
return $user->id === $entity->id;
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
}
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
public function checkEntityCreate(User $user, Entity $entity, ScopeData $data): bool
{
if (!$user->isAdmin() && $entity->isPortal()) {
if ($this->getAclManager()->get($user, 'portalPermission') === 'yes') {
if (!$user->isAdmin()) {
return false;
}
if ($entity->isSuperAdmin() && !$user->isSuperAdmin()) {
return false;
}
return $this->defaultAccessChecker->checkEntityCreate($user, $entity, $data);
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->isPortal()) {
if ($this->aclManager->getPermissionLevel($user, 'portal') === Table::LEVEL_YES) {
return true;
}
}
return $this->checkEntity($user, $entity, $data, 'read');
}
public function checkEntityCreate(EntityUser $user, Entity $entity, $data)
{
if (!$user->isAdmin()) {
return false;
}
if ($entity->isSuperAdmin() && !$user->isSuperAdmin()) {
return false;
}
return $this->checkEntity($user, $entity, $data, 'create');
return $this->defaultAccessChecker->checkEntityRead($user, $entity, $data);
}
public function checkEntityDelete(EntityUser $user, Entity $entity, $data)
public function checkEntityEdit(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->id === 'system') {
return false;
}
if (!$user->isAdmin()) {
return false;
}
if ($entity->isSystem()) {
return false;
}
if ($entity->isSuperAdmin() && !$user->isSuperAdmin()) {
return false;
}
return parent::checkEntityDelete($user, $entity, $data);
}
public function checkEntityEdit(EntityUser $user, Entity $entity, $data)
{
if ($entity->id === 'system') {
return false;
}
if ($entity->isSystem()) {
return false;
}
if (!$user->isAdmin()) {
if ($user->id !== $entity->id) {
if ($user->getId() !== $entity->getId()) {
return false;
}
}
if ($entity->isSuperAdmin() && !$user->isSuperAdmin()) {
return false;
}
return $this->checkEntity($user, $entity, $data, 'edit');
return $this->defaultAccessChecker->checkEntityEdit($user, $entity, $data);
}
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
if (!$user->isAdmin()) {
return false;
}
if ($entity->isSystem()) {
return false;
}
if ($entity->isSuperAdmin() && !$user->isSuperAdmin()) {
return false;
}
return $this->defaultAccessChecker->checkEntityDelete($user, $entity, $data);
}
public function checkEntityStream(User $user, Entity $entity, ScopeData $data): bool
{
return $this->aclManager->checkUserPermission($user, $entity, 'user');
}
}

View File

@@ -27,30 +27,35 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Modules\Crm\Acl;
namespace Espo\Classes\Acl\User;
use \Espo\Entities\User;
use \Espo\ORM\Entity;
use Espo\Entities\User;
class Meeting extends \Espo\Core\Acl\Base
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
Acl\OwnershipTeamChecker,
};
class OwnershipChecker implements OwnershipOwnChecker, OwnershipTeamChecker
{
protected $ownerUserIdAttribute = 'usersIds';
public function checkEntityRead(User $user, Entity $entity, $data)
public function checkOwn(User $user, Entity $entity): bool
{
if ($this->checkEntity($user, $entity, $data, 'read')) {
return true;
}
return $user->getId() === $entity->getId();
}
if (is_object($data)) {
if ($data->read === 'own' || $data->read === 'team') {
if ($entity->hasLinkMultipleId('users', $user->id)) {
return true;
}
}
public function checkTeam(User $user, Entity $entity): bool
{
$intersect = array_intersect(
$user->getLinkMultipleIdList('teams'),
$entity->getLinkMultipleIdList('teams')
);
if (count($intersect)) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,107 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Webhook;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\ScopeData,
Acl\DefaultAccessChecker,
Acl\AccessEntityCREDChecker,
Acl\Traits\DefaultAccessCheckerDependency,
};
class AccessChecker implements AccessEntityCREDChecker
{
use DefaultAccessCheckerDependency;
private $defaultAccessChecker;
public function __construct(DefaultAccessChecker $defaultAccessChecker)
{
$this->defaultAccessChecker = $defaultAccessChecker;
}
public function check(User $user, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if (!$user->isApi()) {
return false;
}
if ($data->isFalse()) {
return false;
}
return true;
}
public function checkEntityCreate(User $user, Entity $entity, ScopeData $data): bool
{
return $this->checkEntityInternal($user, $entity, $data);
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
return $this->checkEntityInternal($user, $entity, $data);
}
public function checkEntityEdit(User $user, Entity $entity, ScopeData $data): bool
{
return $this->checkEntityInternal($user, $entity, $data);
}
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
return $this->checkEntityInternal($user, $entity, $data);
}
private function checkEntityInternal(User $user, Entity $entity, ScopeData $data): bool
{
if ($user->isAdmin()) {
return true;
}
if ($data->isFalse()) {
return false;
}
if ($user->isApi() && $user->getId() === $entity->get('userId')) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,46 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Acl\Webhook;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkOwn(User $user, Entity $entity): bool
{
return $user->getId() === $entity->get('userId') && $user->isApi();
}
}

View File

@@ -0,0 +1,158 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AclPortal\Attachment;
use Espo\Entities\{
User,
Note,
};
use Espo\ORM\Entity;
use Espo\Core\{
ORM\EntityManager,
Portal\AclManager,
Acl\ScopeData,
Acl\AccessEntityCREDChecker,
Portal\Acl\DefaultAccessChecker,
Portal\Acl\Traits\DefaultAccessCheckerDependency,
};
class AccessChecker implements AccessEntityCREDChecker
{
use DefaultAccessCheckerDependency;
private $defaultAccessChecker;
private $aclManager;
private $entityManager;
public function __construct(
DefaultAccessChecker $defaultAccessChecker,
AclManager $aclManager,
EntityManager $entityManager
) {
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
$this->entityManager = $entityManager;
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('parentType') === 'Settings') {
return true;
}
$parent = null;
$hasParent = false;
if ($entity->get('parentId') && $entity->get('parentType')) {
$hasParent = true;
$parent = $this->entityManager->getEntity($entity->get('parentType'), $entity->get('parentId'));
}
else if ($entity->get('relatedId') && $entity->get('relatedType')) {
$hasParent = true;
$parent = $this->entityManager->getEntity($entity->get('relatedType'), $entity->get('relatedId'));
}
if (!$hasParent) {
if ($entity->get('createdById') === $user->getId()) {
return true;
}
return false;
}
if ($parent->getEntityType() === 'Note') {
$result = $this->checkEntityReadNoteParent($user, $parent);
if ($result !== null) {
return $result;
}
}
else if ($this->aclManager->checkEntity($user, $parent)) {
return true;
}
if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) {
return true;
}
return false;
}
private function checkEntityReadNoteParent(User $user, Note $note): ?bool
{
if ($note->isInternal()) {
return false;
}
if ($note->getTargetType() === Note::TARGET_PORTALS) {
$intersect = array_intersect(
$note->getLinkMultipleIdList('portals'),
$user->getLinkMultipleIdList('portals')
);
if (count($intersect)) {
return true;
}
return false;
}
if ($note->getTargetType() === Note::TARGET_USERS) {
$isRelated = $this->entityManager
->getRDBRepository('Note')
->getRelation($note, 'users')
->isRelated($user);
if ($isRelated) {
return true;
}
return false;
}
if (!$note->getParentId() || !$note->getParentType()) {
return null;
}
$parent = $this->entityManager->getEntity($note->getParentType(), $note->getParentId());
if ($parent && $this->aclManager->checkEntity($user, $parent)) {
return true;
}
return null;
}
}

View File

@@ -0,0 +1,52 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AclPortal\Attachment;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
private const ATTR_CREATED_BY_ID = 'createdById';
public function checkOwn(User $user, Entity $entity): bool
{
if ($user->getId() === $entity->get(self::ATTR_CREATED_BY_ID)) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,83 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AclPortal\Email;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Portal\AclManager,
Acl\Table,
Acl\ScopeData,
Acl\AccessEntityCREDSChecker,
Portal\Acl\DefaultAccessChecker,
Portal\Acl\Traits\DefaultAccessCheckerDependency,
};
class AccessChecker implements AccessEntityCREDSChecker
{
use DefaultAccessCheckerDependency;
private $defaultAccessChecker;
private $aclManager;
public function __construct(
DefaultAccessChecker $defaultAccessChecker,
AclManager $aclManager
) {
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) {
return true;
}
if ($data->isFalse()) {
return false;
}
if ($data->getRead() === Table::LEVEL_NO) {
return false;
}
$userIdList = $entity->getLinkMultipleIdLIst('users');
if (is_array($userIdList) && in_array($user->getId(), $userIdList)) {
return true;
}
return false;
}
}

View File

@@ -27,19 +27,24 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\AclPortal;
namespace Espo\Classes\AclPortal\Email;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
use Espo\Entities\User;
class Notification extends \Espo\Core\AclPortal\Base
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkIsOwner(EntityUser $user, Entity $entity)
public function checkOwn(User $user, Entity $entity): bool
{
if ($user->id === $entity->get('userId')) {
if ($user->getId() === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,189 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AclPortal\Note;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Portal\AclManager,
Acl\ScopeData,
Acl\AccessEntityCREDChecker,
Portal\Acl\DefaultAccessChecker,
Portal\Acl\Traits\DefaultAccessCheckerDependency,
ORM\EntityManager,
Utils\Config,
};
use DateTime;
use Exception;
class AccessChecker implements AccessEntityCREDChecker
{
use DefaultAccessCheckerDependency;
private const EDIT_PERIOD = '7 days';
private const DELETE_PERIOD = '1 month';
private $defaultAccessChecker;
private $aclManager;
private $entityManager;
private $config;
public function __construct(
DefaultAccessChecker $defaultAccessChecker,
AclManager $aclManager,
EntityManager $entityManager,
Config $config
) {
$this->defaultAccessChecker = $defaultAccessChecker;
$this->aclManager = $aclManager;
$this->entityManager = $entityManager;
$this->config = $config;
}
public function checkEntityCreate(User $user, Entity $entity, ScopeData $data): bool
{
$parentId = $entity->get('parentId');
$parentType = $entity->get('parentType');
if (!$parentId || !$parentType) {
return $this->defaultAccessChecker->checkEntityCreate($user, $entity, $data);
}
$parent = $this->entityManager->getEntity($parentType, $parentId);
if ($parent && $this->aclManager->checkEntityStream($user, $parent)) {
return true;
}
return $this->defaultAccessChecker->checkEntityCreate($user, $entity, $data);
}
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
{
if ($entity->get('type') !== 'Post') {
return false;
}
if ($entity->get('type') === 'Post' && $entity->get('targetType')) {
return false;
}
if (!$entity->get('parentId') || !$entity->get('parentType')) {
return false;
}
$parent = $this->entityManager->getEntity($entity->get('parentType'), $entity->get('parentId'));
if ($parent) {
if ($this->aclManager->checkEntityStream($user, $parent)) {
return true;
}
}
return false;
}
public function checkEntityEdit(User $user, Entity $entity, ScopeData $data): bool
{
if (!$this->defaultAccessChecker->checkEntityEdit($user, $entity, $data)) {
return false;
}
if (!$this->aclManager->checkOwnershipOwn($user, $entity)) {
return true;
}
$createdAt = $entity->get('createdAt');
if (!$createdAt) {
return true;
}
$noteEditThresholdPeriod =
'-' . $this->config->get('noteEditThresholdPeriod', self::EDIT_PERIOD);
$dt = new DateTime();
$dt->modify($noteEditThresholdPeriod);
try {
if ($dt->format('U') > (new DateTime($createdAt))->format('U')) {
return false;
}
}
catch (Exception $e) {
return false;
}
return true;
}
public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool
{
if (!$this->defaultAccessChecker->checkEntityDelete($user, $entity, $data)) {
return false;
}
if (!$this->aclManager->checkOwnershipOwn($user, $entity)) {
return true;
}
$createdAt = $entity->get('createdAt');
if (!$createdAt) {
return true;
}
$deleteThresholdPeriod =
'-' . $this->config->get('noteDeleteThresholdPeriod', self::DELETE_PERIOD);
$dt = new DateTime();
$dt->modify($deleteThresholdPeriod);
try {
if ($dt->format('U') > (new DateTime($createdAt))->format('U')) {
return false;
}
}
catch (Exception $e) {
return false;
}
return true;
}
}

View File

@@ -0,0 +1,50 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AclPortal\Note;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkOwn(User $user, Entity $entity): bool
{
if ($entity->get('type') === 'Post' && $user->getId() === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -27,23 +27,24 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Modules\Crm\AclPortal;
namespace Espo\Classes\AclPortal\Notification;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\AclPortal\Acl;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class Contact extends Acl
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkIsOwnContact(User $user, Entity $entity)
public function checkOwn(User $user, Entity $entity): bool
{
$contactId = $user->get('contactId');
if ($contactId) {
if ($entity->id === $contactId) {
return true;
}
if ($user->getId() === $entity->get('userId')) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,46 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AclPortal\User;
use Espo\Entities\User;
use Espo\ORM\Entity;
use Espo\Core\{
Acl\OwnershipOwnChecker,
};
class OwnershipChecker implements OwnershipOwnChecker
{
public function checkOwn(User $user, Entity $entity): bool
{
return $user->getId() === $entity->getId();
}
}

View File

@@ -29,14 +29,14 @@
namespace Espo\Classes\AddressFormatters;
use Espo\Core\FieldUtils\Address\{
AddressFormatter,
AddressValue,
use Espo\Core\{
Field\Address,
Field\Address\AddressFormatter,
};
class Formatter1 implements AddressFormatter
{
public function format(AddressValue $address) : string
public function format(Address $address): string
{
$result = '';

View File

@@ -29,14 +29,14 @@
namespace Espo\Classes\AddressFormatters;
use Espo\Core\FieldUtils\Address\{
AddressFormatter,
AddressValue,
use Espo\Core\{
Field\Address,
Field\Address\AddressFormatter,
};
class Formatter2 implements AddressFormatter
{
public function format(AddressValue $address) : string
public function format(Address $address): string
{
$result = '';

View File

@@ -29,14 +29,14 @@
namespace Espo\Classes\AddressFormatters;
use Espo\Core\FieldUtils\Address\{
AddressFormatter,
AddressValue,
use Espo\Core\{
Field\Address,
Field\Address\AddressFormatter,
};
class Formatter3 implements AddressFormatter
{
public function format(AddressValue $address) : string
public function format(Address $address): string
{
$result = '';

View File

@@ -29,14 +29,14 @@
namespace Espo\Classes\AddressFormatters;
use Espo\Core\FieldUtils\Address\{
AddressFormatter,
AddressValue,
use Espo\Core\{
Field\Address,
Field\Address\AddressFormatter,
};
class Formatter4 implements AddressFormatter
{
public function format(AddressValue $address) : string
public function format(Address $address): string
{
$result = '';

View File

@@ -30,28 +30,26 @@
namespace Espo\Classes\AppInfo;
use Espo\Core\{
Utils\File\Manager as FileManager,
Utils\Module,
Binding\EspoBindingLoader,
Binding\Binding as BindingItem,
Console\Command\Params,
};
class Binding
{
protected $fileManager;
private $module;
public function __construct(FileManager $fileManager)
public function __construct(Module $module)
{
$this->fileManager = $fileManager;
$this->module = $module;
}
public function process(array $options, array $flagList) : ?string
public function process(Params $params): string
{
$result = '';
$bindingLoader = new EspoBindingLoader(
new Module($this->fileManager)
);
$bindingLoader = new EspoBindingLoader($this->module);
$data = $bindingLoader->load();
@@ -78,7 +76,7 @@ class Binding
return $result;
}
private function printItem(string $key, BindingItem $binding) : string
private function printItem(string $key, BindingItem $binding): string
{
$result = '';
@@ -94,6 +92,7 @@ class Binding
BindingItem::CONTAINER_SERVICE => 'Service',
BindingItem::VALUE => 'Value',
BindingItem::CALLBACK => 'Callback',
BindingItem::FACTORY_CLASS_NAME => 'Factory',
][$type];
$result .= $tab . "Type: {$typeString}\n";

View File

@@ -32,12 +32,14 @@ namespace Espo\Classes\AppInfo;
use Espo\Core\{
Container as ContainerService,
Utils\Metadata,
Console\Command\Params,
};
class Container
{
protected $container;
protected $metadata;
private $container;
private $metadata;
public function __construct(ContainerService $container, Metadata $metadata)
{
@@ -45,9 +47,9 @@ class Container
$this->metadata = $metadata;
}
public function process(array $options, array $flagList) : ?string
public function process(Params $params): string
{
$nameOnly = in_array('nameOnly', $flagList);
$nameOnly = $params->hasFlag('nameOnly');
$result = '';

View File

@@ -0,0 +1,68 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\AppInfo;
use Espo\Core\Console\Command\Params;
use Espo\Core\Utils\ClassFinder;
use Espo\Core\Job\MetadataProvider;
class Jobs
{
private $classFinder;
private $metadataProvider;
public function __construct(ClassFinder $classFinder, MetadataProvider $metadataProvider)
{
$this->classFinder = $classFinder;
$this->metadataProvider = $metadataProvider;
}
public function process(Params $params): string
{
$result = "Available jobs:\n\n";
$list = array_map(
function ($item) {
return ' ' . $item;
},
array_unique(
array_merge(
array_keys($this->classFinder->getMap('Jobs')),
$this->metadataProvider->getScheduledJobNameList()
)
)
);
asort($list);
return $result . implode("\n", $list) . "\n";
}
}

View File

@@ -31,7 +31,7 @@ namespace Espo\Classes\AppParams;
use Espo\Core\{
Acl,
Select\SelectManagerFactory,
Select\SelectBuilderFactory,
ORM\EntityManager,
};
@@ -41,17 +41,17 @@ use Espo\Core\{
class TemplateEntityTypeList
{
protected $acl;
protected $selectManagerFactory;
protected $selectBuilderFactory;
protected $entityManager;
public function __construct(Acl $acl, SelectManagerFactory $selectManagerFactory, EntityManager $entityManager)
public function __construct(Acl $acl, SelectBuilderFactory $selectBuilderFactory, EntityManager $entityManager)
{
$this->acl = $acl;
$this->selectManagerFactory = $selectManagerFactory;
$this->selectBuilderFactory = $selectBuilderFactory;
$this->entityManager = $entityManager;
}
public function get()
public function get() : array
{
if (!$this->acl->checkScope('Template')) {
return [];
@@ -59,17 +59,21 @@ class TemplateEntityTypeList
$list = [];
$selectManager = $this->selectManagerFactory->create('Template');
$selectParams = $selectManager->getEmptySelectParams();
$selectManager->applyAccess($selectParams);
$templateList = $this->entityManager->getRepository('Template')
$query = $this->selectBuilderFactory
->create()
->from('Template')
->withAccessControlFilter()
->buildQueryBuilder()
->select(['entityType'])
->groupBy(['entityType'])
->find($selectParams);
->group(['entityType'])
->build();
foreach ($templateList as $template) {
$templateCollection = $this->entityManager
->getRepository('Template')
->clone($query)
->find();
foreach ($templateCollection as $template) {
$list[] = $template->get('entityType');
}

View File

@@ -27,78 +27,93 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Notificators;
use Espo\ORM\Entity;
use Espo\Core\Notificators\DefaultNotificator;
namespace Espo\Classes\AssignmentNotificators;
use Espo\Services\Email as EmailService;
use Espo\Services\Stream as StreamService;
use Espo\Core\Notification\AssignmentNotificator;
use Espo\Core\Notification\AssignmentNotificator\Params;
use Espo\Core\Notification\UserEnabledChecker;
use Espo\Core\ServiceFactory;
use Espo\Core\AclManager;
use Espo\ORM\EntityManager;
use Espo\ORM\Entity;
use Espo\Entities\User;
use Espo\Entities\Notification;
use Espo\Core\{
ORM\EntityManager,
ServiceFactory,
AclManager,
};
use DateTime;
use Exception;
class Email extends DefaultNotificator
class Email implements AssignmentNotificator
{
const DAYS_THRESHOLD = 2;
private const DAYS_THRESHOLD = 2;
private $streamService = null;
protected $user;
protected $entityManager;
protected $serviceFactory;
protected $aclManager;
private $user;
private $entityManager;
private $serviceFactory;
private $aclManager;
private $userChecker;
public function __construct(
User $user,
EntityManager $entityManager,
UserEnabledChecker $userChecker,
ServiceFactory $serviceFactory,
AclManager $aclManager
) {
$this->user = $user;
$this->entityManager = $entityManager;
$this->userChecker = $userChecker;
$this->serviceFactory = $serviceFactory;
$this->aclManager = $aclManager;
}
protected function getStreamService()
{
if (empty($this->streamService)) {
$this->streamService = $this->serviceFactory->create('Stream');
}
return $this->streamService;
}
public function process(Entity $entity, array $options = [])
public function process(Entity $entity, Params $params): void
{
if (!in_array($entity->get('status'), ['Archived', 'Sent', 'Being Imported'])) {
return;
}
if (!empty($options['isJustSent'])) {
if ($params->getOption('isJustSent')) {
$previousUserIdList = [];
} else {
}
else {
$previousUserIdList = $entity->getFetched('usersIds');
if (!is_array($previousUserIdList)) {
$previousUserIdList = [];
}
}
$dateSent = $entity->get('dateSent');
if (!$dateSent) return;
$dt = null;
if (!$dateSent) {
return;
}
try {
$dt = new \DateTime($dateSent);
} catch (\Exception $e) {}
if (!$dt) return;
$dt = new DateTime($dateSent);
}
catch (Exception $e) {
return;
}
if ($dt->diff(new \DateTime())->days > self::DAYS_THRESHOLD) return;
if (!$dt) {
return;
}
if ($dt->diff(new DateTime())->days > self::DAYS_THRESHOLD) {
return;
}
$emailUserIdList = $entity->get('usersIds');
@@ -107,14 +122,19 @@ class Email extends DefaultNotificator
}
$userIdList = [];
foreach ($emailUserIdList as $userId) {
if (!in_array($userId, $userIdList) && !in_array($userId, $previousUserIdList) && $userId != $this->user->id) {
if (
!in_array($userId, $userIdList) &&
!in_array($userId, $previousUserIdList) &&
$userId !== $this->user->getId()
) {
$userIdList[] = $userId;
}
}
$data = [
'emailId' => $entity->id,
'emailId' => $entity->getId(),
'emailName' => $entity->get('name'),
];
@@ -125,54 +145,81 @@ class Email extends DefaultNotificator
if (!$entity->has('to')) {
$this->entityManager->getRepository('Email')->loadToField($entity);
}
$person = null;
$from = $entity->get('from');
if ($from) {
$person = $this->entityManager->getRepository('EmailAddress')
$person = $this->entityManager
->getRepository('EmailAddress')
->getEntityByAddress($from, null, ['User', 'Contact', 'Lead']);
if ($person) {
$data['personEntityType'] = $person->getEntityType();
$data['personEntityName'] = $person->get('name');
$data['personEntityId'] = $person->id;
$data['personEntityId'] = $person->getId();
}
}
$userIdFrom = null;
if ($person && $person->getEntityType() == 'User') {
if ($person && $person->getEntityType() === 'User') {
$userIdFrom = $person->id;
}
if (empty($data['personEntityId'])) {
$data['fromString'] = EmailService::parseFromName($entity->get('fromString'));
if (empty($data['fromString']) && $from) {
$data['fromString'] = $from;
}
}
$parent = null;
if ($entity->get('parentId') && $entity->get('parentType')) {
$parent = $this->entityManager->getEntity($entity->get('parentType'), $entity->get('parentId'));
}
$account = null;
if ($entity->get('accountId')) {
$account = $this->entityManager->getEntity('Account', $entity->get('accountId'));
}
foreach ($userIdList as $userId) {
if (!$userId) continue;
if ($userIdFrom === $userId) continue;
if ($entity->getLinkMultipleColumn('users', 'inTrash', $userId)) continue;
if (!$this->isNotificationsEnabledForUser($userId)) return;
if (!$userId) {
continue;
}
if (!empty($options['isBeingImported']) || !empty($options['isJustSent'])) {
if ($userIdFrom === $userId) {
continue;
}
if ($entity->getLinkMultipleColumn('users', 'inTrash', $userId)) {
continue;
}
if (!$this->userChecker->checkAssignment('Email', $userId)) {
continue;
}
if (
$params->getOption('isBeingImported') ||
$params->getOption('isJustSent')
) {
$folderId = $entity->getLinkMultipleColumn('users', 'folderId', $userId);
if ($folderId) {
if (
$this->entityManager->getRepository('EmailFolder')->where([
'id' => $folderId,
'skipNotifications' => true
])->count()
$this->entityManager
->getRepository('EmailFolder')
->where([
'id' => $folderId,
'skipNotifications' => true,
])
->count()
) {
continue;
}
@@ -180,41 +227,70 @@ class Email extends DefaultNotificator
}
$user = $this->entityManager->getEntity('User', $userId);
if (!$user) continue;
if ($user->isPortal()) continue;
if (!$user) {
continue;
}
if ($user->isPortal()) {
continue;
}
if (!$this->aclManager->checkScope($user, 'Email')) {
continue;
}
if ($entity->get('status') == 'Archived' || !empty($options['isBeingImported'])) {
if ($parent) {
if ($this->getStreamService()->checkIsFollowed($parent, $userId)) {
continue;
}
}
if ($account) {
if ($this->getStreamService()->checkIsFollowed($account, $userId)) {
continue;
}
}
}
if (
$this->entityManager->getRepository('Notification')->where([
'type' => 'EmailReceived',
'userId' => $userId,
'relatedId' => $entity->id,
'relatedType' => 'Email',
])->select(['id'])->findOne()
) continue;
$notification = $this->entityManager->getEntity('Notification');
$notification->set([
'type' => 'EmailReceived',
$isArchivedOrBeingImported =
$entity->get('status') === 'Archived' ||
$params->getOption('isBeingImported');
if (
$isArchivedOrBeingImported &&
$parent &&
$this->getStreamService()->checkIsFollowed($parent, $userId)
) {
continue;
}
if (
$isArchivedOrBeingImported &&
$account &&
$this->getStreamService()->checkIsFollowed($account, $userId)
) {
continue;
}
$existing = $this->entityManager
->getRepository(Notification::ENTITY_TYPE)
->where([
'type' => Notification::TYPE_EMAIL_RECEIVED,
'userId' => $userId,
'relatedId' => $entity->getId(),
'relatedType' => 'Email',
])
->select(['id'])
->findOne();
if ($existing) {
continue;
}
$this->entityManager->createEntity(Notification::ENTITY_TYPE, [
'type' => Notification::TYPE_EMAIL_RECEIVED,
'userId' => $userId,
'data' => $data,
'relatedId' => $entity->id,
'relatedId' => $entity->getId(),
'relatedType' => 'Email',
]);
$this->entityManager->saveEntity($notification);
}
}
private function getStreamService(): StreamService
{
if (empty($this->streamService)) {
$this->streamService = $this->serviceFactory->create('Stream');
}
return $this->streamService;
}
}

View File

@@ -29,17 +29,19 @@
namespace Espo\Classes\Cleanup;
use Espo\Core\{
Utils\Config,
ORM\EntityManager,
};
use Espo\Core\Cleanup\Cleanup;
use Espo\Core\Utils\Config;
use Espo\ORM\EntityManager;
use DateTime;
class Reminders
class Reminders implements Cleanup
{
protected $config;
protected $entityManager;
private $config;
private $entityManager;
private $cleanupRemindersPeriod = '15 days';
public function __construct(Config $config, EntityManager $entityManager)
{
@@ -47,9 +49,7 @@ class Reminders
$this->entityManager = $entityManager;
}
protected $cleanupRemindersPeriod = '15 days';
public function process()
public function process(): void
{
$period = '-' . $this->config->get('cleanupRemindersPeriod', $this->cleanupRemindersPeriod);
@@ -57,7 +57,8 @@ class Reminders
$dt->modify($period);
$delete = $this->entityManager->getQueryBuilder()
$delete = $this->entityManager
->getQueryBuilder()
->delete()
->from('Reminder')
->where([

View File

@@ -0,0 +1,77 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Cleanup;
use Espo\Core\Cleanup\Cleanup;
use Espo\Core\Utils\Config;
use Espo\Core\Utils\DateTime as DateTimeUtil;
use Espo\ORM\EntityManager;
use Espo\Entities\TwoFactorCode;
use DateTime;
class TwoFactorCodes implements Cleanup
{
private const PERIOD = '5 days';
private $config;
private $entityManager;
public function __construct(Config $config, EntityManager $entityManager)
{
$this->config = $config;
$this->entityManager = $entityManager;
}
public function process(): void
{
$period = '-' . $this->config->get('cleanupTwoFactorCodesPeriod', self::PERIOD);
$from = (new DateTime())
->modify($period)
->format(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT);
$query = $this->entityManager
->getQueryBuilder()
->delete()
->from(TwoFactorCode::ENTITY_TYPE)
->where([
'createdAt<' => $from,
])
->build();
$this->entityManager
->getQueryExecutor()
->execute($query);
}
}

View File

@@ -29,19 +29,19 @@
namespace Espo\Classes\Cleanup;
use Espo\Core\{
Utils\Config,
ORM\EntityManager,
};
use Espo\Core\Cleanup\Cleanup;
use Espo\Core\Utils\Config;
use Espo\ORM\EntityManager;
use DateTime;
class WebhookQueue
class WebhookQueue implements Cleanup
{
protected $cleanupWebhookQueuePeriod = '10 days';
private $cleanupWebhookQueuePeriod = '10 days';
protected $config;
protected $entityManager;
private $config;
private $entityManager;
public function __construct(Config $config, EntityManager $entityManager)
{
@@ -49,7 +49,7 @@ class WebhookQueue
$this->entityManager = $entityManager;
}
public function process()
public function process(): void
{
$period = '-' . $this->config->get('cleanupWebhookQueuePeriod', $this->cleanupWebhookQueuePeriod);
@@ -58,7 +58,8 @@ class WebhookQueue
$datetime->modify($period);
$from = $datetime->format('Y-m-d H:i:s');
$query = $this->entityManager->getQueryBuilder()
$query1 = $this->entityManager
->getQueryBuilder()
->delete()
->from('WebhookQueueItem')
->where([
@@ -70,9 +71,10 @@ class WebhookQueue
])
->build();
$this->entityManager->getQueryExecutor()->execute($query);
$this->entityManager->getQueryExecutor()->execute($query1);
$query = $this->entityManager->getQueryBuilder()
$query2 = $this->entityManager
->getQueryBuilder()
->delete()
->from('WebhookEventQueueItem')
->where([
@@ -84,6 +86,6 @@ class WebhookQueue
])
->build();
$this->entityManager->getQueryExecutor()->execute($query);
$this->entityManager->getQueryExecutor()->execute($query2);
}
}

View File

@@ -29,42 +29,43 @@
namespace Espo\Classes\ConsoleCommands;
use Espo\Tools\Import\Service;
use Espo\Core\{
ServiceFactory,
Console\Commands\Command,
Console\Command,
Console\Command\Params,
Console\IO,
};
use Throwable;
class Import implements Command
{
protected $serviceFactory;
private $service;
public function __construct(ServiceFactory $serviceFactory)
public function __construct(Service $service)
{
$this->serviceFactory = $serviceFactory;
$this->service = $service;
}
public function run(array $options, array $flagList)
public function run(Params $params, IO $io) : void
{
$id = $options['id'] ?? null;
$filePath = $options['file'] ?? null;
$paramsId = $options['paramsId'] ?? null;
$id = $params->getOption('id');
$filePath = $params->getOption('file');
$paramsId = $params->getOption('paramsId');
$service = $this->serviceFactory->create('Import');
$forceResume = in_array('resume', $flagList);
$revert = in_array('revert', $flagList);
$forceResume = $params->hasFlag('resume');
$revert = $params->hasFlag('revert');
if (!$id && $filePath) {
if (!$paramsId) {
$this->out("You need to specify --params-id option.\n");
$io->writeLine("You need to specify --params-id option.");
return;
}
if (!file_exists($filePath)) {
$this->out("File not found.\n");
$io->writeLine("File not found.");
return;
}
@@ -72,67 +73,60 @@ class Import implements Command
$contents = file_get_contents($filePath);
try {
$result = $service->importFileWithParamsId($contents, $paramsId);
$result = $this->service->importContentsWithParamsId($contents, $paramsId);
$resultId = $result->id;
$countCreated = $result->countCreated;
$countUpdated = $result->countUpdated;
$resultId = $result->getId();
$countCreated = $result->getCountCreated();
$countUpdated = $result->getCountUpdated();
}
catch (Throwable $e) {
$this->out("Error occured: ".$e->getMessage()."\n");
$io->writeLine("Error occurred: ". $e->getMessage() . "");
return;
}
$this->out("Finished. Import ID: {$resultId}. Created: {$countCreated}. Updated: {$countUpdated}.\n");
$io->writeLine("Finished. Import ID: {$resultId}. Created: {$countCreated}. Updated: {$countUpdated}.");
return;
}
if ($id && $revert) {
$this->out("Reverting import...\n");
$io->writeLine("Reverting import...");
try {
$service->revert($id);
$this->service->revert($id);
}
catch (Throwable $e) {
$this->out("Error occured: " . $e->getMessage() . "\n");
$io->writeLine("Error occurred: " . $e->getMessage() . "");
return;
}
$this->out("Finished.\n");
$io->writeLine("Finished.");
return;
}
if ($id) {
$this->out("Running import, this may take a while...\n");
$io->writeLine("Running import, this may take a while...");
try {
$result = $service->importById($id, true, $forceResume);
$result = $this->service->importById($id, true, $forceResume);
}
catch (Throwable $e) {
$this->out("Error occured: " . $e->getMessage() . "\n");
$io->writeLine("Error occurred: " . $e->getMessage() . "");
return;
}
$countCreated = $result->countCreated;
$countUpdated = $result->countUpdated;
$countCreated = $result->getCountCreated();
$countUpdated = $result->getCountUpdated();
$this->out("Finished. Created: {$countCreated}. Updated: {$countUpdated}.\n");
$io->writeLine("Finished. Created: {$countCreated}. Updated: {$countUpdated}.");
return;
}
$this->out("Not enough params passed.\n");
return;
}
protected function out($string)
{
fwrite(\STDOUT, $string);
$io->writeLine("Not enough params passed.");
}
}

View File

@@ -40,7 +40,7 @@ class DefaultSidePanelType
$this->metadata = $metadata;
}
public function get(string $scope) : array
public function get(string $scope): array
{
$list = [];

View File

@@ -0,0 +1,104 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\DuplicateWhereBuilders;
use Espo\Core\Duplicate\WhereBuilder;
use Espo\ORM\{
Query\Part\Condition as Cond,
Query\Part\WhereItem,
Query\Part\Where\OrGroup,
Entity,
};
class Company implements WhereBuilder
{
public function build(Entity $entity): ?WhereItem
{
$orBuilder = OrGroup::createBuilder();
$toCheck = false;
if ($entity->get('name')) {
$orBuilder->add(
Cond::equal(
Cond::column('name'),
$entity->get('name')
),
);
$toCheck = true;
}
if (
($entity->get('emailAddress') || $entity->get('emailAddressData')) &&
(
$entity->isNew() ||
$entity->isAttributeChanged('emailAddress') ||
$entity->isAttributeChanged('emailAddressData')
)
) {
foreach ($this->getEmailAddressList($entity) as $emailAddress) {
$orBuilder->add(
Cond::equal(
Cond::column('emailAddress'),
$emailAddress
)
);
$toCheck = true;
}
}
if (!$toCheck) {
return null;
}
return $orBuilder->build();
}
private function getEmailAddressList(Entity $entity): array
{
if ($entity->get('emailAddressData')) {
/* @var $eaGroup EmailAddressGroup */
$eaGroup = $entity->getValueObject('emailAddress');
return $eaGroup->getAddressList();
}
if ($entity->get('emailAddress')) {
return [
$entity->get('emailAddress')
];
}
return [];
}
}

View File

@@ -0,0 +1,113 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\DuplicateWhereBuilders;
use Espo\Core\{
Duplicate\WhereBuilder,
Field\EmailAddressGroup,
};
use Espo\ORM\{
Query\Part\Condition as Cond,
Query\Part\WhereItem,
Query\Part\Where\OrGroup,
Entity,
};
class Person implements WhereBuilder
{
public function build(Entity $entity): ?WhereItem
{
$orBuilder = OrGroup::createBuilder();
$toCheck = false;
if ($entity->get('firstName') || $entity->get('lastName')) {
$orBuilder->add(
Cond::and(
Cond::equal(
Cond::column('firstName'),
$entity->get('firstName')
),
Cond::equal(
Cond::column('lastName'),
$entity->get('lastName')
)
)
);
$toCheck = true;
}
if (
($entity->get('emailAddress') || $entity->get('emailAddressData')) &&
(
$entity->isNew() ||
$entity->isAttributeChanged('emailAddress') ||
$entity->isAttributeChanged('emailAddressData')
)
) {
foreach ($this->getEmailAddressList($entity) as $emailAddress) {
$orBuilder->add(
Cond::equal(
Cond::column('emailAddress'),
$emailAddress
)
);
$toCheck = true;
}
}
if (!$toCheck) {
return null;
}
return $orBuilder->build();
}
private function getEmailAddressList(Entity $entity): array
{
if ($entity->get('emailAddressData')) {
/* @var $eaGroup EmailAddressGroup */
$eaGroup = $entity->getValueObject('emailAddress');
return $eaGroup->getAddressList();
}
if ($entity->get('emailAddress')) {
return [
$entity->get('emailAddress')
];
}
return [];
}
}

View File

@@ -0,0 +1,63 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Email;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
ORM\EntityManager,
};
use Espo\Repositories\Email as EmailRepository;
class AddressDataLoader implements Loader
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function process(Entity $entity, Params $params): void
{
/* @var $repository EmailRepository */
$repository = $this->entityManager->getRepository('Email');
$repository->loadFromField($entity);
$repository->loadToField($entity);
$repository->loadCcField($entity);
$repository->loadBccField($entity);
$repository->loadReplyToField($entity);
$repository->loadNameHash($entity);
}
}

View File

@@ -0,0 +1,205 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Email;
use Espo\ORM\Entity;
use Espo\ORM\EntityManager;
use Espo\Repositories\EmailAddress as EmailAddressRepository;
use Espo\Entities\EmailAddress;
use Espo\Entities\Email;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
Mail\Event\Event as EspoEvent,
Mail\Event\EventFactory,
Utils\Log,
};
use ICal\ICal;
use ICal\Event;
use Throwable;
class IcsDataLoader implements Loader
{
private $entityManager;
private $log;
private $entityTypeLinkMap = [
'User' => 'users',
'Contact' => 'contacts',
'Lead' => 'leads',
];
public function __construct(EntityManager $entityManager, Log $log)
{
$this->entityManager = $entityManager;
$this->log = $log;
}
public function process(Entity $entity, Params $params): void
{
$icsContents = $entity->get('icsContents');
if ($icsContents === null) {
return;
}
$ical = new ICal();
$ical->initString($icsContents);
/* @var $event Event */
$event = $ical->events()[0] ?? null;
if ($event === null) {
return;
}
if ($event->status === 'CANCELLED') {
return;
}
$espoEvent = EventFactory::createFromU01jmg3Ical($ical);
$valueMap = (object) [
'sourceEmailId' => $entity->getId(),
];
try {
$valueMap->name = $espoEvent->getName();
$valueMap->description = $espoEvent->getDescription();
$valueMap->dateStart = $espoEvent->getDateStart();
$valueMap->dateEnd = $espoEvent->getDateEnd();
$valueMap->location = $espoEvent->getLocation();
$valueMap->isAllDay = $espoEvent->isAllDay();
if ($espoEvent->isAllDay()) {
$valueMap->dateStartDate = $espoEvent->getDateStart();
$valueMap->dateEndDate = $espoEvent->getDateEnd();
}
}
catch (Throwable $e) {
$this->log->warning("Error while converting ICS event '" . $entity->getId() . "': " . $e->getMessage());
return;
}
/* @var $emailAddressRepository EmailAddressRepository */
$emailAddressRepository = $this->entityManager->getRepository(EmailAddress::ENTITY_TYPE);
$attendeeEmailAddressList = $espoEvent->getAttendeeEmailAddressList();
$organizerEmailAddress = $espoEvent->getOrganizerEmailAddress();
if ($organizerEmailAddress) {
$attendeeEmailAddressList[] = $organizerEmailAddress;
}
foreach ($attendeeEmailAddressList as $address) {
$personEntity = $emailAddressRepository->getEntityByAddress($address);
if (!$personEntity) {
continue;
}
$link = $this->entityTypeLinkMap[$personEntity->getEntityType()] ?? null;
if (!$link) {
continue;
}
$idsAttribute = $link . 'Ids';
$namesAttribute = $link . 'Names';
$idList = $valueMap->$idsAttribute ?? [];
$nameMap = $valueMap->$namesAttribute ?? (object) [];
$idList[] = $personEntity->getId();
$nameMap->{$personEntity->getId()} = $personEntity->get('name');
$valueMap->$idsAttribute = $idList;
$valueMap->$namesAttribute = $nameMap;
}
$eventData = (object) [
'valueMap' => $valueMap,
'uid' => $espoEvent->getUid(),
'createdEvent' => null,
];
$this->loadCreatedEvent($entity, $espoEvent, $eventData);
$entity->set('icsEventData', $eventData);
$entity->set('icsEventDateStart', $espoEvent->getDateStart());
if ($espoEvent->isAllDay()) {
$entity->set('icsEventDateStartDate', $espoEvent->getDateStart());
}
}
private function loadCreatedEvent(Entity $entity, EspoEvent $espoEvent, object $eventData): void
{
$emailSameEvent = $this->entityManager
->getRDBRepository(Email::ENTITY_TYPE)
->where([
'icsEventUid' => $espoEvent->getUid(),
'id!=' => $entity->getId()
])
->findOne();
if (!$emailSameEvent) {
return;
}
if (
!$emailSameEvent->get('createdEventId') ||
!$emailSameEvent->get('createdEventType')
) {
return;
}
$createdEvent = $this->entityManager
->getEntity($emailSameEvent->get('createdEventType'), $emailSameEvent->get('createdEventId'));
if (!$createdEvent) {
return;
}
$eventData->createdEvent = (object) [
'id' => $createdEvent->getId(),
'entityType' => $emailSameEvent->getEntityType(),
'name' => $createdEvent->get('name'),
];
}
}

View File

@@ -0,0 +1,122 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Email;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
ORM\EntityManager,
};
use Espo\Entities\Email;
use Espo\Entities\User;
class StringDataLoader implements Loader
{
private $entityManager;
private $user;
private $fromEmailAddressNameCache = [];
public function __construct(EntityManager $entityManager, User $user)
{
$this->entityManager = $entityManager;
$this->user = $user;
}
public function process(Entity $entity, Params $params): void
{
$userEmailAdddressIdList = [];
$emailAddressCollection = $this->entityManager
->getRDBRepository('User')
->getRelation($this->user, 'emailAddresses')
->select(['id'])
->find();
foreach ($emailAddressCollection as $emailAddress) {
$userEmailAdddressIdList[] = $emailAddress->getId();
}
if (
in_array($entity->get('fromEmailAddressId'), $userEmailAdddressIdList) ||
$entity->get('createdById') === $this->user->getId() && $entity->get('status') === Email::STATUS_SENT
) {
$entity->loadLinkMultipleField('toEmailAddresses');
$idList = $entity->get('toEmailAddressesIds');
$names = $entity->get('toEmailAddressesNames');
if (empty($idList)) {
return;
}
$list = [];
foreach ($idList as $emailAddressId) {
$person = $this->entityManager
->getRepository('EmailAddress')
->getEntityByAddressId($emailAddressId, null, true);
$list[] = $person ? $person->get('name') : $names->$emailAddressId;
}
$entity->set('personStringData', 'To: ' . implode(', ', $list));
return;
}
$fromEmailAddressId = $entity->get('fromEmailAddressId');
if (!$fromEmailAddressId) {
return;
}
if (!array_key_exists($fromEmailAddressId, $this->fromEmailAddressNameCache)) {
$person = $this->entityManager
->getRepository('EmailAddress')
->getEntityByAddressId($fromEmailAddressId, null, true);
$fromName = $person ? $person->get('name') : null;
$this->fromEmailAddressNameCache[$fromEmailAddressId] = $fromName;
}
$fromName =
$this->fromEmailAddressNameCache[$fromEmailAddressId] ??
$entity->get('fromName') ??
$entity->get('fromEmailAddressName');
$entity->set('personStringData', $fromName);
}
}

View File

@@ -0,0 +1,80 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Email;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
ORM\EntityManager,
};
use Espo\Entities\User;
class UserColumnsLoader implements Loader
{
private $entityManager;
private $user;
public function __construct(EntityManager $entityManager, User $user)
{
$this->entityManager = $entityManager;
$this->user = $user;
}
public function process(Entity $entity, Params $params): void
{
$emailUser = $this->entityManager
->getRepository('EmailUser')
->select(['isRead', 'isImportant', 'inTrash'])
->where([
'deleted' => false,
'userId' => $this->user->getId(),
'emailId' => $entity->getId(),
])
->findOne();
if (!$emailUser) {
$entity->set('isRead', null);
$entity->clear('isImportant');
$entity->clear('inTrash');
return;
}
$entity->set([
'isRead' => $emailUser->get('isRead'),
'isImportant' => $emailUser->get('isImportant'),
'inTrash' => $emailUser->get('inTrash'),
]);
}
}

View File

@@ -0,0 +1,66 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Import;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
ORM\EntityManager,
};
use Espo\Repositories\Import as ImportRepository;
class CountsLoader implements Loader
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function process(Entity $entity, Params $params): void
{
/* @var $repository ImportRepository */
$repository = $this->entityManager->getRepository('Import');
$importedCount = $repository->countResultRecords($entity, 'imported');
$duplicateCount = $repository->countResultRecords($entity, 'duplicates');
$updatedCount = $repository->countResultRecords($entity, 'updated');
$entity->set([
'importedCount' => $importedCount,
'duplicateCount' => $duplicateCount,
'updatedCount' => $updatedCount,
]);
}
}

View File

@@ -0,0 +1,48 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Note;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
};
use Espo\Entities\Note;
class AttachmentsLoader implements Loader
{
public function process(Entity $entity, Params $params): void
{
/* @var $entity Note */
$entity->loadAttachments();
}
}

View File

@@ -0,0 +1,55 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\Portal;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
ORM\EntityManager,
};
class UrlLoader implements Loader
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function process(Entity $entity, Params $params): void
{
$this->entityManager
->getRepository('Portal')
->loadUrlField($entity);
}
}

View File

@@ -0,0 +1,112 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\FieldProcessing\User;
use Espo\ORM\Entity;
use Espo\Core\{
FieldProcessing\Loader,
FieldProcessing\Loader\Params,
ORM\EntityManager,
Acl,
Acl\Table,
};
use DateTime;
use Exception;
class LastAccessLoader implements Loader
{
private $entityManager;
private $acl;
public function __construct(EntityManager $entityManager, Acl $acl)
{
$this->entityManager = $entityManager;
$this->acl = $acl;
}
public function process(Entity $entity, Params $params): void
{
$forbiddenFieldList = $this->acl
->getScopeForbiddenFieldList($entity->getEntityType(), Table::ACTION_READ);
if (in_array('lastAccess', $forbiddenFieldList)) {
return;
}
$authToken = $this->entityManager
->getRDBRepository('AuthToken')
->select(['id', 'lastAccess'])
->where([
'userId' => $entity->getId(),
])
->order('lastAccess', 'DESC')
->findOne();
$lastAccess = null;
if ($authToken) {
$lastAccess = $authToken->get('lastAccess');
}
$dt = null;
if ($lastAccess) {
try {
$dt = new DateTime($lastAccess);
}
catch (Exception $e) {}
}
$where = [
'userId' => $entity->getId(),
'isDenied' => false,
];
if ($dt) {
$where['requestTime>'] = $dt->format('U');
}
$authLogRecord = $this->entityManager
->getRDBRepository('AuthLogRecord')
->select(['id', 'createdAt'])
->where($where)
->order('requestTime', true)
->findOne();
if ($authLogRecord) {
$lastAccess = $authLogRecord->get('createdAt');
}
$entity->set('lastAccess', $lastAccess);
}
}

View File

@@ -31,22 +31,31 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class ArrayType extends BaseType
use StdClass;
class ArrayType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return $this->isNotEmpty($entity, $field);
}
public function checkMaxCount(Entity $entity, string $field, $validationValue, $data) : bool
public function checkMaxCount(Entity $entity, string $field, int $validationValue): bool
{
if (!$this->isNotEmpty($entity, $field)) return true;
if (!$this->isNotEmpty($entity, $field)) {
return true;
}
$list = $entity->get($field);
if (count($list) > $validationValue) return false;
if (count($list) > $validationValue) {
return false;
}
return true;
}
public function checkArray(Entity $entity, string $field, $validationValue, $data) : bool
public function rawCheckArray(StdClass $data, string $field): bool
{
if (isset($data->$field) && $data->$field !== null && !is_array($data->$field)) {
return false;
@@ -55,12 +64,22 @@ class ArrayType extends BaseType
return true;
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
if (!$entity->has($field) || $entity->get($field) === null) return false;
if (!$entity->has($field) || $entity->get($field) === null) {
return false;
}
$list = $entity->get($field);
if (!is_array($list)) return false;
if (count($list)) return true;
if (!is_array($list)) {
return false;
}
if (count($list)) {
return true;
}
return false;
}
}

View File

@@ -33,7 +33,7 @@ use Espo\ORM\Entity;
class CurrencyType extends FloatType
{
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return
$entity->has($field) && $entity->get($field) !== null &&

View File

@@ -31,14 +31,14 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class DateType extends BaseType
class DateType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return $this->isNotEmpty($entity, $field);
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return $entity->has($field) && $entity->get($field) !== null;
}

View File

@@ -33,15 +33,21 @@ use Espo\ORM\Entity;
class DatetimeOptionalType extends DatetimeType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return $this->isNotEmpty($entity, $field);
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
if ($entity->has($field) && $entity->get($field) !== null) return true;
if ($entity->has($field . 'Date') && $entity->get($field . 'Date') !== null) return true;
if ($entity->has($field) && $entity->get($field) !== null) {
return true;
}
if ($entity->has($field . 'Date') && $entity->get($field . 'Date') !== null) {
return true;
}
return false;
}
}

View File

@@ -31,46 +31,61 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class EmailType extends BaseType
class EmailType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
if ($this->isNotEmpty($entity, $field)) return true;
if ($this->isNotEmpty($entity, $field)) {
return true;
}
$dataList = $entity->get($field . 'Data');
if (!is_array($dataList)) return false;
if (!is_array($dataList)) {
return false;
}
foreach ($dataList as $item) {
if (!empty($item->emailAddress)) return true;
if (!empty($item->emailAddress)) {
return true;
}
}
return false;
}
public function checkEmailAddress(Entity $entity, string $field, $validationValue, $data) : bool
public function checkEmailAddress(Entity $entity, string $field): bool
{
if ($this->isNotEmpty($entity, $field)) {
$address = $entity->get($field);
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
return false;
}
}
$dataList = $entity->get($field . 'Data');
if (is_array($dataList)) {
foreach ($dataList as $item) {
if (empty($item->emailAddress)) continue;
$address = $item->emailAddress;
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
return false;
}
if (!is_array($dataList)) {
return true;
}
foreach ($dataList as $item) {
if (empty($item->emailAddress)) {
continue;
}
$address = $item->emailAddress;
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
return false;
}
}
return true;
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return $entity->has($field) && $entity->get($field) !== '' && $entity->get($field) !== null;
}

View File

@@ -31,14 +31,14 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class EnumType extends BaseType
class EnumType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return $this->isNotEmpty($entity, $field);
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return $entity->has($field) && $entity->get($field) !== null;
}

View File

@@ -31,28 +31,40 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class IntType extends BaseType
class IntType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return $this->isNotEmpty($entity, $field);
}
public function checkMax(Entity $entity, string $field, $validationValue, $data) : bool
public function checkMax(Entity $entity, string $field, $validationValue): bool
{
if (!$this->isNotEmpty($entity, $field)) return true;
if ($entity->get($field) > $validationValue) return false;
if (!$this->isNotEmpty($entity, $field)) {
return true;
}
if ($entity->get($field) > $validationValue) {
return false;
}
return true;
}
public function checkMin(Entity $entity, string $field, $validationValue, $data) : bool
public function checkMin(Entity $entity, string $field, $validationValue): bool
{
if (!$this->isNotEmpty($entity, $field)) return true;
if ($entity->get($field) < $validationValue) return false;
if (!$this->isNotEmpty($entity, $field)) {
return true;
}
if ($entity->get($field) < $validationValue) {
return false;
}
return true;
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return $entity->has($field) && $entity->get($field) !== null;
}

View File

@@ -31,21 +31,35 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class JsonArrayType extends BaseType
{
public function checkArray(Entity $entity, string $field, $validationValue, $data) : bool
{
if (!$entity->has($field) || $entity->get($field) === null) return true;
use StdClass;
return is_array($entity->get($field));
class JsonArrayType
{
public function rawCheckArray(StdClass $data, string $field): bool
{
if (isset($data->$field) && $data->$field !== null && !is_array($data->$field)) {
return false;
}
return true;
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
if (!$entity->has($field) || $entity->get($field) === null) return false;
if (!$entity->has($field) || $entity->get($field) === null) {
return false;
}
$list = $entity->get($field);
if (!is_array($list)) return false;
if (count($list)) return true;
if (!is_array($list)) {
return false;
}
if (count($list)) {
return true;
}
return false;
}
}

View File

@@ -31,9 +31,9 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class LinkMultipleType extends BaseType
class LinkMultipleType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return count($entity->getLinkMultipleIdList($field)) > 0;
}

View File

@@ -31,14 +31,18 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class LinkParentType extends BaseType
class LinkParentType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
$idAttribute = $field . 'Id';
$typeAttribute = $field . 'Type';
if (!$entity->has($idAttribute) || $entity->get($idAttribute) === '' || $entity->get($idAttribute) === null) {
if (
!$entity->has($idAttribute) ||
$entity->get($idAttribute) === '' ||
$entity->get($idAttribute) === null
) {
return false;
}

View File

@@ -31,9 +31,9 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class LinkType extends BaseType
class LinkType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
$idAttribute = $field . 'Id';

View File

@@ -31,21 +31,41 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class PersonNameType extends BaseType
use Espo\Core\{
Utils\FieldUtil,
};
class PersonNameType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
private $fieldUtil;
public function __construct(FieldUtil $fieldUtil)
{
$this->fieldUtil = $fieldUtil;
}
public function checkRequired(Entity $entity, string $field): bool
{
$isEmpty = true;
foreach ($this->getActualAttributeList($entity, $field) as $attribute) {
$attributeList = $this->fieldUtil->getActualAttributeList($entity->getEntityType(), $field);
foreach ($attributeList as $attribute) {
if ($attribute === 'salutation' . ucfirst($field)) {
continue;
}
if ($entity->has($attribute) && $entity->get($attribute) !== '') {
$isEmpty = false;
break;
}
}
if ($isEmpty) return false;
if ($isEmpty) {
return false;
}
return true;
}
}

View File

@@ -31,23 +31,30 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class PhoneType extends BaseType
class PhoneType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
if ($this->isNotEmpty($entity, $field)) return true;
if ($this->isNotEmpty($entity, $field)) {
return true;
}
$dataList = $entity->get($field . 'Data');
if (!is_array($dataList)) return false;
if (!is_array($dataList)) {
return false;
}
foreach ($dataList as $item) {
if (!empty($item->phoneNumber)) return true;
if (!empty($item->phoneNumber)) {
return true;
}
}
return false;
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return $entity->has($field) && $entity->get($field) !== '' && $entity->get($field) !== null;
}

View File

@@ -31,25 +31,27 @@ namespace Espo\Classes\FieldValidators;
use Espo\ORM\Entity;
class VarcharType extends BaseType
class VarcharType
{
public function checkRequired(Entity $entity, string $field, $validationValue, $data) : bool
public function checkRequired(Entity $entity, string $field): bool
{
return $this->isNotEmpty($entity, $field);
}
public function checkMaxLength(Entity $entity, string $field, $validationValue, $data) : bool
public function checkMaxLength(Entity $entity, string $field, int $validationValue): bool
{
if ($this->isNotEmpty($entity, $field)) {
$value = $entity->get($field);
if (mb_strlen($value) > $validationValue) {
return false;
}
}
return true;
}
protected function isNotEmpty(Entity $entity, $field)
protected function isNotEmpty(Entity $entity, string $field): bool
{
return $entity->has($field) && $entity->get($field) !== '' && $entity->get($field) !== null;
}

View File

@@ -0,0 +1,109 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\JobPreparators;
use Espo\Core\Utils\DateTime;
use Espo\Core\Job\Job\Status;
use Espo\Core\Job\Preparator;
use Espo\Core\Job\Preparator\Data;
use Espo\ORM\EntityManager;
use Espo\Entities\Job as JobEntity;
use DateTimeImmutable;
class CheckEmailAccounts implements Preparator
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function prepare(Data $data, DateTimeImmutable $executeTime): void
{
$collection = $this->entityManager
->getRDBRepository('EmailAccount')
->join('assignedUser', 'assignedUserAdditional')
->where([
'status' => 'Active',
'useImap' => true,
'assignedUserAdditional.isActive' => true,
])
->find();
foreach ($collection as $entity) {
$running = $this->entityManager
->getRDBRepository(JobEntity::ENTITY_TYPE)
->where([
'scheduledJobId' => $data->getId(),
'status' => [
Status::RUNNING,
Status::READY,
],
'targetType' => 'EmailAccount',
'targetId' => $entity->getId(),
])
->findOne();
if ($running) {
continue;
}
$countPending = $this->entityManager
->getRDBRepository(JobEntity::ENTITY_TYPE)
->where([
'scheduledJobId' => $data->getId(),
'status' => Status::PENDING,
'targetType' => 'EmailAccount',
'targetId' => $entity->getId(),
])
->count();
if ($countPending > 1) {
continue;
}
$jobEntity = $this->entityManager->getEntity(JobEntity::ENTITY_TYPE);
$jobEntity->set([
'name' => $data->getName(),
'scheduledJobId' => $data->getId(),
'executeTime' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT),
'targetType' => 'EmailAccount',
'targetId' => $entity->getId(),
]);
$this->entityManager->saveEntity($jobEntity);
}
}
}

View File

@@ -0,0 +1,107 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\JobPreparators;
use Espo\Core\Utils\DateTime;
use Espo\Core\Job\Job\Status;
use Espo\Core\Job\Preparator;
use Espo\Core\Job\Preparator\Data;
use Espo\ORM\EntityManager;
use Espo\Entities\Job as JobEntity;
use DateTimeImmutable;
class CheckInboundEmails implements Preparator
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function prepare(Data $data, DateTimeImmutable $executeTime): void
{
$collection = $this->entityManager
->getRDBRepository('InboundEmail')
->where([
'status' => 'Active',
'useImap' => true,
])
->find();
foreach ($collection as $entity) {
$running = $this->entityManager
->getRDBRepository(JobEntity::ENTITY_TYPE)
->where([
'scheduledJobId' => $data->getId(),
'status' => [
Status::RUNNING,
Status::READY,
],
'targetType' => 'InboundEmail',
'targetId' => $entity->getId(),
])
->findOne();
if ($running) {
continue;
}
$countPending = $this->entityManager
->getRDBRepository(JobEntity::ENTITY_TYPE)
->where([
'scheduledJobId' => $data->getId(),
'status' => Status::PENDING,
'targetType' => 'InboundEmail',
'targetId' => $entity->getId(),
])
->count();
if ($countPending > 1) {
continue;
}
$jobEntity = $this->entityManager->getEntity(JobEntity::ENTITY_TYPE);
$jobEntity->set([
'name' => $data->getName(),
'scheduledJobId' => $data->getId(),
'executeTime' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT),
'targetType' => 'InboundEmail',
'targetId' => $entity->getId(),
]);
$this->entityManager->saveEntity($jobEntity);
}
}
}

View File

@@ -27,18 +27,21 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
namespace Espo\Classes\Jobs;
use Espo\Core\{
Utils\Config,
ORM\EntityManager,
Jobs\Job,
Job\JobDataLess,
};
class AuthTokenControl implements Job
use DateTime;
class AuthTokenControl implements JobDataLess
{
protected $config;
protected $entityManager;
private $config;
private $entityManager;
public function __construct(Config $config, EntityManager $entityManager)
{
@@ -46,7 +49,7 @@ class AuthTokenControl implements Job
$this->entityManager = $entityManager;
}
public function run()
public function run(): void
{
$authTokenLifetime = $this->config->get('authTokenLifetime');
$authTokenMaxIdleTime = $this->config->get('authTokenMaxIdleTime');
@@ -55,30 +58,39 @@ class AuthTokenControl implements Job
return;
}
$whereClause = array(
'isActive' => true
);
$whereClause = [
'isActive' => true,
];
if ($authTokenLifetime) {
$dt = new \DateTime();
$dt = new DateTime();
$dt->modify('-' . $authTokenLifetime . ' hours');
$authTokenLifetimeThreshold = $dt->format('Y-m-d H:i:s');
$whereClause['createdAt<'] = $authTokenLifetimeThreshold;
}
if ($authTokenMaxIdleTime) {
$dt = new \DateTime();
$dt = new DateTime();
$dt->modify('-' . $authTokenMaxIdleTime . ' hours');
$authTokenMaxIdleTimeThreshold = $dt->format('Y-m-d H:i:s');
$whereClause['lastAccess<'] = $authTokenMaxIdleTimeThreshold;
}
$tokenList = $this->entityManager->getRepository('AuthToken')->where($whereClause)->limit(0, 500)->find();
$tokenList = $this->entityManager
->getRepository('AuthToken')
->where($whereClause)
->limit(0, 500)
->find();
foreach ($tokenList as $token) {
$token->set('isActive', false);
$this->entityManager->saveEntity($token);
}
}

View File

@@ -0,0 +1,83 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Jobs;
use Espo\Core\Exceptions\Error;
use Espo\Services\EmailAccount as Service;
use Espo\Core\{
Job\Job,
Job\Job\Data,
ORM\EntityManager,
};
use Throwable;
class CheckEmailAccounts implements Job
{
private $service;
private $entityManager;
public function __construct(Service $service, EntityManager $entityManager)
{
$this->service = $service;
$this->entityManager = $entityManager;
}
public function run(Data $data): void
{
$targetId = $data->getTargetId();
if (!$targetId) {
throw new Error("No target.");
}
$entity = $this->entityManager->getEntity('EmailAccount', $targetId);
if (!$entity) {
throw new Error("Job CheckEmailAccounts '{$targetId}': EmailAccount does not exist.", -1);
}
if ($entity->get('status') !== 'Active') {
throw new Error("Job CheckEmailAccounts '{$targetId}': EmailAccount is not active.", -1);
}
try {
$this->service->fetchFromMailServer($entity);
}
catch (Throwable $e) {
throw new Error(
'Job CheckEmailAccounts ' . $entity->getId() . ': [' . $e->getCode() . '] ' .$e->getMessage()
);
}
}
}

View File

@@ -0,0 +1,83 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Jobs;
use Espo\Core\Exceptions\Error;
use Espo\Services\InboundEmail as Service;
use Espo\Core\{
Job\Job,
Job\Job\Data,
ORM\EntityManager,
};
use Throwable;
class CheckInboundEmails implements Job
{
private $service;
private $entityManager;
public function __construct(Service $service, EntityManager $entityManager)
{
$this->service = $service;
$this->entityManager = $entityManager;
}
public function run(Data $data): void
{
$targetId = $data->getTargetId();
if (!$targetId) {
throw new Error("No target.");
}
$entity = $this->entityManager->getEntity('InboundEmail', $targetId);
if (!$entity) {
throw new Error("Job CheckInboundEmails '{$targetId}': InboundEmail does not exist.", -1);
}
if ($entity->get('status') !== 'Active') {
throw new Error("Job CheckInboundEmails '{$targetId}': InboundEmail is not active.", -1);
}
try {
$this->service->fetchFromMailServer($entity);
}
catch (Throwable $e) {
throw new Error(
'Job CheckInboundEmails ' . $entity->getId() . ': [' . $e->getCode() . '] ' .$e->getMessage()
);
}
}
}

View File

@@ -27,16 +27,17 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
use Espo\Core\Exceptions;
namespace Espo\Classes\Jobs;
class CheckNewExtensionVersion extends CheckNewVersion
{
public function run()
public function run(): void
{
if (!$this->config->get('adminNotifications') || !$this->config->get('adminNotificationsNewExtensionVersion')) {
return true;
if (
!$this->config->get('adminNotifications') ||
!$this->config->get('adminNotificationsNewExtensionVersion')
) {
return;
}
$job = $this->entityManager->getEntity('Job');
@@ -48,7 +49,5 @@ class CheckNewExtensionVersion extends CheckNewVersion
]);
$this->entityManager->saveEntity($job);
return true;
}
}
}

View File

@@ -27,20 +27,21 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
namespace Espo\Classes\Jobs;
use Espo\Core\{
Utils\Config,
ORM\EntityManager,
Jobs\Job,
Job\JobDataLess,
};
use DateTime;
use DateTimeZone;
class CheckNewVersion implements Job
class CheckNewVersion implements JobDataLess
{
protected $config;
protected $entityManager;
public function __construct(Config $config, EntityManager $entityManager)
@@ -49,13 +50,14 @@ class CheckNewVersion implements Job
$this->entityManager = $entityManager;
}
public function run()
public function run(): void
{
if (!$this->config->get('adminNotifications') || !$this->config->get('adminNotificationsNewVersion')) {
return true;
return;
}
$job = $this->entityManager->getEntity('Job');
$job->set([
'name' => 'Check for New Version (job)',
'serviceName' => 'AdminNotifications',
@@ -65,7 +67,7 @@ class CheckNewVersion implements Job
$this->entityManager->saveEntity($job);
return true;
return;
}
protected function getRunTime()
@@ -77,6 +79,7 @@ class CheckNewVersion implements Job
$time = $nextDay->format('Y-m-d') . ' ' . $hour . ':' . $minute . ':00';
$timeZone = $this->config->get('timeZone');
if (empty($timeZone)) {
$timeZone = 'UTC';
}
@@ -88,6 +91,7 @@ class CheckNewVersion implements Job
/**
* For backward compatibility.
* @deprecated
*/
protected function getEntityManager()
{

View File

@@ -27,19 +27,19 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
namespace Espo\Classes\Jobs;
use Espo\Core\Exceptions;
use Espo\Core\Record\ServiceContainer;
use Espo\Core\{
Utils\Config,
ORM\EntityManager,
Jobs\Job,
Job\JobDataLess,
Utils\Metadata,
Utils\File\Manager as FileManager,
InjectableFactory,
Select\SelectManagerFactory,
ServiceFactory,
Select\SelectBuilderFactory,
Utils\Log,
};
use Espo\ORM\Entity;
@@ -49,25 +49,41 @@ use SplFileInfo;
use Exception;
use Throwable;
class Cleanup implements Job
class Cleanup implements JobDataLess
{
protected $cleanupJobPeriod = '10 days';
protected $cleanupActionHistoryPeriod = '15 days';
protected $cleanupAuthTokenPeriod = '1 month';
protected $cleanupAuthLogPeriod = '2 months';
protected $cleanupNotificationsPeriod = '2 months';
protected $cleanupAttachmentsPeriod = '15 days';
protected $cleanupAttachmentsFromPeriod = '3 months';
protected $cleanupBackupPeriod = '2 month';
protected $cleanupDeletedRecordsPeriod = '3 months';
private $cleanupJobPeriod = '10 days';
protected $config;
protected $entityManager;
protected $metedata;
protected $fileManager;
protected $injectableFactory;
protected $selectManagerFactory;
protected $serviceFactory;
private $cleanupActionHistoryPeriod = '15 days';
private $cleanupAuthTokenPeriod = '1 month';
private $cleanupAuthLogPeriod = '2 months';
private $cleanupNotificationsPeriod = '2 months';
private $cleanupAttachmentsPeriod = '15 days';
private $cleanupAttachmentsFromPeriod = '3 months';
private $cleanupBackupPeriod = '2 month';
private $cleanupDeletedRecordsPeriod = '3 months';
private $config;
private $entityManager;
private $metadata;
private $fileManager;
private $injectableFactory;
private $selectBuilderFactory;
private $recordServiceContainer;
private $log;
public function __construct(
Config $config,
@@ -75,19 +91,21 @@ class Cleanup implements Job
Metadata $metadata,
FileManager $fileManager,
InjectableFactory $injectableFactory,
SelectManagerFactory $selectManagerFactory,
ServiceFactory $serviceFactory
SelectBuilderFactory $selectBuilderFactory,
ServiceContainer $recordServiceContainer,
Log $log
) {
$this->config = $config;
$this->entityManager = $entityManager;
$this->metadata = $metadata;
$this->fileManager = $fileManager;
$this->injectableFactory = $injectableFactory;
$this->selectManagerFactory = $selectManagerFactory;
$this->serviceFactory = $serviceFactory;
$this->selectBuilderFactory = $selectBuilderFactory;
$this->recordServiceContainer = $recordServiceContainer;
$this->log = $log;
}
public function run()
public function run(): void
{
$this->cleanupJobs();
$this->cleanupScheduledJobLog();
@@ -115,15 +133,16 @@ class Cleanup implements Job
foreach ($items as $name => $item) {
try {
$className = $item['className'];
$injectableFactory->create($className)->process();
}
catch (Throwable $e) {
$GLOBALS['log']->error("Cleanup: {$name}: " . $e->getMessage());
$this->log->error("Cleanup: {$name}: " . $e->getMessage());
}
}
}
protected function cleanupJobs()
private function cleanupJobs(): void
{
$delete = $this->entityManager->getQueryBuilder()->delete()
->from('Job')
@@ -147,9 +166,11 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
protected function cleanupUniqueIds()
private function cleanupUniqueIds(): void
{
$delete = $this->entityManager->getQueryBuilder()->delete()
$delete = $this->entityManager
->getQueryBuilder()
->delete()
->from('UniqueId')
->where([
'terminateAt!=' => null,
@@ -160,7 +181,7 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
protected function cleanupScheduledJobLog()
private function cleanupScheduledJobLog(): void
{
$scheduledJobList = $this->entityManager->getRepository('ScheduledJob')
->select(['id'])
@@ -187,7 +208,9 @@ class Cleanup implements Job
$ignoreIdList[] = $logRecord->get('id');
}
$delete = $this->entityManager->getQueryBuilder()->delete()
$delete = $this->entityManager
->getQueryBuilder()
->delete()
->from('ScheduledJobLogRecord')
->where([
'scheduledJobId' => $scheduledJobId,
@@ -200,7 +223,7 @@ class Cleanup implements Job
}
}
protected function cleanupActionHistory()
private function cleanupActionHistory(): void
{
$period = '-' . $this->config->get('cleanupActionHistoryPeriod', $this->cleanupActionHistoryPeriod);
@@ -218,14 +241,16 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
protected function cleanupAuthToken()
private function cleanupAuthToken(): void
{
$period = '-' . $this->config->get('cleanupAuthTokenPeriod', $this->cleanupAuthTokenPeriod);
$datetime = new DateTime();
$datetime->modify($period);
$delete = $this->entityManager->getQueryBuilder()->delete()
$delete = $this->entityManager
->getQueryBuilder()
->delete()
->from('AuthToken')
->where([
'DATE:modifiedAt<' => $datetime->format('Y-m-d'),
@@ -236,7 +261,7 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
protected function cleanupAuthLog()
private function cleanupAuthLog(): void
{
$period = '-' . $this->config->get('cleanupAuthLogPeriod', $this->cleanupAuthLogPeriod);
@@ -244,7 +269,9 @@ class Cleanup implements Job
$datetime->modify($period);
$delete = $this->entityManager->getQueryBuilder()->delete()
$delete = $this->entityManager
->getQueryBuilder()
->delete()
->from('AuthLogRecord')
->where([
'DATE:createdAt<' => $datetime->format('Y-m-d'),
@@ -254,21 +281,18 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
protected function getCleanupJobFromDate()
private function getCleanupJobFromDate(): string
{
$period = '-' . $this->config->get('cleanupJobPeriod', $this->cleanupJobPeriod);
$datetime = new DateTime();
$datetime->modify($period);
return $datetime->format('Y-m-d');
}
protected function cleanupAttachments()
private function cleanupAttachments(): void
{
$pdo = $this->entityManager->getPDO();
$period = '-' . $this->config->get('cleanupAttachmentsPeriod', $this->cleanupAttachmentsPeriod);
$datetime = new DateTime();
@@ -293,17 +317,22 @@ class Cleanup implements Job
}
if ($this->config->get('cleanupOrphanAttachments')) {
$selectManager = $this->selectManagerFactory->create('Attachment');
$orphanQueryBuilder = $this->selectBuilderFactory
->create()
->from('Attachment')
->withPrimaryFilter('orphan')
->buildQueryBuilder();
$selectParams = $selectManager->getEmptySelectParams();
$selectManager->applyFilter('orphan', $selectParams);
$selectParams['whereClause'][] = [
$orphanQueryBuilder->where([
'createdAt<' => $datetime->format('Y-m-d H:i:s'),
'createdAt>' => '2018-01-01 00:00:00',
];
]);
$collection = $this->entityManager->getRepository('Attachment')->limit(0, 5000)->find($selectParams);
$collection = $this->entityManager
->getRepository('Attachment')
->clone($orphanQueryBuilder->build())
->limit(0, 5000)
->find();
foreach ($collection as $entity) {
$this->entityManager->removeEntity($entity);
@@ -418,7 +447,7 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
protected function cleanupEmails()
private function cleanupEmails(): void
{
$dateBefore = date('Y-m-d H:i:s', time() - 3600 * 24 * 20);
@@ -474,7 +503,7 @@ class Cleanup implements Job
}
}
protected function cleanupNotifications()
private function cleanupNotifications(): void
{
$period = '-' . $this->config->get('cleanupNotificationsPeriod', $this->cleanupNotificationsPeriod);
@@ -492,7 +521,7 @@ class Cleanup implements Job
}
}
protected function cleanupUpgradeBackups()
private function cleanupUpgradeBackups(): void
{
$path = 'data/.backup/upgrades';
@@ -514,7 +543,7 @@ class Cleanup implements Job
}
}
protected function cleanupDeletedEntity(Entity $entity)
private function cleanupDeletedEntity(Entity $entity): void
{
$scope = $entity->getEntityType();
@@ -574,7 +603,7 @@ class Cleanup implements Job
$this->entityManager->getQueryExecutor()->execute($delete);
}
catch (Exception $e) {
$GLOBALS['log']->error("Cleanup: " . $e->getMessage());
$this->log->error("Cleanup: " . $e->getMessage());
}
}
@@ -637,7 +666,7 @@ class Cleanup implements Job
}
}
protected function cleanupDeletedRecords()
private function cleanupDeletedRecords(): void
{
if (!$this->config->get('cleanupDeletedRecords')) {
return;
@@ -647,8 +676,6 @@ class Cleanup implements Job
$datetime = new DateTime($period);
$serviceFactory = $this->serviceFactory;
$scopeList = array_keys($this->metadata->get(['scopes']));
foreach ($scopeList as $scope) {
@@ -677,14 +704,11 @@ class Cleanup implements Job
if (!method_exists($repository, 'deleteFromDb')) continue;
$hasCleanupMethod = false;
$service = null;
if ($serviceFactory->checkExists($scope)) {
$service = $serviceFactory->create($scope);
$service = $this->recordServiceContainer->get($scope);
if (method_exists($service, 'cleanup')) {
$hasCleanupMethod = true;
}
if (method_exists($service, 'cleanup')) {
$hasCleanupMethod = true;
}
$whereClause = [
@@ -693,8 +717,8 @@ class Cleanup implements Job
if ($this->metadata->get(['entityDefs', $scope, 'fields', 'modifiedAt'])) {
$whereClause['modifiedAt<'] = $datetime->format('Y-m-d H:i:s');
} else
if ($this->metadata->get(['entityDefs', $scope, 'fields', 'createdAt'])) {
}
else if ($this->metadata->get(['entityDefs', $scope, 'fields', 'createdAt'])) {
$whereClause['createdAt<'] = $datetime->format('Y-m-d H:i:s');
}
@@ -716,7 +740,7 @@ class Cleanup implements Job
$service->cleanup($entity->id);
}
catch (Throwable $e) {
$GLOBALS['log']->error("Cleanup job: Cleanup scope {$scope}: " . $e->getMessage());
$this->log->error("Cleanup job: Cleanup scope {$scope}: " . $e->getMessage());
}
}

View File

@@ -27,15 +27,11 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
namespace Espo\Classes\Jobs;
use Espo\Core\{
Jobs\Job,
};
use Espo\Core\Job\JobDataLess;
class Dummy implements Job
class Dummy implements JobDataLess
{
public function run()
{
}
public function run(): void {}
}

View File

@@ -0,0 +1,50 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Jobs;
use Espo\Core\{
Job\JobDataLess,
Webhook\Queue,
};
class ProcessWebhookQueue implements JobDataLess
{
private $queue;
public function __construct(Queue $queue)
{
$this->queue = $queue;
}
public function run(): void
{
$this->queue->process();
}
}

View File

@@ -27,25 +27,23 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Jobs;
namespace Espo\Classes\Jobs;
use Espo\Core\{
ServiceFactory,
Jobs\Job,
};
use Espo\Core\Job\JobDataLess;
class SendEmailNotifications implements Job
use Espo\Tools\EmailNotification\Processor;
class SendEmailNotifications implements JobDataLess
{
protected $serviceFactory;
private $processor;
public function __construct(ServiceFactory $serviceFactory)
public function __construct(Processor $processor)
{
$this->serviceFactory = $serviceFactory;
$this->processor = $processor;
}
public function run()
public function run(): void
{
$service = $this->serviceFactory->create('EmailNotification');
$service->process();
$this->processor->process();
}
}

View File

@@ -0,0 +1,113 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\MassAction\User;
use Espo\Core\{
MassAction\Actions\MassDelete as MassDeleteOriginal,
MassAction\QueryBuilder,
MassAction\Params,
MassAction\Result,
MassAction\Data,
MassAction\MassAction,
Acl,
ORM\EntityManager,
Exceptions\Forbidden,
};
use Espo\{
Entities\User,
ORM\Entity,
};
class MassDelete implements MassAction
{
protected $massDeleteOriginal;
protected $queryBuilder;
protected $entityManager;
protected $acl;
protected $user;
public function __construct(
MassDeleteOriginal $massDeleteOriginal,
QueryBuilder $queryBuilder,
EntityManager $entityManager,
Acl $acl,
User $user
) {
$this->massDeleteOriginal = $massDeleteOriginal;
$this->queryBuilder = $queryBuilder;
$this->entityManager = $entityManager;
$this->acl = $acl;
$this->user = $user;
}
public function process(Params $params, Data $data): Result
{
$entityType = $params->getEntityType();
if (!$this->acl->check($entityType, 'delete')) {
throw new Forbidden("No delete access for '{$entityType}'.");
}
if (!$params->hasIds() && $this->acl->get('massUpdatePermission') !== 'yes') {
throw new Forbidden("No mass-update permission.");
}
$query = $this->queryBuilder->build($params);
$collection = $this->entityManager
->getRepository('User')
->clone($query)
->sth()
->select(['id'])
->find();
foreach ($collection as $entity) {
$this->checkEntity($entity, $data);
}
return $this->massDeleteOriginal->process($params, $data);
}
protected function checkEntity(Entity $entity): void
{
if ($entity->id === 'system') {
throw new Forbidden("Can't delete 'system' user.");
}
if ($entity->id === $this->user->id) {
throw new Forbidden("Can't delete own user.");
}
}
}

View File

@@ -0,0 +1,180 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\MassAction\User;
use Espo\Core\{
MassAction\Actions\MassUpdate as MassUpdateOriginal,
MassAction\QueryBuilder,
MassAction\Params,
MassAction\Result,
MassAction\Data,
MassAction\MassAction,
Utils\File\Manager as FileManager,
DataManager,
Acl,
ORM\EntityManager,
Exceptions\Forbidden,
};
use Espo\{
Entities\User,
ORM\Entity,
};
class MassUpdate implements MassAction
{
protected $massUpdateOriginal;
protected $queryBuilder;
protected $entityManager;
protected $acl;
protected $user;
protected $fileManager;
protected $dataManager;
public function __construct(
MassUpdateOriginal $massUpdateOriginal,
QueryBuilder $queryBuilder,
EntityManager $entityManager,
Acl $acl,
User $user,
FileManager $fileManager,
DataManager $dataMaanger
) {
$this->massUpdateOriginal = $massUpdateOriginal;
$this->queryBuilder = $queryBuilder;
$this->entityManager = $entityManager;
$this->acl = $acl;
$this->user = $user;
$this->fileManager = $fileManager;
$this->dataManager = $dataMaanger;
}
public function process(Params $params, Data $data): Result
{
$entityType = $params->getEntityType();
if (!$this->acl->check($entityType, 'edit')) {
throw new Forbidden("No edit access for '{$entityType}'.");
}
if ($this->acl->get('massUpdatePermission') !== 'yes') {
throw new Forbidden("No mass-update permission.");
}
if (
$data->has('type') ||
$data->has('password') ||
$data->has('emailAddress') ||
$data->has('isAdmin') ||
$data->has('isSuperAdmin') ||
$data->has('isPortalUser')
) {
throw new Forbidden("Not allowed fields.");
}
$query = $this->queryBuilder->build($params);
$collection = $this->entityManager
->getRepository('User')
->clone($query)
->sth()
->select(['id'])
->find();
foreach ($collection as $entity) {
$this->checkEntity($entity, $data);
}
$result = $this->massUpdateOriginal->process($params, $data);
$this->afterProcess($result, $data);
return $result;
}
protected function checkEntity(Entity $entity, Data $data): void
{
if ($entity->id === 'system') {
throw new Forbidden("Can't update 'system' user.");
}
if ($entity->id === $this->user->id) {
if ($data->has('isActive')) {
throw new Forbidden("Can't change 'isActive' field for own user.");
}
}
}
protected function afterProcess(Result $result, Data $dataWrapped): void
{
$data = $dataWrapped->getRaw();
if (
property_exists($data, 'rolesIds') ||
property_exists($data, 'teamsIds') ||
property_exists($data, 'type') ||
property_exists($data, 'portalRolesIds') ||
property_exists($data, 'portalsIds')
) {
foreach ($result->getIds() as $id) {
$this->clearRoleCache($id);
}
$this->dataManager->updateCacheTimestamp();
}
if (
property_exists($data, 'portalRolesIds') ||
property_exists($data, 'portalsIds') ||
property_exists($data, 'contactId') ||
property_exists($data, 'accountsIds')
) {
$this->clearPortalRolesCache();
$this->dataManager->updateCacheTimestamp();
}
}
protected function clearRoleCache(string $id): void
{
$this->fileManager->removeFile('data/cache/application/acl/' . $id . '.php');
}
protected function clearPortalRolesCache(): void
{
$this->fileManager->removeInDir('data/cache/application/aclPortal');
}
}

View File

@@ -27,29 +27,34 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Modules\Crm\AclPortal;
namespace Espo\Classes\RecordHooks\Team;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Record\Hook\LinkHook;
use Espo\Entities\User as EntityUser;
use Espo\ORM\Entity;
use Espo\Core\AclPortal\Acl;
use Espo\Entities\User;
class KnowledgeBaseArticle extends Acl
class BeforeLinkUserCheck implements LinkHook
{
public function checkEntityRead(EntityUser $user, Entity $entity, $data)
public function process(Entity $entity, string $link, Entity $foreignEntity): void
{
if (!$this->checkEntity($user, $entity, $data, 'read')) {
return false;
if ($link !== 'users') {
return;
}
if ($entity->get('status') !== 'Published') return false;
$this->processUserCheck($foreignEntity);
}
$portalIdList = $entity->getLinkMultipleIdList('portals');
if ($user->get('portalId') && !in_array($user->get('portalId'), $portalIdList)) {
return false;
private function processUserCheck(User $user): void
{
if ($user->isPortal()) {
throw new Forbidden("Can't add portal users to team.");
}
return true;
if ($user->isSystem()) {
throw new Forbidden("Can't add system users to team.");
}
}
}

View File

@@ -0,0 +1,53 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Select\ActionHistoryRecord\AccessControlFilters;
use Espo\{
Core\Select\AccessControl\Filter,
ORM\Query\SelectBuilder as QueryBuilder,
Entities\User,
};
class OnlyOwn implements Filter
{
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function apply(QueryBuilder $queryBuilder): void
{
$queryBuilder->where([
'userId' => $this->user->getId(),
]);
}
}

View File

@@ -0,0 +1,57 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Select\ActionHistoryRecord\BoolFilters;
use Espo\{
Core\Select\Bool\Filter,
ORM\Query\SelectBuilder as QueryBuilder,
ORM\Query\Part\WhereClause,
ORM\Query\Part\Where\OrGroupBuilder,
Entities\User,
};
class OnlyMy implements Filter
{
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function apply(QueryBuilder $queryBuilder, OrGroupBuilder $orGroupBuilder): void
{
$item = WhereClause::fromRaw([
'userId' => $this->user->getId(),
]);
$orGroupBuilder->add($item);
}
}

View File

@@ -27,13 +27,16 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\SelectManagers;
namespace Espo\Classes\Select\Attachment\PrimaryFilters;
class Attachment extends \Espo\Core\Select\SelectManager
use Espo\Core\Select\Primary\Filter;
use Espo\ORM\Query\SelectBuilder;
class Orphan implements Filter
{
protected function filterOrphan(&$result)
public function apply(SelectBuilder $queryBuilder): void
{
$result['whereClause'][] = [
$queryBuilder->where([
'role' => ['Attachment', 'Inline Attachment'],
[
'OR' => [
@@ -56,13 +59,17 @@ class Attachment extends \Espo\Core\Select\SelectManager
],
],
'attachmentChild.id' => null,
];
]);
$this->addLeftJoin(['Attachment', 'attachmentChild', [
'attachmentChild.sourceId:' => 'attachment.id',
'attachmentChild.deleted' => false
]], $result);
$queryBuilder->leftJoin(
'Attachment',
'attachmentChild',
[
'attachmentChild.sourceId:' => 'attachment.id',
'attachmentChild.deleted' => false,
]
);
$this->setDistinct(true, $result);
$queryBuilder->distinct();
}
}

View File

@@ -0,0 +1,43 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Select\AuthLogRecord\PrimaryFilters;
use Espo\Core\Select\Primary\Filter;
use Espo\ORM\Query\SelectBuilder;
class Accepted implements Filter
{
public function apply(SelectBuilder $queryBuilder): void
{
$queryBuilder->where([
'isDenied' => false,
]);
}
}

View File

@@ -0,0 +1,43 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Select\AuthLogRecord\PrimaryFilters;
use Espo\Core\Select\Primary\Filter;
use Espo\ORM\Query\SelectBuilder;
class Denied implements Filter
{
public function apply(SelectBuilder $queryBuilder): void
{
$queryBuilder->where([
'isDenied' => true,
]);
}
}

View File

@@ -27,16 +27,17 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Di;
namespace Espo\Classes\Select\AuthToken\PrimaryFilters;
use Espo\Core\Utils\FieldValidatorManager;
use Espo\Core\Select\Primary\Filter;
use Espo\ORM\Query\SelectBuilder;
trait FieldValidatorManagerSetter
class Active implements Filter
{
protected $fieldValidatorManager;
public function setFieldValidatorManager(FieldValidatorManager $fieldValidatorManager)
public function apply(SelectBuilder $queryBuilder): void
{
$this->fieldValidatorManager = $fieldValidatorManager;
$queryBuilder->where([
'isActive' => true,
]);
}
}

View File

@@ -0,0 +1,43 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Classes\Select\AuthToken\PrimaryFilters;
use Espo\Core\Select\Primary\Filter;
use Espo\ORM\Query\SelectBuilder;
class Inactive implements Filter
{
public function apply(SelectBuilder $queryBuilder): void
{
$queryBuilder->where([
'isActive' => false,
]);
}
}

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