mirror of
https://git.code.sf.net/p/seeddms/code
synced 2025-05-12 20:51:30 +00:00
Compare commits
3111 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a2a39ce946 | ||
![]() |
1922899d7e | ||
![]() |
58a29b675b | ||
![]() |
d1d348deb9 | ||
![]() |
b9abff5c55 | ||
![]() |
b4d0761824 | ||
![]() |
e43168059e | ||
![]() |
36acb63ebe | ||
![]() |
c2f69ce491 | ||
![]() |
588d150c39 | ||
![]() |
32b6445904 | ||
![]() |
012977d606 | ||
![]() |
d80009e484 | ||
![]() |
4ace32c927 | ||
![]() |
79560a8164 | ||
![]() |
f89011f2ee | ||
![]() |
e71fccbb1e | ||
![]() |
43b1bb6fd8 | ||
![]() |
cc41763a96 | ||
![]() |
1c7b4b0466 | ||
![]() |
2d4d4c59a3 | ||
![]() |
dfe73c8cb1 | ||
![]() |
dcf448072d | ||
![]() |
74e65c9e0c | ||
![]() |
a14ea507fc | ||
![]() |
9db0985495 | ||
![]() |
6f11dc6dc2 | ||
![]() |
e6042e8538 | ||
![]() |
eefbd18e5e | ||
![]() |
8039a0f479 | ||
![]() |
ae72faab11 | ||
![]() |
7c01e94015 | ||
![]() |
41a438754a | ||
![]() |
9e3bb361ae | ||
![]() |
8870ca5c5d | ||
![]() |
17351584d5 | ||
![]() |
ac841494a9 | ||
![]() |
ce0de15ce1 | ||
![]() |
1b163e90e1 | ||
![]() |
791c23befa | ||
![]() |
d552047b0b | ||
![]() |
e1a970fb02 | ||
![]() |
e9d953eed6 | ||
![]() |
3a5886b64a | ||
![]() |
14d79d58e7 | ||
![]() |
56e15e5125 | ||
![]() |
76b9b3c2d6 | ||
![]() |
44621c0bb6 | ||
![]() |
0d0fc4e50a | ||
![]() |
dc14fc5217 | ||
![]() |
1edb468877 | ||
![]() |
2107955b7e | ||
![]() |
a0e906a067 | ||
![]() |
da69c19a1a | ||
![]() |
9e16e54aaa | ||
![]() |
b51749e631 | ||
![]() |
f230cd6918 | ||
![]() |
4f44241850 | ||
![]() |
72a4a05bb2 | ||
![]() |
409b86461b | ||
![]() |
0d2cc403da | ||
![]() |
f5073ffd4f | ||
![]() |
4ed40bff78 | ||
![]() |
478c385d13 | ||
![]() |
7a06b50e92 | ||
![]() |
0da2308ee3 | ||
![]() |
4275072338 | ||
![]() |
d3ab3e7069 | ||
![]() |
cf786e749a | ||
![]() |
06f0e1423b | ||
![]() |
55aa6fe170 | ||
![]() |
15ee5357a5 | ||
![]() |
7f16340a26 | ||
![]() |
50b25a59ec | ||
![]() |
593b6359d2 | ||
![]() |
416df6c846 | ||
![]() |
0da7e0f655 | ||
![]() |
c9286b75a0 | ||
![]() |
bd80e96c92 | ||
![]() |
9c81a10109 | ||
![]() |
74e5be95c2 | ||
![]() |
2f8e3fbb51 | ||
![]() |
f73bdb8388 | ||
![]() |
35873391c8 | ||
![]() |
3914b76919 | ||
![]() |
e1c7e27a69 | ||
![]() |
4e9901161f | ||
![]() |
aae9422e30 | ||
![]() |
ad84609a49 | ||
![]() |
0b4afff149 | ||
![]() |
01837f6c5c | ||
![]() |
1999206af0 | ||
![]() |
d36636be55 | ||
![]() |
e0b421dcca | ||
![]() |
038e929778 | ||
![]() |
246ba45c52 | ||
![]() |
08cac16ecf | ||
![]() |
66114a653c | ||
![]() |
eded3365b1 | ||
![]() |
7998c9d7e0 | ||
![]() |
8b2db5376c | ||
![]() |
3e8a494f1a | ||
![]() |
9fad6c6e61 | ||
![]() |
c1b736022d | ||
![]() |
8e834e8898 | ||
![]() |
69b61b1a75 | ||
![]() |
f65af1741c | ||
![]() |
fc4d2edb57 | ||
![]() |
37478ecd89 | ||
![]() |
6a7d596806 | ||
![]() |
ceaa62f16c | ||
![]() |
ac2ade6b6e | ||
![]() |
36dbc1f825 | ||
![]() |
43f078a153 | ||
![]() |
a1a20a4c25 | ||
![]() |
12a4a6446f | ||
![]() |
a0b3d9da27 | ||
![]() |
f4003f72e9 | ||
![]() |
18e4874a77 | ||
![]() |
c6243813bf | ||
![]() |
3345155e5e | ||
![]() |
0224793366 | ||
![]() |
4eba2e3283 | ||
![]() |
3347b8e4f5 | ||
![]() |
9300d92311 | ||
![]() |
192e750f00 | ||
![]() |
fb37e526cc | ||
![]() |
00d71f4c2e | ||
![]() |
5d2d80b0af | ||
![]() |
0fa5ffae48 | ||
![]() |
192daaec69 | ||
![]() |
89ce934164 | ||
![]() |
61dd316e09 | ||
![]() |
81ee0beeae | ||
![]() |
c66637ce6c | ||
![]() |
eb95f7999a | ||
![]() |
2009e59629 | ||
![]() |
22aaa5608f | ||
![]() |
6b562477aa | ||
![]() |
a03b96330a | ||
![]() |
6c84787027 | ||
![]() |
ba8aebb24b | ||
![]() |
023e2c3edf | ||
![]() |
3af7ce8177 | ||
![]() |
d872b68efe | ||
![]() |
699e1bcfad | ||
![]() |
c23c5845ad | ||
![]() |
00c1efffac | ||
![]() |
ddfe87a82c | ||
![]() |
79aa8098e9 | ||
![]() |
98f5cee2eb | ||
![]() |
07bfdca11e | ||
![]() |
ac656d4da0 | ||
![]() |
1115d08d2f | ||
![]() |
cd0a5c9844 | ||
![]() |
8432340154 | ||
![]() |
1a5dbfef51 | ||
![]() |
0f258d81ac | ||
![]() |
bcf2239334 | ||
![]() |
f69c9ad9d0 | ||
![]() |
46f5b630d6 | ||
![]() |
d7e780493f | ||
![]() |
8a148daa42 | ||
![]() |
46371b2cf2 | ||
![]() |
31fa1d505c | ||
![]() |
b118b00536 | ||
![]() |
ab16c6b539 | ||
![]() |
b34b37189a | ||
![]() |
c10d2f403a | ||
![]() |
8b4c01e339 | ||
![]() |
ee568bb916 | ||
![]() |
000f1e2c44 | ||
![]() |
e06aa0a286 | ||
![]() |
568718f023 | ||
![]() |
1085401ccf | ||
![]() |
ac69311242 | ||
![]() |
f1183cd4d2 | ||
![]() |
878f7e559a | ||
![]() |
5ebbaa9336 | ||
![]() |
04b63531c7 | ||
![]() |
f02ba8ddc5 | ||
![]() |
0139beb33f | ||
![]() |
11301f1955 | ||
![]() |
d120b9eb7d | ||
![]() |
c721c05d6d | ||
![]() |
bd396e1c69 | ||
![]() |
b5dbadfb66 | ||
![]() |
0e86608cbc | ||
![]() |
4f00481f1e | ||
![]() |
2b0d45c68c | ||
![]() |
6ea76aa00e | ||
![]() |
0638776bc5 | ||
![]() |
153796b82c | ||
![]() |
6b6410997f | ||
![]() |
52fdbb8c16 | ||
![]() |
deb2aeea57 | ||
![]() |
0bd625ca20 | ||
![]() |
0092f359bd | ||
![]() |
681ce9090f | ||
![]() |
fc8bef612e | ||
![]() |
5bb70b82aa | ||
![]() |
2bb27b5b8e | ||
![]() |
23c73ed578 | ||
![]() |
e5390d0dbe | ||
![]() |
7d575b2d11 | ||
![]() |
4a1a3c6bfe | ||
![]() |
9f23cc37d7 | ||
![]() |
c3094ce87f | ||
![]() |
ef42fcac07 | ||
![]() |
0c99740d25 | ||
![]() |
1d74863f81 | ||
![]() |
c117b9a590 | ||
![]() |
52b43ba8c6 | ||
![]() |
0f46a7cd6a | ||
![]() |
5f00ebd852 | ||
![]() |
918af9b2e3 | ||
![]() |
bd9c9e8e3b | ||
![]() |
54bdbfdc56 | ||
![]() |
d92acf86a9 | ||
![]() |
7c0634f272 | ||
![]() |
0e66c6457a | ||
![]() |
77474bdaee | ||
![]() |
64a7d341eb | ||
![]() |
0fd0293f35 | ||
![]() |
5bd93d4efe | ||
![]() |
403d391d72 | ||
![]() |
076e5bc5c2 | ||
![]() |
2ccbe2b9c7 | ||
![]() |
eebe9d48d3 | ||
![]() |
c865927fe4 | ||
![]() |
d4add8b343 | ||
![]() |
23568c0a6a | ||
![]() |
40f86da41d | ||
![]() |
24595a234d | ||
![]() |
199fd57151 | ||
![]() |
1103324e89 | ||
![]() |
bb2ccf05a0 | ||
![]() |
b6dce79936 | ||
![]() |
424d279c7f | ||
![]() |
6178252e56 | ||
![]() |
1e699147ff | ||
![]() |
fa19503ab2 | ||
![]() |
497d1e1ca3 | ||
![]() |
775a785525 | ||
![]() |
f97124d694 | ||
![]() |
d7eeacdc74 | ||
![]() |
f42d4d38b1 | ||
![]() |
fab8276b0d | ||
![]() |
337c0ed41f | ||
![]() |
efa587493e | ||
![]() |
fde112e2d9 | ||
![]() |
a1520299a2 | ||
![]() |
de53c5159c | ||
![]() |
ff64e76213 | ||
![]() |
c4c36735b6 | ||
![]() |
80ecac5710 | ||
![]() |
eb2296f814 | ||
![]() |
300bcb2514 | ||
![]() |
e6312db48f | ||
![]() |
ca706753bc | ||
![]() |
048c56f3a3 | ||
![]() |
55c7a32a05 | ||
![]() |
e14bfd9326 | ||
![]() |
337f9f2ce4 | ||
![]() |
6e489dc80a | ||
![]() |
32c93f5494 | ||
![]() |
3fce0d58b6 | ||
![]() |
e51e7cd758 | ||
![]() |
835b330331 | ||
![]() |
a25de1eea5 | ||
![]() |
752653a2b3 | ||
![]() |
e3cc28916d | ||
![]() |
6211ab6b32 | ||
![]() |
00f7a0ee35 | ||
![]() |
f63f7847f0 | ||
![]() |
3bef98756a | ||
![]() |
626e521bc7 | ||
![]() |
e88321c577 | ||
![]() |
c44aaae446 | ||
![]() |
b71467b8c8 | ||
![]() |
d612220ad5 | ||
![]() |
2b2d9ef7de | ||
![]() |
f4097c6831 | ||
![]() |
1f92a47c30 | ||
![]() |
10a3aaf212 | ||
![]() |
c83bcf9877 | ||
![]() |
c04eb28ac1 | ||
![]() |
173ecb00b3 | ||
![]() |
3fb9d140fa | ||
![]() |
cb808e0e66 | ||
![]() |
8609fdee74 | ||
![]() |
dc642fa898 | ||
![]() |
7fb0acb562 | ||
![]() |
7c292986f5 | ||
![]() |
b25776eaad | ||
![]() |
d8e38c2825 | ||
![]() |
668ee243b2 | ||
![]() |
9616a540c2 | ||
![]() |
f4ee945ab1 | ||
![]() |
057abec09c | ||
![]() |
8218b752f5 | ||
![]() |
b7b9acbe7e | ||
![]() |
db5b242cbc | ||
![]() |
c383ca0625 | ||
![]() |
f1211f6c80 | ||
![]() |
33fe05fc6e | ||
![]() |
1c5977fca5 | ||
![]() |
5ae461a157 | ||
![]() |
836a2b50a1 | ||
![]() |
2b900b5e06 | ||
![]() |
ab72673379 | ||
![]() |
a7579f47ae | ||
![]() |
67d6191024 | ||
![]() |
00fe788571 | ||
![]() |
7ae5749bcf | ||
![]() |
fe0fd30971 | ||
![]() |
658351a4d3 | ||
![]() |
20686bccbd | ||
![]() |
63adb75fbc | ||
![]() |
3f6719e7aa | ||
![]() |
5d2ace6a14 | ||
![]() |
359cdedfdb | ||
![]() |
102a5603c0 | ||
![]() |
97778d3e2b | ||
![]() |
8bfe9e92db | ||
![]() |
61b7620ab0 | ||
![]() |
737e69876d | ||
![]() |
df6a2e79bc | ||
![]() |
bc4362c196 | ||
![]() |
e88aa870db | ||
![]() |
4c3218bc0f | ||
![]() |
cb1cb46cfe | ||
![]() |
1463f00faf | ||
![]() |
0ffc8c78f7 | ||
![]() |
513343c89a | ||
![]() |
0b7d3cad2d | ||
![]() |
9c8c9616d5 | ||
![]() |
7c973d9f37 | ||
![]() |
8cb7e22bf9 | ||
![]() |
d86b2cc883 | ||
![]() |
45e1d47e8f | ||
![]() |
9dfc6e8b1e | ||
![]() |
1934cdd7c5 | ||
![]() |
22463fdb40 | ||
![]() |
ef9e685f55 | ||
![]() |
458252f531 | ||
![]() |
11030fad52 | ||
![]() |
bdcaf2b5f3 | ||
![]() |
23f17e291e | ||
![]() |
42a81b6b0e | ||
![]() |
1ab07d53f7 | ||
![]() |
845317e27d | ||
![]() |
0788c29c4a | ||
![]() |
57bbc06577 | ||
![]() |
335c7bbf98 | ||
![]() |
c56a92b395 | ||
![]() |
77ce7554a8 | ||
![]() |
22802c4abd | ||
![]() |
e34830a53e | ||
![]() |
97feb24466 | ||
![]() |
0c30b97f2d | ||
![]() |
cb1d55e413 | ||
![]() |
3d880be30c | ||
![]() |
c3e415ff7a | ||
![]() |
6dc9cc8b8e | ||
![]() |
3bf13c9e03 | ||
![]() |
4f6261321f | ||
![]() |
21a787aa21 | ||
![]() |
ef61f16f95 | ||
![]() |
f6ae2c3868 | ||
![]() |
f0a3d7d60c | ||
![]() |
fb43a82818 | ||
![]() |
1506cef2ab | ||
![]() |
83d11651b3 | ||
![]() |
ace30334a8 | ||
![]() |
795b0e08d3 | ||
![]() |
d628b01ede | ||
![]() |
fa683ba65f | ||
![]() |
48eebee92a | ||
![]() |
b351a05aba | ||
![]() |
328cbd9eb9 | ||
![]() |
6d6bbca94b | ||
![]() |
aa733c7531 | ||
![]() |
41b2ae91e1 | ||
![]() |
244a5da6d8 | ||
![]() |
9461f2c24d | ||
![]() |
1374c7fda3 | ||
![]() |
927e5acdc2 | ||
![]() |
8f07c2fd1f | ||
![]() |
99bb9e5e20 | ||
![]() |
12ffb0174e | ||
![]() |
b5c773a4a3 | ||
![]() |
c4f1019afb | ||
![]() |
2f868c4f44 | ||
![]() |
e141892934 | ||
![]() |
9e9c0c8ac5 | ||
![]() |
de7d1c005e | ||
![]() |
c786635f9c | ||
![]() |
082a6a8af0 | ||
![]() |
5694bf9501 | ||
![]() |
aeb0e4f1de | ||
![]() |
8a01102cf5 | ||
![]() |
182418c856 | ||
![]() |
1488cdcfca | ||
![]() |
e4be5465be | ||
![]() |
0c28f47481 | ||
![]() |
53f350c2fa | ||
![]() |
9e4eae8206 | ||
![]() |
cfc23e0ddf | ||
![]() |
baa3010b43 | ||
![]() |
9dbe4e25aa | ||
![]() |
330073f52a | ||
![]() |
4888082cda | ||
![]() |
1667187613 | ||
![]() |
9850b2d8f9 | ||
![]() |
9c740db936 | ||
![]() |
938126c19c | ||
![]() |
3b473edd25 | ||
![]() |
b6a0b45867 | ||
![]() |
863c3f971c | ||
![]() |
fbbc79815d | ||
![]() |
e2e52d61b1 | ||
![]() |
b786e42bb3 | ||
![]() |
a97fcbc67a | ||
![]() |
3b74689c9c | ||
![]() |
971dc536f7 | ||
![]() |
b8449289ac | ||
![]() |
3e733b91cd | ||
![]() |
e422fcf67a | ||
![]() |
2ce2fd07fe | ||
![]() |
f0cd33d110 | ||
![]() |
dc6b153df8 | ||
![]() |
04211bd09c | ||
![]() |
6bb4eeb926 | ||
![]() |
d48af54737 | ||
![]() |
97c6b19c1f | ||
![]() |
5278732456 | ||
![]() |
df659c52d9 | ||
![]() |
7012580476 | ||
![]() |
54c6d63a2d | ||
![]() |
4b9844262c | ||
![]() |
6dbcf2a172 | ||
![]() |
c3058176f3 | ||
![]() |
dbd43d5877 | ||
![]() |
18a5306d3c | ||
![]() |
3add16e06a | ||
![]() |
d9e6472fff | ||
![]() |
ff1c29561f | ||
![]() |
43e114101a | ||
![]() |
3e2e8e2591 | ||
![]() |
c2a8b4bbc6 | ||
![]() |
3721fcfc22 | ||
![]() |
94d6dd0511 | ||
![]() |
4329729ae0 | ||
![]() |
a453c0e6ef | ||
![]() |
2ee4773357 | ||
![]() |
c4d5ebd24d | ||
![]() |
56a0b14fe9 | ||
![]() |
ea2173b4ed | ||
![]() |
b8c94556ca | ||
![]() |
620a5ff99d | ||
![]() |
ad35601bf2 | ||
![]() |
57a90d93a6 | ||
![]() |
589b213fe7 | ||
![]() |
fdf7126a68 | ||
![]() |
5cd59a7a84 | ||
![]() |
3ccdf862bf | ||
![]() |
607251e02d | ||
![]() |
e76df4c71f | ||
![]() |
04ce8ea28f | ||
![]() |
446f04c775 | ||
![]() |
225817d468 | ||
![]() |
f4b621de36 | ||
![]() |
9a22f0390a | ||
![]() |
da3946adc6 | ||
![]() |
9a08430d5b | ||
![]() |
e5ad205169 | ||
![]() |
80067393f1 | ||
![]() |
0539945bf1 | ||
![]() |
dc7cf3ce86 | ||
![]() |
3a9abc5009 | ||
![]() |
fe419f4857 | ||
![]() |
20ac984a64 | ||
![]() |
751918ef17 | ||
![]() |
6211976f3c | ||
![]() |
73d748a025 | ||
![]() |
e5057d8223 | ||
![]() |
6d9cc4039b | ||
![]() |
f12a9094db | ||
![]() |
365661afb8 | ||
![]() |
f3e7d04674 | ||
![]() |
a0db4bcc6d | ||
![]() |
87a9db64f8 | ||
![]() |
b8fd313e2d | ||
![]() |
85c190aad2 | ||
![]() |
995f7a5bad | ||
![]() |
6557d2edc9 | ||
![]() |
3e45d6a13f | ||
![]() |
502ea86d8d | ||
![]() |
418c42ae59 | ||
![]() |
16cdb8a323 | ||
![]() |
d991978144 | ||
![]() |
40bd123fe3 | ||
![]() |
2bc5b26175 | ||
![]() |
7deddf8f4e | ||
![]() |
2c42fd6a23 | ||
![]() |
6b5826ded4 | ||
![]() |
dee7977016 | ||
![]() |
8bc93eac03 | ||
![]() |
7a7fca84b4 | ||
![]() |
6af82069e8 | ||
![]() |
821d9b1470 | ||
![]() |
38dd38d7c6 | ||
![]() |
6254c8a41a | ||
![]() |
490fe09390 | ||
![]() |
a91003d5fa | ||
![]() |
7ba81f50e3 | ||
![]() |
c6470efc6f | ||
![]() |
d2c680280b | ||
![]() |
6d5d1a7703 | ||
![]() |
c52abe7198 | ||
![]() |
93f6b01c7f | ||
![]() |
d641a8d2ed | ||
![]() |
4ffe010d06 | ||
![]() |
332a7b2f3d | ||
![]() |
bf5aedf1b5 | ||
![]() |
1f6a3c7f77 | ||
![]() |
987cc5d164 | ||
![]() |
369dc80110 | ||
![]() |
eb4b28ea8c | ||
![]() |
20b03dcbe0 | ||
![]() |
af93db836e | ||
![]() |
1b15008870 | ||
![]() |
ecc70bc99a | ||
![]() |
cc341f6ed3 | ||
![]() |
1ae35ca6ad | ||
![]() |
983af33300 | ||
![]() |
9b07f6e943 | ||
![]() |
30c2b8a493 | ||
![]() |
9a76df52bd | ||
![]() |
307b524d11 | ||
![]() |
dfedd201dd | ||
![]() |
6fd868c5a7 | ||
![]() |
c9e93c329c | ||
![]() |
87fe831973 | ||
![]() |
5dab792dba | ||
![]() |
21989fadbb | ||
![]() |
17d1f2bffe | ||
![]() |
7c1c81f7fc | ||
![]() |
bef41ad838 | ||
![]() |
939a7dbce2 | ||
![]() |
b412f113bf | ||
![]() |
7370eebba7 | ||
![]() |
d13f37cfec | ||
![]() |
49c2e54e94 | ||
![]() |
8c43c709b0 | ||
![]() |
16c560d549 | ||
![]() |
8907c2f20a | ||
![]() |
e383434a3d | ||
![]() |
b854d64757 | ||
![]() |
2014eae334 | ||
![]() |
34c7132847 | ||
![]() |
24146db478 | ||
![]() |
6c3ecaf9a1 | ||
![]() |
15182713ea | ||
![]() |
7c29d1d4e8 | ||
![]() |
58e8306bb4 | ||
![]() |
eca2701da1 | ||
![]() |
9cab1880a7 | ||
![]() |
202e607959 | ||
![]() |
b558844841 | ||
![]() |
b48318d1da | ||
![]() |
f8ac9090fb | ||
![]() |
d80d1be9de | ||
![]() |
f24330740a | ||
![]() |
d90b01111e | ||
![]() |
43fe015049 | ||
![]() |
6f4a1bab68 | ||
![]() |
7a1836d33a | ||
![]() |
687d7eb0dd | ||
![]() |
9e92524fdb | ||
![]() |
283d051d3a | ||
![]() |
988dc9deff | ||
![]() |
f5148c00c2 | ||
![]() |
6de426bbc3 | ||
![]() |
11942c825d | ||
![]() |
48613b5897 | ||
![]() |
a5a2b877ce | ||
![]() |
b65d940259 | ||
![]() |
b88e05fe22 | ||
![]() |
a4f96c76d6 | ||
![]() |
1e8da679b5 | ||
![]() |
a156932843 | ||
![]() |
0652faf7c3 | ||
![]() |
eca5f3608f | ||
![]() |
dafa4813c1 | ||
![]() |
b64ee6012c | ||
![]() |
95547cf6b8 | ||
![]() |
aa9a30a98a | ||
![]() |
0869e97a1a | ||
![]() |
aa61028f08 | ||
![]() |
673bc9ec7d | ||
![]() |
275e81874a | ||
![]() |
98936632b2 | ||
![]() |
830f0258df | ||
![]() |
f095e252ad | ||
![]() |
68bb7bcfaf | ||
![]() |
659cdb4e6c | ||
![]() |
535a0b1b67 | ||
![]() |
0f417a2d7b | ||
![]() |
87ee71a1a1 | ||
![]() |
96933bb30d | ||
![]() |
b9c613ff83 | ||
![]() |
b57dc78e2a | ||
![]() |
f93af56f52 | ||
![]() |
b2fd7bb383 | ||
![]() |
3e63f1ffc0 | ||
![]() |
27b5af8ada | ||
![]() |
9889bbe639 | ||
![]() |
3bdb215adf | ||
![]() |
056dd8bd09 | ||
![]() |
2b0351325c | ||
![]() |
5e386597c3 | ||
![]() |
5ec5bab294 | ||
![]() |
b91745626a | ||
![]() |
7b87cc355d | ||
![]() |
29a6882106 | ||
![]() |
6fbc6043eb | ||
![]() |
e78c8174d8 | ||
![]() |
d4f4d5cfcd | ||
![]() |
f7f0721dba | ||
![]() |
a1b4b3b081 | ||
![]() |
f7683f2176 | ||
![]() |
fa946be140 | ||
![]() |
6a54f7dac7 | ||
![]() |
050aff4798 | ||
![]() |
58434abf10 | ||
![]() |
6e124f73f1 | ||
![]() |
b01e2aa666 | ||
![]() |
36110a85e7 | ||
![]() |
684c316f86 | ||
![]() |
622b7a13bb | ||
![]() |
f635d0e546 | ||
![]() |
9ae7a54183 | ||
![]() |
45d0d0b9d7 | ||
![]() |
4ef64199ab | ||
![]() |
611be01cce | ||
![]() |
e6766a3607 | ||
![]() |
efdb37399d | ||
![]() |
25e12c5f5e | ||
![]() |
542a6cb045 | ||
![]() |
31fda7e60e | ||
![]() |
f727843720 | ||
![]() |
4e5fefa4ba | ||
![]() |
ea5a9f499f | ||
![]() |
df94bc0c1a | ||
![]() |
07f50b4b95 | ||
![]() |
fdda22b58d | ||
![]() |
adde8afc84 | ||
![]() |
e40afa452c | ||
![]() |
da1bf3fb97 | ||
![]() |
9260382ef2 | ||
![]() |
4c8a2496b6 | ||
![]() |
b46795cbfe | ||
![]() |
e7303b6371 | ||
![]() |
b2b61eb990 | ||
![]() |
3cd4763c0e | ||
![]() |
8e6828e36d | ||
![]() |
a830b18fc3 | ||
![]() |
77a606cebe | ||
![]() |
768631bf55 | ||
![]() |
3487a27f9d | ||
![]() |
43f7a94aa6 | ||
![]() |
19266f1647 | ||
![]() |
2d3ec59c2d | ||
![]() |
ab5aec99ba | ||
![]() |
cce3899688 | ||
![]() |
39ec44cd41 | ||
![]() |
b6a308e630 | ||
![]() |
d05a200ed6 | ||
![]() |
8b68402bec | ||
![]() |
0c1a795113 | ||
![]() |
3b55c458c2 | ||
![]() |
825ae7bfeb | ||
![]() |
24ae96b9fa | ||
![]() |
5904d22394 | ||
![]() |
753d808d2a | ||
![]() |
a343c4cc1c | ||
![]() |
7a1b03951e | ||
![]() |
1398b614cd | ||
![]() |
9ea8a02893 | ||
![]() |
5cf3b5fc3e | ||
![]() |
6ccabf1c68 | ||
![]() |
4f3a7f6512 | ||
![]() |
6fbfe15baf | ||
![]() |
43c1385e0f | ||
![]() |
11c97f4c41 | ||
![]() |
ef551e6923 | ||
![]() |
ada2730636 | ||
![]() |
7b807f8d67 | ||
![]() |
40ce4a74e1 | ||
![]() |
f19ed34d25 | ||
![]() |
bbcf7cb979 | ||
![]() |
99bc6becb6 | ||
![]() |
0a6ce976c7 | ||
![]() |
ef1113490d | ||
![]() |
5ddfa0e297 | ||
![]() |
73d27bc82b | ||
![]() |
be7aa1b4a8 | ||
![]() |
749f7a2fb1 | ||
![]() |
9e9995241d | ||
![]() |
46040dce7e | ||
![]() |
8b34c4f82e | ||
![]() |
8bc9ab8f3c | ||
![]() |
9f20268d3b | ||
![]() |
cb0c51234e | ||
![]() |
58a46497f0 | ||
![]() |
93c88a6f87 | ||
![]() |
50d528a831 | ||
![]() |
20dd55840e | ||
![]() |
74003313e8 | ||
![]() |
09a60988fb | ||
![]() |
23f05a4eb6 | ||
![]() |
d7a936f6f1 | ||
![]() |
532db722a6 | ||
![]() |
75d716db26 | ||
![]() |
4401ce7b23 | ||
![]() |
74d1b11250 | ||
![]() |
3cfa3d2d7b | ||
![]() |
f2b0375df6 | ||
![]() |
64a5ea3d90 | ||
![]() |
020e307240 | ||
![]() |
ca9e1c8860 | ||
![]() |
59d9786a4c | ||
![]() |
e733b4fced | ||
![]() |
652acf4b86 | ||
![]() |
0bd2e2d83d | ||
![]() |
c5b9306918 | ||
![]() |
c91476fe80 | ||
![]() |
8767d170f1 | ||
![]() |
e2960219c8 | ||
![]() |
0b22b8d657 | ||
![]() |
f5068fa30f | ||
![]() |
30b8d4ddd9 | ||
![]() |
cdb93920e4 | ||
![]() |
9a616999d3 | ||
![]() |
00041b30bd | ||
![]() |
a289c8bbf6 | ||
![]() |
cb601a82eb | ||
![]() |
7218e47558 | ||
![]() |
56c35b5eba | ||
![]() |
486a685873 | ||
![]() |
5cbf98e832 | ||
![]() |
bffa24ad60 | ||
![]() |
2a23dbb0ef | ||
![]() |
f67ba27e4b | ||
![]() |
8c4e20e649 | ||
![]() |
03a394906e | ||
![]() |
bf23abad87 | ||
![]() |
e8a50e3101 | ||
![]() |
0c260f286b | ||
![]() |
38993eced2 | ||
![]() |
635d8253fe | ||
![]() |
f02074c794 | ||
![]() |
4e33cee86a | ||
![]() |
34a02f77d7 | ||
![]() |
4de124d9ae | ||
![]() |
c57640f804 | ||
![]() |
39fc81b64b | ||
![]() |
db2c4a739e | ||
![]() |
371f348d88 | ||
![]() |
265865a9b6 | ||
![]() |
f443f6544a | ||
![]() |
7635146a94 | ||
![]() |
363f417eb7 | ||
![]() |
3827cdda27 | ||
![]() |
6d1aa2f347 | ||
![]() |
cefcdc966b | ||
![]() |
780d398d4c | ||
![]() |
8cbf9c803f | ||
![]() |
0754a794d3 | ||
![]() |
1a3d3c8f80 | ||
![]() |
ea5efd75d7 | ||
![]() |
d1b967e9f3 | ||
![]() |
aa4997a7e7 | ||
![]() |
79e926324a | ||
![]() |
bfcad700af | ||
![]() |
e91a66af21 | ||
![]() |
1ab5f83395 | ||
![]() |
e425120d7d | ||
![]() |
fbc3be64a2 | ||
![]() |
eeb3422e8a | ||
![]() |
4363566998 | ||
![]() |
514249a132 | ||
![]() |
3480a9550d | ||
![]() |
047b5bb3b0 | ||
![]() |
74292d9304 | ||
![]() |
7c818d0913 | ||
![]() |
cd263e7353 | ||
![]() |
7485d0291a | ||
![]() |
5d6235ec0b | ||
![]() |
554b102356 | ||
![]() |
012c3b7d22 | ||
![]() |
33616f2c92 | ||
![]() |
64658c06cd | ||
![]() |
afb77c4365 | ||
![]() |
1132bd134e | ||
![]() |
1a5a5ad6c8 | ||
![]() |
3614bae91b | ||
![]() |
da86d0714d | ||
![]() |
88ace95baa | ||
![]() |
05a3405f07 | ||
![]() |
960edf45ea | ||
![]() |
cd99928cd4 | ||
![]() |
d939b40486 | ||
![]() |
447c035065 | ||
![]() |
b87f68c06e | ||
![]() |
a024cc19d3 | ||
![]() |
9d9e05a54b | ||
![]() |
01a4251b9a | ||
![]() |
c1ea7fd6cc | ||
![]() |
21b590d547 | ||
![]() |
686fef1f4e | ||
![]() |
7d34bd86b3 | ||
![]() |
813587e8c9 | ||
![]() |
0f9be43152 | ||
![]() |
d1690c917d | ||
![]() |
2c0729915c | ||
![]() |
1af7524b76 | ||
![]() |
266ae182f0 | ||
![]() |
e0cfbd9b1b | ||
![]() |
6d817b333c | ||
![]() |
9cd60901b1 | ||
![]() |
c53b3babbd | ||
![]() |
53654444f0 | ||
![]() |
3cee482b1c | ||
![]() |
1cb6816a6f | ||
![]() |
06025d03db | ||
![]() |
8d660b1f98 | ||
![]() |
7e73388730 | ||
![]() |
b2f0f2fa30 | ||
![]() |
3205f6ad82 | ||
![]() |
c519feb6c8 | ||
![]() |
1d4e7364ec | ||
![]() |
e014b37f44 | ||
![]() |
aece6cbaaa | ||
![]() |
bf62dd68e9 | ||
![]() |
065244c128 | ||
![]() |
39e9ba904a | ||
![]() |
faa47a9d2e | ||
![]() |
096312dbdb | ||
![]() |
a99efecb7b | ||
![]() |
c640ece18b | ||
![]() |
8644e750e9 | ||
![]() |
9c9de6d0a1 | ||
![]() |
189bbb540c | ||
![]() |
93192b7e3d | ||
![]() |
1a84cb311a | ||
![]() |
4fb43aef5a | ||
![]() |
791872adee | ||
![]() |
5869abc56b | ||
![]() |
a17fcfcd8e | ||
![]() |
c6c99bc384 | ||
![]() |
e557811acf | ||
![]() |
41b5caa302 | ||
![]() |
515a8de2e0 | ||
![]() |
12896970cc | ||
![]() |
12a44b75a3 | ||
![]() |
f5b8b5b45d | ||
![]() |
efd79e7521 | ||
![]() |
ff4151093c | ||
![]() |
84a61cbd14 | ||
![]() |
d7a935b276 | ||
![]() |
0acfb9a265 | ||
![]() |
431a2e581c | ||
![]() |
4cb4cce922 | ||
![]() |
56adaae427 | ||
![]() |
efd46b7a1d | ||
![]() |
b03e759053 | ||
![]() |
b7c46ccfda | ||
![]() |
90f849c801 | ||
![]() |
34b1d792ec | ||
![]() |
bc1faf4d2e | ||
![]() |
0a8659826f | ||
![]() |
612a493873 | ||
![]() |
c2f773ad85 | ||
![]() |
5e18a0b5b4 | ||
![]() |
dcba7a7572 | ||
![]() |
da2174fafd | ||
![]() |
f0fc1bfcc3 | ||
![]() |
8773195f2a | ||
![]() |
29e9907c89 | ||
![]() |
113db3fb01 | ||
![]() |
539b5b02eb | ||
![]() |
ded86a39f2 | ||
![]() |
a2645a4f16 | ||
![]() |
025e293f80 | ||
![]() |
db8e6f3ac6 | ||
![]() |
6bb34b870a | ||
![]() |
4a23c1df86 | ||
![]() |
bb5a79ba70 | ||
![]() |
30eadac7cd | ||
![]() |
1873d77958 | ||
![]() |
4a678ad1ec | ||
![]() |
4d471ed592 | ||
![]() |
fb44b524fd | ||
![]() |
ed12ddb573 | ||
![]() |
d8b2433edd | ||
![]() |
e128e0e9dd | ||
![]() |
2c7ab1cfb1 | ||
![]() |
a7deac7948 | ||
![]() |
e279a2f8e8 | ||
![]() |
84fca7227c | ||
![]() |
86fa6269b4 | ||
![]() |
7e7b12f1c3 | ||
![]() |
cad9e24ec3 | ||
![]() |
42a7644d09 | ||
![]() |
4c47d69a88 | ||
![]() |
33e746ff80 | ||
![]() |
54dabfed93 | ||
![]() |
132b904315 | ||
![]() |
fa241482c0 | ||
![]() |
f55db469c7 | ||
![]() |
c9ae939bff | ||
![]() |
73a7f8a5f2 | ||
![]() |
39b81e03c3 | ||
![]() |
6a9def5358 | ||
![]() |
15c281095d | ||
![]() |
7bdf60ebbf | ||
![]() |
606f8d8df8 | ||
![]() |
993a8056ec | ||
![]() |
81f091a44d | ||
![]() |
1fc4d21f27 | ||
![]() |
7b30188dd9 | ||
![]() |
d3631a4f61 | ||
![]() |
d994232cc4 | ||
![]() |
84b709c8cd | ||
![]() |
d8c534dff4 | ||
![]() |
0695f35f8d | ||
![]() |
f3fb09762f | ||
![]() |
2c2d1e4dd8 | ||
![]() |
130afd7d25 | ||
![]() |
c0377d4e34 | ||
![]() |
8fcfd70bd6 | ||
![]() |
7c2ac0e6ad | ||
![]() |
7aba671ade | ||
![]() |
59e92a836f | ||
![]() |
e10b7ff3e3 | ||
![]() |
5dc5400e04 | ||
![]() |
e8d1369fad | ||
![]() |
397081bdeb | ||
![]() |
ceeedcdd92 | ||
![]() |
aa045478dd | ||
![]() |
c9faef81f7 | ||
![]() |
6b0b517bed | ||
![]() |
9bb2943719 | ||
![]() |
ee727c12ba | ||
![]() |
8fbb5fe24c | ||
![]() |
67d8cf39fb | ||
![]() |
6defb81dd8 | ||
![]() |
ffc259c680 | ||
![]() |
bbc4943973 | ||
![]() |
a9a68d9d7b | ||
![]() |
64e6e8f1c4 | ||
![]() |
18cfdb3efe | ||
![]() |
e728633349 | ||
![]() |
1710e5278b | ||
![]() |
fd23364bde | ||
![]() |
c7f8c157c6 | ||
![]() |
70b2fa45e4 | ||
![]() |
05e1f04773 | ||
![]() |
c39fbcb70d | ||
![]() |
c8aca99462 | ||
![]() |
0c08af7246 | ||
![]() |
58f349e295 | ||
![]() |
c494afa49c | ||
![]() |
7f0ed73f74 | ||
![]() |
1df630a28e | ||
![]() |
347c740f1f | ||
![]() |
5e3f5fc8f0 | ||
![]() |
7574615b3c | ||
![]() |
664b881eb7 | ||
![]() |
b9e12a82ae | ||
![]() |
7292ceb83c | ||
![]() |
ad49c78302 | ||
![]() |
ff5580fa7e | ||
![]() |
5b9df18756 | ||
![]() |
53ee447d84 | ||
![]() |
a0ef972028 | ||
![]() |
47b3416b5b | ||
![]() |
4f650f3d2b | ||
![]() |
bb779c678c | ||
![]() |
8e78a217fc | ||
![]() |
826a6ae109 | ||
![]() |
2fd21b9792 | ||
![]() |
58e1abe568 | ||
![]() |
41e2d7b3be | ||
![]() |
2650ff4d7f | ||
![]() |
bc06fd60f0 | ||
![]() |
2850298297 | ||
![]() |
b0868e9726 | ||
![]() |
a018a1602a | ||
![]() |
ec8d2ab8b3 | ||
![]() |
d22d21d157 | ||
![]() |
d82bd687aa | ||
![]() |
02a830e74c | ||
![]() |
16c8102392 | ||
![]() |
5ac51f3c89 | ||
![]() |
0d43c618cd | ||
![]() |
68a16ce372 | ||
![]() |
3931227789 | ||
![]() |
6fa0849924 | ||
![]() |
7d93bccee6 | ||
![]() |
e68608bf04 | ||
![]() |
7696dc66b8 | ||
![]() |
d53318b917 | ||
![]() |
aaec9a5410 | ||
![]() |
531e11ce57 | ||
![]() |
c524add775 | ||
![]() |
92949d8887 | ||
![]() |
2f23a09f24 | ||
![]() |
445664ed53 | ||
![]() |
9186cf66c3 | ||
![]() |
3ac58509cc | ||
![]() |
d5cef4fabf | ||
![]() |
4bfb3795bd | ||
![]() |
8197f37117 | ||
![]() |
73b1051d82 | ||
![]() |
6025092793 | ||
![]() |
93f0faa145 | ||
![]() |
b971932c88 | ||
![]() |
2fe261492c | ||
![]() |
aaa40c6075 | ||
![]() |
82784f4aed | ||
![]() |
dc18b39305 | ||
![]() |
c5247b8abf | ||
![]() |
f32f39bb6a | ||
![]() |
f1f574c412 | ||
![]() |
780be78d36 | ||
![]() |
aa8290e03b | ||
![]() |
935d8a7b68 | ||
![]() |
768345a2ef | ||
![]() |
6a3939158b | ||
![]() |
8c2aac4d98 | ||
![]() |
8129221b57 | ||
![]() |
788b5b0014 | ||
![]() |
768c02866c | ||
![]() |
2d4c7b7581 | ||
![]() |
d6e652ec45 | ||
![]() |
a7286be63a | ||
![]() |
599786bcb0 | ||
![]() |
363fdf7a1a | ||
![]() |
590a93525c | ||
![]() |
518eecde18 | ||
![]() |
59c59f136a | ||
![]() |
b18fb02303 | ||
![]() |
a2c82409c9 | ||
![]() |
663d660e29 | ||
![]() |
ec41921691 | ||
![]() |
20bc412a17 | ||
![]() |
feec95eff7 | ||
![]() |
df76dbf35a | ||
![]() |
e847ff2647 | ||
![]() |
5a30032375 | ||
![]() |
6f0803e698 | ||
![]() |
3ddd18eb84 | ||
![]() |
31ac06cfa8 | ||
![]() |
1f40945218 | ||
![]() |
8d38bb7669 | ||
![]() |
649a2d280d | ||
![]() |
d6106c0673 | ||
![]() |
b93e6768c4 | ||
![]() |
f80cb6c24f | ||
![]() |
1c1d547e92 | ||
![]() |
77a59e008b | ||
![]() |
2c008bafee | ||
![]() |
8e1e94e01a | ||
![]() |
5323feca9b | ||
![]() |
0ac709b3c8 | ||
![]() |
1d72fea524 | ||
![]() |
f7a96e6888 | ||
![]() |
2d4007d62f | ||
![]() |
e25fda8e9b | ||
![]() |
faf45dc253 | ||
![]() |
0c399ced95 | ||
![]() |
6e2133747d | ||
![]() |
f7bedcdbd8 | ||
![]() |
f3cc82a780 | ||
![]() |
a80f177691 | ||
![]() |
63c0804e07 | ||
![]() |
c369950458 | ||
![]() |
b65c62e370 | ||
![]() |
d46d6821fc | ||
![]() |
410eeecd7f | ||
![]() |
e3d7a6f464 | ||
![]() |
0d9cdf7dcd | ||
![]() |
52f5dbdcfa | ||
![]() |
6dd96137bf | ||
![]() |
020dfb00d2 | ||
![]() |
fcab6f5a09 | ||
![]() |
bf22fe7e6a | ||
![]() |
3e0e8a1b8d | ||
![]() |
104952d644 | ||
![]() |
2158225795 | ||
![]() |
8b796353a5 | ||
![]() |
67a8d10797 | ||
![]() |
c9a2aaca9c | ||
![]() |
5e8de41b2e | ||
![]() |
a182717d4a | ||
![]() |
152c943d5a | ||
![]() |
858c449489 | ||
![]() |
ab438f18d9 | ||
![]() |
ffef8d2417 | ||
![]() |
78aab08ebd | ||
![]() |
f440d8bf54 | ||
![]() |
15d05d6ace | ||
![]() |
f47ad55223 | ||
![]() |
a80f710317 | ||
![]() |
6f2581bba2 | ||
![]() |
ab5e96a5ca | ||
![]() |
f1aed51047 | ||
![]() |
715f6ec04e | ||
![]() |
65a1b64db9 | ||
![]() |
3014b94111 | ||
![]() |
6ed79ac5dc | ||
![]() |
598529da7a | ||
![]() |
88155c8cbf | ||
![]() |
5a166d6a2b | ||
![]() |
40f410a762 | ||
![]() |
0cc4fccd7f | ||
![]() |
d627aff69c | ||
![]() |
18c7a910bb | ||
![]() |
024a61319e | ||
![]() |
867d676ef2 | ||
![]() |
5bfc79ceff | ||
![]() |
1617518282 | ||
![]() |
71d9e14d69 | ||
![]() |
831dff03db | ||
![]() |
3b0ee6c3e3 | ||
![]() |
3f74df0ae4 | ||
![]() |
dc8c8670db | ||
![]() |
eb0367bd7c | ||
![]() |
73fe0e37ff | ||
![]() |
16e4437032 | ||
![]() |
c81a2554aa | ||
![]() |
8d2de27828 | ||
![]() |
9b357ec3d9 | ||
![]() |
b8652ec951 | ||
![]() |
94e57c6a5b | ||
![]() |
5d28744758 | ||
![]() |
237fb9af42 | ||
![]() |
4c1acfe6dd | ||
![]() |
a71da52667 | ||
![]() |
12e85f66c3 | ||
![]() |
c2df7a2421 | ||
![]() |
e38e16bf69 | ||
![]() |
78948a3f51 | ||
![]() |
5148f27a01 | ||
![]() |
d9c1d2f5af | ||
![]() |
76f6500fd4 | ||
![]() |
5e1bb70d9b | ||
![]() |
c0b7f1a395 | ||
![]() |
b8b88b1ba3 | ||
![]() |
fdfad60c97 | ||
![]() |
0b5ced7efb | ||
![]() |
36215f676a | ||
![]() |
dfad2e581b | ||
![]() |
467e76b5b0 | ||
![]() |
28d45c0270 | ||
![]() |
f0bdb0fda3 | ||
![]() |
505f0f97b7 | ||
![]() |
62cf4f3fba | ||
![]() |
1de3bf1d41 | ||
![]() |
52e336ea4b | ||
![]() |
9a1d92d250 | ||
![]() |
71134eb29c | ||
![]() |
2c43ef2c96 | ||
![]() |
d06e5fa3fb | ||
![]() |
630fefa3a8 | ||
![]() |
5a32f4b7c5 | ||
![]() |
94b8690266 | ||
![]() |
45f1184696 | ||
![]() |
4770364c45 | ||
![]() |
8ec772c504 | ||
![]() |
a736d60df5 | ||
![]() |
faecb589cb | ||
![]() |
131d2b4645 | ||
![]() |
4c64b316db | ||
![]() |
01062a16a5 | ||
![]() |
52dfa8f401 | ||
![]() |
3d40b14691 | ||
![]() |
480a130180 | ||
![]() |
a78800e036 | ||
![]() |
a17220d373 | ||
![]() |
ce2e6c61d2 | ||
![]() |
a5994e3011 | ||
![]() |
1a9e7bde1b | ||
![]() |
ac81ce4335 | ||
![]() |
8865f61a54 | ||
![]() |
012dbeaf27 | ||
![]() |
ee656527c2 | ||
![]() |
10ecff6142 | ||
![]() |
9e5224a661 | ||
![]() |
d1ad6383d2 | ||
![]() |
031408fdae | ||
![]() |
29471ea6b3 | ||
![]() |
9f491dce6d | ||
![]() |
67cb38bd54 | ||
![]() |
aa3384f28b | ||
![]() |
600d14ed88 | ||
![]() |
19502debea | ||
![]() |
7b78a1ac69 | ||
![]() |
276b62082b | ||
![]() |
caea759aa9 | ||
![]() |
db6456d698 | ||
![]() |
e3bb44d504 | ||
![]() |
4828c5ba63 | ||
![]() |
b89b2a9254 | ||
![]() |
6c84cab7d4 | ||
![]() |
ca5457141d | ||
![]() |
446472c3b1 | ||
![]() |
709d362b02 | ||
![]() |
54dea818f7 | ||
![]() |
08d2cc389e | ||
![]() |
680818a760 | ||
![]() |
096f9773dc | ||
![]() |
ab8b42f960 | ||
![]() |
53d33f0d7a | ||
![]() |
2edf1251c7 | ||
![]() |
d664e166b6 | ||
![]() |
9f49460ee9 | ||
![]() |
508e1b74d3 | ||
![]() |
5ba96000c1 | ||
![]() |
0d4cd6a0be | ||
![]() |
9c8f737dcd | ||
![]() |
a34cd8b4ee | ||
![]() |
8eec73b4be | ||
![]() |
77c2841d40 | ||
![]() |
00d9a8c239 | ||
![]() |
4bd68ac535 | ||
![]() |
38d8aebb49 | ||
![]() |
fd0a362578 | ||
![]() |
28aed4d11a | ||
![]() |
e64ef5fae3 | ||
![]() |
fbfd3644c7 | ||
![]() |
e440985fb9 | ||
![]() |
db668791d1 | ||
![]() |
9a8b13a1cc | ||
![]() |
b44a368d6d | ||
![]() |
af9dc81ba4 | ||
![]() |
cd3026a88a | ||
![]() |
b14326e1ad | ||
![]() |
9eae07fae9 | ||
![]() |
cfc2ca1e24 | ||
![]() |
619e8a8d30 | ||
![]() |
31720be0fe | ||
![]() |
395d71b705 | ||
![]() |
505bf27d52 | ||
![]() |
d56812f66d | ||
![]() |
d9143ff271 | ||
![]() |
5bb78b6468 | ||
![]() |
550f0ee1f1 | ||
![]() |
bf1d8482d4 | ||
![]() |
1c8452ecea | ||
![]() |
50fb928988 | ||
![]() |
98734e8ef9 | ||
![]() |
b974f4c4e9 | ||
![]() |
cc6fd60168 | ||
![]() |
b2c606f37f | ||
![]() |
a446f45e43 | ||
![]() |
db3a372e94 | ||
![]() |
6f0b8806a1 | ||
![]() |
b1c433e594 | ||
![]() |
3a913aaaa9 | ||
![]() |
3a29edff89 | ||
![]() |
c59a112917 | ||
![]() |
579b561d9d | ||
![]() |
f4a9182ead | ||
![]() |
4f014a51e4 | ||
![]() |
6773f93e11 | ||
![]() |
376df1cb20 | ||
![]() |
fc5ad6e5e5 | ||
![]() |
d497eebc01 | ||
![]() |
88a3359a9e | ||
![]() |
90cf72367d | ||
![]() |
e5477708ad | ||
![]() |
3e45348b31 | ||
![]() |
c645bc3782 | ||
![]() |
f3b7a979ff | ||
![]() |
496020ca59 | ||
![]() |
16f8333e89 | ||
![]() |
2d97c204a8 | ||
![]() |
1b8e7883d1 | ||
![]() |
fd668ce709 | ||
![]() |
2bd75c6d1f | ||
![]() |
98374b513d | ||
![]() |
c946126e53 | ||
![]() |
22d314b87a | ||
![]() |
c0f4ea859b | ||
![]() |
df02d76e56 | ||
![]() |
92bf2e1d69 | ||
![]() |
204387237f | ||
![]() |
30ae0ffc30 | ||
![]() |
e4ac7a9275 | ||
![]() |
57830a60d1 | ||
![]() |
537327e41d | ||
![]() |
ff69d6e08e | ||
![]() |
317f10b5d1 | ||
![]() |
cdf29f754d | ||
![]() |
3776d2037d | ||
![]() |
d524c5f48c | ||
![]() |
7ed2660453 | ||
![]() |
2e31004982 | ||
![]() |
6319318773 | ||
![]() |
06de96a552 | ||
![]() |
a31524df09 | ||
![]() |
bf11f7cc87 | ||
![]() |
d1e79d1afc | ||
![]() |
4a88ff342f | ||
![]() |
a8af1a148b | ||
![]() |
ae9be17b4d | ||
![]() |
521e3b3380 | ||
![]() |
1bf0529a68 | ||
![]() |
8884b1b54d | ||
![]() |
1ebe7332d1 | ||
![]() |
84aa83d1d9 | ||
![]() |
8ae40fbc9e | ||
![]() |
6dddef6efa | ||
![]() |
000a8e7710 | ||
![]() |
48353cfa81 | ||
![]() |
dc661029af | ||
![]() |
d1f47f9320 | ||
![]() |
1aefc633f9 | ||
![]() |
20e3826316 | ||
![]() |
4d27f98c1b | ||
![]() |
00cd7fc700 | ||
![]() |
7485e0b57a | ||
![]() |
7cc6ed952e | ||
![]() |
16613a1e27 | ||
![]() |
6e89a180b1 | ||
![]() |
5d1d406cc1 | ||
![]() |
4538858561 | ||
![]() |
2e58a9324f | ||
![]() |
ede1cf3fbc | ||
![]() |
9f0bc73372 | ||
![]() |
48cc8d80e8 | ||
![]() |
c69490daba | ||
![]() |
0fac1646d4 | ||
![]() |
9b30289b32 | ||
![]() |
97f5f73730 | ||
![]() |
297bdcb3a0 | ||
![]() |
26ff848f9c | ||
![]() |
509d23715a | ||
![]() |
7a8fffadfc | ||
![]() |
14123cd604 | ||
![]() |
48ee318921 | ||
![]() |
36b5fec504 | ||
![]() |
4ad398a01e | ||
![]() |
839607e1ca | ||
![]() |
feda33c2c8 | ||
![]() |
bf9a409a71 | ||
![]() |
cce4be822c | ||
![]() |
9c3b34b41e | ||
![]() |
2c53286943 | ||
![]() |
f21ce1f2ed | ||
![]() |
2324a67da4 | ||
![]() |
626d9d69c8 | ||
![]() |
c6cd1b6900 | ||
![]() |
835ab33fcd | ||
![]() |
3b4cecabcc | ||
![]() |
30112e4b21 | ||
![]() |
3d5f321713 | ||
![]() |
ef06f2909f | ||
![]() |
0ed11fcb36 | ||
![]() |
d928c43981 | ||
![]() |
6950f7777e | ||
![]() |
b5eddc2296 | ||
![]() |
45acd496d6 | ||
![]() |
6139c781d0 | ||
![]() |
67e5eb5efe | ||
![]() |
a41e03425b | ||
![]() |
0e7b23ff4c | ||
![]() |
756a86abe5 | ||
![]() |
479214118e | ||
![]() |
13e27496e0 | ||
![]() |
111d433c8a | ||
![]() |
23a456e730 | ||
![]() |
c8df1533e6 | ||
![]() |
2eda020373 | ||
![]() |
9e5f005f05 | ||
![]() |
5f71f51644 | ||
![]() |
08c0507de2 | ||
![]() |
9733c44ef3 | ||
![]() |
7761f5d77b | ||
![]() |
3d33c1d49c | ||
![]() |
33c4f88636 | ||
![]() |
5f900b7ab1 | ||
![]() |
0602fad397 | ||
![]() |
dc5d742c45 | ||
![]() |
1ad2976f0d | ||
![]() |
ac1c2a55e2 | ||
![]() |
a6a7ede3f8 | ||
![]() |
450bdc0b7f | ||
![]() |
9b24827598 | ||
![]() |
efec0c36bf | ||
![]() |
901fcaef5e | ||
![]() |
5ff1333c9f | ||
![]() |
a97114b77d | ||
![]() |
7f5908bcf8 | ||
![]() |
60b65aad13 | ||
![]() |
9672f19bc4 | ||
![]() |
3e9d2dc695 | ||
![]() |
01813f19f8 | ||
![]() |
c3ef148ca6 | ||
![]() |
58412c8179 | ||
![]() |
eba7f208d5 | ||
![]() |
11a8a8087f | ||
![]() |
8362796339 | ||
![]() |
4d43097961 | ||
![]() |
0643a3dc87 | ||
![]() |
cfdd951369 | ||
![]() |
481d01977b | ||
![]() |
dee275397a | ||
![]() |
e7a50bfb91 | ||
![]() |
36231f8cf3 | ||
![]() |
6fc73a9a77 | ||
![]() |
7b1835774d | ||
![]() |
cbaa038c55 | ||
![]() |
dcc64bc539 | ||
![]() |
769b9e5beb | ||
![]() |
1593ca5f34 | ||
![]() |
e14e14ddb4 | ||
![]() |
df095c63a3 | ||
![]() |
e9827b8701 | ||
![]() |
809f224e7d | ||
![]() |
dabf821b6a | ||
![]() |
babba864a1 | ||
![]() |
3011f96372 | ||
![]() |
2ec6534079 | ||
![]() |
d82b59f173 | ||
![]() |
a75d337912 | ||
![]() |
4dbec073cc | ||
![]() |
293e26c747 | ||
![]() |
ac570b09e9 | ||
![]() |
e4b934ea76 | ||
![]() |
10f6606efa | ||
![]() |
dc770f3c17 | ||
![]() |
cbac16773d | ||
![]() |
0d4c970029 | ||
![]() |
79aa6c079c | ||
![]() |
684f27ef87 | ||
![]() |
b3cc272941 | ||
![]() |
893a8d6d8d | ||
![]() |
7d9de047bd | ||
![]() |
83e42948ee | ||
![]() |
04f9edbb39 | ||
![]() |
51943050c2 | ||
![]() |
89d5c98818 | ||
![]() |
4b55bc4fd8 | ||
![]() |
85157a8bfe | ||
![]() |
3012fc52e5 | ||
![]() |
55727bd1a2 | ||
![]() |
d2382f437c | ||
![]() |
b123cd29ca | ||
![]() |
5d9b94de6b | ||
![]() |
ed32e8e2b2 | ||
![]() |
1b6a07b73e | ||
![]() |
a493e7645d | ||
![]() |
43f57637e7 | ||
![]() |
270770782f | ||
![]() |
d9a4305fd7 | ||
![]() |
d96b3b84a2 | ||
![]() |
e873ba999b | ||
![]() |
ac0824ae37 | ||
![]() |
400755a0e0 | ||
![]() |
4a06e54f89 | ||
![]() |
e20d4e492f | ||
![]() |
1d521fd97e | ||
![]() |
096b117e34 | ||
![]() |
6f06faabc0 | ||
![]() |
b3e7b9a2dd | ||
![]() |
7362bf192b | ||
![]() |
1c08d83704 | ||
![]() |
572d776e55 | ||
![]() |
bd56ca76c3 | ||
![]() |
a09a023d42 | ||
![]() |
65212329a7 | ||
![]() |
511152be68 | ||
![]() |
ffcc53408f | ||
![]() |
40ddfd3ea6 | ||
![]() |
7e3f490b57 | ||
![]() |
95aede5c2b | ||
![]() |
065bf4eb26 | ||
![]() |
a870602324 | ||
![]() |
9bc5b73771 | ||
![]() |
68e97f81ce | ||
![]() |
4b5c5ab00f | ||
![]() |
670597ea5f | ||
![]() |
88168d005e | ||
![]() |
37db957c41 | ||
![]() |
44bf03c557 | ||
![]() |
801f0f0ed2 | ||
![]() |
768ff5acb1 | ||
![]() |
fa64bb3200 | ||
![]() |
4bcb5f8e4c | ||
![]() |
4fe696f18b | ||
![]() |
023c2c58f1 | ||
![]() |
5e8c34ad54 | ||
![]() |
7ceb0e9718 | ||
![]() |
4f4160c1a5 | ||
![]() |
570dc9ca71 | ||
![]() |
5c59a92624 | ||
![]() |
469370cb42 | ||
![]() |
f5505e85b2 | ||
![]() |
e2c3cbe3cf | ||
![]() |
1a002c9d18 | ||
![]() |
d0cf90032f | ||
![]() |
d8fb4fa4b0 | ||
![]() |
d2c55cd685 | ||
![]() |
cd4eb3d115 | ||
![]() |
f97af846e6 | ||
![]() |
b953ead796 | ||
![]() |
d5109326f2 | ||
![]() |
fd5bfe246f | ||
![]() |
a2fbb7cca0 | ||
![]() |
83e8f900e5 | ||
![]() |
00d6b7e150 | ||
![]() |
7860cdc769 | ||
![]() |
ce3bb7d8ca | ||
![]() |
add79b47d1 | ||
![]() |
a3fcfcb6d9 | ||
![]() |
d721ee374a | ||
![]() |
4eec4b6977 | ||
![]() |
695c7c7c44 | ||
![]() |
3ccc9f5176 | ||
![]() |
6d5ce06c9f | ||
![]() |
4b7e9d9c75 | ||
![]() |
ee88020054 | ||
![]() |
08fac559c9 | ||
![]() |
feee5600c4 | ||
![]() |
fa96dca929 | ||
![]() |
8c826a0c0d | ||
![]() |
b2fa733a0d | ||
![]() |
770daa330c | ||
![]() |
963f2b9b78 | ||
![]() |
07d7bb0834 | ||
![]() |
90f4c17533 | ||
![]() |
b27895e4ea | ||
![]() |
d4ca66706d | ||
![]() |
d7515b3084 | ||
![]() |
6d09865bae | ||
![]() |
6880901b4a | ||
![]() |
6776f0c93d | ||
![]() |
7adefd2d8d | ||
![]() |
6e5634cf62 | ||
![]() |
621dc6fd98 | ||
![]() |
cad94cd18b | ||
![]() |
64e517a02e | ||
![]() |
1db49ff214 | ||
![]() |
22a4160a58 | ||
![]() |
4b76b5e6ae | ||
![]() |
8fcfadf5a8 | ||
![]() |
9e1dff071a | ||
![]() |
4b1e933c76 | ||
![]() |
fc688441ad | ||
![]() |
0a256bde29 | ||
![]() |
d5ae314dec | ||
![]() |
d79b41c925 | ||
![]() |
f4a638ce14 | ||
![]() |
d33564ce88 | ||
![]() |
e79cba72a8 | ||
![]() |
56ecf9d99e | ||
![]() |
37c7eed2bb | ||
![]() |
2709231dfc | ||
![]() |
3e12261637 | ||
![]() |
770d9223af | ||
![]() |
48cf4b2ff3 | ||
![]() |
e252af2df4 | ||
![]() |
23bec2fe96 | ||
![]() |
0f39ccc7c3 | ||
![]() |
046d07bbf1 | ||
![]() |
70b45bcd24 | ||
![]() |
39a7c26977 | ||
![]() |
4e0a34966c | ||
![]() |
3321b097e6 | ||
![]() |
a4ddbd6605 | ||
![]() |
93b8ee1750 | ||
![]() |
6553f7a379 | ||
![]() |
7ec84597eb | ||
![]() |
4081173442 | ||
![]() |
3958714bff | ||
![]() |
620dfa6a29 | ||
![]() |
31e1e48dea | ||
![]() |
aa7daffe46 | ||
![]() |
ded0c29b24 | ||
![]() |
5df058415d | ||
![]() |
dc2cadc6d8 | ||
![]() |
ec80f5aa0e | ||
![]() |
9902445ff1 | ||
![]() |
c9cf0139ee | ||
![]() |
5c2e3edee7 | ||
![]() |
dc35f2d9dd | ||
![]() |
af004146e9 | ||
![]() |
0398229bca | ||
![]() |
0ce5143532 | ||
![]() |
18bd1fdf55 | ||
![]() |
0199019ee6 | ||
![]() |
d8daa1dd3d | ||
![]() |
3bc9e9c5ce | ||
![]() |
0d3596d237 | ||
![]() |
5064c24388 | ||
![]() |
e592d0e3d0 | ||
![]() |
2cc48d491e | ||
![]() |
295a6d0fe7 | ||
![]() |
9ea9289fdf | ||
![]() |
ba98736dfb | ||
![]() |
00dd7ee2df | ||
![]() |
2e647fb4ec | ||
![]() |
801bda3560 | ||
![]() |
659a62e133 | ||
![]() |
0cdba79f59 | ||
![]() |
f1fb23c7e7 | ||
![]() |
8ea8c0086e | ||
![]() |
63a1ae0c13 | ||
![]() |
7c9f5d3819 | ||
![]() |
e5376d144d | ||
![]() |
90762b9e13 | ||
![]() |
54ce5a7e16 | ||
![]() |
5882fc10a9 | ||
![]() |
3379a2510c | ||
![]() |
9ba070da7c | ||
![]() |
d47f4c5ca9 | ||
![]() |
276245a395 | ||
![]() |
718ac96777 | ||
![]() |
a54f6f416b | ||
![]() |
1ba06eeb27 | ||
![]() |
21b703725b | ||
![]() |
f9a00de8ee | ||
![]() |
c9d0ac3e73 | ||
![]() |
867a5b8d7c | ||
![]() |
ed48285da5 | ||
![]() |
2b62fbcc1b | ||
![]() |
86e7b0a13f | ||
![]() |
6fb4b9b545 | ||
![]() |
7dc6cba8f2 | ||
![]() |
e610d4d855 | ||
![]() |
eadce9145d | ||
![]() |
9711cee70a | ||
![]() |
9ae591bae7 | ||
![]() |
52f58727ca | ||
![]() |
8d0e7e2b42 | ||
![]() |
57dc5fa31a | ||
![]() |
8ecc721f3c | ||
![]() |
fd5920fc8d | ||
![]() |
28e65a1520 | ||
![]() |
ab3fc8ec7c | ||
![]() |
20a798d9f1 | ||
![]() |
c2ecc4adbb | ||
![]() |
666ced5fea | ||
![]() |
28c2323744 | ||
![]() |
c0c9f755a8 | ||
![]() |
2259acc3f2 | ||
![]() |
05626a4759 | ||
![]() |
d1ee800423 | ||
![]() |
8447c87ab0 | ||
![]() |
d7e22068af | ||
![]() |
3976657a66 | ||
![]() |
bf1473fbb1 | ||
![]() |
9f211d1fda | ||
![]() |
3e2931068e | ||
![]() |
820b88c9cf | ||
![]() |
c0215ffef3 | ||
![]() |
f6a506ff92 | ||
![]() |
7be573cac9 | ||
![]() |
ad5c4fc332 | ||
![]() |
1a8a0c3621 | ||
![]() |
ab3475f512 | ||
![]() |
aa416f90ec | ||
![]() |
5506c0ed69 | ||
![]() |
4a76a144ee | ||
![]() |
d40dc681dc | ||
![]() |
3514b0db89 | ||
![]() |
0c0472ae3c | ||
![]() |
c739d37bf5 | ||
![]() |
c3e5909411 | ||
![]() |
c4113c1abb | ||
![]() |
90bf0f13f4 | ||
![]() |
db66dff191 | ||
![]() |
fb9d04a3a9 | ||
![]() |
939cbd7a56 | ||
![]() |
8d7e6715fa | ||
![]() |
40ec1447d5 | ||
![]() |
095e471f8b | ||
![]() |
08e3a5aca3 | ||
![]() |
77c5645ccc | ||
![]() |
90affe7db1 | ||
![]() |
49af6ab171 | ||
![]() |
26d3c7a504 | ||
![]() |
20d1a2695b | ||
![]() |
6211014896 | ||
![]() |
f6ba941e68 | ||
![]() |
dffdc46568 | ||
![]() |
0c0669fbbd | ||
![]() |
66f478b36a | ||
![]() |
edffd85f94 | ||
![]() |
9b2eecca0e | ||
![]() |
31d3d491b5 | ||
![]() |
953e94cd8e | ||
![]() |
9605989054 | ||
![]() |
dda5ec7d13 | ||
![]() |
841cd2cfaf | ||
![]() |
b553263f11 | ||
![]() |
7fe44b6644 | ||
![]() |
d78b165322 | ||
![]() |
7008b11f64 | ||
![]() |
0066d29650 | ||
![]() |
eda033babe | ||
![]() |
40dda18f5a | ||
![]() |
1ea5575fa8 | ||
![]() |
2a234307a3 | ||
![]() |
0bb1035261 | ||
![]() |
9ff60e8a35 | ||
![]() |
66aa7edbf5 | ||
![]() |
e3664780e9 | ||
![]() |
a87d493cb3 | ||
![]() |
836bff3ea0 | ||
![]() |
8528cd12ef | ||
![]() |
e913be8add | ||
![]() |
a575714218 | ||
![]() |
656c4b0b7f | ||
![]() |
a6d16911e8 | ||
![]() |
6548776cb3 | ||
![]() |
cb287741d0 | ||
![]() |
414532db25 | ||
![]() |
87519d6d08 | ||
![]() |
af066bb15b | ||
![]() |
5e478d749d | ||
![]() |
981bcaf7d7 | ||
![]() |
1640682a10 | ||
![]() |
03b3bfa4e4 | ||
![]() |
ffbc685752 | ||
![]() |
91b163a825 | ||
![]() |
aa4804cf56 | ||
![]() |
795ca98b8f | ||
![]() |
6ad630edf4 | ||
![]() |
52ceaaf98e | ||
![]() |
5d51f18c5b | ||
![]() |
663cbab2c6 | ||
![]() |
57839377f8 | ||
![]() |
ab7776bdb9 | ||
![]() |
7e0b1b6907 | ||
![]() |
7bc2c0813d | ||
![]() |
a1a8abceea | ||
![]() |
dacacde524 | ||
![]() |
233cf9b1f1 | ||
![]() |
ceb7d65913 | ||
![]() |
2641478216 | ||
![]() |
2c3dff2a24 | ||
![]() |
28a0860824 | ||
![]() |
51f3416c70 | ||
![]() |
2ad6a04965 | ||
![]() |
16e70a0cdd | ||
![]() |
d824ca30fb | ||
![]() |
c7dbe7d16f | ||
![]() |
8c4dc337c5 | ||
![]() |
d89cfc3f1a | ||
![]() |
b3c372e270 | ||
![]() |
b1ac7d94ac | ||
![]() |
13119773bf | ||
![]() |
3ad9fe9743 | ||
![]() |
e7bec65b89 | ||
![]() |
03e227af4c | ||
![]() |
4268e1874a | ||
![]() |
17478a52ef | ||
![]() |
de689727b0 | ||
![]() |
18191000ea | ||
![]() |
39b94d4c75 | ||
![]() |
f3e1c56d5d | ||
![]() |
e47ff72ec3 | ||
![]() |
9d7b735ff4 | ||
![]() |
d84d4cfcdb | ||
![]() |
0cc14e937d | ||
![]() |
7f1f551334 | ||
![]() |
bf2ced4c6e | ||
![]() |
231af615af | ||
![]() |
4fa0efa07d | ||
![]() |
83e960fe03 | ||
![]() |
7eb76b4c99 | ||
![]() |
89ad08a537 | ||
![]() |
408c60bc15 | ||
![]() |
dc198e383b | ||
![]() |
593ba16c2d | ||
![]() |
da82cbe8da | ||
![]() |
8931759f84 | ||
![]() |
093a1fa844 | ||
![]() |
a8fad905a0 | ||
![]() |
c768a9150b | ||
![]() |
d2a0c08633 | ||
![]() |
85a3041b9b | ||
![]() |
cbf7f1a161 | ||
![]() |
4dfade96f7 | ||
![]() |
b9622ad165 | ||
![]() |
e35b732d80 | ||
![]() |
cde0f066ad | ||
![]() |
81b8d2ae1b | ||
![]() |
5b5e9af891 | ||
![]() |
b8632046b7 | ||
![]() |
7e0cae0590 | ||
![]() |
3dda280ef8 | ||
![]() |
3502ce5de7 | ||
![]() |
b3c000de45 | ||
![]() |
4b8fad4605 | ||
![]() |
b803c1d448 | ||
![]() |
e97c3a4b25 | ||
![]() |
d547fdd05b | ||
![]() |
c3e413c476 | ||
![]() |
48141e1116 | ||
![]() |
fd770b5264 | ||
![]() |
065fa49cc4 | ||
![]() |
2b5f9ab3b3 | ||
![]() |
03690b9f1e | ||
![]() |
903a491016 | ||
![]() |
544e151135 | ||
![]() |
b51b3bb9f3 | ||
![]() |
eed90367da | ||
![]() |
0b8c6692ae | ||
![]() |
62f5dd1a9f | ||
![]() |
6e75dd9c44 | ||
![]() |
3244f20dcc | ||
![]() |
9d575d6371 | ||
![]() |
20e9157d01 | ||
![]() |
d5b4553c90 | ||
![]() |
3c4be73678 | ||
![]() |
3cd766468d | ||
![]() |
02e7066749 | ||
![]() |
52fbb45df4 | ||
![]() |
367039f8b1 | ||
![]() |
ad336cdd9f | ||
![]() |
70ea4c2314 | ||
![]() |
2f7a91d785 | ||
![]() |
d1a6651fa5 | ||
![]() |
228bfffba1 | ||
![]() |
3b3b5efafe | ||
![]() |
7129b9737c | ||
![]() |
ac09ee3773 | ||
![]() |
529e546600 | ||
![]() |
a42c42f335 | ||
![]() |
6f4577d7b2 | ||
![]() |
1538171d31 | ||
![]() |
31853c5586 | ||
![]() |
326a4eda2f | ||
![]() |
2364d0505b | ||
![]() |
6e58e2bb33 | ||
![]() |
e36fbd87d8 | ||
![]() |
10cb3e1cb3 | ||
![]() |
1048e3d181 | ||
![]() |
8784b1224b | ||
![]() |
a320b3cc39 | ||
![]() |
fe6d00b6e1 | ||
![]() |
a4a1100abe | ||
![]() |
a1f98902a5 | ||
![]() |
6b7eb1cf3e | ||
![]() |
b63ffa490b | ||
![]() |
2a3b61aada | ||
![]() |
6d8652f393 | ||
![]() |
f4c25576bc | ||
![]() |
0a38435a2d | ||
![]() |
87308a3c21 | ||
![]() |
92d01dcbd3 | ||
![]() |
c657dabcda | ||
![]() |
37a3661698 | ||
![]() |
ed5f5bd169 | ||
![]() |
68a69c7531 | ||
![]() |
60d0a6cae4 | ||
![]() |
909bfc4a30 | ||
![]() |
c6e3aebc48 | ||
![]() |
ed6b678b5f | ||
![]() |
f5a06f8e69 | ||
![]() |
4658db9c21 | ||
![]() |
18c34ce29d | ||
![]() |
bae2baf3f5 | ||
![]() |
5895a6685a | ||
![]() |
36b51b64b1 | ||
![]() |
3d6dcbd181 | ||
![]() |
68ccb13a72 | ||
![]() |
5149511aaa | ||
![]() |
f3d4b86bae | ||
![]() |
22dce2fdf1 | ||
![]() |
c54e16c3b4 | ||
![]() |
5b2da28edd | ||
![]() |
d152d9f3af | ||
![]() |
b7014a6b21 | ||
![]() |
04346aa4b8 | ||
![]() |
d73071b38e | ||
![]() |
58bd26966d | ||
![]() |
79dd5a2f42 | ||
![]() |
f1b502b2f2 | ||
![]() |
38f90b400d | ||
![]() |
94b79fcd09 | ||
![]() |
e67e830946 | ||
![]() |
2de2fc00fc | ||
![]() |
81b153ccd5 | ||
![]() |
716cbfa090 | ||
![]() |
1c4944b166 | ||
![]() |
eba5645281 | ||
![]() |
01fb6feeca | ||
![]() |
0b8666629b | ||
![]() |
c86525e383 | ||
![]() |
0c8daca856 | ||
![]() |
7d0a18861b | ||
![]() |
f181ca044d | ||
![]() |
f54ed82496 | ||
![]() |
ccc6112714 | ||
![]() |
7c363ff4ef | ||
![]() |
4e55911213 | ||
![]() |
52a9e37729 | ||
![]() |
1886b160b9 | ||
![]() |
94a4844616 | ||
![]() |
d82f8c44d1 | ||
![]() |
e878f438fd | ||
![]() |
658a666f15 | ||
![]() |
ed1f74baca | ||
![]() |
9e4b80e25b | ||
![]() |
9fe0a39321 | ||
![]() |
df193261b3 | ||
![]() |
52395af0ce | ||
![]() |
8f59babaad | ||
![]() |
85cc7c017f | ||
![]() |
e8b09b3f03 | ||
![]() |
887612ddf9 | ||
![]() |
547eb06725 | ||
![]() |
b5a7f41a8e | ||
![]() |
b0dfeca98b | ||
![]() |
3074e2f530 | ||
![]() |
b0013b9304 | ||
![]() |
2de7d8931a | ||
![]() |
7b5412ff36 | ||
![]() |
596cb2afd6 | ||
![]() |
cda9f99f9e | ||
![]() |
07d760d7d8 | ||
![]() |
014b7ac201 | ||
![]() |
4c60fbde5d | ||
![]() |
88585418f8 | ||
![]() |
acb6337503 | ||
![]() |
114a8a3ac1 | ||
![]() |
afefe1d66c | ||
![]() |
a2802f124d | ||
![]() |
e953d9dcbb | ||
![]() |
4d178a225d | ||
![]() |
7f76864f41 | ||
![]() |
6cebc644c2 | ||
![]() |
2c41c57a13 | ||
![]() |
8b9875a771 | ||
![]() |
378e071232 | ||
![]() |
bfd8184648 | ||
![]() |
e851c7967a | ||
![]() |
29bc0c1fda | ||
![]() |
268d844b43 | ||
![]() |
ab141b84df | ||
![]() |
dd94898b19 | ||
![]() |
88d89c206d | ||
![]() |
1f701a84e4 | ||
![]() |
ffc00a6beb | ||
![]() |
aabbb5c254 | ||
![]() |
9f2fd0e2ec | ||
![]() |
05489891f7 | ||
![]() |
c953d02604 | ||
![]() |
f5333e7c8d | ||
![]() |
752f4e8760 | ||
![]() |
b5ae39836c | ||
![]() |
8b848cc05a | ||
![]() |
ee13f8d084 | ||
![]() |
29ec098798 | ||
![]() |
62878f29e0 | ||
![]() |
0483e44ddc | ||
![]() |
d954b4df1d | ||
![]() |
66044f8b4a | ||
![]() |
6847e1b6db | ||
![]() |
aa162b6601 | ||
![]() |
26cb15fe21 | ||
![]() |
37e03e2e9e | ||
![]() |
6aee48fc08 | ||
![]() |
09dd448b40 | ||
![]() |
a846bcf633 | ||
![]() |
bbad479580 | ||
![]() |
7c01cadb2f | ||
![]() |
58a90d595f | ||
![]() |
cfc73b1183 | ||
![]() |
28e84443d8 | ||
![]() |
c03566336a | ||
![]() |
9e87300567 | ||
![]() |
7259c668c4 | ||
![]() |
5d6a56d95c | ||
![]() |
6ee9288cb0 | ||
![]() |
fdf14b2a1f | ||
![]() |
0b88f3b30b | ||
![]() |
7601e62504 | ||
![]() |
78e1ac7572 | ||
![]() |
d879cc6114 | ||
![]() |
00b4817bc7 | ||
![]() |
a5688a7c3b | ||
![]() |
5c882bdbb2 | ||
![]() |
3fd1dfe87a | ||
![]() |
3213aa168f | ||
![]() |
b855389965 | ||
![]() |
d7f679428d | ||
![]() |
d6e10dddd6 | ||
![]() |
6e37e1ded6 | ||
![]() |
e79a0015f9 | ||
![]() |
8e3919ae09 | ||
![]() |
7f1766ba94 | ||
![]() |
efd8273901 | ||
![]() |
18b7df494e | ||
![]() |
c26d13484f | ||
![]() |
99682a11d1 | ||
![]() |
410654cb19 | ||
![]() |
bb4c6fe83b | ||
![]() |
310fa41bc2 | ||
![]() |
c6f7b03700 | ||
![]() |
bdcf9d8e93 | ||
![]() |
1249d069c7 | ||
![]() |
0e2b8df36b | ||
![]() |
1326f825d3 | ||
![]() |
2a38d713b8 | ||
![]() |
7372ccfe11 | ||
![]() |
919f4cb39c | ||
![]() |
e7b0e7bdde | ||
![]() |
977f28c30c | ||
![]() |
b59b6a0cfb | ||
![]() |
652e7a82af | ||
![]() |
98e7615c5b | ||
![]() |
72aa0375b7 | ||
![]() |
092967004a | ||
![]() |
3cc572a1cd | ||
![]() |
c9bdac8d33 | ||
![]() |
62a1d2d7ec | ||
![]() |
c1b6fbf11a | ||
![]() |
a548710a55 | ||
![]() |
510067a714 | ||
![]() |
ffb4f3179d | ||
![]() |
dde99fa150 | ||
![]() |
10b62bc7fb | ||
![]() |
d7af33f579 | ||
![]() |
3a615b6e06 | ||
![]() |
da5dc944e7 | ||
![]() |
923df99443 | ||
![]() |
72c5bd237b | ||
![]() |
c18f09d344 | ||
![]() |
470e946ec2 | ||
![]() |
050a2e60df | ||
![]() |
7e306054a7 | ||
![]() |
0c4103ce34 | ||
![]() |
c01c59e2e5 | ||
![]() |
a65315c537 | ||
![]() |
df27dcf878 | ||
![]() |
43b613c210 | ||
![]() |
ee4215f89e | ||
![]() |
0cfd663275 | ||
![]() |
9905a1ed75 | ||
![]() |
d2bf22994d | ||
![]() |
e70cadf5dd | ||
![]() |
caf35ad868 | ||
![]() |
3ac9bcafc7 | ||
![]() |
d95943a365 | ||
![]() |
3853f0010f | ||
![]() |
e5326430cb | ||
![]() |
322bef00a2 | ||
![]() |
858b9b4b38 | ||
![]() |
132f146a9f | ||
![]() |
469270882c | ||
![]() |
b05a7f2ba5 | ||
![]() |
5bdf7868d5 | ||
![]() |
390a653b94 | ||
![]() |
4fe435f450 | ||
![]() |
0a8261fdcb | ||
![]() |
012d4d9f8d | ||
![]() |
e9c029e8fc | ||
![]() |
6e9b840e45 | ||
![]() |
ff3dd800e4 | ||
![]() |
35594e23f9 | ||
![]() |
fea676c1d4 | ||
![]() |
8d7c8a0bdf | ||
![]() |
293091d13d | ||
![]() |
ce3c2d4f80 | ||
![]() |
e102f5d6bc | ||
![]() |
32241d1403 | ||
![]() |
37fb2e2c47 | ||
![]() |
7f28008d5d | ||
![]() |
f6786406ef | ||
![]() |
6006dd3944 | ||
![]() |
9aadb7f471 | ||
![]() |
4b1b702fc5 | ||
![]() |
63920fdce8 | ||
![]() |
08e9f14e9d | ||
![]() |
6b8b099339 | ||
![]() |
b03fcc5b6a | ||
![]() |
7fc7ffd708 | ||
![]() |
fa5721c2cb | ||
![]() |
4c794381e6 | ||
![]() |
283c51b193 | ||
![]() |
d7403d3745 | ||
![]() |
a761b0b417 | ||
![]() |
8988bc0098 | ||
![]() |
a18b3c6879 | ||
![]() |
bfbd845bab | ||
![]() |
50919f40c1 | ||
![]() |
1a03adebbd | ||
![]() |
2c775b560f | ||
![]() |
b1bd666386 | ||
![]() |
e0f7c16a10 | ||
![]() |
7467df155d | ||
![]() |
cafdd457c8 | ||
![]() |
0239edd4ee | ||
![]() |
c55b595ae9 | ||
![]() |
e1fdfdbef6 | ||
![]() |
89b0861f9e | ||
![]() |
455014b2c1 | ||
![]() |
38740e3a8b | ||
![]() |
784505ce4c | ||
![]() |
be16e7edce | ||
![]() |
4aaf7f78e8 | ||
![]() |
b310d3065d | ||
![]() |
c1727652a8 | ||
![]() |
7dfbad5451 | ||
![]() |
05cf0b83f4 | ||
![]() |
7f1dc2dfe1 | ||
![]() |
e58f0888b5 | ||
![]() |
c785906ffb | ||
![]() |
27a323a38f | ||
![]() |
602903de46 | ||
![]() |
e74a9a4295 | ||
![]() |
2b91fb06bc | ||
![]() |
89811361bb | ||
![]() |
42c050588b | ||
![]() |
f6aded2428 | ||
![]() |
7d82b73208 | ||
![]() |
7401330e81 | ||
![]() |
211a3bc6bc | ||
![]() |
eb82f8cc19 | ||
![]() |
94cf017102 | ||
![]() |
efa316dbf8 | ||
![]() |
247f27fa54 | ||
![]() |
a7ea074328 | ||
![]() |
b90d1a6be5 | ||
![]() |
0d5f7a607a | ||
![]() |
c98ff36977 | ||
![]() |
b07cd2d442 | ||
![]() |
40956e9501 | ||
![]() |
f4648a7023 | ||
![]() |
cf3dba89e0 | ||
![]() |
ec4712b5bf | ||
![]() |
99a83c0d97 | ||
![]() |
475239e1ba | ||
![]() |
d200070c16 | ||
![]() |
2077cd6bcb | ||
![]() |
86530371f4 | ||
![]() |
69e1bb66ad | ||
![]() |
761247fe0d | ||
![]() |
bbcff75b00 | ||
![]() |
8c63cc607b | ||
![]() |
b814b07e2a | ||
![]() |
27247438f5 | ||
![]() |
c6d69bdb75 | ||
![]() |
b1fa737b56 | ||
![]() |
4108cf1696 | ||
![]() |
3c05f5f5cb | ||
![]() |
e280a6afa9 | ||
![]() |
c1e38ec059 | ||
![]() |
4191a8feb7 | ||
![]() |
db22c3f348 | ||
![]() |
c63f994a5f | ||
![]() |
39bebbdcf6 | ||
![]() |
6513642efb | ||
![]() |
825c4378a0 | ||
![]() |
16342981eb | ||
![]() |
17b72a9d0c | ||
![]() |
e6e14fb37a | ||
![]() |
f3b5af1c43 | ||
![]() |
4baa37b2d9 | ||
![]() |
d3c7ef3088 | ||
![]() |
b769ae3805 | ||
![]() |
9a675bafb4 | ||
![]() |
1c281b98e8 | ||
![]() |
5e93bea2fd | ||
![]() |
14d2a7263b | ||
![]() |
eefdfb676a | ||
![]() |
600cd490a4 | ||
![]() |
24624f6136 | ||
![]() |
56e7f567c7 | ||
![]() |
3fee35fd3a | ||
![]() |
e0ac6e0349 | ||
![]() |
c12eed91b3 | ||
![]() |
520a783407 | ||
![]() |
ba4a6558b4 | ||
![]() |
e562ad14cd | ||
![]() |
9d2ed9dc97 | ||
![]() |
f6d3e9785f | ||
![]() |
c09146796f | ||
![]() |
b832ace635 | ||
![]() |
d0662a6132 | ||
![]() |
ba621af162 | ||
![]() |
32da91d145 | ||
![]() |
66e6cec446 | ||
![]() |
7a721ee84f | ||
![]() |
2d2ebdc887 | ||
![]() |
47f43a47ba | ||
![]() |
95cdf17527 | ||
![]() |
e49f675cfc | ||
![]() |
05f1919e3c | ||
![]() |
8375b66cbe | ||
![]() |
d659627959 | ||
![]() |
b27b8ba7fd | ||
![]() |
5584cedce3 | ||
![]() |
fae159a5f3 | ||
![]() |
95ebfe1657 | ||
![]() |
72535081d6 | ||
![]() |
fbb91c9c30 | ||
![]() |
9f0e5c4f3e | ||
![]() |
b5f8e9efcc | ||
![]() |
8b1b9fdb2a | ||
![]() |
7d8f4f54c0 | ||
![]() |
c6d26ec3fa | ||
![]() |
e49c9e1c98 | ||
![]() |
e21e897468 | ||
![]() |
6cb5dec1a9 | ||
![]() |
662d9d0d85 | ||
![]() |
2c498613b6 | ||
![]() |
7db1703477 | ||
![]() |
c5a67874cf | ||
![]() |
a8f5892562 | ||
![]() |
718762d284 | ||
![]() |
a560035482 | ||
![]() |
106f849e82 | ||
![]() |
3ddd24c7cd | ||
![]() |
87bbb6bf44 | ||
![]() |
1df09242a0 | ||
![]() |
ba338191cb | ||
![]() |
ca76b64ba8 | ||
![]() |
20f2d68e05 | ||
![]() |
10a8b14eff | ||
![]() |
42bb8b4bf6 | ||
![]() |
d05962c58b | ||
![]() |
4e79899323 | ||
![]() |
86ba717c83 | ||
![]() |
44bc96835a | ||
![]() |
c2446c48f5 | ||
![]() |
e5016cf4f1 | ||
![]() |
e8ec31e293 | ||
![]() |
408cd5a3eb | ||
![]() |
f9d2d9dc48 | ||
![]() |
94dbc6b240 | ||
![]() |
2bc839918a | ||
![]() |
ef4b6578cc | ||
![]() |
9ac66febee | ||
![]() |
e10b6974ae | ||
![]() |
ba5a73df45 | ||
![]() |
cc387a1f52 | ||
![]() |
04cb20a814 | ||
![]() |
d3c12a84fd | ||
![]() |
8592554ad7 | ||
![]() |
622c6e134e | ||
![]() |
bf2ebc561c | ||
![]() |
3d1e6eede0 | ||
![]() |
2cc90ccbaf | ||
![]() |
500bbb552b | ||
![]() |
489654c622 | ||
![]() |
bbc6376bcf | ||
![]() |
7597cb1c74 | ||
![]() |
efc11d4236 | ||
![]() |
35e6625601 | ||
![]() |
42de7bb0c9 | ||
![]() |
f5dc479714 | ||
![]() |
70db94f83c | ||
![]() |
736b916286 | ||
![]() |
1c7bc39c80 | ||
![]() |
7710f8e307 | ||
![]() |
8f851e1a3a | ||
![]() |
9d1f3b867f | ||
![]() |
b869c4253c | ||
![]() |
919543bf82 | ||
![]() |
94c3ba51d1 | ||
![]() |
1989657c9a | ||
![]() |
88d7f252b6 | ||
![]() |
3e777f987d | ||
![]() |
9746c85ce5 | ||
![]() |
7937f73031 | ||
![]() |
be9f987342 | ||
![]() |
b8e3e2d092 | ||
![]() |
20c3ddfd1e | ||
![]() |
4219559450 | ||
![]() |
e932c3efd5 | ||
![]() |
e3002fce0b | ||
![]() |
d3eefc41bc | ||
![]() |
df63e1bb7e | ||
![]() |
159aa09636 | ||
![]() |
19d4d84e58 | ||
![]() |
556626501c | ||
![]() |
839b5f72f6 | ||
![]() |
5c558601c7 | ||
![]() |
10f01c0fc6 | ||
![]() |
da616fd4ed | ||
![]() |
7bb3726f5b | ||
![]() |
42ac18d962 | ||
![]() |
6ba36e2cae | ||
![]() |
86b1a562c1 | ||
![]() |
40e97f7363 | ||
![]() |
167e21abf7 | ||
![]() |
93f3153903 | ||
![]() |
2fee305eb2 | ||
![]() |
813b265f6c | ||
![]() |
42c20082eb | ||
![]() |
1fb6305380 | ||
![]() |
75ce06c128 | ||
![]() |
f768ad63f0 | ||
![]() |
e272d26f30 | ||
![]() |
a1ccc60729 | ||
![]() |
3249a8f889 | ||
![]() |
926087a448 | ||
![]() |
bf25274fc0 | ||
![]() |
89334c25d6 | ||
![]() |
bdee3da08e | ||
![]() |
10dfc4d7b8 | ||
![]() |
bdd0dd6582 | ||
![]() |
84a65f0f32 | ||
![]() |
2418675822 | ||
![]() |
d64747ddef | ||
![]() |
4d6ce5114a | ||
![]() |
9604a4548d | ||
![]() |
c92a6fb413 | ||
![]() |
b646e4f9cf | ||
![]() |
2a45854818 | ||
![]() |
a8fd2da7ea | ||
![]() |
d4e6732eeb | ||
![]() |
169204173f | ||
![]() |
8b9d4b98d5 | ||
![]() |
58e52856b2 | ||
![]() |
3fbfadeebd | ||
![]() |
34ce80eb3d | ||
![]() |
c8121afed1 | ||
![]() |
a2bde8fd6b | ||
![]() |
2d199cae8d | ||
![]() |
cf6f8b952d | ||
![]() |
3e45e8cb10 | ||
![]() |
b6907c6bc2 | ||
![]() |
38e75cf422 | ||
![]() |
879ecea1e5 | ||
![]() |
3112078041 | ||
![]() |
74f9a0209b | ||
![]() |
224172f785 | ||
![]() |
c56d026679 | ||
![]() |
f2ffca8096 | ||
![]() |
9a20306399 | ||
![]() |
b90c9a379a | ||
![]() |
bf7a63bf5a | ||
![]() |
504cfe6d3e | ||
![]() |
4fa95bcd48 | ||
![]() |
8126d6d3fe | ||
![]() |
d9d5c98c5f | ||
![]() |
4266e426db | ||
![]() |
dc2edaca25 | ||
![]() |
861776f9f0 | ||
![]() |
20f5bd6489 | ||
![]() |
8916c83a8e | ||
![]() |
17c9556337 | ||
![]() |
c4401a45df | ||
![]() |
2e19ad3dcb | ||
![]() |
40b84b89bd | ||
![]() |
0cc0d0795e | ||
![]() |
889c82652b | ||
![]() |
073bdf24bb | ||
![]() |
eebb3e996d | ||
![]() |
739b6fb9a9 | ||
![]() |
f397558f75 | ||
![]() |
31fd01cc71 | ||
![]() |
eb2f3c7148 | ||
![]() |
71e0fd36ad | ||
![]() |
a87ae68c24 | ||
![]() |
8165ee4776 | ||
![]() |
eef3b28270 | ||
![]() |
148088f42a | ||
![]() |
71e7d6f3e6 | ||
![]() |
43016dcbc1 | ||
![]() |
d2e959e32e | ||
![]() |
229b7e874f | ||
![]() |
dac9c7b37f | ||
![]() |
83dcd9da7b | ||
![]() |
b3ec207213 | ||
![]() |
9f79586017 | ||
![]() |
0fb14d4c6a | ||
![]() |
624a96ddde | ||
![]() |
138a6ce408 | ||
![]() |
3c6bd6bf6f | ||
![]() |
1cf7516cc3 | ||
![]() |
45fd0bf934 | ||
![]() |
5adaf41288 | ||
![]() |
6097b7b9a9 | ||
![]() |
f7e6a25a50 | ||
![]() |
dd1310871f | ||
![]() |
d5360b9342 | ||
![]() |
13c3e15b4f | ||
![]() |
8410ca9273 | ||
![]() |
76e8d25f87 | ||
![]() |
0434caa89a | ||
![]() |
8a50145932 | ||
![]() |
53296bb330 | ||
![]() |
b717e0bafd | ||
![]() |
5f76b170b5 | ||
![]() |
e384966172 | ||
![]() |
b49790f48a | ||
![]() |
9eb10d06b8 | ||
![]() |
65ec97c2ac | ||
![]() |
4230df3c88 | ||
![]() |
420586ea0a | ||
![]() |
e68a7b82b3 | ||
![]() |
b5b9a5eac3 | ||
![]() |
b8b1996fb4 | ||
![]() |
2bc217b156 | ||
![]() |
5e5951880f | ||
![]() |
7f9f118fba | ||
![]() |
4d7f228a4c | ||
![]() |
825ef2898b | ||
![]() |
303a114178 | ||
![]() |
3922d1706a | ||
![]() |
d064d24903 | ||
![]() |
a8c8dbf535 | ||
![]() |
cb059d53eb | ||
![]() |
97d471bce1 | ||
![]() |
1544912dbc | ||
![]() |
21b053cd0d | ||
![]() |
50a837a05d | ||
![]() |
95b332586c | ||
![]() |
86d775ff84 | ||
![]() |
de793abb7b | ||
![]() |
21c1d1b7b9 | ||
![]() |
4fe01ebbfd | ||
![]() |
a32a5c929a | ||
![]() |
62695fba33 | ||
![]() |
44dbf74c57 | ||
![]() |
6ab00875a9 | ||
![]() |
b7a6bb2201 | ||
![]() |
e7b307f6fd | ||
![]() |
1b0a972cdd | ||
![]() |
d159432181 | ||
![]() |
20476876ac | ||
![]() |
6380e028fa | ||
![]() |
38f02a149e | ||
![]() |
979b15a8fa | ||
![]() |
8a4948085a | ||
![]() |
51ca23085a | ||
![]() |
99e52d68f4 | ||
![]() |
6b2d4a4b75 | ||
![]() |
f87a3ce570 | ||
![]() |
ad95fdecd9 | ||
![]() |
44bd7fda79 | ||
![]() |
6930202349 | ||
![]() |
92ab26d547 | ||
![]() |
35d7a70ade | ||
![]() |
b4e2224c3e | ||
![]() |
281c4baeb3 | ||
![]() |
e97b94d393 | ||
![]() |
c6121ff201 | ||
![]() |
1d01338e49 | ||
![]() |
8a47cdd1da | ||
![]() |
0d3ff8a2d4 | ||
![]() |
7e3535ad1a | ||
![]() |
088a146888 | ||
![]() |
bc6f641eb3 | ||
![]() |
d63b36f3bf | ||
![]() |
e1926ed217 | ||
![]() |
823e7bf76e | ||
![]() |
cc685141e9 | ||
![]() |
b28153d8f9 | ||
![]() |
d0ef7f4238 | ||
![]() |
35c8e57633 | ||
![]() |
037646537b | ||
![]() |
20c0abf69d | ||
![]() |
358b0701a4 | ||
![]() |
a18fd1d5c9 | ||
![]() |
24c7c0a076 | ||
![]() |
531cfbea29 | ||
![]() |
aee1ff2fcb | ||
![]() |
c137d28da5 | ||
![]() |
e22f0e2065 | ||
![]() |
8a08cc3bff | ||
![]() |
ea4d3d782c | ||
![]() |
ae1bbffc64 | ||
![]() |
9999f6d57c | ||
![]() |
c14aaf02a6 | ||
![]() |
dccb4c476a | ||
![]() |
7ed8801f46 | ||
![]() |
ae3c5faef5 | ||
![]() |
5912354f09 | ||
![]() |
4590a14de1 | ||
![]() |
6ad8c5a10f | ||
![]() |
8d8f3e51fb | ||
![]() |
8c77b0734c | ||
![]() |
2188babab8 | ||
![]() |
4e2313d387 | ||
![]() |
4f70b6822b | ||
![]() |
9a44f8439e | ||
![]() |
f8adb0cecf | ||
![]() |
fcfce2d68d | ||
![]() |
28dc4d32ad | ||
![]() |
b30aee4314 | ||
![]() |
8723151361 | ||
![]() |
7e24402671 | ||
![]() |
caf1501c89 | ||
![]() |
94682fb0ff | ||
![]() |
b80cb91d54 | ||
![]() |
76beca23c6 | ||
![]() |
e96e94d471 | ||
![]() |
64470891ba | ||
![]() |
a3e0f6eb7d | ||
![]() |
0dba3d5300 | ||
![]() |
46b36ba7e5 | ||
![]() |
46602c744b | ||
![]() |
e527a6d176 | ||
![]() |
23e3011d82 | ||
![]() |
4c15aa7c49 | ||
![]() |
e22ca653ed | ||
![]() |
d2b2bd0226 | ||
![]() |
daa4066c04 | ||
![]() |
bb25509fd6 | ||
![]() |
f7118a6ac3 | ||
![]() |
1a35ef9cc3 | ||
![]() |
ece56944d8 | ||
![]() |
5bdc6fe3cc | ||
![]() |
795eb1e028 | ||
![]() |
6278dd8df3 | ||
![]() |
0511d06d63 | ||
![]() |
7a84ffee5e | ||
![]() |
cdf78c0f4c | ||
![]() |
41fa410010 | ||
![]() |
50cf128471 | ||
![]() |
4ea8b141da | ||
![]() |
3654906e9a | ||
![]() |
fb73b9c922 | ||
![]() |
be8be01ed5 | ||
![]() |
130c894a35 | ||
![]() |
9786a51822 | ||
![]() |
5224cbb9c6 | ||
![]() |
0a87820f9a | ||
![]() |
2caa65add6 | ||
![]() |
3a0d9526f7 | ||
![]() |
cac1387d24 | ||
![]() |
e3bc75da15 | ||
![]() |
ba23fa9073 | ||
![]() |
8722b87727 | ||
![]() |
c86616b971 | ||
![]() |
552c3b4d98 | ||
![]() |
688244c87b | ||
![]() |
ce905f3144 | ||
![]() |
b2b3975b70 | ||
![]() |
8139bebb6a | ||
![]() |
263ec73451 | ||
![]() |
7d50c6e69d | ||
![]() |
8b04957820 | ||
![]() |
5f54964d69 | ||
![]() |
267734e866 | ||
![]() |
9fec5fd1c0 | ||
![]() |
50490ce808 | ||
![]() |
cc1c4081bc | ||
![]() |
ced19968aa | ||
![]() |
5a43b8f9f4 | ||
![]() |
fe8e1d2b52 | ||
![]() |
f5db1b66cb | ||
![]() |
50a39d439a | ||
![]() |
6deefda545 | ||
![]() |
3e05cfe24f | ||
![]() |
353be72dc9 | ||
![]() |
50cfb869e2 | ||
![]() |
a693233150 | ||
![]() |
c7836aabfe | ||
![]() |
8d5e6d9d14 | ||
![]() |
c947f92a73 | ||
![]() |
8b1effc2f3 | ||
![]() |
e72e7f3f15 | ||
![]() |
3ed43f3f09 | ||
![]() |
14b30ce48f | ||
![]() |
f2b091cb83 | ||
![]() |
ba47fededd | ||
![]() |
84e010bdf7 | ||
![]() |
2fa5946bc5 | ||
![]() |
f2c239f67c | ||
![]() |
59786c7bb0 | ||
![]() |
1cd5622ca0 | ||
![]() |
b8fc40f60f | ||
![]() |
d8e0ba840d | ||
![]() |
66da520835 | ||
![]() |
19793e41b9 | ||
![]() |
00ed4c5743 | ||
![]() |
c3f9abea0e | ||
![]() |
4dcd92b528 | ||
![]() |
601f32fc00 | ||
![]() |
a7a9bc72a2 | ||
![]() |
4a85977874 | ||
![]() |
361b63256f | ||
![]() |
7bd77ba43e | ||
![]() |
c5435e0a27 | ||
![]() |
3f6420a6d4 | ||
![]() |
d317388d18 | ||
![]() |
5139efd4d7 | ||
![]() |
f859b48a57 | ||
![]() |
4e32ce086e | ||
![]() |
aca3db06c2 | ||
![]() |
4bd2a9f766 | ||
![]() |
51d0078e26 | ||
![]() |
1578b12cf9 | ||
![]() |
64c0b37726 | ||
![]() |
535012f844 | ||
![]() |
85ac4314f5 | ||
![]() |
1f9aa108a4 | ||
![]() |
8e606dac8b | ||
![]() |
04eadaad67 | ||
![]() |
dcc3d9e74c | ||
![]() |
4770608d8f | ||
![]() |
82ac006a13 | ||
![]() |
06346b956c | ||
![]() |
795f03f8b8 | ||
![]() |
304a5d804e | ||
![]() |
1175f6f9c5 | ||
![]() |
e4bc8d2180 | ||
![]() |
a3df77e713 | ||
![]() |
0909d43bcf | ||
![]() |
31017fee9d | ||
![]() |
6826e69795 | ||
![]() |
bd3fbd5cf7 | ||
![]() |
1fe2b3bdc2 | ||
![]() |
f84c8eedd2 | ||
![]() |
42e168a1fc | ||
![]() |
51fa5d18e6 | ||
![]() |
8985748f8a | ||
![]() |
e089cc898c | ||
![]() |
c987412482 | ||
![]() |
bae1386c58 | ||
![]() |
839ae0b1df | ||
![]() |
e6966ae841 | ||
![]() |
8f7a84e495 | ||
![]() |
a8d615071e | ||
![]() |
b19f306bbf | ||
![]() |
677534c8ec | ||
![]() |
ce57466695 | ||
![]() |
a213a6a0cd | ||
![]() |
920d850915 | ||
![]() |
2a727b6204 | ||
![]() |
5f610c4049 | ||
![]() |
8d1dc66c59 | ||
![]() |
206983cffd | ||
![]() |
21c7068341 | ||
![]() |
b3426ec6eb | ||
![]() |
7099dc6d73 | ||
![]() |
3b18b4398c | ||
![]() |
72ce140895 | ||
![]() |
fcd4b23710 | ||
![]() |
489f464163 | ||
![]() |
2721a43dde | ||
![]() |
724dfd45e6 | ||
![]() |
e759b44d37 | ||
![]() |
fb95d8f5ed | ||
![]() |
3d76792239 | ||
![]() |
49be0485c5 | ||
![]() |
ee7180ccd3 | ||
![]() |
4c3e45ee02 | ||
![]() |
480aca1c80 | ||
![]() |
3dc3b6f0d2 | ||
![]() |
f41210f2d7 | ||
![]() |
91db603a89 | ||
![]() |
7b251fb419 | ||
![]() |
0e5e09dbbf | ||
![]() |
d4e28ec735 | ||
![]() |
aa836a8954 | ||
![]() |
bd7868cfc7 | ||
![]() |
314906adf3 | ||
![]() |
067890345e | ||
![]() |
3907431369 | ||
![]() |
179af06438 | ||
![]() |
ee613233db | ||
![]() |
01c03f33f9 | ||
![]() |
bc608eff07 | ||
![]() |
6c7648b75a | ||
![]() |
db8b5cc033 | ||
![]() |
d62d6f5662 | ||
![]() |
14f600da35 | ||
![]() |
2a5a2cd61d | ||
![]() |
2da2f0af9a | ||
![]() |
3b8d7a5271 | ||
![]() |
468b146a64 | ||
![]() |
d81f946446 | ||
![]() |
097aae895f | ||
![]() |
ad41fd2571 | ||
![]() |
f71ea7eddc | ||
![]() |
860f9b0854 | ||
![]() |
3bd4605c1f | ||
![]() |
5863d962ac | ||
![]() |
569fa62737 | ||
![]() |
65a1ba9102 | ||
![]() |
9e09e5db5a | ||
![]() |
6b95229ff7 | ||
![]() |
6ae70ce7f6 | ||
![]() |
4a5d084ddd | ||
![]() |
502e9b6271 | ||
![]() |
ffc709c557 | ||
![]() |
52b64822c5 | ||
![]() |
20e7b873a5 | ||
![]() |
7d88617964 | ||
![]() |
574cc53075 | ||
![]() |
3e4e27f236 | ||
![]() |
f7b2d5b6d6 | ||
![]() |
eee4e2f0eb | ||
![]() |
0fc1806ca4 | ||
![]() |
5351bd9596 | ||
![]() |
348d40ad22 | ||
![]() |
10cbf3b3b3 | ||
![]() |
1f77a749be | ||
![]() |
3d0e970760 | ||
![]() |
a55662ea1b | ||
![]() |
d04e65108d | ||
![]() |
f33f7ab41a | ||
![]() |
c22b22f49a | ||
![]() |
19c195a357 | ||
![]() |
ecf8f311d9 | ||
![]() |
14d79338de | ||
![]() |
5dc4bf258b | ||
![]() |
a30b3b9505 | ||
![]() |
f78e02e7e8 | ||
![]() |
50ef190ae7 | ||
![]() |
031129a31c | ||
![]() |
dc66a5959d | ||
![]() |
7ba956d760 | ||
![]() |
15bedc303e | ||
![]() |
8d35bb6a9b | ||
![]() |
ddfea8f3cb | ||
![]() |
fd92628c30 | ||
![]() |
37f9771b97 | ||
![]() |
42b5162ca4 | ||
![]() |
b0edf297a2 | ||
![]() |
e8b99cea70 | ||
![]() |
fcbb5f68fe | ||
![]() |
6be0d179fc | ||
![]() |
d54172d366 | ||
![]() |
ab35650f0b | ||
![]() |
850bb05481 | ||
![]() |
7826d487cc | ||
![]() |
07053ca7e9 | ||
![]() |
022490e461 | ||
![]() |
397c5ee9d8 | ||
![]() |
8c0377aa39 | ||
![]() |
b7de0f61c7 | ||
![]() |
e97de9c6df | ||
![]() |
58413e5218 | ||
![]() |
4c6eb18528 | ||
![]() |
92c24739bf | ||
![]() |
263d4b7caf | ||
![]() |
9aa2637a71 | ||
![]() |
ad1d9f556f | ||
![]() |
f53413006b | ||
![]() |
de79e6c496 | ||
![]() |
7e30ec4459 | ||
![]() |
d8b42af4b1 | ||
![]() |
aa49c5b0b1 | ||
![]() |
1b0eb64698 | ||
![]() |
3ef5dbd2ae | ||
![]() |
ec244587eb | ||
![]() |
0ba67b2634 | ||
![]() |
a20c6f23e2 | ||
![]() |
1bc65c0eef | ||
![]() |
4c907dbf9e | ||
![]() |
92f66f4b4a | ||
![]() |
70e504ecef | ||
![]() |
eeff55eb7d | ||
![]() |
c4f7223293 | ||
![]() |
e8456dec57 | ||
![]() |
06c89b0cc5 | ||
![]() |
cca8221f28 | ||
![]() |
c8d7bdca8b | ||
![]() |
e1f8a1abbb | ||
![]() |
51a06c4ab6 | ||
![]() |
16abca2913 | ||
![]() |
6c74206544 | ||
![]() |
68a695d58c | ||
![]() |
972b8972be | ||
![]() |
ed32bcfb70 | ||
![]() |
91086c594e | ||
![]() |
215380b806 | ||
![]() |
170f70d005 | ||
![]() |
55ccf3e987 | ||
![]() |
0d4a2164f3 | ||
![]() |
46bbf2234a | ||
![]() |
3478d4e86c | ||
![]() |
c7f5f77925 | ||
![]() |
8a3aebf3cc | ||
![]() |
f1ed611aa9 | ||
![]() |
7fcfe644da | ||
![]() |
6c7ff86a09 | ||
![]() |
3d4f64a4e6 | ||
![]() |
0c6515b4c7 | ||
![]() |
de8726cccf | ||
![]() |
0c48b342a5 | ||
![]() |
d653c516ea | ||
![]() |
30ccf4f8f6 | ||
![]() |
c1b28071df | ||
![]() |
2bf7bd0a4e | ||
![]() |
ff53a3e3e5 | ||
![]() |
b520bfece0 | ||
![]() |
9a228017c1 | ||
![]() |
572927668a | ||
![]() |
5f8cc5f460 | ||
![]() |
43341c802f | ||
![]() |
75fbf8d1f4 | ||
![]() |
368ef8478c | ||
![]() |
8ed3264ae6 | ||
![]() |
a6d8ed829f | ||
![]() |
4e9cadeca6 | ||
![]() |
ce79c8e8cd | ||
![]() |
bd7a11f0b1 | ||
![]() |
889779113d | ||
![]() |
9604076555 | ||
![]() |
d09605c6b9 | ||
![]() |
f187dff23a | ||
![]() |
a2179ca53e | ||
![]() |
d0760b2925 | ||
![]() |
5a3dec7c2e | ||
![]() |
e17bcc714a | ||
![]() |
4f2392e492 | ||
![]() |
a6541296a1 | ||
![]() |
7a601a1cd0 | ||
![]() |
f25c090039 | ||
![]() |
9bc675873d | ||
![]() |
59fd3c7170 | ||
![]() |
4290e705cf | ||
![]() |
863d203133 | ||
![]() |
f35573611d | ||
![]() |
cd3a239482 | ||
![]() |
9682b02b8e | ||
![]() |
bf95beb536 | ||
![]() |
ae288c83f2 | ||
![]() |
a76e1de49e | ||
![]() |
3583962085 | ||
![]() |
6b2f528624 | ||
![]() |
e4a568e6b9 | ||
![]() |
d146e04a13 | ||
![]() |
284f987783 | ||
![]() |
8e5daeb960 | ||
![]() |
26982d1da0 | ||
![]() |
bab558cd5c | ||
![]() |
9ce168b4b6 | ||
![]() |
4ae913e307 | ||
![]() |
51cae12fab | ||
![]() |
6b1124c23f | ||
![]() |
85174c6f45 | ||
![]() |
4ac3ea014c | ||
![]() |
f98aecaa59 | ||
![]() |
88739db6e7 | ||
![]() |
f7d695c015 | ||
![]() |
3a531462d9 | ||
![]() |
ddbc3839a5 | ||
![]() |
ad1edc8281 | ||
![]() |
5f46f97298 | ||
![]() |
d070f6da85 | ||
![]() |
401e995df6 | ||
![]() |
370bef25ff | ||
![]() |
2c63ab3caf | ||
![]() |
9841c571b6 | ||
![]() |
52559730d9 | ||
![]() |
9269a74092 | ||
![]() |
5348905c23 | ||
![]() |
6b816f4d44 | ||
![]() |
2feeb560d1 | ||
![]() |
3c2980dfdf | ||
![]() |
871ed870cc | ||
![]() |
ac550a1ec1 | ||
![]() |
7ed7ae01ca | ||
![]() |
e158a873f5 | ||
![]() |
f78af97b4a | ||
![]() |
7f2bb15d49 | ||
![]() |
6487db064a | ||
![]() |
fd55efb3b9 | ||
![]() |
88df1cee82 | ||
![]() |
7cc3a0cf86 | ||
![]() |
6fde8fe200 | ||
![]() |
db3d563e3f | ||
![]() |
b95f7ed91a | ||
![]() |
28c39791dc | ||
![]() |
905bc9c140 | ||
![]() |
9643c12429 | ||
![]() |
75c8129185 | ||
![]() |
ee8ad500ce | ||
![]() |
5a0a034be3 | ||
![]() |
8ee6d74613 | ||
![]() |
a0d0790a34 | ||
![]() |
b96d75b97d | ||
![]() |
ab72bb9f8c | ||
![]() |
e513731455 | ||
![]() |
3ed43b0a85 | ||
![]() |
42ce9fa21b | ||
![]() |
b981f87d38 | ||
![]() |
dbf31053c9 | ||
![]() |
1a179c7dca | ||
![]() |
5d5d954077 | ||
![]() |
5b03c3dcc3 | ||
![]() |
9eb9114ece | ||
![]() |
80a49262f4 | ||
![]() |
d12f9993dd | ||
![]() |
d8df113676 | ||
![]() |
e7ed3f7789 | ||
![]() |
67d10d10ae | ||
![]() |
03d8d6c247 | ||
![]() |
15a708fbf2 | ||
![]() |
ecafa39d1e | ||
![]() |
da7c04d250 | ||
![]() |
34a7df9180 | ||
![]() |
42d822a48d | ||
![]() |
77794294b1 | ||
![]() |
b3c9cb2728 | ||
![]() |
fcddfb0162 | ||
![]() |
5bac2e9a4e | ||
![]() |
01ce03ca5c | ||
![]() |
2fceade3a2 | ||
![]() |
5bc915f487 | ||
![]() |
0e8a385b6d | ||
![]() |
2cd37d90b1 | ||
![]() |
f2a7811f0c | ||
![]() |
4cc1704915 | ||
![]() |
6809645256 | ||
![]() |
0c053d410c | ||
![]() |
6a7b9c8a65 | ||
![]() |
394a23fa57 | ||
![]() |
a178ab9bc0 | ||
![]() |
d7f7a40f06 | ||
![]() |
7791ae1b0d | ||
![]() |
82190c7d0e | ||
![]() |
380ac2f1bd | ||
![]() |
bd85c0c25a | ||
![]() |
15bb6177d8 | ||
![]() |
fb2e7dfe12 | ||
![]() |
20f28bb7df | ||
![]() |
46dc4ea6e3 | ||
![]() |
da0b3e71b3 | ||
![]() |
c2e2b1e9be | ||
![]() |
4b23765042 | ||
![]() |
f7c8d39b5d | ||
![]() |
94744862a5 | ||
![]() |
13a977f84f | ||
![]() |
11bac92d2f | ||
![]() |
a6085279c9 | ||
![]() |
dea874de02 | ||
![]() |
ec78639d94 | ||
![]() |
1123611371 | ||
![]() |
1bc5e6116c | ||
![]() |
5a29cde314 | ||
![]() |
944b059abe | ||
![]() |
d9d4d89a27 | ||
![]() |
86f641c3b0 | ||
![]() |
3a99d005b1 | ||
![]() |
325b91933d | ||
![]() |
bd08e9b125 | ||
![]() |
9de1ff7cf4 | ||
![]() |
142af5c218 | ||
![]() |
596a577529 | ||
![]() |
c460c9e674 | ||
![]() |
312e619fa6 | ||
![]() |
45d3ebab3d | ||
![]() |
34bd22f40e | ||
![]() |
ed5a5bb069 | ||
![]() |
4e15fee3fb | ||
![]() |
68e3045da2 | ||
![]() |
87eb1e0dc9 | ||
![]() |
175485284d | ||
![]() |
c2e49aa2d7 | ||
![]() |
bcff843186 | ||
![]() |
5246c3a329 | ||
![]() |
19b9888d34 | ||
![]() |
bcebca9c97 | ||
![]() |
570e0fa782 | ||
![]() |
d5e9c7532a | ||
![]() |
5c94655bd7 | ||
![]() |
c48030d54e | ||
![]() |
13babfa3f9 | ||
![]() |
ed1db45990 | ||
![]() |
4e6081bacc | ||
![]() |
062097a438 | ||
![]() |
220fa8a8fc | ||
![]() |
5b931afefb | ||
![]() |
6678928301 | ||
![]() |
b8d06babee | ||
![]() |
38b7a7c660 | ||
![]() |
3bc72a46df | ||
![]() |
e65c266831 | ||
![]() |
5e846059f7 | ||
![]() |
f76536b0a4 | ||
![]() |
536ead64ac | ||
![]() |
6c1ac6f038 | ||
![]() |
207f0b255f | ||
![]() |
a80f4090af | ||
![]() |
395f742bce | ||
![]() |
20a695f571 | ||
![]() |
06c71cc332 | ||
![]() |
fedcdb1b99 | ||
![]() |
d4652a614c | ||
![]() |
b374e8e962 | ||
![]() |
277fe6d5ad | ||
![]() |
54525d60ef | ||
![]() |
ce572f82cb | ||
![]() |
eb7f3613ca | ||
![]() |
fe9229c8bc | ||
![]() |
2d967f8741 | ||
![]() |
bdd75ecfee | ||
![]() |
37fe7925a4 | ||
![]() |
3aa22eccbd | ||
![]() |
6f3594d294 | ||
![]() |
d7232aa8cd | ||
![]() |
359f030ddb | ||
![]() |
540b1ece0a | ||
![]() |
3efa77e78f | ||
![]() |
d446034193 | ||
![]() |
20227a44a4 | ||
![]() |
d538bde579 | ||
![]() |
bc7407ad85 | ||
![]() |
f083b6fd7a | ||
![]() |
4101a83639 | ||
![]() |
5296edb8d2 | ||
![]() |
6cfdea17b3 | ||
![]() |
309be28256 | ||
![]() |
448dc172d0 | ||
![]() |
a5d77d7cbb | ||
![]() |
4c74bda247 | ||
![]() |
22c5470b9b | ||
![]() |
71da44c618 | ||
![]() |
9859737668 | ||
![]() |
608a86d45c | ||
![]() |
0fab2df676 | ||
![]() |
7b41fa961c | ||
![]() |
9955a0e07b | ||
![]() |
cf2160993f | ||
![]() |
7d664ac105 | ||
![]() |
2ddd6aa468 | ||
![]() |
ed0b1f28cb | ||
![]() |
a6a335d481 | ||
![]() |
b2027eb2d7 | ||
![]() |
af177f5249 | ||
![]() |
6c35f106a4 | ||
![]() |
9b643fa700 | ||
![]() |
a5c27190c1 | ||
![]() |
b872318350 | ||
![]() |
a16a57a1f9 | ||
![]() |
3d10f91026 | ||
![]() |
fa43001824 | ||
![]() |
f32dbe5ef8 | ||
![]() |
47d97e77d8 | ||
![]() |
eefc346312 | ||
![]() |
31ebf1807f | ||
![]() |
b4e8c39158 | ||
![]() |
2a1ce40a9c | ||
![]() |
2d5827a1b9 | ||
![]() |
c3d9efc691 | ||
![]() |
304e54f009 | ||
![]() |
4e682ecbe2 | ||
![]() |
877f937413 | ||
![]() |
962e0f8523 | ||
![]() |
01b55843d2 | ||
![]() |
7338ddaadd | ||
![]() |
d04786884b | ||
![]() |
654d8ac75a | ||
![]() |
3d3025c2cd | ||
![]() |
0b57325c04 | ||
![]() |
91f7d8dfc3 | ||
![]() |
5952d49711 | ||
![]() |
0bac3deabb | ||
![]() |
4b6eeba319 | ||
![]() |
c0ba8a6711 | ||
![]() |
8b065cf7ac | ||
![]() |
505763e0be | ||
![]() |
1afd3102ab | ||
![]() |
107f96e921 | ||
![]() |
61294336b5 | ||
![]() |
08e768fc52 | ||
![]() |
87b3c37cb0 | ||
![]() |
4f3c6ed090 | ||
![]() |
d7d4ab6390 | ||
![]() |
12b0eadc66 | ||
![]() |
5702708643 | ||
![]() |
1ab9fdb229 | ||
![]() |
9c64566386 | ||
![]() |
4a413cf72b | ||
![]() |
69e56a5087 | ||
![]() |
2d3277a7ea | ||
![]() |
df75ae5c8c | ||
![]() |
0addaf56d3 | ||
![]() |
040839714d | ||
![]() |
ebdfc45b69 | ||
![]() |
a590fec967 | ||
![]() |
68be1ad42e | ||
![]() |
ca9715c3bc | ||
![]() |
a3b6ed8fb3 | ||
![]() |
4bd0e3efe0 | ||
![]() |
274c020148 | ||
![]() |
387f67dad4 | ||
![]() |
ff9b3486c5 | ||
![]() |
8824aa4624 | ||
![]() |
03bfa5f972 | ||
![]() |
0e1571c6c8 | ||
![]() |
4e5bf5912f | ||
![]() |
90cbbe7d3c | ||
![]() |
e00f440717 | ||
![]() |
696b5f0996 | ||
![]() |
bcb34f1e51 | ||
![]() |
dc08f8df1b | ||
![]() |
a796c85e01 | ||
![]() |
3dae5ec57a | ||
![]() |
7bc0b8947f | ||
![]() |
2d7e511bb8 |
303
CHANGELOG
303
CHANGELOG
|
@ -1,3 +1,306 @@
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.30
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.37
|
||||||
|
- receipt comment can be disabled
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.29
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.36
|
||||||
|
- fix regression in FolderNotify
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.28
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.35
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.27
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.34
|
||||||
|
- Document/folder check distinguishes between documents which cannot be
|
||||||
|
receiped/revised because of access rights or the recipient/revisor being
|
||||||
|
disabled.
|
||||||
|
- fix creating user via rest api
|
||||||
|
- checkout info does not depend on whether the logged in user was substituted
|
||||||
|
- add new endpoints for managing roles by rest api
|
||||||
|
- add transmittals in menu
|
||||||
|
- add legacy access check for controllers
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.26
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.33
|
||||||
|
- add task to import files from drop folder
|
||||||
|
- add substitution of users in bootstrap4 theme
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.25
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.32
|
||||||
|
- status log can be turned on with advanced access control
|
||||||
|
- scheduler has more condensed layout
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.24
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- add task to send list of recent changes by email
|
||||||
|
- merge changes up to 5.1.31
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.23
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix setting recipients and revisors
|
||||||
|
- check in of a document is allowed for the user having done the check out
|
||||||
|
or those users with unlimited access rights on the document
|
||||||
|
- merge changes up to 5.1.30
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.22
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.29
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.21
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.28
|
||||||
|
- add new check for documents with identical sequence numbers in a folder
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.20
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.27
|
||||||
|
- fix triggering workflow (Closes: #542)
|
||||||
|
- create original file name from new document name when uploading document
|
||||||
|
from the library folder. Used to be the original file name
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.19
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.26
|
||||||
|
- fix deletion of tasks when using bootstrap4 theme
|
||||||
|
- fix deletion of documents when clicking on icon in document list (my documents)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.18
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- finish op/op.Cron.php, returns json
|
||||||
|
- merge changes up to 5.1.25
|
||||||
|
- fix sending trigger workflow notification (Closes: #522)
|
||||||
|
- fix updating und deleting items in document lists
|
||||||
|
- call hook 'filenameDownloadItem' in search export and transmittal download
|
||||||
|
- fix possible xss attack in UsrMgr (CVE-2022-28479)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.17
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.24
|
||||||
|
- send notification when a receiption of a document was submitted
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.16
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- cancel checkout needs confirmation
|
||||||
|
- add input field to filter list of recipients if more then 10
|
||||||
|
- add task for creating missing preview images
|
||||||
|
- no longer use old PHPExcel classes, use PhpOffice\PhpSpreadsheet\Spreadsheet
|
||||||
|
instead
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.15
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.22
|
||||||
|
- add a new task for checking the checksum of all document versions
|
||||||
|
- add searching for revision date
|
||||||
|
- list of open tasks will no longer contain expired documents but MyDocuments
|
||||||
|
page still list them
|
||||||
|
- fixed downloading approval file (Closes: #503)
|
||||||
|
- regular users can no longer set owner of document while uploading
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.14
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- show debug menu only if debug mode is on
|
||||||
|
- merge changes up to 5.1.21
|
||||||
|
- document links can be added by regular users again
|
||||||
|
- add list of checked out documents to tasks
|
||||||
|
- issue a warning when removing a document which is checked out
|
||||||
|
- checked out can be discarded if it was changed
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.13
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.20
|
||||||
|
- create download file for transmittal in system tmp (Closes: #478)
|
||||||
|
- sync source code of checkin with update document
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.12
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.19
|
||||||
|
- fix various errors concerning workflows
|
||||||
|
- show menu tasks even if not admin (Closes: #485)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.11
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.18
|
||||||
|
- fix access restriction for roles (content of documents was visible even if the
|
||||||
|
role and status didn't allow it)
|
||||||
|
- fix missing Content-Type in UserList (Closes: #480)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.10
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.17
|
||||||
|
- fix list of previous document versions (Closes: #471)
|
||||||
|
- fix uploading files with fine uploader (Closes: #472)
|
||||||
|
- clear revision date when all revisors have been deleted
|
||||||
|
- improve scheduler task management, tasks can be deleted, fix setting parameters
|
||||||
|
- add op.Cron.php for running all scheduled tasks
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.9
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.16
|
||||||
|
- fix removal of roles (Closes: #465)
|
||||||
|
- fix password forgotten process
|
||||||
|
- fix setting role of new user and retrieving role of existing user
|
||||||
|
- processes of users can be deleted again, instead of only transfered to
|
||||||
|
another user
|
||||||
|
- fix export of search results, headers of excel file can be translated
|
||||||
|
- fix arcordeon for folder filters on search page
|
||||||
|
- fix upload from dropfolder
|
||||||
|
- fix adding new calendar event
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.8
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.15
|
||||||
|
- fix syntax error in op/op.EditComment.php
|
||||||
|
- fix use of private variable in op/op.SetRecipients.php and op/op.SetRevisors.php
|
||||||
|
- fix triggering a transition in advanced workflow mode
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.7
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix editing of document attachments
|
||||||
|
- make receipt summary look like approval/review summary
|
||||||
|
- merge changes up to 5.1.14
|
||||||
|
- do not show the updating user in a revision workflow if the status is 0
|
||||||
|
this is misleading because the user starting the revision workflow is the one
|
||||||
|
first accessing the document
|
||||||
|
- rejection of document receipts are turned off by default, but can be turned
|
||||||
|
on in the settings
|
||||||
|
- documents in DocumentChooser are sorted by name
|
||||||
|
- instead of just removing a user from all processes it can be replaced by a new user
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.6
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix setting attributes when checking in a new document version
|
||||||
|
- setting a document revision to 'needs correction' will no longer set the
|
||||||
|
documents status to 'needѕ correction' if this was turned off in the settings
|
||||||
|
- a document will not leave draft status when setting the approver/reviewer
|
||||||
|
without setting a reviewer/approver
|
||||||
|
- tasks to be counted in menu can be configured
|
||||||
|
- add number of documents which need correction to menu
|
||||||
|
- minor 2 factor auth. fixes when initially setting the secret
|
||||||
|
- remove ѕome unneeded code from AddDocument which just caused php warnings
|
||||||
|
- do not set the uploader of new documents to owner if the owner is different from
|
||||||
|
the uploader
|
||||||
|
- add scheduler
|
||||||
|
- add hook showVersionComment in out.ViewDocument.php
|
||||||
|
- Various minor corrections of database tables tblWorkflowLog and
|
||||||
|
tblWorkflowDocumentContent
|
||||||
|
- merge changes up to 5.1.7
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.5
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- sync form for updating document by upload and checkin
|
||||||
|
- add list of documents which need correction on MyDocuments page
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.4
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.5
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.3
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- add list of documents without a receiver on MyDocuments page
|
||||||
|
- propperly calculate number of documents for each value of value set in attribute mgr
|
||||||
|
- output of progress bar for reception of a document can be controlled by access list
|
||||||
|
- recipientof a document version can be set when uploading the file
|
||||||
|
- fix export of search and display of 2nd, 3rd, ... search page
|
||||||
|
- speed up creation of document lists if reception progress bar is shown
|
||||||
|
- status of rejected documents can be overriden
|
||||||
|
- do not add users from group as recipients if they are the uploader or reviewer
|
||||||
|
of a document
|
||||||
|
- add list of documents without a receiver, list of drafts, and list of absolete
|
||||||
|
documents on MyDocuments page
|
||||||
|
- add callback onCheckAccessDocument to SeedDMS_Core_Document
|
||||||
|
- add new document status 'needs correction', revised documents which do not pass
|
||||||
|
will no longer be in status 'rejected' but 'needs correction'
|
||||||
|
- better error handling when indexing documents fails
|
||||||
|
- apache xsendfile module is used for downloading documents when installed
|
||||||
|
- add view access check for ApprovalSummary, ReviewSummary, ReceiptSummary,
|
||||||
|
WorkflowSummary, DocumentAccess, GroupView, UsrView, WorkflowSummary
|
||||||
|
- filter out reviewers and uploader of a document version when setting recipients
|
||||||
|
by user group
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.2
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- check if user has access on document and is not disabled if set as
|
||||||
|
receiver, revisor
|
||||||
|
- check if group has members if set as reviewer, approver, receiver, revisor
|
||||||
|
- fix bug in notification of approver after successful review
|
||||||
|
- add document check for docs in revision and missing access rights of revisor
|
||||||
|
- add document check for docs requiring receptions but user lacks access right
|
||||||
|
- fix Acl manager when using pgsql
|
||||||
|
- list all open tasks of user in user info of user manager
|
||||||
|
- owner of document may see review/approval/receipt/revision log
|
||||||
|
- fix sending mails to reviewer/approvers after check in
|
||||||
|
- downloading of review/approval files works again
|
||||||
|
- optimizing retrieval of open tasks
|
||||||
|
- do not show user which has been removed from a process except for admins
|
||||||
|
- show scheduled revisions in calendar
|
||||||
|
- merge changes up to 5.1.5
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.1
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- call hook 'rawcontent' when downloading transmittal list or search content
|
||||||
|
- speed up list of locked documents on MyDocuments page
|
||||||
|
- sql queries and execution times can be written to file in database layer
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.0
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.0.10
|
||||||
|
- filter documents by status 'draft' on search page
|
||||||
|
- list of documents to look at now contains documents in revision
|
||||||
|
- add list of documents waiting for reception on MyDocuments page
|
||||||
|
- group document lists on MyDocuments page into three sections
|
||||||
|
- show progressbar and comments for reception of document in documentlist
|
||||||
|
- restructure page for document/folder check, add check for missing access
|
||||||
|
on documents by recipient or revisor
|
||||||
|
- overhaul revision workflow, add hook after revision workflow was finished
|
||||||
|
- add two factor authentication based on google authenticator
|
||||||
|
- set timeout for ajax call 'mytasks' from 200ms to 1000ms
|
||||||
|
- use a similar layout for document list on the ViewDocument page
|
||||||
|
- add RSS feed of timeline
|
||||||
|
- put more operations under access control
|
||||||
|
- add receipent list for documents
|
||||||
|
- add revision of documents
|
||||||
|
- add substitute user command for regular users
|
||||||
|
- add access controll list for many functions
|
||||||
|
- add document list which can be exported as an archive
|
||||||
|
- search results can be exported
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
Changes in version 5.1.37
|
Changes in version 5.1.37
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
"slim/slim": "^3.0",
|
"slim/slim": "^3.0",
|
||||||
"erusev/parsedown": "*",
|
"erusev/parsedown": "*",
|
||||||
"erusev/parsedown-extra": "*",
|
"erusev/parsedown-extra": "*",
|
||||||
|
"mibe/feedwriter": "^1.1",
|
||||||
|
"phpoffice/phpspreadsheet": "*",
|
||||||
"pear/log": "*",
|
"pear/log": "*",
|
||||||
"pear/mail": "*",
|
"pear/mail": "*",
|
||||||
"pear/mail_mime": "*",
|
"pear/mail_mime": "*",
|
||||||
|
@ -18,6 +20,7 @@
|
||||||
"pear/auth_sasl": "*",
|
"pear/auth_sasl": "*",
|
||||||
"pear/db": "*",
|
"pear/db": "*",
|
||||||
"alecrabbit/php-console-colour": "*",
|
"alecrabbit/php-console-colour": "*",
|
||||||
|
"dragonmantank/cron-expression": "^3",
|
||||||
"zf1/zend-search-lucene": "*",
|
"zf1/zend-search-lucene": "*",
|
||||||
"symfony/http-foundation": "^5.4",
|
"symfony/http-foundation": "^5.4",
|
||||||
"seeddms/core": "dev-master",
|
"seeddms/core": "dev-master",
|
||||||
|
|
|
@ -296,7 +296,7 @@
|
||||||
updateNotifyTime = "86400"
|
updateNotifyTime = "86400"
|
||||||
extraPath = ""
|
extraPath = ""
|
||||||
maxExecutionTime = "30"
|
maxExecutionTime = "30"
|
||||||
cmdTimeout = "1"
|
cmdTimeout = "10"
|
||||||
/>
|
/>
|
||||||
<!--
|
<!--
|
||||||
- enableNotificationAppRev: set to true if reviewers and approvers shall be informed about a pending review/approval
|
- enableNotificationAppRev: set to true if reviewers and approvers shall be informed about a pending review/approval
|
||||||
|
|
|
@ -52,6 +52,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
$sequence = $this->getParam('sequence');
|
$sequence = $this->getParam('sequence');
|
||||||
$reviewers = $this->getParam('reviewers');
|
$reviewers = $this->getParam('reviewers');
|
||||||
$approvers = $this->getParam('approvers');
|
$approvers = $this->getParam('approvers');
|
||||||
|
$recipients = $this->getParam('recipients');
|
||||||
$reqversion = $this->getParam('reqversion');
|
$reqversion = $this->getParam('reqversion');
|
||||||
$version_comment = $this->getParam('versioncomment');
|
$version_comment = $this->getParam('versioncomment');
|
||||||
$attributes = $this->getParam('attributes');
|
$attributes = $this->getParam('attributes');
|
||||||
|
@ -160,6 +161,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
$workflow = $this->getParam('workflow');
|
$workflow = $this->getParam('workflow');
|
||||||
$notificationgroups = $this->getParam('notificationgroups');
|
$notificationgroups = $this->getParam('notificationgroups');
|
||||||
$notificationusers = $this->getParam('notificationusers');
|
$notificationusers = $this->getParam('notificationusers');
|
||||||
|
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
|
||||||
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
||||||
$defaultaccessdocs = $this->getParam('defaultaccessdocs');
|
$defaultaccessdocs = $this->getParam('defaultaccessdocs');
|
||||||
|
|
||||||
|
@ -170,7 +172,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
$cats, $userfiletmp, utf8_basename($userfilename),
|
$cats, $userfiletmp, utf8_basename($userfilename),
|
||||||
$filetype, $userfiletype, $sequence,
|
$filetype, $userfiletype, $sequence,
|
||||||
$reviewers, $approvers, $reqversion,
|
$reviewers, $approvers, $reqversion,
|
||||||
$version_comment, $attributes, $attributes_version, $workflow);
|
$version_comment, $attributes, $attributes_version, $workflow, $initialdocumentstatus);
|
||||||
|
|
||||||
if (is_bool($res) && !$res) {
|
if (is_bool($res) && !$res) {
|
||||||
$this->errormsg = "error_occured";
|
$this->errormsg = "error_occured";
|
||||||
|
@ -187,6 +189,24 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$lc = $document->getLatestContent();
|
||||||
|
if($recipients) {
|
||||||
|
if($recipients['i']) {
|
||||||
|
foreach($recipients['i'] as $uid) {
|
||||||
|
if($u = $dms->getUser($uid)) {
|
||||||
|
$res = $lc->addIndRecipient($u, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($recipients['g']) {
|
||||||
|
foreach($recipients['g'] as $gid) {
|
||||||
|
if($g = $dms->getGroup($gid)) {
|
||||||
|
$res = $lc->addGrpRecipient($g, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a default notification for the owner of the document */
|
/* Add a default notification for the owner of the document */
|
||||||
if($settings->_enableOwnerNotification) {
|
if($settings->_enableOwnerNotification) {
|
||||||
$res = $document->addNotify($owner->getID(), true);
|
$res = $document->addNotify($owner->getID(), true);
|
||||||
|
|
|
@ -40,62 +40,76 @@ class SeedDMS_Controller_ApproveDocument extends SeedDMS_Controller_Common {
|
||||||
$this->oldstatus = $overallStatus['status'];
|
$this->oldstatus = $overallStatus['status'];
|
||||||
$this->newstatus = $this->oldstatus;
|
$this->newstatus = $this->oldstatus;
|
||||||
|
|
||||||
if ($approvaltype == "ind") {
|
if(!$this->callHook('preApproveDocument', $content)) {
|
||||||
$approvalLogID = $content->setApprovalByInd($user, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
|
||||||
} elseif ($approvaltype == "grp") {
|
|
||||||
$approvalLogID = $content->setApprovalByGrp($approvalgroup, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
|
||||||
} else {
|
|
||||||
$this->errormsg = "approval_wrong_type";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if($approvalLogID === false || 0 > $approvalLogID) {
|
|
||||||
$this->errormsg = "approval_update_failed";
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($approvalstatus == -1) {
|
$result = $this->callHook('approveDocument', $content);
|
||||||
$this->newstatus = S_REJECTED;
|
if($result === null) {
|
||||||
if($content->setStatus(S_REJECTED, $approvalcomment, $user)) {
|
if ($approvaltype == "ind") {
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
$approvalLogID = $content->setApprovalByInd($user, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
} elseif ($approvaltype == "grp") {
|
||||||
if (method_exists($hookObj, 'postApproveDocument')) {
|
$approvalLogID = $content->setApprovalByGrp($approvalgroup, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
||||||
$hookObj->postApproveDocument(null, $content, S_REJECTED);
|
} else {
|
||||||
}
|
$this->errormsg = "approval_wrong_type";
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$docApprovalStatus = $content->getApprovalStatus();
|
|
||||||
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
|
||||||
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$approvalCT = 0;
|
if($approvalLogID === false || 0 > $approvalLogID) {
|
||||||
$approvalTotal = 0;
|
$this->errormsg = "approval_update_failed";
|
||||||
foreach ($docApprovalStatus as $drstat) {
|
return false;
|
||||||
if ($drstat["status"] == 1) {
|
|
||||||
$approvalCT++;
|
|
||||||
}
|
|
||||||
if ($drstat["status"] != -2) {
|
|
||||||
$approvalTotal++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If all approvals have been received and there are no rejections, retrieve a
|
}
|
||||||
// count of the approvals required for this document.
|
|
||||||
if ($approvalCT == $approvalTotal) {
|
$result = $this->callHook('approveUpdateDocumentStatus', $content);
|
||||||
// Change the status to released.
|
if($result === null) {
|
||||||
$this->newstatus=S_RELEASED;
|
if($approvalstatus == -1) {
|
||||||
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
$this->newstatus = S_REJECTED;
|
||||||
|
if($content->setStatus(S_REJECTED, $approvalcomment, $user)) {
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
||||||
if (method_exists($hookObj, 'postApproveDocument')) {
|
if (method_exists($hookObj, 'postApproveDocument')) {
|
||||||
$hookObj->postApproveDocument(null, $content, S_RELEASED);
|
$hookObj->postApproveDocument(null, $content, S_REJECTED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docApprovalStatus = $content->getApprovalStatus();
|
||||||
|
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
||||||
|
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$approvalCT = 0;
|
||||||
|
$approvalTotal = 0;
|
||||||
|
foreach ($docApprovalStatus as $drstat) {
|
||||||
|
if ($drstat["status"] == 1) {
|
||||||
|
$approvalCT++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] != -2) {
|
||||||
|
$approvalTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all approvals have been received and there are no rejections, retrieve a
|
||||||
|
// count of the approvals required for this document.
|
||||||
|
if ($approvalCT == $approvalTotal) {
|
||||||
|
// Change the status to released.
|
||||||
|
$this->newstatus=S_RELEASED;
|
||||||
|
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
||||||
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
||||||
|
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
||||||
|
if (method_exists($hookObj, 'postApproveDocument')) {
|
||||||
|
$hookObj->postApproveDocument(null, $content, S_RELEASED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postApproveDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
114
controllers/class.CheckInDocument.php
Normal file
114
controllers/class.CheckInDocument.php
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of CheckInDocument controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2024 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a document
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2024 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_CheckInDocument extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() { /* {{{ */
|
||||||
|
$name = $this->getParam('name');
|
||||||
|
$comment = $this->getParam('comment');
|
||||||
|
|
||||||
|
/* Call preCheckInDocument early, because it might need to modify some
|
||||||
|
* of the parameters.
|
||||||
|
*/
|
||||||
|
if(false === $this->callHook('preCheckInDocument', $this->params['document'])) {
|
||||||
|
if(empty($this->errormsg))
|
||||||
|
$this->errormsg = 'hook_preCheckInDocument_failed';
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$comment = $this->getParam('comment');
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$fulltextservice = $this->params['fulltextservice'];
|
||||||
|
$folder = $this->params['folder'];
|
||||||
|
$userfiletmp = $this->getParam('userfiletmp');
|
||||||
|
$userfilename = $this->getParam('userfilename');
|
||||||
|
$filetype = $this->getParam('filetype');
|
||||||
|
$userfiletype = $this->getParam('userfiletype');
|
||||||
|
$reviewers = $this->getParam('reviewers');
|
||||||
|
$approvers = $this->getParam('approvers');
|
||||||
|
$recipients = $this->getParam('recipients');
|
||||||
|
$reqversion = $this->getParam('reqversion');
|
||||||
|
$comment = $this->getParam('comment');
|
||||||
|
$attributes = $this->getParam('attributes');
|
||||||
|
$workflow = $this->getParam('workflow');
|
||||||
|
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
||||||
|
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
|
||||||
|
|
||||||
|
$content = $this->callHook('checkinDocument');
|
||||||
|
if($content === null) {
|
||||||
|
if($contentResult=$document->checkIn($comment, $user, $reviewers, $approvers, $version=0, $attributes, $workflow, $initialdocumentstatus)) {
|
||||||
|
|
||||||
|
if ($this->hasParam('expires')) {
|
||||||
|
if($document->setExpires($this->getParam('expires'))) {
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($recipients['i'])) {
|
||||||
|
foreach($recipients['i'] as $uid) {
|
||||||
|
if($u = $dms->getUser($uid)) {
|
||||||
|
$res = $contentResult->getContent()->addIndRecipient($u, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!empty($recipients['g'])) {
|
||||||
|
foreach($recipients['g'] as $gid) {
|
||||||
|
if($g = $dms->getGroup($gid)) {
|
||||||
|
$res = $contentResult->getContent()->addGrpRecipient($g, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = $contentResult->getContent();
|
||||||
|
} else {
|
||||||
|
$this->errormsg = 'error_checkin_document';
|
||||||
|
$result = false;
|
||||||
|
}
|
||||||
|
} elseif($result === false) {
|
||||||
|
if(empty($this->errormsg))
|
||||||
|
$this->errormsg = 'hook_checkinDocument_failed';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($fulltextservice && ($index = $fulltextservice->Indexer()) && $content) {
|
||||||
|
$idoc = $fulltextservice->IndexedDocument($document);
|
||||||
|
if(false !== $this->callHook('preIndexDocument', $document, $idoc)) {
|
||||||
|
$lucenesearch = $fulltextservice->Search();
|
||||||
|
if($hit = $lucenesearch->getDocument((int) $document->getId())) {
|
||||||
|
$index->delete($hit->id);
|
||||||
|
}
|
||||||
|
$index->addDocument($idoc);
|
||||||
|
$index->commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(false === $this->callHook('postCheckInDocument', $document, $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
} /* }}} */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
108
controllers/class.Cron.php
Normal file
108
controllers/class.Cron.php
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of Cron controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2020 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for the regular cron job
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2020 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_Cron extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$logger = $this->params['logger'];
|
||||||
|
$mode = $this->params['mode'];
|
||||||
|
$seltask = $this->params['task'];
|
||||||
|
$db = $dms->getDb();
|
||||||
|
|
||||||
|
$scheduler = new SeedDMS_Scheduler($db);
|
||||||
|
$tasks = $scheduler->getTasks();
|
||||||
|
|
||||||
|
$jsonarr = [];
|
||||||
|
foreach($tasks as $task) {
|
||||||
|
if($seltask && $seltask != $task->getExtension()."::".$task->getTask())
|
||||||
|
continue;
|
||||||
|
if(isset($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()]) && is_object($taskobj = resolveTask($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()][$task->getTask()]))) {
|
||||||
|
$arr = array(
|
||||||
|
'extension'=>$task->getExtension(),
|
||||||
|
'name'=>$task->getTask(),
|
||||||
|
'mode'=>$mode,
|
||||||
|
'disabled' => (bool) $task->getDisabled(),
|
||||||
|
'isdue' => $task->isDue(),
|
||||||
|
);
|
||||||
|
switch($mode) {
|
||||||
|
case "run":
|
||||||
|
case "dryrun":
|
||||||
|
if(method_exists($taskobj, 'execute')) {
|
||||||
|
if(!$task->getDisabled() && $task->isDue()) {
|
||||||
|
if($mode == 'run') {
|
||||||
|
/* Schedule the next run right away to prevent a second execution
|
||||||
|
* of the task when the cron job of the scheduler is called before
|
||||||
|
* the last run was finished. The task itself can still be scheduled
|
||||||
|
* to fast, but this is up to the admin of seeddms.
|
||||||
|
*/
|
||||||
|
$task->updateLastNextRun();
|
||||||
|
if($taskobj->execute($task)) {
|
||||||
|
add_log_line("Execution of task ".$task->getExtension()."::".$task->getTask()." successful.");
|
||||||
|
$arr['success'] = true;
|
||||||
|
} else {
|
||||||
|
add_log_line("Execution of task ".$task->getExtension()."::".$task->getTask()." failed, task has been disabled.", PEAR_LOG_ERR);
|
||||||
|
$arr['success'] = false;
|
||||||
|
$task->setDisabled(1);
|
||||||
|
}
|
||||||
|
} elseif($mode == 'dryrun') {
|
||||||
|
$arr['success'] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "check":
|
||||||
|
$arr['error'] = false;
|
||||||
|
if(!method_exists($taskobj, 'execute')) {
|
||||||
|
$arr['error'] = true;
|
||||||
|
$arr['messages'][] = 'Missing method execute()';
|
||||||
|
}
|
||||||
|
if(get_parent_class($taskobj) != 'SeedDMS_SchedulerTaskBase') {
|
||||||
|
$arr['error'] = true;
|
||||||
|
$arr['error'][] = "Wrong parent class";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "list":
|
||||||
|
default:
|
||||||
|
header("Content-Type: application/json");
|
||||||
|
$arr['nextrun']=$task->getNextRun();
|
||||||
|
$arr['frequency']=$task->getFrequency();
|
||||||
|
$arr['params']=array();
|
||||||
|
if($params = $task->getParameter()) {
|
||||||
|
foreach($params as $key=>$value) {
|
||||||
|
$p = $taskobj->getAdditionalParamByName($key);
|
||||||
|
$arr['params'][$key] = ($p['type'] == 'password') ? '*******' : $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$jsonarr[] = $arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo json_encode($jsonarr);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
}
|
||||||
|
|
|
@ -22,49 +22,192 @@
|
||||||
*/
|
*/
|
||||||
class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
|
class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
public function run() {
|
public function version() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$version = $this->params['version'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
if($version < 1) {
|
||||||
|
$content = $this->callHook('documentLatestContent', $document);
|
||||||
|
if($content === null)
|
||||||
|
$content = $document->getLatestContent();
|
||||||
|
} else {
|
||||||
|
$content = $this->callHook('documentContent', $document, $version);
|
||||||
|
if($content === null)
|
||||||
|
$content = $document->getContentByVersion($version);
|
||||||
|
}
|
||||||
|
if (!is_object($content)) {
|
||||||
|
$this->errormsg = 'invalid_version';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/* set params['content'] for compatiblity with older extensions which
|
||||||
|
* expect the content in the controller
|
||||||
|
*/
|
||||||
|
$this->params['content'] = $content;
|
||||||
|
if(null === $this->callHook('version')) {
|
||||||
|
if(file_exists($dms->contentDir . $content->getPath())) {
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($content->getOriginalFileName());
|
||||||
|
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Content-Type: " . $content->getMimeType());
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
header("ETag: ".$content->getChecksum());
|
||||||
|
|
||||||
|
sendFile($dms->contentDir . $content->getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function file() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$file = $this->params['file'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('file')) {
|
||||||
|
if(file_exists($dms->contentDir . $file->getPath())) {
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Disposition: attachment; filename=\"" . $file->getOriginalFileName() . "\"");
|
||||||
|
header("Content-Type: " . $file->getMimeType());
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
sendFile($dms->contentDir . $file->getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function archive() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$filename = $this->params['file'];
|
||||||
|
$basedir = $this->params['basedir'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('archive')) {
|
||||||
|
if(file_exists($basedir . $filename)) {
|
||||||
|
header('Content-Description: File Transfer');
|
||||||
|
header("Content-Type: application/zip");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($filename);
|
||||||
|
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Cache-Control: public");
|
||||||
|
|
||||||
|
sendFile($basedir .$filename );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function log() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$filename = $this->params['file'];
|
||||||
|
$basedir = $this->params['basedir'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('log')) {
|
||||||
|
if(file_exists($basedir . $filename)) {
|
||||||
|
header("Content-Type: text/plain; name=\"" . $filename . "\"");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($filename);
|
||||||
|
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
sendFile($basedir.$filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sqldump() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$filename = $this->params['file'];
|
||||||
|
$basedir = $this->params['basedir'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('sqldump')) {
|
||||||
|
if(file_exists($basedir . $filename)) {
|
||||||
|
header("Content-Type: application/zip");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($filename);
|
||||||
|
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
sendFile($basedir.$filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function approval() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$logid = $this->params['approvelogid'];
|
||||||
|
|
||||||
|
$filename = $dms->contentDir . $document->getDir().'a'.$logid;
|
||||||
|
if (!file_exists($filename) ) {
|
||||||
|
$this->error = 1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(null === $this->callHook('approval')) {
|
||||||
|
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||||
|
$mimetype = finfo_file($finfo, $filename);
|
||||||
|
|
||||||
|
header("Content-Type: ".$mimetype);
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Disposition: attachment; filename=\"approval-" . $document->getID()."-".(int) $_GET['approvelogid'] . get_extension($mimetype) . "\"");
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
sendFile($filename);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function review() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$logid = $this->params['reviewlogid'];
|
||||||
|
|
||||||
|
$filename = $dms->contentDir . $document->getDir().'r'.$logid;
|
||||||
|
if (!file_exists($filename) ) {
|
||||||
|
$this->error = 1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(null === $this->callHook('review')) {
|
||||||
|
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||||
|
$mimetype = finfo_file($finfo, $filename);
|
||||||
|
|
||||||
|
header("Content-Type: ".$mimetype);
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Length: " . filesize($filename ));
|
||||||
|
header("Content-Disposition: attachment; filename=\"review-" . $document->getID()."-".(int) $_GET['reviewlogid'] . get_extension($mimetype) . "\"");
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
sendFile($filename);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function run() { /* {{{ */
|
||||||
$dms = $this->params['dms'];
|
$dms = $this->params['dms'];
|
||||||
$type = $this->params['type'];
|
$type = $this->params['type'];
|
||||||
|
|
||||||
switch($type) {
|
switch($type) {
|
||||||
case "version":
|
case "version":
|
||||||
if(empty($this->params['content'])) {
|
return $this->version();
|
||||||
$version = $this->params['version'];
|
break;
|
||||||
$document = $this->params['document'];
|
case "file":
|
||||||
if($version < 1) {
|
return $this->file();
|
||||||
$content = $this->callHook('documentLatestContent', $document);
|
break;
|
||||||
if($content === null)
|
case "archive":
|
||||||
$content = $document->getLatestContent();
|
return $this->archive();
|
||||||
} else {
|
break;
|
||||||
$content = $this->callHook('documentContent', $document, $version);
|
case "log":
|
||||||
if($content === null)
|
return $this->log();
|
||||||
$content = $document->getContentByVersion($version);
|
break;
|
||||||
}
|
case "sqldump":
|
||||||
if (!is_object($content)) {
|
return $this->sqldump();
|
||||||
$this->errormsg = 'invalid_version';
|
break;
|
||||||
return false;
|
case "approval":
|
||||||
}
|
return $this->approval();
|
||||||
/* set params['content'] for compatiblity with older extensions which
|
break;
|
||||||
* expect the content in the controller
|
case "review":
|
||||||
*/
|
return $this->review();
|
||||||
$this->params['content'] = $content;
|
|
||||||
} else {
|
|
||||||
$content = $this->params['content'];
|
|
||||||
}
|
|
||||||
if(null === $this->callHook('version')) {
|
|
||||||
if(file_exists($dms->contentDir . $content->getPath())) {
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
$efilename = rawurlencode($content->getOriginalFileName());
|
|
||||||
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Content-Type: " . $content->getMimeType());
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
header("ETag: ".$content->getChecksum());
|
|
||||||
|
|
||||||
sendFile($dms->contentDir.$content->getPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
} /* }}} */
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,16 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($settings->_enable2FactorAuthentication) {
|
||||||
|
if($user->getSecret()) {
|
||||||
|
$tfa = new \RobThree\Auth\TwoFactorAuth('SeedDMS');
|
||||||
|
if($tfa->verifyCode($user->getSecret(), $_POST['twofactauth']) !== true) {
|
||||||
|
$this->setErrorMsg("login_error_text");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Run any additional checks which may prevent login */
|
/* Run any additional checks which may prevent login */
|
||||||
if(false === $this->callHook('restrictLogin', $user)) {
|
if(false === $this->callHook('restrictLogin', $user)) {
|
||||||
if(empty($this->errormsg))
|
if(empty($this->errormsg))
|
||||||
|
|
67
controllers/class.ReceiptDocument.php
Normal file
67
controllers/class.ReceiptDocument.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of ReceiptDocument controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a document
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_ReceiptDocument extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$content = $this->params['content'];
|
||||||
|
$receiptstatus = $this->params['receiptstatus'];
|
||||||
|
$receipttype = $this->params['receipttype'];
|
||||||
|
$group = $this->params['group'];
|
||||||
|
$comment = $this->params['comment'];
|
||||||
|
|
||||||
|
/* Get the document id and name before removing the document */
|
||||||
|
$docname = $document->getName();
|
||||||
|
$documentid = $document->getID();
|
||||||
|
|
||||||
|
if(!$this->callHook('preReceiptDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->callHook('receiptDocument', $content);
|
||||||
|
if($result === null) {
|
||||||
|
|
||||||
|
if ($receipttype == "ind") {
|
||||||
|
if(0 > $content->setReceiptByInd($user, $user, $receiptstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "receipt_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif ($receipttype == "grp") {
|
||||||
|
if(0 > $content->setReceiptByGrp($group, $user, $receiptstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "receipt_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postReceiptDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -36,83 +36,96 @@ class SeedDMS_Controller_ReviewDocument extends SeedDMS_Controller_Common {
|
||||||
$this->oldstatus = $overallStatus['status'];
|
$this->oldstatus = $overallStatus['status'];
|
||||||
$this->newstatus = $this->oldstatus;
|
$this->newstatus = $this->oldstatus;
|
||||||
|
|
||||||
if ($reviewtype == "ind") {
|
if(!$this->callHook('preReviewDocument', $content)) {
|
||||||
$reviewLogID = $content->setReviewByInd($user, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
|
||||||
} elseif($reviewtype == "grp") {
|
|
||||||
$reviewLogID = $content->setReviewByGrp($reviewgroup, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
|
||||||
} else {
|
|
||||||
$this->errormsg = "review_wrong_type";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if($reviewLogID === false || 0 > $reviewLogID) {
|
|
||||||
$this->errormsg = "review_update_failed";
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($reviewstatus == -1) {
|
$result = $this->callHook('reviewDocument', $content);
|
||||||
$this->newstatus = S_REJECTED;
|
if($result === null) {
|
||||||
if($content->setStatus(S_REJECTED, $reviewcomment, $user)) {
|
if ($reviewtype == "ind") {
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
$reviewLogID = $content->setReviewByInd($user, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
} elseif($reviewtype == "grp") {
|
||||||
if (method_exists($hookObj, 'postReviewDocument')) {
|
$reviewLogID = $content->setReviewByGrp($reviewgroup, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
||||||
$hookObj->postReviewDocument(null, $content, S_REJECTED);
|
} else {
|
||||||
}
|
$this->errormsg = "review_wrong_type";
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$docReviewStatus = $content->getReviewStatus();
|
|
||||||
if (is_bool($docReviewStatus) && !$docReviewStatus) {
|
|
||||||
$this->errormsg = "cannot_retrieve_review_snapshot";
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$reviewCT = 0;
|
if($reviewLogID === false || 0 > $reviewLogID) {
|
||||||
$reviewTotal = 0;
|
$this->errormsg = "review_update_failed";
|
||||||
foreach ($docReviewStatus as $drstat) {
|
return false;
|
||||||
if ($drstat["status"] == 1) {
|
|
||||||
$reviewCT++;
|
|
||||||
}
|
|
||||||
if ($drstat["status"] != -2) {
|
|
||||||
$reviewTotal++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If all reviews have been received and there are no rejections, retrieve a
|
}
|
||||||
// count of the approvals required for this document.
|
|
||||||
if ($reviewCT == $reviewTotal) {
|
$result = $this->callHook('reviewUpdateDocumentStatus', $content);
|
||||||
$docApprovalStatus = $content->getApprovalStatus();
|
if($result === null) {
|
||||||
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
if($reviewstatus == -1) {
|
||||||
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
$this->newstatus = S_REJECTED;
|
||||||
return false;
|
if($content->setStatus(S_REJECTED, $reviewcomment, $user)) {
|
||||||
}
|
|
||||||
$approvalCT = 0;
|
|
||||||
$approvalTotal = 0;
|
|
||||||
foreach($docApprovalStatus as $dastat) {
|
|
||||||
if($dastat["status"] == 1) {
|
|
||||||
$approvalCT++;
|
|
||||||
}
|
|
||||||
if($dastat["status"] != -2) {
|
|
||||||
$approvalTotal++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If the approvals received is less than the approvals total, then
|
|
||||||
// change status to pending approval.
|
|
||||||
if($approvalCT < $approvalTotal) {
|
|
||||||
$this->newstatus = S_DRAFT_APP;
|
|
||||||
} else {
|
|
||||||
// Otherwise, change the status to released.
|
|
||||||
$this->newstatus = S_RELEASED;
|
|
||||||
}
|
|
||||||
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
||||||
if (method_exists($hookObj, 'postReviewDocument')) {
|
if (method_exists($hookObj, 'postReviewDocument')) {
|
||||||
$hookObj->postReviewDocument(null, $content, $this->newstatus);
|
$hookObj->postReviewDocument(null, $content, S_REJECTED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docReviewStatus = $content->getReviewStatus();
|
||||||
|
if (is_bool($docReviewStatus) && !$docReviewStatus) {
|
||||||
|
$this->errormsg = "cannot_retrieve_review_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$reviewCT = 0;
|
||||||
|
$reviewTotal = 0;
|
||||||
|
foreach ($docReviewStatus as $drstat) {
|
||||||
|
if ($drstat["status"] == 1) {
|
||||||
|
$reviewCT++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] != -2) {
|
||||||
|
$reviewTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all reviews have been received and there are no rejections, retrieve a
|
||||||
|
// count of the approvals required for this document.
|
||||||
|
if ($reviewCT == $reviewTotal) {
|
||||||
|
$docApprovalStatus = $content->getApprovalStatus();
|
||||||
|
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
||||||
|
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$approvalCT = 0;
|
||||||
|
$approvalTotal = 0;
|
||||||
|
foreach($docApprovalStatus as $dastat) {
|
||||||
|
if($dastat["status"] == 1) {
|
||||||
|
$approvalCT++;
|
||||||
|
}
|
||||||
|
if($dastat["status"] != -2) {
|
||||||
|
$approvalTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the approvals received is less than the approvals total, then
|
||||||
|
// change status to pending approval.
|
||||||
|
if($approvalCT < $approvalTotal) {
|
||||||
|
$this->newstatus = S_DRAFT_APP;
|
||||||
|
} else {
|
||||||
|
// Otherwise, change the status to released.
|
||||||
|
$this->newstatus = S_RELEASED;
|
||||||
|
}
|
||||||
|
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
||||||
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
||||||
|
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
||||||
|
if (method_exists($hookObj, 'postReviewDocument')) {
|
||||||
|
$hookObj->postReviewDocument(null, $content, $this->newstatus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postReviewDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
}
|
}
|
||||||
|
|
143
controllers/class.ReviseDocument.php
Normal file
143
controllers/class.ReviseDocument.php
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of ReviseDocument controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a document
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public $oldstatus;
|
||||||
|
|
||||||
|
public $newstatus;
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$content = $this->params['content'];
|
||||||
|
$revisionstatus = $this->params['revisionstatus'];
|
||||||
|
$revisiontype = $this->params['revisiontype'];
|
||||||
|
$group = $this->params['group'];
|
||||||
|
$comment = $this->params['comment'];
|
||||||
|
$overallStatus = $content->getStatus();
|
||||||
|
$this->oldstatus = $overallStatus['status'];
|
||||||
|
$this->newstatus = $this->oldstatus;
|
||||||
|
|
||||||
|
/* if set to true, a single reject will reject the doc. If set to false
|
||||||
|
* all revisions will be collected first and afterwards the doc is rejected
|
||||||
|
* if one has rejected it. So in the very end the doc is rejected, but
|
||||||
|
* doc remainѕ in S_IN_REVISION until all have revised the doc
|
||||||
|
*/
|
||||||
|
$onevotereject = $this->params['onevotereject'];
|
||||||
|
|
||||||
|
/* Get the document id and name before removing the document */
|
||||||
|
$docname = $document->getName();
|
||||||
|
$documentid = $document->getID();
|
||||||
|
|
||||||
|
if(!$this->callHook('preReviseDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->callHook('reviseDocument', $content);
|
||||||
|
if($result === null) {
|
||||||
|
|
||||||
|
if ($revisiontype == "ind") {
|
||||||
|
if(0 > $content->setRevision($user, $user, $revisionstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif ($revisiontype == "grp") {
|
||||||
|
if(0 > $content->setRevision($group, $user, $revisionstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = $ll."revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check to see if the overall status for the document version needs to be
|
||||||
|
* updated.
|
||||||
|
*/
|
||||||
|
$result = $this->callHook('reviseUpdateDocumentStatus', $content);
|
||||||
|
if($result === null) {
|
||||||
|
if ($onevotereject && $revisionstatus == -1){
|
||||||
|
$this->newstatus = S_NEEDS_CORRECTION;
|
||||||
|
if(!$content->setStatus(S_NEEDS_CORRECTION,$comment,$user)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docRevisionStatus = $content->getRevisionStatus();
|
||||||
|
if (is_bool($docRevisionStatus) && !$docRevisionStatus) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "cannot_retrieve_revision_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$revisionok = 0;
|
||||||
|
$revisionnotok = 0;
|
||||||
|
$revisionTotal = 0;
|
||||||
|
foreach ($docRevisionStatus as $drstat) {
|
||||||
|
if ($drstat["status"] == 1) {
|
||||||
|
$revisionok++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] == -1) {
|
||||||
|
$revisionnotok++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] != -2) {
|
||||||
|
$revisionTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all revisions have been done and there are no rejections,
|
||||||
|
// then release the document. If all revisions have been done but some
|
||||||
|
// of them were rejections then documents needs correction.
|
||||||
|
// Otherwise put it back into revision workflow
|
||||||
|
if ($revisionok == $revisionTotal) {
|
||||||
|
$this->newstatus=S_RELEASED;
|
||||||
|
if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
|
||||||
|
if(!$this->callHook('finishReviseDocument', $content)) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (($revisionok + $revisionnotok) == $revisionTotal) {
|
||||||
|
$this->newstatus=S_NEEDS_CORRECTION;
|
||||||
|
// if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
|
||||||
|
if(!$content->setStatus($this->newstatus,$comment,$user)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->newstatus=S_IN_REVISION;
|
||||||
|
if(!$content->setStatus($this->newstatus,$comment,$user)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postReviseDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
56
controllers/class.RoleMgr.php
Normal file
56
controllers/class.RoleMgr.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of Role manager controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for role manager
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_RoleMgr extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addrole() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$name = $this->params['name'];
|
||||||
|
$role = $this->params['role'];
|
||||||
|
|
||||||
|
return($dms->addRole($name, $role));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removerole() {
|
||||||
|
$roleobj = $this->params['roleobj'];
|
||||||
|
return $roleobj->remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function editrole() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$name = $this->params['name'];
|
||||||
|
$role = $this->params['role'];
|
||||||
|
$roleobj = $this->params['roleobj'];
|
||||||
|
$noaccess = $this->params['noaccess'];
|
||||||
|
|
||||||
|
if ($roleobj->getName() != $name)
|
||||||
|
$roleobj->setName($name);
|
||||||
|
if ($roleobj->getRole() != $role)
|
||||||
|
$roleobj->setRole($role);
|
||||||
|
$roleobj->setNoAccess($noaccess);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
68
controllers/class.TransmittalDownload.php
Normal file
68
controllers/class.TransmittalDownload.php
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of Transmittal Download controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a transmittal
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_TransmittalDownload extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$transmittal = $this->params['transmittal'];
|
||||||
|
|
||||||
|
$items = $transmittal->getItems();
|
||||||
|
if($items) {
|
||||||
|
include("../inc/inc.ClassDownloadMgr.php");
|
||||||
|
$downmgr = new SeedDMS_Download_Mgr();
|
||||||
|
if($extraheader = $this->callHook('extraDownloadHeader'))
|
||||||
|
$downmgr->addHeader($extraheader);
|
||||||
|
|
||||||
|
foreach($items as $item) {
|
||||||
|
$content = $item->getContent();
|
||||||
|
$document = $content->getDocument();
|
||||||
|
if ($document->getAccessMode($user) >= M_READ) {
|
||||||
|
$extracols = $this->callHook('extraDownloadColumns', $document);
|
||||||
|
$filename = $this->callHook('filenameDownloadItem', $content);
|
||||||
|
if($rawcontent = $this->callHook('rawcontent', $content)) {
|
||||||
|
$downmgr->addItem($content, $extracols, $rawcontent, $filename);
|
||||||
|
} else
|
||||||
|
$downmgr->addItem($content, $extracols, null, $filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$filename = tempnam(sys_get_temp_dir(), 'transmittal-download-');
|
||||||
|
if($filename) {
|
||||||
|
if($downmgr->createArchive($filename)) {
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Length: " . filesize($filename));
|
||||||
|
header("Content-Disposition: attachment; filename=\"export-" .date('Y-m-d') . ".zip\"");
|
||||||
|
header("Content-Type: application/zip");
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
readfile($filename);
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
unlink($filename);
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -48,16 +48,18 @@ class SeedDMS_Controller_UpdateDocument extends SeedDMS_Controller_Common {
|
||||||
$userfiletype = $this->getParam('userfiletype');
|
$userfiletype = $this->getParam('userfiletype');
|
||||||
$reviewers = $this->getParam('reviewers');
|
$reviewers = $this->getParam('reviewers');
|
||||||
$approvers = $this->getParam('approvers');
|
$approvers = $this->getParam('approvers');
|
||||||
|
$recipients = $this->getParam('recipients');
|
||||||
$reqversion = $this->getParam('reqversion');
|
$reqversion = $this->getParam('reqversion');
|
||||||
$comment = $this->getParam('comment');
|
$comment = $this->getParam('comment');
|
||||||
$attributes = $this->getParam('attributes');
|
$attributes = $this->getParam('attributes');
|
||||||
$workflow = $this->getParam('workflow');
|
$workflow = $this->getParam('workflow');
|
||||||
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
||||||
|
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
|
||||||
|
|
||||||
$content = $this->callHook('updateDocument');
|
$content = $this->callHook('updateDocument');
|
||||||
if($content === null) {
|
if($content === null) {
|
||||||
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
|
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
|
||||||
if($contentResult=$document->addContent($comment, $user, $userfiletmp, utf8_basename($userfilename), $filetype, $userfiletype, $reviewers, $approvers, $version=0, $attributes, $workflow)) {
|
if($contentResult=$document->addContent($comment, $user, $userfiletmp, utf8_basename($userfilename), $filetype, $userfiletype, $reviewers, $approvers, $version=0, $attributes, $workflow, $initialdocumentstatus)) {
|
||||||
|
|
||||||
if ($this->hasParam('expires')) {
|
if ($this->hasParam('expires')) {
|
||||||
if($document->setExpires($this->getParam('expires'))) {
|
if($document->setExpires($this->getParam('expires'))) {
|
||||||
|
@ -65,6 +67,21 @@ class SeedDMS_Controller_UpdateDocument extends SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!empty($recipients['i'])) {
|
||||||
|
foreach($recipients['i'] as $uid) {
|
||||||
|
if($u = $dms->getUser($uid)) {
|
||||||
|
$res = $contentResult->getContent()->addIndRecipient($u, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!empty($recipients['g'])) {
|
||||||
|
foreach($recipients['g'] as $gid) {
|
||||||
|
if($g = $dms->getGroup($gid)) {
|
||||||
|
$res = $contentResult->getContent()->addGrpRecipient($g, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$content = $contentResult->getContent();
|
$content = $contentResult->getContent();
|
||||||
} else {
|
} else {
|
||||||
$this->errormsg = 'error_update_document';
|
$this->errormsg = 'error_update_document';
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# This command retrieves the strings that need to be translated
|
# This command retrieves the strings that need to be translated
|
||||||
sgrep -o "%r\n" '"getMLText(\"" __ "\""' */*.php|sort|uniq -c
|
sgrep -o "%r\n" '"getMLText(\"" __ "\""' */*.php views/bootstrap/*.php |sort|uniq -c
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
/* Determine all languages keys used in the php files */
|
/* Determine all languages keys used in the php files */
|
||||||
$output = array();
|
$output = array();
|
||||||
if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php|sort|uniq -c', $output)) {
|
if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php views/bootstrap/*.php|sort|uniq -c', $output)) {
|
||||||
$allkeys = array();
|
$allkeys = array();
|
||||||
foreach($output as $line) {
|
foreach($output as $line) {
|
||||||
$data = explode(' ', trim($line));
|
$data = explode(' ', trim($line));
|
||||||
|
@ -9,8 +9,9 @@ if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php|sort|uniq -c', $output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$languages = array('ar_EG', 'bg_BG', 'ca_ES', 'cs_CZ', 'de_DE', 'en_GB', 'es_ES', 'fr_FR', 'hu_HU', 'it_IT', 'nl_NL', 'pl_PL', 'pt_BR', 'ro_RO', 'ru_RU', 'sk_SK', 'sv_SE', 'tr_TR', 'zh_CN', 'zh_TW');
|
||||||
/* Reading languages */
|
/* Reading languages */
|
||||||
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
foreach($languages as $lang) {
|
||||||
include('languages/'.$lang.'/lang.inc');
|
include('languages/'.$lang.'/lang.inc');
|
||||||
ksort($text);
|
ksort($text);
|
||||||
$langarr[$lang] = $text;
|
$langarr[$lang] = $text;
|
||||||
|
@ -20,7 +21,7 @@ foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
||||||
echo "List of missing keys\n";
|
echo "List of missing keys\n";
|
||||||
echo "-----------------------------\n";
|
echo "-----------------------------\n";
|
||||||
foreach(array_keys($allkeys) as $key) {
|
foreach(array_keys($allkeys) as $key) {
|
||||||
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
foreach($languages as $lang) {
|
||||||
if(!isset($langarr[$lang][$key])) {
|
if(!isset($langarr[$lang][$key])) {
|
||||||
echo "Missing key '".$key."' in language ".$lang."\n";
|
echo "Missing key '".$key."' in language ".$lang."\n";
|
||||||
}
|
}
|
||||||
|
@ -31,7 +32,7 @@ echo "\n";
|
||||||
/* Check for phrases not used anymore */
|
/* Check for phrases not used anymore */
|
||||||
echo "List of superflous keys\n";
|
echo "List of superflous keys\n";
|
||||||
echo "-----------------------------\n";
|
echo "-----------------------------\n";
|
||||||
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
foreach($languages as $lang) {
|
||||||
$n = 0;
|
$n = 0;
|
||||||
foreach($langarr[$lang] as $key=>$value) {
|
foreach($langarr[$lang] as $key=>$value) {
|
||||||
if(!isset($allkeys[$key])) {
|
if(!isset($allkeys[$key])) {
|
||||||
|
|
|
@ -126,3 +126,28 @@ op/op.TriggerWorkflow.php
|
||||||
op/op.UpdateDocument.php
|
op/op.UpdateDocument.php
|
||||||
* document was updated
|
* document was updated
|
||||||
subscribers of the document
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.ReceiptDocument.php
|
||||||
|
* document was received
|
||||||
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.ReviseDocument.php
|
||||||
|
* document was revised
|
||||||
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.SetRevisors.php
|
||||||
|
* Revisors were added/deleted
|
||||||
|
subscribers of the document
|
||||||
|
uploader of version
|
||||||
|
revisor
|
||||||
|
|
||||||
|
op/op.ReceiptDocument.php
|
||||||
|
* document was receipt
|
||||||
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.SetRecipients.php
|
||||||
|
* Recipients were added/deleted
|
||||||
|
subscribers of the document
|
||||||
|
uploader of version
|
||||||
|
recipient
|
||||||
|
|
||||||
|
|
26
doc/README.Scheduler.md
Normal file
26
doc/README.Scheduler.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
Scheduler
|
||||||
|
==========
|
||||||
|
|
||||||
|
The scheduler in SeedDMS manages frequently run tasks. It is very similar
|
||||||
|
to regular unix cron jobs. A task in SeedDMS is an instanciation of a task
|
||||||
|
class which itself is defined by an extension or SeedDMS itself.
|
||||||
|
SeedDMS has some predefined classes e.g. core::expireddocs.
|
||||||
|
|
||||||
|
In order for tasks to be runnalbe, a user `cli_scheduler` must exists in
|
||||||
|
SeedDMS.
|
||||||
|
|
||||||
|
All tasks are executed by a single cronjob in the directory `utils`
|
||||||
|
|
||||||
|
> */5 * * * * /home/www-data/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
|
||||||
|
|
||||||
|
Please keep in mind, that the php interpreter used for the cronjob may be
|
||||||
|
different from the php interpreter used für the web application. Hence, two
|
||||||
|
different php.ini files might be used. php and the php extensions may differ as
|
||||||
|
well. This can cause some extensions to be disabled and consequently some task
|
||||||
|
classes are not defined.
|
||||||
|
|
||||||
|
`utils/seeddms-schedulercli` can also be run on the command line. If you
|
||||||
|
do that, run it with the same system user used for the web server. On Debian
|
||||||
|
this is www-data. Hence run it like
|
||||||
|
|
||||||
|
sudo -u www-data utils/seeddms-schedulercli --mode=list
|
42
doc/README.cron
Normal file
42
doc/README.cron
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
Running the scheduler
|
||||||
|
======================
|
||||||
|
|
||||||
|
Since version 6 of SeedDMS a scheduler is implemented which runs
|
||||||
|
scheduled tasks. Such tasks must be implemented in an extension
|
||||||
|
and can be scheduled by the administrator within the user interface.
|
||||||
|
|
||||||
|
In order to check frequently for tasks ready to run, a system cron job
|
||||||
|
must be installed. On Linux this can be done by adding the following line
|
||||||
|
to the crontab
|
||||||
|
|
||||||
|
*/5 * * * * /var/www/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
|
||||||
|
|
||||||
|
(Of course you need to change the path to `seeddms-schedulercli`)
|
||||||
|
|
||||||
|
This will install a cronjob running every 5 minutes. `seeddms-schedulercli` will check
|
||||||
|
for tasks ready to run and execute them in that case. You can decrease the time between
|
||||||
|
two calls of the cronjob, but keep in mind that seeddms tasks may take longer and
|
||||||
|
are being started again before the previous task has been ended.
|
||||||
|
|
||||||
|
If the configuration file of SeedDMS is not found, its path can be passed
|
||||||
|
on the command, though this should not be needed in a regular installation
|
||||||
|
obeying the directory structure of the quickstart archive.
|
||||||
|
|
||||||
|
*/5 * * * * /var/www/seeddms60x/seeddms/utils/seeddms-schedulercli --config /var/www/seeddms60x/seeddms/conf/settings.xml --mode=run
|
||||||
|
|
||||||
|
For testing purposes it may be usefull to run `seeddms-schedulercli` in list mode.
|
||||||
|
|
||||||
|
seeddms-schedulercli --mode=list
|
||||||
|
|
||||||
|
This will just list all tasks and its scheduled exection time. Tasks ready to run,
|
||||||
|
because its scheduled execution time is already in the past will be marked with
|
||||||
|
a `*`. Tasks which are disabled will be marked with a `-`.
|
||||||
|
|
||||||
|
Executing `seeddms-schedulercli` in `dryrun` mode will behave just like in `run` mode
|
||||||
|
but instead of running the task it will just issue a line.
|
||||||
|
|
||||||
|
Instead of running utils/seeddms-schedulercli you may as well access
|
||||||
|
op/op.Cron.php which also runs all scheduled tasks. On Linux you do this
|
||||||
|
by setting up a cronjob like
|
||||||
|
|
||||||
|
*/5 * * * * wget -q -O - "http://<your domain>/op/op.Cron.php"
|
|
@ -177,7 +177,32 @@ class SeedDMS_ExtExample_ViewFolder {
|
||||||
* @package SeedDMS
|
* @package SeedDMS
|
||||||
* @subpackage example
|
* @subpackage example
|
||||||
*/
|
*/
|
||||||
class SeedDMS_ExtExample_Task {
|
class SeedDMS_ExtExample_Task extends SeedDMS_SchedulerTaskBase {
|
||||||
public function execute() {
|
|
||||||
|
/**
|
||||||
|
* Run the task
|
||||||
|
*
|
||||||
|
* @param $task task to be executed
|
||||||
|
* @return boolean true if task was executed succesfully, otherwise false
|
||||||
|
*/
|
||||||
|
public function execute($task) {
|
||||||
|
$dms = $this->dms;
|
||||||
|
$user = $this->user;
|
||||||
|
$settings = $this->settings;
|
||||||
|
$logger = $this->logger;
|
||||||
|
$taskparams = $task->getParameter();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return 'Description';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAdditionalParams() {
|
||||||
|
return array(array(
|
||||||
|
'name'=>'email',
|
||||||
|
'type'=>'string',
|
||||||
|
'description'=> '',
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
$EXT_CONF['example'] = array(
|
$EXT_CONF['example'] = array(
|
||||||
'title' => 'Example Extension',
|
'title' => 'Example Extension',
|
||||||
'description' => 'This sample extension demonstrate the use of various hooks',
|
'description' => 'This sample extension demonstrates the use of various hooks',
|
||||||
'disable' => true,
|
'disable' => true,
|
||||||
'version' => '1.0.1',
|
'version' => '1.0.1',
|
||||||
'releasedate' => '2018-03-21',
|
'releasedate' => '2018-03-21',
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
$__lang['de_DE'] = array(
|
$__lang['de_DE'] = array(
|
||||||
'folder_contents' => 'Dies war mal "Ordner enthält". Wurde von sample Extension geändert.',
|
'folder_contents' => 'Dies war mal "Ordner enthält". Wurde von sample Extension geändert.',
|
||||||
|
'task_example_example_email' => 'Email',
|
||||||
|
);
|
||||||
|
$__lang['en_GB'] = array(
|
||||||
|
'folder_contents' => 'This used to be "Folder contents". Was changed by sample Extension.',
|
||||||
|
'task_example_example_email' => 'Email',
|
||||||
);
|
);
|
||||||
|
|
|
@ -21,17 +21,23 @@ if (!strncmp("/op", $refer, 3)) {
|
||||||
} else {
|
} else {
|
||||||
$refer = urlencode($refer);
|
$refer = urlencode($refer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if this is a ajax call. In that case do not redirect to any page */
|
||||||
|
$isajax = isset($_GET['action']) && ($_GET['action'] != 'show');
|
||||||
|
|
||||||
if (!isset($_COOKIE["mydms_session"])) {
|
if (!isset($_COOKIE["mydms_session"])) {
|
||||||
if($settings->_enableGuestLogin && $settings->_enableGuestAutoLogin) {
|
if($settings->_enableGuestLogin && $settings->_enableGuestAutoLogin) {
|
||||||
$session = new SeedDMS_Session($db);
|
$session = new SeedDMS_Session($db);
|
||||||
if(!$dms_session = $session->create(array('userid'=>$settings->_guestID, 'theme'=>$settings->_theme, 'lang'=>$settings->_language))) {
|
if(!$dms_session = $session->create(array('userid'=>$settings->_guestID, 'theme'=>$settings->_theme, 'lang'=>$settings->_language))) {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$resArr = $session->load($dms_session);
|
$resArr = $session->load($dms_session);
|
||||||
} elseif($settings->_autoLoginUser) {
|
} elseif($settings->_autoLoginUser) {
|
||||||
if(!($user = $dms->getUser($settings->_autoLoginUser))/* || !$user->isGuest()*/) {
|
if(!($user = $dms->getUser($settings->_autoLoginUser))/* || !$user->isGuest()*/) {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$theme = $user->getTheme();
|
$theme = $user->getTheme();
|
||||||
|
@ -46,12 +52,14 @@ if (!isset($_COOKIE["mydms_session"])) {
|
||||||
}
|
}
|
||||||
$session = new SeedDMS_Session($db);
|
$session = new SeedDMS_Session($db);
|
||||||
if(!$dms_session = $session->create(array('userid'=>$user->getID(), 'theme'=>$theme, 'lang'=>$lang))) {
|
if(!$dms_session = $session->create(array('userid'=>$user->getID(), 'theme'=>$theme, 'lang'=>$lang))) {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$resArr = $session->load($dms_session);
|
$resArr = $session->load($dms_session);
|
||||||
} else {
|
} else {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -60,7 +68,8 @@ if (!isset($_COOKIE["mydms_session"])) {
|
||||||
$session = new SeedDMS_Session($db);
|
$session = new SeedDMS_Session($db);
|
||||||
if(!$resArr = $session->load($dms_session)) {
|
if(!$resArr = $session->load($dms_session)) {
|
||||||
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,13 +82,16 @@ if((int)$resArr['lastAccess']+60 < time())
|
||||||
$user = $dms->getUser($resArr["userID"]);
|
$user = $dms->getUser($resArr["userID"]);
|
||||||
if (!is_object($user)) {
|
if (!is_object($user)) {
|
||||||
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($user->isAdmin()) {
|
$origuser = null;
|
||||||
if($resArr["su"]) {
|
if($resArr["su"] && $su = $dms->getUser($resArr["su"])) {
|
||||||
$user = $dms->getUser($resArr["su"]);
|
if($user->isAdmin() || $user->maySwitchToUser($su)) {
|
||||||
|
$origuser = $user;
|
||||||
|
$user = $su;
|
||||||
} else {
|
} else {
|
||||||
// $session->resetSu();
|
// $session->resetSu();
|
||||||
}
|
}
|
||||||
|
@ -92,6 +104,8 @@ if($settings->_useHomeAsRootFolder && !$user->isAdmin() && $user->getHomeFolder(
|
||||||
$dms->checkWithinRootDir = true;
|
$dms->checkWithinRootDir = true;
|
||||||
$dms->setRootFolderID($user->getHomeFolder());
|
$dms->setRootFolderID($user->getHomeFolder());
|
||||||
}
|
}
|
||||||
|
$role = $user->getRole();
|
||||||
|
$dms->noReadForStatus = $role->getNoAccess();
|
||||||
|
|
||||||
/* Include additional language file for view
|
/* Include additional language file for view
|
||||||
* This file must set $LANG[xx][]
|
* This file must set $LANG[xx][]
|
||||||
|
@ -100,13 +114,17 @@ if(file_exists($settings->_rootDir . "view/".$theme."/languages/" . $lang . "/la
|
||||||
include $settings->_rootDir . "view/".$theme."/languages/" . $lang . "/lang.inc";
|
include $settings->_rootDir . "view/".$theme."/languages/" . $lang . "/lang.inc";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if this is a ajax call, then exit early as the rest of the script is irrelevant */
|
||||||
|
if($isajax)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Check if password needs to be changed because it expired. If it needs
|
/* Check if password needs to be changed because it expired. If it needs
|
||||||
* to be changed redirect to out/out.ForcePasswordChange.php. Do this
|
* to be changed redirect to out/out.ForcePasswordChange.php. Do this
|
||||||
* check only if password expiration is turned on, we are not on the
|
* check only if password expiration is turned on, we are not on the
|
||||||
* page to change the password or the page that changes the password, the
|
* page to change the password or the page that changes the password, the
|
||||||
* current user is not admin, and no user substitution has occured. */
|
* current user is not admin, and no user substitution has occured. */
|
||||||
|
|
||||||
if (!$user->isAdmin() && !$resArr['su']) {
|
if (!$user->isAdmin() && $origuser == null) {
|
||||||
if($settings->_passwordExpiration > 0) {
|
if($settings->_passwordExpiration > 0) {
|
||||||
if(basename($_SERVER['SCRIPT_NAME']) != 'out.ForcePasswordChange.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.EditUserData.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Logout.php') {
|
if(basename($_SERVER['SCRIPT_NAME']) != 'out.ForcePasswordChange.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.EditUserData.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Logout.php') {
|
||||||
$pwdexp = $user->getPwdExpiration();
|
$pwdexp = $user->getPwdExpiration();
|
||||||
|
@ -121,6 +139,17 @@ if (!$user->isAdmin() && !$resArr['su']) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if secret is set for 2-factor authentication. Redirect to Setup2Factor.php
|
||||||
|
* if secret is not set and 2-factor authentication is turned on. Also check if
|
||||||
|
* already on the page Setup2Factor.php and no user substiation has occured.
|
||||||
|
*/
|
||||||
|
if($settings->_enable2FactorAuthentication && $settings->_guestID != $user->getID() && $settings->_autoLoginUser != $user->getID() && $origuser == null && $user->getSecret() == '') {
|
||||||
|
if(basename($_SERVER['SCRIPT_NAME']) != 'out.Setup2Factor.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Setup2Factor.php') {
|
||||||
|
header("Location: ../out/out.Setup2Factor.php");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Update cookie lifetime */
|
/* Update cookie lifetime */
|
||||||
if($settings->_cookieLifetime) {
|
if($settings->_cookieLifetime) {
|
||||||
$lifetime = time() + intval($settings->_cookieLifetime);
|
$lifetime = time() + intval($settings->_cookieLifetime);
|
||||||
|
|
41
inc/inc.BasicAuthentication.php
Normal file
41
inc/inc.BasicAuthentication.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Do authentication of users and session management
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2002-2005 Markus Westphal,
|
||||||
|
* 2006-2008 Malcolm Cowe, 2010 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once("inc.Utils.php");
|
||||||
|
require_once("inc.ClassNotificationService.php");
|
||||||
|
require_once("inc.ClassEmailNotify.php");
|
||||||
|
require_once("inc.ClassSession.php");
|
||||||
|
require_once("inc.ClassAccessOperation.php");
|
||||||
|
|
||||||
|
if (!isset($_SERVER['PHP_AUTH_USER'])) {
|
||||||
|
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
|
||||||
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
|
echo getMLText('cancel_basic_authentication');
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
if(!($user = $authenticator->authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) {
|
||||||
|
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
|
||||||
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
|
echo getMLText('cancel_basic_authentication');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear login failures if login was successful */
|
||||||
|
$user->clearLoginFailures();
|
||||||
|
|
||||||
|
$dms->setUser($user);
|
||||||
|
|
||||||
|
require_once('inc/inc.Notification.php');
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
* @version Release: @package_version@
|
* @version Release: @package_version@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
require_once "inc.ClassAcl.php";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to check certain access restrictions
|
* Class to check certain access restrictions
|
||||||
*
|
*
|
||||||
|
@ -27,33 +29,32 @@ class SeedDMS_AccessOperation {
|
||||||
*/
|
*/
|
||||||
private $dms;
|
private $dms;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var object $obj object being accessed
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
private $obj;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var object $user user requesting the access
|
* @var object $user user requesting the access
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
private $user;
|
protected $user;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var object $settings SeedDMS Settings
|
* @var object $settings SeedDMS Settings
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
private $settings;
|
protected $settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array $legacy_access list of objects with access
|
* @var object $aro access request object for caching
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
private $_aro;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array $legacy_access list of objects with access use for view and controller
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
private $legacy_access;
|
private $legacy_access;
|
||||||
|
|
||||||
function __construct($dms, $obj, $user, $settings) { /* {{{ */
|
function __construct($dms, $user, $settings) { /* {{{ */
|
||||||
$this->dms = $dms;
|
$this->dms = $dms;
|
||||||
$this->obj = $obj;
|
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->legacy_access['guest'] = array(
|
$this->legacy_access['guest'] = array(
|
||||||
|
@ -163,15 +164,15 @@ class SeedDMS_AccessOperation {
|
||||||
* document may delete versions. The admin may even delete a version
|
* document may delete versions. The admin may even delete a version
|
||||||
* even if is disallowed in the settings.
|
* even if is disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayEditVersion($vno=0) { /* {{{ */
|
function mayEditVersion($document, $vno=0) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($vno)
|
if($vno)
|
||||||
$version = $this->obj->getContentByVersion($vno);
|
$version = $document->getContentByVersion($vno);
|
||||||
else
|
else
|
||||||
$version = $this->obj->getLatestContent();
|
$version = $document->getLatestContent();
|
||||||
if (!isset($this->settings->_editOnlineFileTypes) || !is_array($this->settings->_editOnlineFileTypes) || (!in_array(strtolower($version->getFileType()), $this->settings->_editOnlineFileTypes) && !in_array(strtolower($version->getMimeType()), $this->settings->_editOnlineFileTypes)))
|
if (!isset($this->settings->_editOnlineFileTypes) || !is_array($this->settings->_editOnlineFileTypes) || (!in_array(strtolower($version->getFileType()), $this->settings->_editOnlineFileTypes) && !in_array(strtolower($version->getMimeType()), $this->settings->_editOnlineFileTypes)))
|
||||||
return false;
|
return false;
|
||||||
if ($this->obj->getAccessMode($this->user) == M_ALL || $this->user->isAdmin()) {
|
if ($document->getAccessMode($this->user) == M_ALL || $this->user->isAdmin()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,10 +188,10 @@ class SeedDMS_AccessOperation {
|
||||||
* document may delete versions. The admin may even delete a version
|
* document may delete versions. The admin may even delete a version
|
||||||
* even if is disallowed in the settings.
|
* even if is disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayRemoveVersion() { /* {{{ */
|
function mayRemoveVersion($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
$versions = $this->obj->getContent();
|
$versions = $document->getContent();
|
||||||
if ((($this->settings->_enableVersionDeletion && ($this->obj->getAccessMode($this->user, 'removeVersion') == M_ALL)) || $this->user->isAdmin() ) && (count($versions) > 1)) {
|
if ((($this->settings->_enableVersionDeletion && ($document->getAccessMode($this->user, 'removeVersion') == M_ALL)) || $this->user->isAdmin() ) && (count($versions) > 1)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,11 +208,11 @@ class SeedDMS_AccessOperation {
|
||||||
* The admin may even modify the status
|
* The admin may even modify the status
|
||||||
* even if is disallowed in the settings.
|
* even if is disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayOverwriteStatus() { /* {{{ */
|
function mayOverrideStatus($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_RELEASED || $status["status"]==S_OBSOLETE )) {
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_DRAFT || $status["status"]==S_RELEASED || $status["status"]==S_REJECTED || $status["status"]==S_OBSOLETE || $status["status"]==S_NEEDS_CORRECTION)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,12 +227,13 @@ class SeedDMS_AccessOperation {
|
||||||
* reviewers/approvers is only allowed if version modification is turned on
|
* reviewers/approvers is only allowed if version modification is turned on
|
||||||
* in the settings and the document has not been reviewed/approved by any
|
* in the settings and the document has not been reviewed/approved by any
|
||||||
* user/group already.
|
* user/group already.
|
||||||
* The admin may even set reviewers/approvers if is disallowed in the
|
* The admin may even set reviewers/approvers after the review/approval
|
||||||
* settings.
|
* process has been started, but only if _allowChangeRevAppInProcess
|
||||||
|
* explicitly allows it.
|
||||||
*/
|
*/
|
||||||
function maySetReviewersApprovers() { /* {{{ */
|
function maySetReviewersApprovers($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
$reviewstatus = $latestContent->getReviewStatus();
|
$reviewstatus = $latestContent->getReviewStatus();
|
||||||
$hasreview = false;
|
$hasreview = false;
|
||||||
|
@ -245,7 +247,49 @@ class SeedDMS_AccessOperation {
|
||||||
if($r['status'] == 1 || $r['status'] == -1)
|
if($r['status'] == 1 || $r['status'] == -1)
|
||||||
$hasapproval = true;
|
$hasapproval = true;
|
||||||
}
|
}
|
||||||
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (($status["status"]==S_DRAFT_REV && !$hasreview) || ($status["status"]==S_DRAFT_APP && !$hasreview && !$hasapproval))) {
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (($status["status"]==S_DRAFT_REV && (!$hasreview || ($this->user->isAdmin() && $this->settings->_allowChangeRevAppInProcess))) || ($status["status"]==S_DRAFT_APP && ((!$hasreview && !$hasapproval) || ($this->user->isAdmin() && $this->settings->_allowChangeRevAppInProcess))) || $status["status"]==S_DRAFT)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if recipients may be edited
|
||||||
|
*
|
||||||
|
* This check can only be done for documents. Setting the document
|
||||||
|
* recipients is only allowed if version modification is turned on
|
||||||
|
* in the settings. The
|
||||||
|
* admin may even set recipients if is disallowed in the
|
||||||
|
* settings.
|
||||||
|
*/
|
||||||
|
function maySetRecipients($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if (($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) >= M_READWRITE)) || $this->user->isAdmin()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if revisors may be edited
|
||||||
|
*
|
||||||
|
* This check can only be done for documents. Setting the document
|
||||||
|
* revisors is only allowed if version modification is turned on
|
||||||
|
* in the settings. The
|
||||||
|
* admin may even set revisors if is disallowed in the
|
||||||
|
* settings.
|
||||||
|
*/
|
||||||
|
function maySetRevisors($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_RELEASED || $status["status"]==S_IN_REVISION)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,12 +306,12 @@ class SeedDMS_AccessOperation {
|
||||||
* admin may even set the workflow if is disallowed in the
|
* admin may even set the workflow if is disallowed in the
|
||||||
* settings.
|
* settings.
|
||||||
*/
|
*/
|
||||||
function maySetWorkflow() { /* {{{ */
|
function maySetWorkflow($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$workflow = $latestContent->getWorkflow();
|
$workflow = $latestContent->getWorkflow();
|
||||||
$workflowstate = $latestContent->getWorkflowState();
|
$workflowstate = $latestContent->getWorkflowState();
|
||||||
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (!$workflow || ($workflowstate && ($workflow->getInitState()->getID() == $workflowstate->getID())))) {
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (!$workflow || ($workflowstate && ($workflow->getInitState()->getID() == $workflowstate->getID())))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,11 +325,11 @@ class SeedDMS_AccessOperation {
|
||||||
* This check can only be done for documents. Setting the documents
|
* This check can only be done for documents. Setting the documents
|
||||||
* expiration date is only allowed if the document has not been obsoleted.
|
* expiration date is only allowed if the document has not been obsoleted.
|
||||||
*/
|
*/
|
||||||
function maySetExpires() { /* {{{ */
|
function maySetExpires($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ((($this->obj->getAccessMode($this->user) == M_ALL) || $this->user->isAdmin()) && ($status["status"]!=S_OBSOLETE)) {
|
if ((($document->getAccessMode($this->user) >= M_READWRITE) || $this->user->isAdmin()) && ($status["status"]!=S_OBSOLETE)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -302,17 +346,17 @@ class SeedDMS_AccessOperation {
|
||||||
* The admin may set the comment even if is
|
* The admin may set the comment even if is
|
||||||
* disallowed in the settings.
|
* disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayEditComment() { /* {{{ */
|
function mayEditComment($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($this->obj->getAccessMode($this->user) < M_READWRITE)
|
if($document->getAccessMode($this->user) < M_READWRITE)
|
||||||
return false;
|
return false;
|
||||||
if($this->obj->isLocked()) {
|
if($document->isLocked()) {
|
||||||
$lockingUser = $this->obj->getLockingUser();
|
$lockingUser = $document->getLockingUser();
|
||||||
if (($lockingUser->getID() != $this->user->getID()) && ($this->obj->getAccessMode($this->user) != M_ALL)) {
|
if (($lockingUser->getID() != $this->user->getID()) && ($document->getAccessMode($this->user) != M_ALL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if (($this->settings->_enableVersionModification || $this->user->isAdmin()) && !in_array($status["status"], array(S_OBSOLETE, S_EXPIRED))) {
|
if (($this->settings->_enableVersionModification || $this->user->isAdmin()) && !in_array($status["status"], array(S_OBSOLETE, S_EXPIRED))) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -330,15 +374,15 @@ class SeedDMS_AccessOperation {
|
||||||
* the settings or the document is still in an approval/review
|
* the settings or the document is still in an approval/review
|
||||||
* or intial workflow step.
|
* or intial workflow step.
|
||||||
*/
|
*/
|
||||||
function mayEditAttributes() { /* {{{ */
|
function mayEditAttributes($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
$workflow = $latestContent->getWorkflow();
|
$workflow = $latestContent->getWorkflow();
|
||||||
$workflowstate = $latestContent->getWorkflowState();
|
$workflowstate = $latestContent->getWorkflowState();
|
||||||
if($this->obj->getAccessMode($this->user) < M_READWRITE)
|
if($document->getAccessMode($this->user) < M_READWRITE)
|
||||||
return false;
|
return false;
|
||||||
if ($this->settings->_enableVersionModification || in_array($status["status"], array(S_DRAFT_REV, S_DRAFT_APP)) || ($workflow && $workflowstate && $workflow->getInitState()->getID() == $workflowstate->getID())) {
|
if ($this->settings->_enableVersionModification || in_array($status["status"], array(S_DRAFT_REV, S_DRAFT_APP, S_IN_REVISION)) || ($workflow && $workflowstate && $workflow->getInitState()->getID() == $workflowstate->getID())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -353,11 +397,11 @@ class SeedDMS_AccessOperation {
|
||||||
* review. There are other requirements which are not taken into
|
* review. There are other requirements which are not taken into
|
||||||
* account here.
|
* account here.
|
||||||
*/
|
*/
|
||||||
function mayReview() { /* {{{ */
|
function mayReview($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ($status["status"]==S_DRAFT_REV) {
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_DRAFT_REV) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,9 +415,24 @@ class SeedDMS_AccessOperation {
|
||||||
* A review may only be updated by the user who originaly addedd the
|
* A review may only be updated by the user who originaly addedd the
|
||||||
* review and if it is allowed in the settings
|
* review and if it is allowed in the settings
|
||||||
*/
|
*/
|
||||||
function mayUpdateReview($updateUser) { /* {{{ */
|
function mayUpdateReview($document, $updateUser) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && !$this->obj->hasExpired()) {
|
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a approval maybe edited
|
||||||
|
*
|
||||||
|
* An approval may only be updated by the user who originaly addedd the
|
||||||
|
* approval and if it is allowed in the settings
|
||||||
|
*/
|
||||||
|
function mayUpdateApproval($document, $updateUser) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -389,11 +448,11 @@ class SeedDMS_AccessOperation {
|
||||||
* There are other requirements which are not taken into
|
* There are other requirements which are not taken into
|
||||||
* account here.
|
* account here.
|
||||||
*/
|
*/
|
||||||
function mayApprove() { /* {{{ */
|
function mayApprove($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ($status["status"]==S_DRAFT_APP) {
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_DRAFT_APP) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -402,14 +461,70 @@ class SeedDMS_AccessOperation {
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a approval maybe edited
|
* Check if document content may be receipted
|
||||||
*
|
*
|
||||||
* An approval may only be updated by the user who originaly addedd the
|
* Reviewing a document content is only allowed if the document was not
|
||||||
* approval and if it is allowed in the settings
|
* obsoleted. There are other requirements which are not taken into
|
||||||
|
* account here.
|
||||||
*/
|
*/
|
||||||
function mayUpdateApproval($updateUser) { /* {{{ */
|
function mayReceipt($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && !$this->obj->hasExpired()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_RELEASED) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a review maybe edited
|
||||||
|
*
|
||||||
|
* A review may only be updated by the user who originaly addedd the
|
||||||
|
* review and if it is allowed in the settings
|
||||||
|
*/
|
||||||
|
function mayUpdateReceipt($document, $updateUser) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($this->settings->_enableUpdateReceipt && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if document content may be revised
|
||||||
|
*
|
||||||
|
* Revising a document content is only allowed if the document was not
|
||||||
|
* obsoleted. There may be other requirements which are not taken into
|
||||||
|
* account here.
|
||||||
|
*/
|
||||||
|
function mayRevise($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]!=S_OBSOLETE) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if document content may be checked in
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function mayCheckIn($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
$checkoutinfo = $document->getCheckOutInfo();
|
||||||
|
if(!$checkoutinfo)
|
||||||
|
return false;
|
||||||
|
$info = $checkoutinfo[0];
|
||||||
|
if($this->user->getID() == $info['userID'] || $document->getAccessMode($this->user) == M_ALL) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -448,11 +563,44 @@ class SeedDMS_AccessOperation {
|
||||||
return false;
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
protected function check_controller_legacy_access($controller, $get=array()) { /* {{{ */
|
||||||
|
if($this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if(is_string($controller)) {
|
||||||
|
$scripts = array($controller);
|
||||||
|
} elseif(is_array($controller)) {
|
||||||
|
$scripts = $controller;
|
||||||
|
} elseif(is_subclass_of($controller, 'SeedDMS_Controller_Common')) {
|
||||||
|
$scripts = array($controller->getParam('class'));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->user->isGuest()) {
|
||||||
|
$user_allowed = $this->legacy_access['guest'];
|
||||||
|
} else {
|
||||||
|
$user_allowed = $this->legacy_access['user'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(array_intersect($scripts, $user_allowed))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for access permission on view
|
* Check for access permission on view
|
||||||
*
|
*
|
||||||
* This function will always return true because it was added to smooth
|
* If the parameter $view is an array then each element is considered the
|
||||||
* migration from 5.1.x to 6.0.x
|
* name of a view and true will be returned if one of them is accessible.
|
||||||
|
* Whether access is allowed also depends on the currently logged in user
|
||||||
|
* stored in the view object. If the user is an admin the access
|
||||||
|
* on a view must be explicitly disallowed. For regular users the access
|
||||||
|
* must be explicitly allowed.
|
||||||
|
*
|
||||||
|
* If advanced access control is turn off, this function will always return
|
||||||
|
* true for admins and false for other users.
|
||||||
*
|
*
|
||||||
* @param mixed $view Instanz of view, name of view or array of view names
|
* @param mixed $view Instanz of view, name of view or array of view names
|
||||||
* @param string $get query parameters possible containing the element 'action'
|
* @param string $get query parameters possible containing the element 'action'
|
||||||
|
@ -460,20 +608,79 @@ class SeedDMS_AccessOperation {
|
||||||
* no specific access right is set, otherwise false
|
* no specific access right is set, otherwise false
|
||||||
*/
|
*/
|
||||||
function check_view_access($view, $get=array()) { /* {{{ */
|
function check_view_access($view, $get=array()) { /* {{{ */
|
||||||
return $this->check_view_legacy_access($view, $get);
|
if(!$this->settings->_advancedAcl) {
|
||||||
|
return $this->check_view_legacy_access($view, $get);
|
||||||
|
}
|
||||||
|
if(is_string($view)) {
|
||||||
|
$scripts = array($view);
|
||||||
|
} elseif(is_array($view)) {
|
||||||
|
$scripts = $view;
|
||||||
|
} elseif(is_subclass_of($view, 'SeedDMS_View_Common')) {
|
||||||
|
$scripts = array($view->getParam('class'));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$scope = 'Views';
|
||||||
|
$action = (isset($get['action']) && $get['action']) ? $get['action'] : 'show';
|
||||||
|
$acl = new SeedDMS_Acl($this->dms);
|
||||||
|
if(!$this->_aro)
|
||||||
|
$this->_aro = SeedDMS_Aro::getInstance($this->user->getRole(), $this->dms);
|
||||||
|
foreach($scripts as $script) {
|
||||||
|
$aco = SeedDMS_Aco::getInstance($scope.'/'.$script.'/'.$action, $this->dms);
|
||||||
|
$ll = $acl->check($this->_aro, $aco);
|
||||||
|
if($ll === 1 && !$this->user->isAdmin() || $ll !== -1 && $this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for access permission on controller
|
* Check for access permission on controller
|
||||||
*
|
*
|
||||||
* This function will always return true because it was added to smooth
|
* If the parameter $controller is an array then each element is considered the
|
||||||
* migration from 5.1.x to 6.0.x
|
* name of a controller and true will be returned if one is accesible.
|
||||||
|
* If advanced access controll is turn off, this function will return false
|
||||||
|
* for guest users and true otherwise.
|
||||||
*
|
*
|
||||||
* @param mixed $controller Instanz of controller, name of controller or array of controller names
|
* @param mixed $controller Instanz of controller, name of controller or array of controller names
|
||||||
* @param string $get query parameters
|
* @param string $get query parameters
|
||||||
* @return boolean true if access is allowed otherwise false
|
* @return boolean true if access is allowed otherwise false
|
||||||
*/
|
*/
|
||||||
function check_controller_access($controller, $get=array()) { /* {{{ */
|
function check_controller_access($controller, $get=array()) { /* {{{ */
|
||||||
return true;
|
if(!$this->settings->_advancedAcl) {
|
||||||
|
return $this->check_controller_legacy_access($controller, $get);
|
||||||
|
/*
|
||||||
|
if($this->user->isGuest())
|
||||||
|
return false;
|
||||||
|
elseif($this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
else {
|
||||||
|
if($controller == 'AddDocument' && isset($get['action']) && $get['action'] == 'setOwner')
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
if(is_string($controller)) {
|
||||||
|
$scripts = array($controller);
|
||||||
|
} elseif(is_array($controller)) {
|
||||||
|
$scripts = $controller;
|
||||||
|
} elseif(is_subclass_of($controller, 'SeedDMS_Controller_Common')) {
|
||||||
|
$scripts = array($controller->getParam('class'));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$scope = 'Controllers';
|
||||||
|
$action = (isset($get['action']) && $get['action']) ? $get['action'] : 'run';
|
||||||
|
$acl = new SeedDMS_Acl($this->dms);
|
||||||
|
if(!$this->_aro)
|
||||||
|
$this->_aro = SeedDMS_Aro::getInstance($this->user->getRole(), $this->dms);
|
||||||
|
foreach($scripts as $script) {
|
||||||
|
$aco = SeedDMS_Aco::getInstance($scope.'/'.$script.'/'.$action, $this->dms);
|
||||||
|
$ll = $acl->check($this->_aro, $aco);
|
||||||
|
if($ll === 1 && !$this->user->isAdmin() || $ll !== -1 && $this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
}
|
}
|
||||||
|
|
390
inc/inc.ClassAcl.php
Normal file
390
inc/inc.ClassAcl.php
Normal file
|
@ -0,0 +1,390 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of a access control list.
|
||||||
|
*
|
||||||
|
* SeedDMS uses access control list for setting permission,
|
||||||
|
* on various operations.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access request object
|
||||||
|
*
|
||||||
|
* This class provides a model for access request objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Acl { /* {{{ */
|
||||||
|
/**
|
||||||
|
* @var object $dms reference to dms object.
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public $_dms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an acl
|
||||||
|
*
|
||||||
|
* @param object $dms object of dms
|
||||||
|
* @return object instance of SeedDMS_Acl
|
||||||
|
*/
|
||||||
|
public function __construct($dms) { /* {{{ */
|
||||||
|
$this->_dms = $dms;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Aro has access on Aco
|
||||||
|
*
|
||||||
|
* @param object $aro access request object
|
||||||
|
* @param object $aco access control object
|
||||||
|
* @return integer/boolean -1 if access is explictly denied, 1 if access
|
||||||
|
* is explictly allow, 0 if no access restrictions exists, false if
|
||||||
|
* an error occured.
|
||||||
|
*/
|
||||||
|
public function check($aro, $aco) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
|
||||||
|
while($aco) {
|
||||||
|
$acoid = $aco->getID();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$acoid;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 1)
|
||||||
|
return((int) $resArr[0]['read']);
|
||||||
|
|
||||||
|
$aco = $aco->getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function toggle($aro, $aco) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return false;
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
|
||||||
|
$newperm = $resArr['read'] == 1 ? -1 : 1;
|
||||||
|
$queryStr = "UPDATE `tblArosAcos` SET `read`=".$newperm." WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function add($aro, $aco, $perm=-1) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 1) {
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
|
||||||
|
$newperm = $resArr['read'] == 1 ? -1 : 1;
|
||||||
|
$queryStr = "UPDATE `tblArosAcos` SET `read`=".$newperm." WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
$queryStr = "INSERT INTO `tblArosAcos` (`aro`, `aco`, `read`) VALUES (".$aro->getID().", ".$aco->getID().", ".$perm.")";
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function remove($aro, $aco) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
$queryStr = "DELETE FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access request/controll object
|
||||||
|
*
|
||||||
|
* This class provides a model for access request/controll objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_AroAco { /* {{{ */
|
||||||
|
/**
|
||||||
|
* @var object $dms reference to dms object.
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
public $_dms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer id of access request object
|
||||||
|
*/
|
||||||
|
protected $_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer id of parent of access request object
|
||||||
|
*/
|
||||||
|
protected $_parent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string alias of access request object
|
||||||
|
*/
|
||||||
|
protected $_alias;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var object object of access request object
|
||||||
|
*/
|
||||||
|
protected $_object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an aro
|
||||||
|
*
|
||||||
|
* @param object $dms object of dms
|
||||||
|
* @return object instance of SeedDMS_Aco
|
||||||
|
*/
|
||||||
|
function __construct($dms, $id, $parent, $object, $alias) { /* {{{ */
|
||||||
|
$this->_dms = $dms;
|
||||||
|
$this->_id = $id;
|
||||||
|
$this->_parent = $parent;
|
||||||
|
$this->_object = $object;
|
||||||
|
$this->_alias = $alias;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function setDMS($dms) { /* {{{ */
|
||||||
|
$this->_dms = $dms;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getDMS() { /* {{{ */
|
||||||
|
return($this->_dms);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getID() { /* {{{ */
|
||||||
|
return $this->_id;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getAlias() { /* {{{ */
|
||||||
|
return $this->_alias;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getObject() { /* {{{ */
|
||||||
|
return $this->_object;
|
||||||
|
} /* }}} */
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access request object
|
||||||
|
*
|
||||||
|
* This class provides a model for access request objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Aro extends SeedDMS_AroAco { /* {{{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an aro
|
||||||
|
*
|
||||||
|
* @param object $dms object to access the underlying database
|
||||||
|
* @return object instance of SeedDMS_Aro
|
||||||
|
*/
|
||||||
|
public static function getInstance($id, $dms) { /* {{{ */
|
||||||
|
$db = $dms->getDB();
|
||||||
|
if(is_int($id)) {
|
||||||
|
$queryStr = "SELECT * FROM `tblAros` WHERE `id` = " . (int) $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return null;
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
} elseif(is_object($id)) {
|
||||||
|
if($dms->getClassname('role') == get_class($id)) {
|
||||||
|
$model = 'Role';
|
||||||
|
$queryStr = "SELECT * FROM `tblAros` WHERE `model`=".$db->qstr($model)." AND `foreignid`=".$id->getID();
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0) {
|
||||||
|
$queryStr = "INSERT INTO `tblAros` (`parent`, `model`, `foreignid`) VALUES (0, ".$db->qstr($model).", ".$id->getID().")";
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return null;
|
||||||
|
$id = $db->getInsertID();
|
||||||
|
$queryStr = "SELECT * FROM `tblAros` WHERE `id` = " . $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
}
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($resArr['model'] == 'Role') {
|
||||||
|
$classname = $dms->getClassname('role');
|
||||||
|
$object = $classname::getInstance($resArr['foreignid'], $dms);
|
||||||
|
} else {
|
||||||
|
$object = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$aro = new SeedDMS_Aro($dms, $resArr["id"], $resArr['parent'], $object, $resArr['alias']);
|
||||||
|
$aro->setDMS($dms);
|
||||||
|
return $aro;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access control object
|
||||||
|
*
|
||||||
|
* This class provides a model for access control objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Aco extends SeedDMS_AroAco{ /* {{{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an aco
|
||||||
|
*
|
||||||
|
* @param object $dms object to access the underlying database
|
||||||
|
* @return object instance of SeedDMS_Aco
|
||||||
|
*/
|
||||||
|
public static function getInstance($id, $dms) { /* {{{ */
|
||||||
|
$db = $dms->getDB();
|
||||||
|
if(is_int($id)) {
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = " . (int) $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
} elseif(is_string($id)) {
|
||||||
|
$tmp = explode('/', $id);
|
||||||
|
$parentid = 0;
|
||||||
|
foreach($tmp as $part) {
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `alias` = " . $db->qstr($part);
|
||||||
|
// if($parentid)
|
||||||
|
$queryStr .= " AND parent=".$parentid;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0) {
|
||||||
|
$queryStr = "INSERT INTO `tblAcos` (`parent`, `alias`, `model`) VALUES (".$parentid.",".$db->qstr($part).", '')";
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return null;
|
||||||
|
$id = $db->getInsertID();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = " . $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
}
|
||||||
|
$parentid = (int) $resArr[0]['id'];
|
||||||
|
}
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if($resArr['model'] == 'Document') {
|
||||||
|
$classname = $dms->getClassname('document');
|
||||||
|
$object = $classname::getInstance($resArr['foreignid'], $dms);
|
||||||
|
} elseif($resArr['model'] == 'Folder') {
|
||||||
|
$classname = $dms->getClassname('focument');
|
||||||
|
$object = $classname::getInstance($resArr['foreignid'], $dms);
|
||||||
|
} else {
|
||||||
|
$object = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$aco = new SeedDMS_Aco($dms, $resArr["id"], $resArr['parent'], $object, $resArr['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
return $aco;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getChildren() { /* {{{ */
|
||||||
|
$dms = $this->getDMS();
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `parent` = ".$this->_id." ORDER BY `alias`";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$acos = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
$acos[] = $aco;
|
||||||
|
}
|
||||||
|
return $acos;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getPermission($aro) { /* {{{ */
|
||||||
|
if(!$aro)
|
||||||
|
return 0;
|
||||||
|
$dms = $this->getDMS();
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$this->_id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return 0;
|
||||||
|
return (int) $resArr[0]['read'];
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public static function getRoot($dms) { /* {{{ */
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `parent` = 0 ORDER BY `alias`";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$acos = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
$acos[] = $aco;
|
||||||
|
}
|
||||||
|
return $acos;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getParent() { /* {{{ */
|
||||||
|
$dms = $this->getDMS();
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = ".$this->_parent;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$row = $resArr[0];
|
||||||
|
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
return $aco;
|
||||||
|
} /* }}} */
|
||||||
|
} /* }}} */
|
|
@ -52,6 +52,7 @@ class Controller {
|
||||||
require_once($filename);
|
require_once($filename);
|
||||||
$controller = new $classname($params);
|
$controller = new $classname($params);
|
||||||
/* Set some configuration parameters */
|
/* Set some configuration parameters */
|
||||||
|
$controller->setParam('class', $class);
|
||||||
$controller->setParam('postVars', $_POST);
|
$controller->setParam('postVars', $_POST);
|
||||||
$controller->setParam('getVars', $_GET);
|
$controller->setParam('getVars', $_GET);
|
||||||
$controller->setParam('requestVars', $_REQUEST);
|
$controller->setParam('requestVars', $_REQUEST);
|
||||||
|
|
|
@ -316,4 +316,26 @@ class SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the access on the contoller with given name or the current
|
||||||
|
* controller itself may be accessed.
|
||||||
|
*
|
||||||
|
* The function requires the parameter 'accessobject' to be available in the
|
||||||
|
* controller, because it calls SeedDMS_AccessOperation::check_controller_access()
|
||||||
|
* to check access rights. If the the optional $name is not set the
|
||||||
|
* current controller is used.
|
||||||
|
*
|
||||||
|
* @param string|array $name name of controller or list of controller names
|
||||||
|
* @return boolean true if access is allowed otherwise false
|
||||||
|
*/
|
||||||
|
protected function check_access($name='') { /* {{{ */
|
||||||
|
if(!$name)
|
||||||
|
$name = $this;
|
||||||
|
if(!isset($this->params['accessobject']))
|
||||||
|
return false;
|
||||||
|
$access = $this->params['accessobject']->check_controller_access($name);
|
||||||
|
return $access;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,6 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
|
||||||
$from = $this->from_address;
|
$from = $this->from_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$body = '';
|
$body = '';
|
||||||
if(!isset($params['__skip_header__']) || !$params['__skip_header__']) {
|
if(!isset($params['__skip_header__']) || !$params['__skip_header__']) {
|
||||||
if(!isset($params['__header__']))
|
if(!isset($params['__header__']))
|
||||||
|
@ -278,10 +277,12 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
|
||||||
* The dispatching is now done in SeedDMS_NotificationService::toList()
|
* The dispatching is now done in SeedDMS_NotificationService::toList()
|
||||||
*/
|
*/
|
||||||
function toList($sender, $recipients, $subject, $message, $params=array()) { /* {{{ */
|
function toList($sender, $recipients, $subject, $message, $params=array()) { /* {{{ */
|
||||||
|
/*
|
||||||
if ((!is_object($sender) && strcasecmp(get_class($sender), $this->_dms->getClassname('user'))) ||
|
if ((!is_object($sender) && strcasecmp(get_class($sender), $this->_dms->getClassname('user'))) ||
|
||||||
(!is_array($recipients) && count($recipients)==0)) {
|
(!is_array($recipients) && count($recipients)==0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
$ret = true;
|
$ret = true;
|
||||||
foreach ($recipients as $recipient) {
|
foreach ($recipients as $recipient) {
|
||||||
|
|
|
@ -148,6 +148,10 @@ class SeedDMS_Extension_Mgr {
|
||||||
}
|
}
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getRepositoryUrl() { /* {{{ */
|
||||||
|
return $this->reposurl;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
private function getStreamContext() { /* {{{ */
|
private function getStreamContext() { /* {{{ */
|
||||||
if(!$this->proxyurl)
|
if(!$this->proxyurl)
|
||||||
return null;
|
return null;
|
||||||
|
@ -619,14 +623,15 @@ class SeedDMS_Extension_Mgr {
|
||||||
$result = array();
|
$result = array();
|
||||||
$vcache = array(); // keep highest version of extension
|
$vcache = array(); // keep highest version of extension
|
||||||
foreach($list as $e) {
|
foreach($list as $e) {
|
||||||
if($e[0] != '#') {
|
if($e[0] != '#' && trim($e)) {
|
||||||
$re = json_decode($e, true);
|
if($re = json_decode($e, true)) {
|
||||||
if(!isset($result[$re['name']])) {
|
if(!isset($result[$re['name']])) {
|
||||||
$result[$re['name']] = $re;
|
$result[$re['name']] = $re;
|
||||||
$vcache[$re['name']] = $re['version'];
|
$vcache[$re['name']] = $re['version'];
|
||||||
} elseif(self::cmpVersion($re['version'], $vcache[$re['name']]) > 0) {
|
} elseif(self::cmpVersion($re['version'], $vcache[$re['name']]) > 0) {
|
||||||
$result[$re['name']] = $re;
|
$result[$re['name']] = $re;
|
||||||
$vcache[$re['name']] = $re['version'];
|
$vcache[$re['name']] = $re['version'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,8 @@ class SeedDMS_NotificationService {
|
||||||
const RECV_APPROVER = 4;
|
const RECV_APPROVER = 4;
|
||||||
const RECV_WORKFLOW = 5;
|
const RECV_WORKFLOW = 5;
|
||||||
const RECV_UPLOADER = 6;
|
const RECV_UPLOADER = 6;
|
||||||
|
const RECV_REVISOR = 7;
|
||||||
|
const RECV_RECIPIENT = 8;
|
||||||
|
|
||||||
public function __construct($logger = null, $settings = null) { /* {{{ */
|
public function __construct($logger = null, $settings = null) { /* {{{ */
|
||||||
$this->services = array();
|
$this->services = array();
|
||||||
|
@ -1175,6 +1177,80 @@ class SeedDMS_NotificationService {
|
||||||
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendSubmittedReceiptMail($content, $user, $receiptlog) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$nl=$document->getNotifyList();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "receipt_submit_email_subject";
|
||||||
|
$message = "receipt_submit_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['status'] = getReceiptStatusText($receiptlog["status"]);
|
||||||
|
$params['comment'] = $receiptlog['comment'];
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
foreach ($nl["groups"] as $grp) {
|
||||||
|
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
}
|
||||||
|
/* Send mail to owner only if the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Send mail to uploader of version only if the uploader is not the owner and
|
||||||
|
* the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendSubmittedRevisionMail($content, $user, $revisionlog) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$nl=$document->getNotifyList();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "revision_submit_email_subject";
|
||||||
|
$message = "revision_submit_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['status'] = getRevisionStatusText($revisionlog["status"]);
|
||||||
|
$params['comment'] = $revisionlog['comment'];
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
foreach ($nl["groups"] as $grp) {
|
||||||
|
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
}
|
||||||
|
/* Send mail to owner only if the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Send mail to uploader of version only if the uploader is not the owner and
|
||||||
|
* the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
public function sendDeleteApprovalMail($content, $user, $approver) { /* {{{ */
|
public function sendDeleteApprovalMail($content, $user, $approver) { /* {{{ */
|
||||||
$document = $content->getDocument();
|
$document = $content->getDocument();
|
||||||
$folder = $document->getFolder();
|
$folder = $document->getFolder();
|
||||||
|
@ -1208,7 +1284,11 @@ class SeedDMS_NotificationService {
|
||||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
$params['version'] = $content->getVersion();
|
$params['version'] = $content->getVersion();
|
||||||
$params['comment'] = $content->getComment();
|
$params['comment'] = $content->getComment();
|
||||||
$params['username'] = $user->getFullName();
|
if($reviewer->isType('user'))
|
||||||
|
$params['reviewer'] = $reviewer->getFullName();
|
||||||
|
elseif($reviewer->isType('group'))
|
||||||
|
$params['reviewer'] = $reviewer->getName();
|
||||||
|
$params['username'] = $user->getName();
|
||||||
$params['sitename'] = $this->settings->_siteName;
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
$params['http_root'] = $this->settings->_httpRoot;
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
@ -1219,6 +1299,58 @@ class SeedDMS_NotificationService {
|
||||||
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendDeleteRevisionMail($content, $user, $revisor) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "revision_deletion_email_subject";
|
||||||
|
$message = "revision_deletion_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$params['revisor'] = $revisor->getFullName();
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$params['revisor'] = $revisor->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendDeleteReceiptMail($content, $user, $recipient) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "receipt_deletion_email_subject";
|
||||||
|
$message = "receipt_deletion_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$params['recipient'] = $recipient->getFullName();
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$params['recipient'] = $recipient->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This notification is send if a new approver is added.
|
* This notification is send if a new approver is added.
|
||||||
*
|
*
|
||||||
|
@ -1270,6 +1402,10 @@ class SeedDMS_NotificationService {
|
||||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
$params['version'] = $content->getVersion();
|
$params['version'] = $content->getVersion();
|
||||||
$params['comment'] = $content->getComment();
|
$params['comment'] = $content->getComment();
|
||||||
|
if($reviewer->isType('user'))
|
||||||
|
$params['reviewer'] = $reviewer->getFullName();
|
||||||
|
elseif($reviewer->isType('group'))
|
||||||
|
$params['reviewer'] = $reviewer->getName();
|
||||||
$params['username'] = $user->getFullName();
|
$params['username'] = $user->getFullName();
|
||||||
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
$params['sitename'] = $this->settings->_siteName;
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
@ -1281,6 +1417,60 @@ class SeedDMS_NotificationService {
|
||||||
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendAddRevisionMail($content, $user, $revisor) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
$subject = "revision_request_email_subject";
|
||||||
|
$message = "revision_request_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$params['revisor'] = $revisor->getFullName();
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$params['revisor'] = $user->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendAddReceiptMail($content, $user, $recipient) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
$subject = "receipt_request_email_subject";
|
||||||
|
$message = "receipt_request_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$params['recipient'] = $recipient->getFullName();
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$params['recipient'] = $user->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */
|
public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */
|
||||||
if($oldowner->getID() != $document->getOwner()->getID()) {
|
if($oldowner->getID() != $document->getOwner()->getID()) {
|
||||||
$notifyList = $document->getNotifyList();
|
$notifyList = $document->getNotifyList();
|
||||||
|
|
74
inc/inc.ClassScheduler.php
Normal file
74
inc/inc.ClassScheduler.php
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of an SchedulerTask.
|
||||||
|
*
|
||||||
|
* SeedDMS can be extended by extensions. Extension usually implement
|
||||||
|
* hook.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2018 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent a SchedulerTask
|
||||||
|
*
|
||||||
|
* This class provides some very basic methods to manage extensions.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2011 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Scheduler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instanz of database
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
public function getTask($id) { /* {{{ */
|
||||||
|
return SeedDMS_SchedulerTask::getInstance($id, $this->db);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getTasksByExtension($extname, $taskname) { /* {{{ */
|
||||||
|
return SeedDMS_SchedulerTask::getInstancesByExtension($extname, $taskname, $this->db);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getTasks() { /* {{{ */
|
||||||
|
return SeedDMS_SchedulerTask::getInstances($this->db);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function addTask($extname, $taskname, $name, $description, $frequency, $disabled, $params) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
if(!$extname)
|
||||||
|
return false;
|
||||||
|
if(!$taskname)
|
||||||
|
return false;
|
||||||
|
try {
|
||||||
|
$cron = Cron\CronExpression::factory($frequency);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
$queryStr = "INSERT INTO `tblSchedulerTask` (`extension`, `task`, `name`, `description`, `frequency`, `disabled`, `params`, `nextrun`, `lastrun`) VALUES (".$db->qstr($extname).", ".$db->qstr($taskname).", ".$db->qstr($name).", ".$db->qstr($description).", ".$db->qstr($frequency).", ".intval($disabled).", ".$db->qstr(json_encode($params)).", '".$nextrun."', NULL)";
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$task = SeedDMS_SchedulerTask::getInstance($db->getInsertID('tblSchedulerTask'), $db);
|
||||||
|
|
||||||
|
return $task;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function __construct($db) {
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
347
inc/inc.ClassSchedulerTask.php
Normal file
347
inc/inc.ClassSchedulerTask.php
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of an SchedulerTask.
|
||||||
|
*
|
||||||
|
* SeedDMS can be extended by extensions. Extension usually implement
|
||||||
|
* hook.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2018 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent a SchedulerTask
|
||||||
|
*
|
||||||
|
* This class provides some very basic methods to manage extensions.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2011 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_SchedulerTask {
|
||||||
|
/**
|
||||||
|
* Instanz of database
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer unique id of task
|
||||||
|
*/
|
||||||
|
protected $_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string name of task
|
||||||
|
*/
|
||||||
|
protected $_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string description of task
|
||||||
|
*/
|
||||||
|
protected $_description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string extension of task
|
||||||
|
*/
|
||||||
|
protected $_extension;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string task of task
|
||||||
|
*/
|
||||||
|
protected $_task;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string frequency of task
|
||||||
|
*/
|
||||||
|
protected $_frequency;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer set if disabled
|
||||||
|
*/
|
||||||
|
protected $_disabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array list of parameters
|
||||||
|
*/
|
||||||
|
protected $_params;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer last run
|
||||||
|
*/
|
||||||
|
protected $_lastrun;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer next run
|
||||||
|
*/
|
||||||
|
protected $_nextrun;
|
||||||
|
|
||||||
|
public static function getInstance($id, $db) { /* {{{ */
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `id` = " . (int) $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return null;
|
||||||
|
$row = $resArr[0];
|
||||||
|
|
||||||
|
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
|
||||||
|
$task->setDB($db);
|
||||||
|
|
||||||
|
return $task;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public static function getInstances($db) { /* {{{ */
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask`";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 0)
|
||||||
|
return array();
|
||||||
|
|
||||||
|
$tasks = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
|
||||||
|
$task->setDB($db);
|
||||||
|
$tasks[] = $task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tasks;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public static function getInstancesByExtension($extname, $taskname, $db) { /* {{{ */
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `extension` = '".$extname."' AND `task` = '".$taskname."'";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 0)
|
||||||
|
return array();
|
||||||
|
|
||||||
|
$tasks = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
|
||||||
|
$task->setDB($db);
|
||||||
|
$tasks[] = $task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tasks;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function __construct($id, $name, $description, $extension, $task, $frequency, $disabled, $params, $nextrun, $lastrun) {
|
||||||
|
$this->_id = $id;
|
||||||
|
$this->_name = $name;
|
||||||
|
$this->_description = $description;
|
||||||
|
$this->_extension = $extension;
|
||||||
|
$this->_task = $task;
|
||||||
|
$this->_frequency = $frequency;
|
||||||
|
$this->_disabled = $disabled;
|
||||||
|
$this->_params = $params;
|
||||||
|
$this->_nextrun = $nextrun;
|
||||||
|
$this->_lastrun = $lastrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDB($db) {
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getID() {
|
||||||
|
return $this->_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName() {
|
||||||
|
return $this->_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setName($newName) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `name` =".$db->qstr($newName)." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_name = $newName;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return $this->_description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDescription($newDescripion) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `description` =".$db->qstr($newDescripion)." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_description = $newDescripion;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getExtension() {
|
||||||
|
return $this->_extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTask() {
|
||||||
|
return $this->_task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFrequency() {
|
||||||
|
return $this->_frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFrequency($newFrequency) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$cron = Cron\CronExpression::factory($newFrequency);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `frequency` =".$db->qstr($newFrequency).", `nextrun` = '".$nextrun."' WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_frequency = $newFrequency;
|
||||||
|
$this->_nextrun = $nextrun;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getNextRun() {
|
||||||
|
return $this->_nextrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastRun() {
|
||||||
|
return $this->_lastrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDisabled() {
|
||||||
|
return $this->_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDisabled($newDisabled) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `disabled` =".intval($newDisabled)." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_disabled = $newDisabled;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function setParameter($newParams) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `params` =".$db->qstr(json_encode($newParams))." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_params = $newParams;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getParameter($name = '') {
|
||||||
|
if($name)
|
||||||
|
return isset($this->_params[$name]) ? $this->_params[$name] : null;
|
||||||
|
return $this->_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if task is due
|
||||||
|
*
|
||||||
|
* This methods compares the current time with the time in the database
|
||||||
|
* field `nextrun`.
|
||||||
|
* If nextrun is smaller than the current time, the the task is due.
|
||||||
|
* The methode does not rely on the value in the class variable `_nextrun`,
|
||||||
|
* because that value could be 'very old', retrieved at a time
|
||||||
|
* when the task list was fetched for checking due tasks e.g. by the
|
||||||
|
* scheduler client. There is good reason to always take the current
|
||||||
|
* value of nextrun from the database.
|
||||||
|
*
|
||||||
|
* Assuming there are two tasks. Task 1 takes 13 mins and task 2 takes only
|
||||||
|
* 30 sec. Task 1 is run every hour and task 2 starts at 8:06. The cronjob
|
||||||
|
* runs every 5 min. At e.g. 8:00 the list of tasks is read from the database
|
||||||
|
* task 1 is due and starts running and before it runs it sets the database
|
||||||
|
* field nextrun to 9:00. Task 2 isn't due at that time.
|
||||||
|
* At 8:05 the cron job runs again, task 1 has already a new nextrun value
|
||||||
|
* and will not run again. Task 2 isn't due yet and task 1 started at 8:00 is
|
||||||
|
* still running.
|
||||||
|
* At 8:10 task 1 is still running an not due again, but task 2 is due and
|
||||||
|
* will be run. The database field `nextrun` of task 2 will be set to 8:06
|
||||||
|
* on the next day.
|
||||||
|
* At 8:13 task 1 which started at 8:00 is finished and the list of tasks
|
||||||
|
* from that time will be processed further. Task 2 still has the old value
|
||||||
|
* in the class variable `_nextrun` (8:06 the current day),
|
||||||
|
* though the database field `nextrun` has been updated in
|
||||||
|
* between. Taking the value of the class variable would rerun task 2 again,
|
||||||
|
* though it ran at 8:10 already.
|
||||||
|
* That's why this method always takes the current value of nextrun
|
||||||
|
* from the database.
|
||||||
|
*
|
||||||
|
* @return boolean true if task is due, otherwise false
|
||||||
|
*/
|
||||||
|
public function isDue() {
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `id` = " . $this->_id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return false;
|
||||||
|
$row = $resArr[0];
|
||||||
|
$this->_nextrun = $row['nextrun'];
|
||||||
|
|
||||||
|
return $this->_nextrun < date('Y-m-d H:i:s');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateLastNextRun() {
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$lastrun = date('Y-m-d H:i:s');
|
||||||
|
try {
|
||||||
|
$cron = Cron\CronExpression::factory($this->_frequency);
|
||||||
|
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$nextrun = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `lastrun`=".$db->qstr($lastrun).", `nextrun`=".($nextrun ? $db->qstr($nextrun) : "NULL")." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_lastrun = $lastrun;
|
||||||
|
$this->_nextrun = $nextrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete task
|
||||||
|
*
|
||||||
|
* @return boolean true on success or false in case of an error
|
||||||
|
*/
|
||||||
|
function remove() { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "DELETE FROM `tblSchedulerTask` WHERE `id` = " . $this->_id;
|
||||||
|
if (!$db->getResult($queryStr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
}
|
139
inc/inc.ClassSchedulerTaskBase.php
Normal file
139
inc/inc.ClassSchedulerTaskBase.php
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
<?php
|
||||||
|
/***************************************************************
|
||||||
|
* Copyright notice
|
||||||
|
*
|
||||||
|
* (c) 2018 Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* This script is part of the SeedDMS project. The SeedDMS project 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 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* The GNU General Public License can be found at
|
||||||
|
* http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
*
|
||||||
|
* This script 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.
|
||||||
|
*
|
||||||
|
* This copyright notice MUST APPEAR in all copies of the script!
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for scheduler task
|
||||||
|
*
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @package SeedDMS
|
||||||
|
*/
|
||||||
|
class SeedDMS_SchedulerTaskBase {
|
||||||
|
var $dms;
|
||||||
|
|
||||||
|
var $user;
|
||||||
|
|
||||||
|
var $settings;
|
||||||
|
|
||||||
|
var $logger;
|
||||||
|
|
||||||
|
var $fulltextservice;
|
||||||
|
|
||||||
|
var $notifier;
|
||||||
|
|
||||||
|
var $conversionmgr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call a hook with a given name
|
||||||
|
*
|
||||||
|
* Checks if a hook with the given name and for the current task
|
||||||
|
* exists and executes it. The name of the current task is taken
|
||||||
|
* from the current class name by lower casing the first char.
|
||||||
|
* This function will execute all registered hooks in the order
|
||||||
|
* they were registered.
|
||||||
|
*
|
||||||
|
* Attention: as func_get_arg() cannot handle references passed to the hook,
|
||||||
|
* callHook() should not be called if that is required. In that case get
|
||||||
|
* a list of hook objects with getHookObjects() and call the hooks yourself.
|
||||||
|
*
|
||||||
|
* @params string $hook name of hook
|
||||||
|
* @return string concatenated string, merged arrays or whatever the hook
|
||||||
|
* function returns
|
||||||
|
*/
|
||||||
|
public function callHook($hook) { /* {{{ */
|
||||||
|
$tmps = array();
|
||||||
|
$tmp = explode('_', get_class($this));
|
||||||
|
$tmps[] = $tmp[1];
|
||||||
|
$tmp = explode('_', get_parent_class($this));
|
||||||
|
$tmps[] = $tmp[1];
|
||||||
|
/* Run array_unique() in case the parent class has the same suffix */
|
||||||
|
$tmps = array_unique($tmps);
|
||||||
|
$ret = null;
|
||||||
|
foreach($tmps as $tmp)
|
||||||
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['task'][lcfirst($tmp)])) {
|
||||||
|
foreach($GLOBALS['SEEDDMS_HOOKS']['task'][lcfirst($tmp)] as $hookObj) {
|
||||||
|
if (method_exists($hookObj, $hook)) {
|
||||||
|
switch(func_num_args()) {
|
||||||
|
case 1:
|
||||||
|
$tmpret = $hookObj->$hook($this);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2));
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 5:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3), func_get_arg(4));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if($tmpret !== null) {
|
||||||
|
if(is_string($tmpret)) {
|
||||||
|
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? $ret.$tmpret : array_merge($ret, array($tmpret)));
|
||||||
|
} elseif(is_array($tmpret) || is_object($tmpret)) {
|
||||||
|
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? array_merge(array($ret), $tmpret) : array_merge($ret, $tmpret));
|
||||||
|
} else
|
||||||
|
$ret = $tmpret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function __construct($dms=null, $user=null, $settings=null, $logger=null, $fulltextservice=null, $notifier=null, $conversionmgr=null) { /* {{{ */
|
||||||
|
$this->dms = $dms;
|
||||||
|
$this->user = $user;
|
||||||
|
$this->settings = $settings;
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->fulltextservice = $fulltextservice;
|
||||||
|
$this->notifier = $notifier;
|
||||||
|
$this->conversionmgr = $conversionmgr;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function execute(SeedDMS_SchedulerTask $task) { /* {{{ */
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getDescription() { /* {{{ */
|
||||||
|
return '';
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getAdditionalParams() { /* {{{ */
|
||||||
|
return array();
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getAdditionalParamByName($name) { /* {{{ */
|
||||||
|
foreach($this->getAdditionalParams() as $param) {
|
||||||
|
if($param['name'] == $name)
|
||||||
|
return $param;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} /* }}} */
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -45,6 +45,8 @@ class Settings { /* {{{ */
|
||||||
var $_enableGuestLogin = false;
|
var $_enableGuestLogin = false;
|
||||||
// If you even want guest to be logged in automatically, set the following to true
|
// If you even want guest to be logged in automatically, set the following to true
|
||||||
var $_enableGuestAutoLogin = false;
|
var $_enableGuestAutoLogin = false;
|
||||||
|
// Set to true for 2-factor Authentication
|
||||||
|
var $_enable2FactorAuthentication = false;
|
||||||
// If you want to allow login by email, set the following to true
|
// If you want to allow login by email, set the following to true
|
||||||
var $_enableLoginByEmail = false;
|
var $_enableLoginByEmail = false;
|
||||||
// Allow users to reset their password
|
// Allow users to reset their password
|
||||||
|
@ -116,6 +118,12 @@ class Settings { /* {{{ */
|
||||||
var $_dropFolderDir = null;
|
var $_dropFolderDir = null;
|
||||||
// Where the backup directory is located
|
// Where the backup directory is located
|
||||||
var $_backupDir = null;
|
var $_backupDir = null;
|
||||||
|
// Where the library folder is located
|
||||||
|
var $_libraryFolder = 1;
|
||||||
|
// Where the checked out files are located
|
||||||
|
var $_checkOutDir = null;
|
||||||
|
// Create checkout dir if it doesn't exists
|
||||||
|
var $_createCheckOutDir = false;
|
||||||
// Where the repository for extensions is located
|
// Where the repository for extensions is located
|
||||||
var $_repositoryUrl = null;
|
var $_repositoryUrl = null;
|
||||||
// URL of proxy
|
// URL of proxy
|
||||||
|
@ -186,6 +194,18 @@ class Settings { /* {{{ */
|
||||||
var $_enableUpdateRevApp = false;
|
var $_enableUpdateRevApp = false;
|
||||||
// enable/disable removal of a review/approval by the administrator
|
// enable/disable removal of a review/approval by the administrator
|
||||||
var $_enableRemoveRevApp = false;
|
var $_enableRemoveRevApp = false;
|
||||||
|
// enable/disable listing logged in user as recipient
|
||||||
|
var $_enableSelfReceipt = false;
|
||||||
|
// enable/disable hidden user as recipient
|
||||||
|
var $_enableHiddenReceipt = true;
|
||||||
|
// enable/disable update of a receipt by the recipient
|
||||||
|
var $_enableUpdateReceipt = false;
|
||||||
|
// enable/disable listing administrator as recipient
|
||||||
|
var $_enableAdminReceipt = false;
|
||||||
|
// enable/disable listing owner as recipient
|
||||||
|
var $_enableOwnerReceipt = false;
|
||||||
|
// enable/disable filter for receipt by the recipient
|
||||||
|
var $_enableFilterReceipt = false;
|
||||||
// group manager is mandatory reviewer
|
// group manager is mandatory reviewer
|
||||||
var $_addManagerAsReviewer = false;
|
var $_addManagerAsReviewer = false;
|
||||||
// group manager is mandatory approver
|
// group manager is mandatory approver
|
||||||
|
@ -208,8 +228,12 @@ class Settings { /* {{{ */
|
||||||
var $_enableDuplicateDocNames = true;
|
var $_enableDuplicateDocNames = true;
|
||||||
// enable/disable duplicate names of a subfolder in a folder
|
// enable/disable duplicate names of a subfolder in a folder
|
||||||
var $_enableDuplicateSubFolderNames = true;
|
var $_enableDuplicateSubFolderNames = true;
|
||||||
|
// allow/disallow to cancel a checkout
|
||||||
|
var $_enableCancelCheckout = true;
|
||||||
// override mimetype set by browser when uploading a file
|
// override mimetype set by browser when uploading a file
|
||||||
var $_overrideMimeType = false;
|
var $_overrideMimeType = false;
|
||||||
|
// advanced access control lists
|
||||||
|
var $_advancedAcl = false;
|
||||||
// enable/disable notification when added as a reviewer/approver
|
// enable/disable notification when added as a reviewer/approver
|
||||||
var $_enableNotificationAppRev = true;
|
var $_enableNotificationAppRev = true;
|
||||||
// enable/disable notification of users/group who need to take action for
|
// enable/disable notification of users/group who need to take action for
|
||||||
|
@ -219,12 +243,26 @@ class Settings { /* {{{ */
|
||||||
var $_enableNotificationWorkflow = false;
|
var $_enableNotificationWorkflow = false;
|
||||||
// preset expiration date
|
// preset expiration date
|
||||||
var $_presetExpirationDate = "";
|
var $_presetExpirationDate = "";
|
||||||
|
// initial document status
|
||||||
|
var $_initialDocumentStatus = 2; //S_RELEASED;
|
||||||
// the name of the versioning info file created by the backup tool
|
// the name of the versioning info file created by the backup tool
|
||||||
var $_versioningFileName = "versioning_info.txt";
|
var $_versioningFileName = "versioning_info.txt";
|
||||||
// the mode of workflow
|
// the mode of workflow
|
||||||
var $_workflowMode = "traditional";
|
var $_workflowMode = "traditional";
|
||||||
|
// enable/disable acknowledge workflow
|
||||||
|
var $_enableReceiptWorkflow = true;
|
||||||
|
// enable/disable reject of reception
|
||||||
|
var $_enableReceiptReject = false;
|
||||||
|
// enable/disable comment of reception
|
||||||
|
var $_disableReceiptComment = false;
|
||||||
|
// enable/disable revision workflow
|
||||||
|
var $_enableRevisionWorkflow = true;
|
||||||
|
// enable/disable revision on vote reject
|
||||||
|
var $_enableRevisionOneVoteReject = true;
|
||||||
// Allow to set just a reviewer in tradional workflow
|
// Allow to set just a reviewer in tradional workflow
|
||||||
var $_allowReviewerOnly = true;
|
var $_allowReviewerOnly = true;
|
||||||
|
// Allow to change reviewer/approver after review/approval has started
|
||||||
|
var $_allowChangeRevAppInProcess = false;
|
||||||
// enable/disable log system
|
// enable/disable log system
|
||||||
var $_logFileEnable = true;
|
var $_logFileEnable = true;
|
||||||
// enable/disable log system
|
// enable/disable log system
|
||||||
|
@ -259,8 +297,12 @@ class Settings { /* {{{ */
|
||||||
var $_enableClipboard = true;
|
var $_enableClipboard = true;
|
||||||
// show always clipboard in main menu, even if empty
|
// show always clipboard in main menu, even if empty
|
||||||
var $_alwaysShowClipboard = false;
|
var $_alwaysShowClipboard = false;
|
||||||
|
// enable/disable list of transmittals in main menu
|
||||||
|
var $_enableMenuTransmittals = false;
|
||||||
// enable/disable list of tasks in main menu
|
// enable/disable list of tasks in main menu
|
||||||
var $_enableMenuTasks = true;
|
var $_enableMenuTasks = true;
|
||||||
|
// select which tasks show up in main menu
|
||||||
|
var $_tasksInMenu = array();
|
||||||
// show always tasks in main menu, even if none are due
|
// show always tasks in main menu, even if none are due
|
||||||
var $_alwaysShowMenuTasks = true;
|
var $_alwaysShowMenuTasks = true;
|
||||||
// enable/disable list of files in drop folder
|
// enable/disable list of files in drop folder
|
||||||
|
@ -433,6 +475,18 @@ class Settings { /* {{{ */
|
||||||
return $out;
|
return $out;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a variable is a string and returns an array
|
||||||
|
*
|
||||||
|
* @param array $var value
|
||||||
|
* @return true/false
|
||||||
|
*/
|
||||||
|
function arrayVal($var) { /* {{{ */
|
||||||
|
if((string) $var)
|
||||||
|
return explode(';', $var);
|
||||||
|
return array();
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return ';' seperated string from array
|
* Return ';' seperated string from array
|
||||||
*
|
*
|
||||||
|
@ -557,8 +611,10 @@ class Settings { /* {{{ */
|
||||||
$this->_enableSessionList = Settings::boolVal($tab["enableSessionList"]);
|
$this->_enableSessionList = Settings::boolVal($tab["enableSessionList"]);
|
||||||
$this->_enableClipboard = Settings::boolVal($tab["enableClipboard"]);
|
$this->_enableClipboard = Settings::boolVal($tab["enableClipboard"]);
|
||||||
$this->_alwaysShowClipboard = Settings::boolVal($tab["alwaysShowClipboard"]);
|
$this->_alwaysShowClipboard = Settings::boolVal($tab["alwaysShowClipboard"]);
|
||||||
|
$this->_enableMenuTransmittals = Settings::boolVal($tab["enableMenuTransmittals"]);
|
||||||
$this->_enableMenuTasks = Settings::boolVal($tab["enableMenuTasks"]);
|
$this->_enableMenuTasks = Settings::boolVal($tab["enableMenuTasks"]);
|
||||||
$this->_alwaysShowMenuTasks = Settings::boolVal($tab["alwaysShowMenuTasks"]);
|
$this->_alwaysShowMenuTasks = Settings::boolVal($tab["alwaysShowMenuTasks"]);
|
||||||
|
$this->_tasksInMenu = Settings::arrayVal($tab["tasksInMenu"]);
|
||||||
$this->_enableDropFolderList = Settings::boolVal($tab["enableDropFolderList"]);
|
$this->_enableDropFolderList = Settings::boolVal($tab["enableDropFolderList"]);
|
||||||
$this->_enableDropUpload = Settings::boolVal($tab["enableDropUpload"]);
|
$this->_enableDropUpload = Settings::boolVal($tab["enableDropUpload"]);
|
||||||
$this->_enableMultiUpload = Settings::boolVal($tab["enableMultiUpload"]);
|
$this->_enableMultiUpload = Settings::boolVal($tab["enableMultiUpload"]);
|
||||||
|
@ -582,6 +638,7 @@ class Settings { /* {{{ */
|
||||||
$this->_sortUsersInList = strval($tab["sortUsersInList"]);
|
$this->_sortUsersInList = strval($tab["sortUsersInList"]);
|
||||||
$this->_sortFoldersDefault = strval($tab["sortFoldersDefault"]);
|
$this->_sortFoldersDefault = strval($tab["sortFoldersDefault"]);
|
||||||
$this->_expandFolderTree = intval($tab["expandFolderTree"]);
|
$this->_expandFolderTree = intval($tab["expandFolderTree"]);
|
||||||
|
$this->_libraryFolder = intval($tab["libraryFolder"]);
|
||||||
$this->_defaultDocPosition = strval($tab["defaultDocPosition"]);
|
$this->_defaultDocPosition = strval($tab["defaultDocPosition"]);
|
||||||
$this->_defaultFolderPosition = strval($tab["defaultFolderPosition"]);
|
$this->_defaultFolderPosition = strval($tab["defaultFolderPosition"]);
|
||||||
|
|
||||||
|
@ -625,6 +682,8 @@ class Settings { /* {{{ */
|
||||||
$this->_luceneDir = strval($tab["luceneDir"]);
|
$this->_luceneDir = strval($tab["luceneDir"]);
|
||||||
$this->_dropFolderDir = strval($tab["dropFolderDir"]);
|
$this->_dropFolderDir = strval($tab["dropFolderDir"]);
|
||||||
$this->_backupDir = strval($tab["backupDir"]);
|
$this->_backupDir = strval($tab["backupDir"]);
|
||||||
|
$this->_checkOutDir = strval($tab["checkOutDir"]);
|
||||||
|
$this->_createCheckOutDir = Settings::boolVal($tab["createCheckOutDir"]);
|
||||||
$this->_repositoryUrl = strval($tab["repositoryUrl"]);
|
$this->_repositoryUrl = strval($tab["repositoryUrl"]);
|
||||||
$this->_proxyUrl = strval($tab["proxyUrl"]);
|
$this->_proxyUrl = strval($tab["proxyUrl"]);
|
||||||
$this->_proxyUser = strval($tab["proxyUser"]);
|
$this->_proxyUser = strval($tab["proxyUser"]);
|
||||||
|
@ -636,14 +695,13 @@ class Settings { /* {{{ */
|
||||||
$this->_partitionSize = strval($tab["partitionSize"]);
|
$this->_partitionSize = strval($tab["partitionSize"]);
|
||||||
$this->_maxUploadSize = strval($tab["maxUploadSize"]);
|
$this->_maxUploadSize = strval($tab["maxUploadSize"]);
|
||||||
$this->_enableXsendfile = Settings::boolVal($tab["enableXsendfile"]);
|
$this->_enableXsendfile = Settings::boolVal($tab["enableXsendfile"]);
|
||||||
}
|
|
||||||
|
|
||||||
// XML Path: /configuration/system/authentication
|
// XML Path: /configuration/system/authentication
|
||||||
$node = $xml->xpath('/configuration/system/authentication');
|
$node = $xml->xpath('/configuration/system/authentication');
|
||||||
if($node) {
|
|
||||||
$tab = $node[0]->attributes();
|
$tab = $node[0]->attributes();
|
||||||
$this->_enableGuestLogin = Settings::boolVal($tab["enableGuestLogin"]);
|
$this->_enableGuestLogin = Settings::boolVal($tab["enableGuestLogin"]);
|
||||||
$this->_enableGuestAutoLogin = Settings::boolVal($tab["enableGuestAutoLogin"]);
|
$this->_enableGuestAutoLogin = Settings::boolVal($tab["enableGuestAutoLogin"]);
|
||||||
|
$this->_enable2FactorAuthentication = Settings::boolVal($tab["enable2FactorAuthentication"]);
|
||||||
$this->_enableLoginByEmail = Settings::boolVal($tab["enableLoginByEmail"]);
|
$this->_enableLoginByEmail = Settings::boolVal($tab["enableLoginByEmail"]);
|
||||||
$this->_enablePasswordForgotten = Settings::boolVal($tab["enablePasswordForgotten"]);
|
$this->_enablePasswordForgotten = Settings::boolVal($tab["enablePasswordForgotten"]);
|
||||||
$this->_passwordStrength = intval($tab["passwordStrength"]);
|
$this->_passwordStrength = intval($tab["passwordStrength"]);
|
||||||
|
@ -781,6 +839,11 @@ class Settings { /* {{{ */
|
||||||
$this->_enableHiddenRevApp = Settings::boolval($tab["enableHiddenRevApp"]);
|
$this->_enableHiddenRevApp = Settings::boolval($tab["enableHiddenRevApp"]);
|
||||||
$this->_enableUpdateRevApp = Settings::boolval($tab["enableUpdateRevApp"]);
|
$this->_enableUpdateRevApp = Settings::boolval($tab["enableUpdateRevApp"]);
|
||||||
$this->_enableRemoveRevApp = Settings::boolval($tab["enableRemoveRevApp"]);
|
$this->_enableRemoveRevApp = Settings::boolval($tab["enableRemoveRevApp"]);
|
||||||
|
$this->_enableSelfReceipt = Settings::boolval($tab["enableSelfReceipt"]);
|
||||||
|
$this->_enableAdminReceipt = Settings::boolval($tab["enableAdminReceipt"]);
|
||||||
|
$this->_enableOwnerReceipt = Settings::boolval($tab["enableOwnerReceipt"]);
|
||||||
|
$this->_enableUpdateReceipt = Settings::boolval($tab["enableUpdateReceipt"]);
|
||||||
|
$this->_enableFilterReceipt = Settings::boolval($tab["enableFilterReceipt"]);
|
||||||
$this->_addManagerAsReviewer = Settings::boolval($tab["addManagerAsReviewer"]);
|
$this->_addManagerAsReviewer = Settings::boolval($tab["addManagerAsReviewer"]);
|
||||||
$this->_addManagerAsApprover = Settings::boolval($tab["addManagerAsApprover"]);
|
$this->_addManagerAsApprover = Settings::boolval($tab["addManagerAsApprover"]);
|
||||||
if(trim(strval($tab["globalReviewer"])))
|
if(trim(strval($tab["globalReviewer"])))
|
||||||
|
@ -792,14 +855,23 @@ class Settings { /* {{{ */
|
||||||
if(trim(strval($tab["globalGroupApprover"])))
|
if(trim(strval($tab["globalGroupApprover"])))
|
||||||
$this->_globalGroupApprover = explode(',',strval($tab["globalGroupApprover"]));
|
$this->_globalGroupApprover = explode(',',strval($tab["globalGroupApprover"]));
|
||||||
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
|
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
|
||||||
|
$this->_initialDocumentStatus = intval($tab["initialDocumentStatus"]);
|
||||||
$this->_versioningFileName = strval($tab["versioningFileName"]);
|
$this->_versioningFileName = strval($tab["versioningFileName"]);
|
||||||
$this->_workflowMode = strval($tab["workflowMode"]);
|
$this->_workflowMode = strval($tab["workflowMode"]);
|
||||||
|
$this->_enableReceiptWorkflow = Settings::boolval($tab["enableReceiptWorkflow"]);
|
||||||
|
$this->_enableReceiptReject = Settings::boolval($tab["enableReceiptReject"]);
|
||||||
|
$this->_disableReceiptComment = Settings::boolval($tab["disableReceiptComment"]);
|
||||||
|
$this->_enableRevisionWorkflow = Settings::boolval($tab["enableRevisionWorkflow"]);
|
||||||
|
$this->_enableRevisionOneVoteReject = Settings::boolval($tab["enableRevisionOneVoteReject"]);
|
||||||
$this->_allowReviewerOnly = Settings::boolval($tab["allowReviewerOnly"]);
|
$this->_allowReviewerOnly = Settings::boolval($tab["allowReviewerOnly"]);
|
||||||
|
$this->_allowChangeRevAppInProcess = Settings::boolval($tab["allowChangeRevAppInProcess"]);
|
||||||
$this->_enableVersionDeletion = Settings::boolval($tab["enableVersionDeletion"]);
|
$this->_enableVersionDeletion = Settings::boolval($tab["enableVersionDeletion"]);
|
||||||
$this->_enableVersionModification = Settings::boolval($tab["enableVersionModification"]);
|
$this->_enableVersionModification = Settings::boolval($tab["enableVersionModification"]);
|
||||||
$this->_enableDuplicateDocNames = Settings::boolval($tab["enableDuplicateDocNames"]);
|
$this->_enableDuplicateDocNames = Settings::boolval($tab["enableDuplicateDocNames"]);
|
||||||
$this->_enableDuplicateSubFolderNames = Settings::boolval($tab["enableDuplicateSubFolderNames"]);
|
$this->_enableDuplicateSubFolderNames = Settings::boolval($tab["enableDuplicateSubFolderNames"]);
|
||||||
|
$this->_enableCancelCheckout = Settings::boolval($tab["enableCancelCheckout"]);
|
||||||
$this->_overrideMimeType = Settings::boolval($tab["overrideMimeType"]);
|
$this->_overrideMimeType = Settings::boolval($tab["overrideMimeType"]);
|
||||||
|
$this->_advancedAcl = Settings::boolval($tab["advancedAcl"]);
|
||||||
$this->_removeFromDropFolder = Settings::boolval($tab["removeFromDropFolder"]);
|
$this->_removeFromDropFolder = Settings::boolval($tab["removeFromDropFolder"]);
|
||||||
$this->_uploadedAttachmentIsPublic = Settings::boolval($tab["uploadedAttachmentIsPublic"]);
|
$this->_uploadedAttachmentIsPublic = Settings::boolval($tab["uploadedAttachmentIsPublic"]);
|
||||||
}
|
}
|
||||||
|
@ -884,6 +956,8 @@ class Settings { /* {{{ */
|
||||||
$attributValue = "true";
|
$attributValue = "true";
|
||||||
else
|
else
|
||||||
$attributValue = "false";
|
$attributValue = "false";
|
||||||
|
} elseif(is_array($attributValue)) {
|
||||||
|
$attributValue = implode(';', $attributValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($node[$attributName])) {
|
if (isset($node[$attributName])) {
|
||||||
|
@ -967,8 +1041,10 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "enableSessionList", $this->_enableSessionList);
|
$this->setXMLAttributValue($node, "enableSessionList", $this->_enableSessionList);
|
||||||
$this->setXMLAttributValue($node, "enableClipboard", $this->_enableClipboard);
|
$this->setXMLAttributValue($node, "enableClipboard", $this->_enableClipboard);
|
||||||
$this->setXMLAttributValue($node, "alwaysShowClipboard", $this->_alwaysShowClipboard);
|
$this->setXMLAttributValue($node, "alwaysShowClipboard", $this->_alwaysShowClipboard);
|
||||||
|
$this->setXMLAttributValue($node, "enableMenuTransmittals", $this->_enableMenuTransmittals);
|
||||||
$this->setXMLAttributValue($node, "enableMenuTasks", $this->_enableMenuTasks);
|
$this->setXMLAttributValue($node, "enableMenuTasks", $this->_enableMenuTasks);
|
||||||
$this->setXMLAttributValue($node, "alwaysShowMenuTasks", $this->_alwaysShowMenuTasks);
|
$this->setXMLAttributValue($node, "alwaysShowMenuTasks", $this->_alwaysShowMenuTasks);
|
||||||
|
$this->setXMLAttributValue($node, "tasksInMenu", $this->_tasksInMenu);
|
||||||
$this->setXMLAttributValue($node, "enableDropFolderList", $this->_enableDropFolderList);
|
$this->setXMLAttributValue($node, "enableDropFolderList", $this->_enableDropFolderList);
|
||||||
$this->setXMLAttributValue($node, "enableDropUpload", $this->_enableDropUpload);
|
$this->setXMLAttributValue($node, "enableDropUpload", $this->_enableDropUpload);
|
||||||
$this->setXMLAttributValue($node, "enableMultiUpload", $this->_enableMultiUpload);
|
$this->setXMLAttributValue($node, "enableMultiUpload", $this->_enableMultiUpload);
|
||||||
|
@ -990,6 +1066,7 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile);
|
$this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile);
|
||||||
$this->setXMLAttributValue($node, "sortUsersInList", $this->_sortUsersInList);
|
$this->setXMLAttributValue($node, "sortUsersInList", $this->_sortUsersInList);
|
||||||
$this->setXMLAttributValue($node, "sortFoldersDefault", $this->_sortFoldersDefault);
|
$this->setXMLAttributValue($node, "sortFoldersDefault", $this->_sortFoldersDefault);
|
||||||
|
$this->setXMLAttributValue($node, "libraryFolder", $this->_libraryFolder);
|
||||||
$this->setXMLAttributValue($node, "defaultDocPosition", $this->_defaultDocPosition);
|
$this->setXMLAttributValue($node, "defaultDocPosition", $this->_defaultDocPosition);
|
||||||
$this->setXMLAttributValue($node, "defaultFolderPosition", $this->_defaultFolderPosition);
|
$this->setXMLAttributValue($node, "defaultFolderPosition", $this->_defaultFolderPosition);
|
||||||
|
|
||||||
|
@ -1021,6 +1098,8 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "luceneDir", $this->_luceneDir);
|
$this->setXMLAttributValue($node, "luceneDir", $this->_luceneDir);
|
||||||
$this->setXMLAttributValue($node, "dropFolderDir", $this->_dropFolderDir);
|
$this->setXMLAttributValue($node, "dropFolderDir", $this->_dropFolderDir);
|
||||||
$this->setXMLAttributValue($node, "backupDir", $this->_backupDir);
|
$this->setXMLAttributValue($node, "backupDir", $this->_backupDir);
|
||||||
|
$this->setXMLAttributValue($node, "checkOutDir", $this->_checkOutDir);
|
||||||
|
$this->setXMLAttributValue($node, "createCheckOutDir", $this->_createCheckOutDir);
|
||||||
$this->setXMLAttributValue($node, "repositoryUrl", $this->_repositoryUrl);
|
$this->setXMLAttributValue($node, "repositoryUrl", $this->_repositoryUrl);
|
||||||
$this->setXMLAttributValue($node, "proxyUrl", $this->_proxyUrl);
|
$this->setXMLAttributValue($node, "proxyUrl", $this->_proxyUrl);
|
||||||
$this->setXMLAttributValue($node, "proxyUser", $this->_proxyUser);
|
$this->setXMLAttributValue($node, "proxyUser", $this->_proxyUser);
|
||||||
|
@ -1037,6 +1116,7 @@ class Settings { /* {{{ */
|
||||||
$node = $this->getXMLNode($xml, '/configuration/system', 'authentication');
|
$node = $this->getXMLNode($xml, '/configuration/system', 'authentication');
|
||||||
$this->setXMLAttributValue($node, "enableGuestLogin", $this->_enableGuestLogin);
|
$this->setXMLAttributValue($node, "enableGuestLogin", $this->_enableGuestLogin);
|
||||||
$this->setXMLAttributValue($node, "enableGuestAutoLogin", $this->_enableGuestAutoLogin);
|
$this->setXMLAttributValue($node, "enableGuestAutoLogin", $this->_enableGuestAutoLogin);
|
||||||
|
$this->setXMLAttributValue($node, "enable2FactorAuthentication", $this->_enable2FactorAuthentication);
|
||||||
$this->setXMLAttributValue($node, "enableLoginByEmail", $this->_enableLoginByEmail);
|
$this->setXMLAttributValue($node, "enableLoginByEmail", $this->_enableLoginByEmail);
|
||||||
$this->setXMLAttributValue($node, "enablePasswordForgotten", $this->_enablePasswordForgotten);
|
$this->setXMLAttributValue($node, "enablePasswordForgotten", $this->_enablePasswordForgotten);
|
||||||
$this->setXMLAttributValue($node, "passwordStrength", $this->_passwordStrength);
|
$this->setXMLAttributValue($node, "passwordStrength", $this->_passwordStrength);
|
||||||
|
@ -1148,6 +1228,13 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "enableHiddenRevApp", $this->_enableHiddenRevApp);
|
$this->setXMLAttributValue($node, "enableHiddenRevApp", $this->_enableHiddenRevApp);
|
||||||
$this->setXMLAttributValue($node, "enableUpdateRevApp", $this->_enableUpdateRevApp);
|
$this->setXMLAttributValue($node, "enableUpdateRevApp", $this->_enableUpdateRevApp);
|
||||||
$this->setXMLAttributValue($node, "enableRemoveRevApp", $this->_enableRemoveRevApp);
|
$this->setXMLAttributValue($node, "enableRemoveRevApp", $this->_enableRemoveRevApp);
|
||||||
|
$this->setXMLAttributValue($node, "enableSelfReceipt", $this->_enableSelfReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableAdminReceipt", $this->_enableAdminReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableOwnerReceipt", $this->_enableOwnerReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableUpdateReceipt", $this->_enableUpdateReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableFilterReceipt", $this->_enableFilterReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
||||||
|
$this->setXMLAttributValue($node, "initialDocumentStatus", $this->_initialDocumentStatus);
|
||||||
$this->setXMLAttributValue($node, "addManagerAsReviewer", $this->_addManagerAsReviewer);
|
$this->setXMLAttributValue($node, "addManagerAsReviewer", $this->_addManagerAsReviewer);
|
||||||
$this->setXMLAttributValue($node, "addManagerAsApprover", $this->_addManagerAsApprover);
|
$this->setXMLAttributValue($node, "addManagerAsApprover", $this->_addManagerAsApprover);
|
||||||
$this->setXMLAttributValue($node, "globalReviewer", implode(',', $this->_globalReviewer));
|
$this->setXMLAttributValue($node, "globalReviewer", implode(',', $this->_globalReviewer));
|
||||||
|
@ -1157,14 +1244,21 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
||||||
$this->setXMLAttributValue($node, "apiOrigin", $this->_apiOrigin);
|
$this->setXMLAttributValue($node, "apiOrigin", $this->_apiOrigin);
|
||||||
$this->setXMLAttributValue($node, "versioningFileName", $this->_versioningFileName);
|
$this->setXMLAttributValue($node, "versioningFileName", $this->_versioningFileName);
|
||||||
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
|
||||||
$this->setXMLAttributValue($node, "workflowMode", $this->_workflowMode);
|
$this->setXMLAttributValue($node, "workflowMode", $this->_workflowMode);
|
||||||
|
$this->setXMLAttributValue($node, "enableReceiptWorkflow", $this->_enableReceiptWorkflow);
|
||||||
|
$this->setXMLAttributValue($node, "enableReceiptReject", $this->_enableReceiptReject);
|
||||||
|
$this->setXMLAttributValue($node, "disableReceiptComment", $this->_disableReceiptComment);
|
||||||
|
$this->setXMLAttributValue($node, "enableRevisionWorkflow", $this->_enableRevisionWorkflow);
|
||||||
|
$this->setXMLAttributValue($node, "enableRevisionOneVoteReject", $this->_enableRevisionOneVoteReject);
|
||||||
$this->setXMLAttributValue($node, "allowReviewerOnly", $this->_allowReviewerOnly);
|
$this->setXMLAttributValue($node, "allowReviewerOnly", $this->_allowReviewerOnly);
|
||||||
|
$this->setXMLAttributValue($node, "allowChangeRevAppInProcess", $this->_allowChangeRevAppInProcess);
|
||||||
$this->setXMLAttributValue($node, "enableVersionDeletion", $this->_enableVersionDeletion);
|
$this->setXMLAttributValue($node, "enableVersionDeletion", $this->_enableVersionDeletion);
|
||||||
$this->setXMLAttributValue($node, "enableVersionModification", $this->_enableVersionModification);
|
$this->setXMLAttributValue($node, "enableVersionModification", $this->_enableVersionModification);
|
||||||
$this->setXMLAttributValue($node, "enableDuplicateDocNames", $this->_enableDuplicateDocNames);
|
$this->setXMLAttributValue($node, "enableDuplicateDocNames", $this->_enableDuplicateDocNames);
|
||||||
$this->setXMLAttributValue($node, "enableDuplicateSubFolderNames", $this->_enableDuplicateSubFolderNames);
|
$this->setXMLAttributValue($node, "enableDuplicateSubFolderNames", $this->_enableDuplicateSubFolderNames);
|
||||||
|
$this->setXMLAttributValue($node, "enableCancelCheckout", $this->_enableCancelCheckout);
|
||||||
$this->setXMLAttributValue($node, "overrideMimeType", $this->_overrideMimeType);
|
$this->setXMLAttributValue($node, "overrideMimeType", $this->_overrideMimeType);
|
||||||
|
$this->setXMLAttributValue($node, "advancedAcl", $this->_advancedAcl);
|
||||||
$this->setXMLAttributValue($node, "removeFromDropFolder", $this->_removeFromDropFolder);
|
$this->setXMLAttributValue($node, "removeFromDropFolder", $this->_removeFromDropFolder);
|
||||||
$this->setXMLAttributValue($node, "uploadedAttachmentIsPublic", $this->_uploadedAttachmentIsPublic);
|
$this->setXMLAttributValue($node, "uploadedAttachmentIsPublic", $this->_uploadedAttachmentIsPublic);
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
require_once('inc.ClassUI_Default.php');
|
require_once('inc.ClassUI_Default.php');
|
||||||
require_once('inc.ClassViewCommon.php');
|
require_once('inc.ClassViewCommon.php');
|
||||||
|
require_once('inc.ClassAccessOperation.php');
|
||||||
|
|
||||||
/* $theme was possibly set in inc.Authentication.php */
|
/* $theme was possibly set in inc.Authentication.php */
|
||||||
if (!isset($theme) || strlen($theme)==0) {
|
if (!isset($theme) || strlen($theme)==0) {
|
||||||
|
@ -45,7 +46,7 @@ class UI extends UI_Default {
|
||||||
* @return object an object of a class implementing the view
|
* @return object an object of a class implementing the view
|
||||||
*/
|
*/
|
||||||
static function factory($theme, $class='', $params=array()) { /* {{{ */
|
static function factory($theme, $class='', $params=array()) { /* {{{ */
|
||||||
global $settings, $session, $extMgr, $request, $logger, $notifier;
|
global $settings, $dms, $user, $session, $extMgr, $request, $logger, $notifier;
|
||||||
if(!$class) {
|
if(!$class) {
|
||||||
$class = 'Bootstrap';
|
$class = 'Bootstrap';
|
||||||
$class = 'Style';
|
$class = 'Style';
|
||||||
|
@ -127,6 +128,7 @@ class UI extends UI_Default {
|
||||||
$params['settings'] = $settings;
|
$params['settings'] = $settings;
|
||||||
$view = new $classname($params, $theme);
|
$view = new $classname($params, $theme);
|
||||||
/* Set some configuration parameters */
|
/* Set some configuration parameters */
|
||||||
|
$view->setParam('accessobject', new SeedDMS_AccessOperation($dms, $user, $settings));
|
||||||
$view->setParam('referer', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
|
$view->setParam('referer', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
|
||||||
$view->setParam('requesturi', $_SERVER['REQUEST_URI']);
|
$view->setParam('requesturi', $_SERVER['REQUEST_URI']);
|
||||||
$view->setParam('absbaseprefix', $settings->_httpRoot.$httpbasedir);
|
$view->setParam('absbaseprefix', $settings->_httpRoot.$httpbasedir);
|
||||||
|
@ -153,11 +155,14 @@ class UI extends UI_Default {
|
||||||
$view->setParam('enablefoldertree', $settings->_enableFolderTree);
|
$view->setParam('enablefoldertree', $settings->_enableFolderTree);
|
||||||
$view->setParam('enablelanguageselector', $settings->_enableLanguageSelector);
|
$view->setParam('enablelanguageselector', $settings->_enableLanguageSelector);
|
||||||
$view->setParam('enableclipboard', $settings->_enableClipboard);
|
$view->setParam('enableclipboard', $settings->_enableClipboard);
|
||||||
|
$view->setParam('enablemenutransmittals', $settings->_enableMenuTransmittals);
|
||||||
$view->setParam('enablemenutasks', $settings->_enableMenuTasks);
|
$view->setParam('enablemenutasks', $settings->_enableMenuTasks);
|
||||||
|
$view->setParam('tasksinmenu', $settings->_tasksInMenu);
|
||||||
$view->setParam('enabledropfolderlist', $settings->_enableDropFolderList);
|
$view->setParam('enabledropfolderlist', $settings->_enableDropFolderList);
|
||||||
$view->setParam('dropfolderdir', $settings->_dropFolderDir);
|
$view->setParam('dropfolderdir', $settings->_dropFolderDir);
|
||||||
$view->setParam('enablesessionlist', $settings->_enableSessionList);
|
$view->setParam('enablesessionlist', $settings->_enableSessionList);
|
||||||
$view->setParam('workflowmode', $settings->_workflowMode);
|
$view->setParam('workflowmode', $settings->_workflowMode);
|
||||||
|
$view->setParam('checkoutdir', $settings->_checkOutDir);
|
||||||
$view->setParam('partitionsize', SeedDMS_Core_File::parse_filesize( $settings->_partitionSize));
|
$view->setParam('partitionsize', SeedDMS_Core_File::parse_filesize( $settings->_partitionSize));
|
||||||
$view->setParam('maxuploadsize', $settings->getMaximumUploadSize());
|
$view->setParam('maxuploadsize', $settings->getMaximumUploadSize());
|
||||||
$view->setParam('showmissingtranslations', $settings->_showMissingTranslations);
|
$view->setParam('showmissingtranslations', $settings->_showMissingTranslations);
|
||||||
|
@ -193,7 +198,6 @@ class UI extends UI_Default {
|
||||||
|
|
||||||
static function exitError($pagetitle, $error, $noexit=false, $plain=false) {
|
static function exitError($pagetitle, $error, $noexit=false, $plain=false) {
|
||||||
global $theme, $dms, $user, $settings;
|
global $theme, $dms, $user, $settings;
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
|
||||||
$view = UI::factory($theme, 'ErrorDlg');
|
$view = UI::factory($theme, 'ErrorDlg');
|
||||||
$request = $view->getParam('request');
|
$request = $view->getParam('request');
|
||||||
if($request) {
|
if($request) {
|
||||||
|
@ -201,7 +205,6 @@ class UI extends UI_Default {
|
||||||
}
|
}
|
||||||
$view->setParam('dms', $dms);
|
$view->setParam('dms', $dms);
|
||||||
$view->setParam('user', $user);
|
$view->setParam('user', $user);
|
||||||
$view->setParam('accessobject', $accessop);
|
|
||||||
$view->setParam('pagetitle', $pagetitle);
|
$view->setParam('pagetitle', $pagetitle);
|
||||||
$view->setParam('errormsg', $error);
|
$view->setParam('errormsg', $error);
|
||||||
$view->setParam('plain', $plain);
|
$view->setParam('plain', $plain);
|
||||||
|
|
|
@ -322,8 +322,10 @@ class SeedDMS_View_Common {
|
||||||
*/
|
*/
|
||||||
protected function html_url($view, $urlparams=array()) { /* {{{ */
|
protected function html_url($view, $urlparams=array()) { /* {{{ */
|
||||||
$url = $this->params['settings']->_httpRoot."out/out.".$view.".php";
|
$url = $this->params['settings']->_httpRoot."out/out.".$view.".php";
|
||||||
if($urlparams)
|
if(is_array($urlparams))
|
||||||
$url .= "?".http_build_query($urlparams);
|
$url .= "?".http_build_query($urlparams);
|
||||||
|
elseif(is_string($urlparams))
|
||||||
|
$url .= "?".$urlparams;
|
||||||
return $url;
|
return $url;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,7 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require_once('inc/inc.Tasks.php');
|
||||||
require_once("inc.ConversionInit.php");
|
require_once("inc.ConversionInit.php");
|
||||||
require_once('inc.FulltextInit.php');
|
require_once('inc.FulltextInit.php');
|
||||||
require_once('inc.AuthenticationInit.php');
|
require_once('inc.AuthenticationInit.php');
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
global $logger;
|
global $logger;
|
||||||
|
|
||||||
require "inc.ClassExtensionMgr.php";
|
require "inc.ClassExtensionMgr.php";
|
||||||
|
require_once "inc.ClassSchedulerTaskBase.php";
|
||||||
require_once "inc.ClassExtBase.php";
|
require_once "inc.ClassExtBase.php";
|
||||||
|
|
||||||
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);
|
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);
|
||||||
|
|
|
@ -26,6 +26,7 @@ $fulltextservice = null;
|
||||||
if($settings->_enableFullSearch) {
|
if($settings->_enableFullSearch) {
|
||||||
require_once("inc.ClassFulltextService.php");
|
require_once("inc.ClassFulltextService.php");
|
||||||
$fulltextservice = new SeedDMS_FulltextService();
|
$fulltextservice = new SeedDMS_FulltextService();
|
||||||
|
$fulltextservice->setLogger($logger);
|
||||||
|
|
||||||
if($settings->_fullSearchEngine == 'sqlitefts') {
|
if($settings->_fullSearchEngine == 'sqlitefts') {
|
||||||
$indexconf = array(
|
$indexconf = array(
|
||||||
|
|
|
@ -174,6 +174,68 @@ function getReviewStatusText($status, $date=0) { /* {{{ */
|
||||||
}
|
}
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
function printReceiptStatusText($status, $date=0) { /* {{{ */
|
||||||
|
print getReceiptStatusText($status, $date);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function getReceiptStatusText($status, $date=0) { /* {{{ */
|
||||||
|
if (is_null($status)) {
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch ($status) {
|
||||||
|
case -2:
|
||||||
|
return getMLText("status_recipient_removed");
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
return getMLText("status_receipt_rejected").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
return getMLText("status_not_receipted");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return getMLText("status_receipted").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function printRevisionStatusText($status, $date=0) { /* {{{ */
|
||||||
|
print getRevisionStatusText($status, $date);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function getRevisionStatusText($status, $date=0) { /* {{{ */
|
||||||
|
if (is_null($status)) {
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch ($status) {
|
||||||
|
case -3:
|
||||||
|
return getMLText("status_revision_sleeping");
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
return getMLText("status_revisor_removed");
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
return getMLText("status_needs_correction").($date !=0 ? " ".$date : "");
|
||||||
|
return getMLText("status_revision_rejected").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
return getMLText("status_not_revised");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return getMLText("status_revised").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
function printApprovalStatusText($status, $date=0) { /* {{{ */
|
function printApprovalStatusText($status, $date=0) { /* {{{ */
|
||||||
if (is_null($status)) {
|
if (is_null($status)) {
|
||||||
print getMLText("status_unknown");
|
print getMLText("status_unknown");
|
||||||
|
@ -255,6 +317,15 @@ function getOverallStatusText($status) { /* {{{ */
|
||||||
case S_EXPIRED:
|
case S_EXPIRED:
|
||||||
return getMLText("expired");
|
return getMLText("expired");
|
||||||
break;
|
break;
|
||||||
|
case S_IN_REVISION:
|
||||||
|
return getMLText("in_revision");
|
||||||
|
break;
|
||||||
|
case S_DRAFT:
|
||||||
|
return getMLText("draft");
|
||||||
|
break;
|
||||||
|
case S_NEEDS_CORRECTION:
|
||||||
|
return getMLText("needs_correction");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return getMLText("status_unknown");
|
return getMLText("status_unknown");
|
||||||
break;
|
break;
|
||||||
|
|
17
inc/inc.Scheduler.php
Normal file
17
inc/inc.Scheduler.php
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Initialize scheduler
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2018 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once "inc.ClassSchedulerTaskBase.php";
|
||||||
|
require_once "inc.ClassScheduler.php";
|
||||||
|
require_once "inc.ClassSchedulerTask.php";
|
||||||
|
|
1047
inc/inc.Tasks.php
Normal file
1047
inc/inc.Tasks.php
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -447,7 +447,7 @@ function utf8_basename($path, $suffix='') { /* {{{ */
|
||||||
* @return string valid file name
|
* @return string valid file name
|
||||||
*/
|
*/
|
||||||
function getFilenameByDocname($content) { /* {{{ */
|
function getFilenameByDocname($content) { /* {{{ */
|
||||||
if(is_string) {
|
if(is_string($content)) {
|
||||||
$filename = $content;
|
$filename = $content;
|
||||||
} else {
|
} else {
|
||||||
$document = $content->getDocument();
|
$document = $content->getDocument();
|
||||||
|
@ -795,6 +795,18 @@ function addDirSep($str, $chr=DIRECTORY_SEPARATOR) { /* {{{ */
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Formats comments for aknowledge of reception.
|
||||||
|
*
|
||||||
|
* Only use in documentListRow()
|
||||||
|
*/
|
||||||
|
function formatComment($an) { /* {{{ */
|
||||||
|
$t = array();
|
||||||
|
foreach($an as $a)
|
||||||
|
$t[] = $a['n']." × ".$a['c'];
|
||||||
|
return $t;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/*
|
||||||
* Determines if a command exists on the current environment
|
* Determines if a command exists on the current environment
|
||||||
*
|
*
|
||||||
* @param string $command The command to check
|
* @param string $command The command to check
|
||||||
|
@ -970,6 +982,19 @@ function seed_pass_verify($password, $hash) { /* {{{ */
|
||||||
return $hash === md5($password);
|
return $hash === md5($password);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
function resolveTask($task) { /* {{{ */
|
||||||
|
global $dms, $user, $settings, $logger, $fulltextservice, $notifier, $conversionmgr;
|
||||||
|
|
||||||
|
if(is_object($task))
|
||||||
|
return $task;
|
||||||
|
if(is_string($task)) {
|
||||||
|
if(class_exists($task)) {
|
||||||
|
$task = new $task($dms, $user, $settings, $logger, $fulltextservice, $notifier, $conversionmgr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $task;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return nonce for CSP
|
* Return nonce for CSP
|
||||||
*
|
*
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
class SeedDMS_Version { /* {{{ */
|
class SeedDMS_Version { /* {{{ */
|
||||||
|
|
||||||
const _number = "5.1.37";
|
const _number = "6.0.30";
|
||||||
const _string = "SeedDMS";
|
const _string = "SeedDMS";
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
|
|
|
@ -47,19 +47,35 @@ CREATE TABLE `tblAttributeDefinitions` (
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUsers`
|
-- Table structure for table `tblRoles`
|
||||||
--
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(50) DEFAULT NULL,
|
||||||
|
`role` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (`name`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUsers`
|
||||||
|
--
|
||||||
|
|
||||||
CREATE TABLE `tblUsers` (
|
CREATE TABLE `tblUsers` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`login` varchar(50) DEFAULT NULL,
|
`login` varchar(50) DEFAULT NULL,
|
||||||
`pwd` varchar(50) DEFAULT NULL,
|
`pwd` varchar(50) DEFAULT NULL,
|
||||||
|
`secret` varchar(50) DEFAULT NULL,
|
||||||
`fullName` varchar(100) DEFAULT NULL,
|
`fullName` varchar(100) DEFAULT NULL,
|
||||||
`email` varchar(70) DEFAULT NULL,
|
`email` varchar(70) DEFAULT NULL,
|
||||||
`language` varchar(32) NOT NULL,
|
`language` varchar(32) NOT NULL,
|
||||||
`theme` varchar(32) NOT NULL,
|
`theme` varchar(32) NOT NULL,
|
||||||
`comment` text NOT NULL,
|
`comment` text NOT NULL,
|
||||||
`role` smallint(1) NOT NULL DEFAULT '0',
|
`role` int(11) NOT NULL,
|
||||||
`hidden` smallint(1) NOT NULL DEFAULT '0',
|
`hidden` smallint(1) NOT NULL DEFAULT '0',
|
||||||
`pwdExpiration` datetime DEFAULT NULL,
|
`pwdExpiration` datetime DEFAULT NULL,
|
||||||
`loginfailures` tinyint(4) NOT NULL DEFAULT '0',
|
`loginfailures` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
@ -67,11 +83,28 @@ CREATE TABLE `tblUsers` (
|
||||||
`quota` bigint(20) DEFAULT NULL,
|
`quota` bigint(20) DEFAULT NULL,
|
||||||
`homefolder` int(11) DEFAULT NULL,
|
`homefolder` int(11) DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `login` (`login`)
|
UNIQUE KEY `login` (`login`),
|
||||||
|
CONSTRAINT `tblUsers_role` FOREIGN KEY (`role`) REFERENCES `tblRoles` (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUserSubstitutes`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`user` int(11) DEFAULT null,
|
||||||
|
`substitute` int(11) DEFAULT null,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `user` (`user`,`substitute`),
|
||||||
|
CONSTRAINT `tblUserSubstitutes_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblUserSubstitutes_substitute` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUserPasswordRequest`
|
-- Table structure for table `tblUserPasswordRequest`
|
||||||
--
|
--
|
||||||
|
@ -222,6 +255,7 @@ CREATE TABLE `tblDocumentApprovers` (
|
||||||
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
CONSTRAINT `tblDocumentApprovers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblDocumentApprovers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -262,6 +296,7 @@ CREATE TABLE `tblDocumentContent` (
|
||||||
`mimeType` varchar(100) NOT NULL DEFAULT '',
|
`mimeType` varchar(100) NOT NULL DEFAULT '',
|
||||||
`fileSize` bigint(20) DEFAULT NULL,
|
`fileSize` bigint(20) DEFAULT NULL,
|
||||||
`checksum` char(32) DEFAULT NULL,
|
`checksum` char(32) DEFAULT NULL,
|
||||||
|
`revisiondate` datetime DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `document` (`document`,`version`),
|
UNIQUE KEY `document` (`document`,`version`),
|
||||||
CONSTRAINT `tblDocumentContent_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`)
|
CONSTRAINT `tblDocumentContent_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`)
|
||||||
|
@ -350,6 +385,23 @@ CREATE TABLE `tblDocumentLocks` (
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
|
-- Table structure for table `tblDocumentCheckOuts`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`document`),
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
-- Table structure for table `tblDocumentReviewers`
|
-- Table structure for table `tblDocumentReviewers`
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -363,6 +415,7 @@ CREATE TABLE `tblDocumentReviewers` (
|
||||||
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
CONSTRAINT `tblDocumentReviewers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblDocumentReviewers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -386,6 +439,83 @@ CREATE TABLE `tblDocumentReviewLog` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRecipients`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRecipients_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentReceiptLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`receiptID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptLogID`),
|
||||||
|
KEY `tblDocumentReceiptLog_receipt` (`receiptID`),
|
||||||
|
KEY `tblDocumentReceiptLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_recipient` FOREIGN KEY (`receiptID`) REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisors`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`startdate` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`revisionID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRevisors_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisionLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`revisionID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`revisionLogID`),
|
||||||
|
KEY `tblDocumentRevisionLog_revision` (`revisionID`),
|
||||||
|
KEY `tblDocumentRevisionLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_revision` FOREIGN KEY (`revisionID`) REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblDocumentStatus`
|
-- Table structure for table `tblDocumentStatus`
|
||||||
--
|
--
|
||||||
|
@ -608,6 +738,7 @@ CREATE TABLE `tblWorkflows` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`name` text NOT NULL,
|
`name` text NOT NULL,
|
||||||
`initstate` int(11) NOT NULL,
|
`initstate` int(11) NOT NULL,
|
||||||
|
`layoutdata` text DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `tblWorkflow_initstate` (`initstate`),
|
KEY `tblWorkflow_initstate` (`initstate`),
|
||||||
CONSTRAINT `tblWorkflow_initstate` FOREIGN KEY (`initstate`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblWorkflow_initstate` FOREIGN KEY (`initstate`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
|
||||||
|
@ -674,53 +805,52 @@ CREATE TABLE `tblWorkflowTransitionGroups` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `tblWorkflowLog`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowLog` (
|
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`document` int(11) DEFAULT NULL,
|
|
||||||
`version` smallint(5) DEFAULT NULL,
|
|
||||||
`workflow` int(11) DEFAULT NULL,
|
|
||||||
`userid` int(11) DEFAULT NULL,
|
|
||||||
`transition` int(11) DEFAULT NULL,
|
|
||||||
`date` datetime NOT NULL,
|
|
||||||
`comment` text,
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `tblWorkflowLog_document` (`document`),
|
|
||||||
KEY `tblWorkflowLog_workflow` (`workflow`),
|
|
||||||
KEY `tblWorkflowLog_userid` (`userid`),
|
|
||||||
KEY `tblWorkflowLog_transition` (`transition`),
|
|
||||||
CONSTRAINT `tblWorkflowLog_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT `tblWorkflowLog_transition` FOREIGN KEY (`transition`) REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT `tblWorkflowLog_userid` FOREIGN KEY (`userid`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT `tblWorkflowLog_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowDocumentContent`
|
-- Table structure for table `tblWorkflowDocumentContent`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowDocumentContent` (
|
CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
`parentworkflow` int(11) DEFAULT '0',
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`parent` int(11) DEFAULT NULL,
|
||||||
`workflow` int(11) DEFAULT NULL,
|
`workflow` int(11) DEFAULT NULL,
|
||||||
`document` int(11) DEFAULT NULL,
|
`document` int(11) DEFAULT NULL,
|
||||||
`version` smallint(5) DEFAULT NULL,
|
`version` smallint(5) DEFAULT NULL,
|
||||||
`state` int(11) DEFAULT NULL,
|
`state` int(11) DEFAULT NULL,
|
||||||
`date` datetime NOT NULL,
|
`date` datetime NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
KEY `tblWorkflowDocument_document` (`document`),
|
KEY `tblWorkflowDocument_document` (`document`),
|
||||||
KEY `tblWorkflowDocument_workflow` (`workflow`),
|
KEY `tblWorkflowDocument_workflow` (`workflow`),
|
||||||
KEY `tblWorkflowDocument_state` (`state`),
|
KEY `tblWorkflowDocument_state` (`state`),
|
||||||
CONSTRAINT `tblWorkflowDocument_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
CONSTRAINT `tblWorkflowDocument_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
CONSTRAINT `tblWorkflowDocument_state` FOREIGN KEY (`state`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
CONSTRAINT `tblWorkflowDocument_state` FOREIGN KEY (`state`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblWorkflowDocumentContent_parent` FOREIGN KEY (`parent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
CONSTRAINT `tblWorkflowDocument_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblWorkflowDocument_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblWorkflowLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblWorkflowLog` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`workflowdocumentcontent` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`userid` int(11) DEFAULT NULL,
|
||||||
|
`transition` int(11) DEFAULT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`comment` text,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `tblWorkflowLog_userid` (`userid`),
|
||||||
|
KEY `tblWorkflowLog_transition` (`transition`),
|
||||||
|
KEY `tblWorkflowLog_workflowdocumentcontent` (`workflowdocumentcontent`),
|
||||||
|
CONSTRAINT `tblWorkflowLog_workflowdocumentcontent` FOREIGN KEY (`workflowdocumentcontent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblWorkflowLog_transition` FOREIGN KEY (`transition`) REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblWorkflowLog_userid` FOREIGN KEY (`userid`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
||||||
--
|
--
|
||||||
|
@ -736,6 +866,127 @@ CREATE TABLE `tblWorkflowMandatoryWorkflow` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
`public` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `tblTransmittals_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal item
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`transmittal` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`document` int(11) DEFAULT NULL,
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (transmittal, document, version),
|
||||||
|
CONSTRAINT `tblTransmittalItems_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblTransmittalItem_transmittal` FOREIGN KEY (`transmittal`) REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for cached read access
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblCachedAccess` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`document` int(11) DEFAULT NULL,
|
||||||
|
`user` int(11) DEFAULT null,
|
||||||
|
`mode` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `tblCachedAccess_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblCachedAccess_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access request objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access control objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for acos/aros relation
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`aro` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`aco` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`create` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`read` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`update` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`delete` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (aco, aro),
|
||||||
|
CONSTRAINT `tblArosAcos_acos` FOREIGN KEY (`aco`) REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblArosAcos_aros` FOREIGN KEY (`aro`) REFERENCES `tblAros` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblSchedulerTask`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` text DEFAULT NULL,
|
||||||
|
`disabled` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` text DEFAULT NULL,
|
||||||
|
`nextrun` datetime DEFAULT NULL,
|
||||||
|
`lastrun` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblVersion`
|
-- Table structure for table `tblVersion`
|
||||||
--
|
--
|
||||||
|
@ -753,7 +1004,10 @@ CREATE TABLE `tblVersion` (
|
||||||
-- Initial content for database
|
-- Initial content for database
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO tblUsers VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
INSERT INTO tblUsers VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
|
INSERT INTO tblUsers VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
||||||
|
INSERT INTO tblUsers VALUES (2, 'guest', NULL, '', 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
||||||
INSERT INTO tblFolders VALUES (1, 'DMS', 0, '', 'DMS root', UNIX_TIMESTAMP(), 1, 0, 2, 0);
|
INSERT INTO tblFolders VALUES (1, 'DMS', 0, '', 'DMS root', UNIX_TIMESTAMP(), 1, 0, 2, 0);
|
||||||
INSERT INTO tblVersion VALUES (NOW(), 5, 1, 0);
|
INSERT INTO tblVersion VALUES (NOW(), 6, 0, 0);
|
||||||
|
|
|
@ -43,6 +43,19 @@ CREATE TABLE "tblAttributeDefinitions" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblRoles`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblRoles" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(50) default NULL,
|
||||||
|
"role" INTEGER NOT NULL default '0',
|
||||||
|
"noaccess" varchar(30) NOT NULL default ''
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblUsers"
|
-- Table structure for table "tblUsers"
|
||||||
--
|
--
|
||||||
|
@ -51,6 +64,7 @@ CREATE TABLE "tblUsers" (
|
||||||
"id" SERIAL UNIQUE,
|
"id" SERIAL UNIQUE,
|
||||||
"login" varchar(50) default NULL,
|
"login" varchar(50) default NULL,
|
||||||
"pwd" varchar(50) default NULL,
|
"pwd" varchar(50) default NULL,
|
||||||
|
"secret" varchar(50) default NULL,
|
||||||
"fullName" varchar(100) default NULL,
|
"fullName" varchar(100) default NULL,
|
||||||
"email" varchar(70) default NULL,
|
"email" varchar(70) default NULL,
|
||||||
"language" varchar(32) NOT NULL,
|
"language" varchar(32) NOT NULL,
|
||||||
|
@ -68,6 +82,18 @@ CREATE TABLE "tblUsers" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUserSubstitutes`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblUserSubstitutes" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"user" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
"substitute" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblUserPasswordRequest"
|
-- Table structure for table "tblUserPasswordRequest"
|
||||||
--
|
--
|
||||||
|
@ -225,6 +251,7 @@ CREATE TABLE "tblDocumentContent" (
|
||||||
"mimeType" varchar(100) NOT NULL default '',
|
"mimeType" varchar(100) NOT NULL default '',
|
||||||
"fileSize" BIGINT,
|
"fileSize" BIGINT,
|
||||||
"checksum" char(32),
|
"checksum" char(32),
|
||||||
|
"revisiondate" TIMESTAMP default NULL,
|
||||||
UNIQUE ("document","version")
|
UNIQUE ("document","version")
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
@ -290,6 +317,21 @@ CREATE TABLE "tblDocumentLocks" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentCheckOuts`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentCheckOuts" (
|
||||||
|
"document" INTEGER REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"userID" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id"),
|
||||||
|
"date" TEXT NOT NULL,
|
||||||
|
"filename" varchar(255) NOT NULL default '',
|
||||||
|
UNIQUE ("document")
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblDocumentReviewers"
|
-- Table structure for table "tblDocumentReviewers"
|
||||||
--
|
--
|
||||||
|
@ -320,6 +362,67 @@ CREATE TABLE "tblDocumentReviewLog" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRecipients`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRecipients" (
|
||||||
|
"receiptID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0' REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE ("documentID","version","type","required")
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table "tblDocumentReceiptLog"
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentReceiptLog" (
|
||||||
|
"receiptLogID" SERIAL UNIQUE,
|
||||||
|
"receiptID" INTEGER NOT NULL default 0 REFERENCES "tblDocumentRecipients" ("receiptID") ON DELETE CASCADE,
|
||||||
|
"status" INTEGER NOT NULL default 0,
|
||||||
|
"comment" TEXT NOT NULL,
|
||||||
|
"date" TEXT NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default 0 REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisors`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisors" (
|
||||||
|
"revisionID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0' REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
"startdate" TIMESTAMP default NULL,
|
||||||
|
UNIQUE ("documentID","version","type","required")
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table "tblDocumentRevisionLog"
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisionLog" (
|
||||||
|
"revisionLogID" SERIAL UNIQUE,
|
||||||
|
"revisionID" INTEGER NOT NULL default 0 REFERENCES "tblDocumentRevisors" ("revisionID") ON DELETE CASCADE,
|
||||||
|
"status" INTEGER NOT NULL default 0,
|
||||||
|
"comment" TEXT NOT NULL,
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"userID" INTEGER NOT NULL default 0 REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblDocumentStatus"
|
-- Table structure for table "tblDocumentStatus"
|
||||||
--
|
--
|
||||||
|
@ -433,7 +536,7 @@ CREATE TABLE "tblSessions" (
|
||||||
"theme" varchar(30) NOT NULL default '',
|
"theme" varchar(30) NOT NULL default '',
|
||||||
"language" varchar(30) NOT NULL default '',
|
"language" varchar(30) NOT NULL default '',
|
||||||
"clipboard" text default NULL,
|
"clipboard" text default NULL,
|
||||||
"su" INTEGER DEFAULT NULL,
|
"su" INTEGER DEFAULT NULL,
|
||||||
"splashmsg" text default NULL
|
"splashmsg" text default NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
@ -514,7 +617,8 @@ CREATE TABLE "tblWorkflowActions" (
|
||||||
CREATE TABLE "tblWorkflows" (
|
CREATE TABLE "tblWorkflows" (
|
||||||
"id" SERIAL UNIQUE,
|
"id" SERIAL UNIQUE,
|
||||||
"name" text NOT NULL,
|
"name" text NOT NULL,
|
||||||
"initstate" INTEGER NOT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE
|
"initstate" INTEGER NOT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE,
|
||||||
|
"layoutdata" text default NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -559,29 +663,13 @@ CREATE TABLE "tblWorkflowTransitionGroups" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for workflow log
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE "tblWorkflowLog" (
|
|
||||||
"id" SERIAL UNIQUE,
|
|
||||||
"document" INTEGER default NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
|
||||||
"version" INTEGER default NULL,
|
|
||||||
"workflow" INTEGER default NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
|
|
||||||
"userid" INTEGER default NULL REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
|
||||||
"transition" INTEGER default NULL REFERENCES "tblWorkflowTransitions" ("id") ON DELETE CASCADE,
|
|
||||||
"date" TIMESTAMP default NULL,
|
|
||||||
"comment" text
|
|
||||||
) ;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for workflow document relation
|
-- Table structure for workflow document relation
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE "tblWorkflowDocumentContent" (
|
CREATE TABLE "tblWorkflowDocumentContent" (
|
||||||
"parentworkflow" INTEGER DEFAULT 0,
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER DEFAULT NULL REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE,
|
||||||
"workflow" INTEGER DEFAULT NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
|
"workflow" INTEGER DEFAULT NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
|
||||||
"document" INTEGER DEFAULT NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
"document" INTEGER DEFAULT NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
"version" INTEGER DEFAULT NULL,
|
"version" INTEGER DEFAULT NULL,
|
||||||
|
@ -591,6 +679,21 @@ CREATE TABLE "tblWorkflowDocumentContent" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for workflow log
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblWorkflowLog" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"workflowdocumentcontent" INTEGER DEFAULT NULL REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE,
|
||||||
|
"userid" INTEGER default NULL REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
"transition" INTEGER default NULL REFERENCES "tblWorkflowTransitions" ("id") ON DELETE CASCADE,
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"comment" text
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for mandatory workflows
|
-- Table structure for mandatory workflows
|
||||||
--
|
--
|
||||||
|
@ -603,6 +706,101 @@ CREATE TABLE "tblWorkflowMandatoryWorkflow" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittals" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" text NOT NULL,
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"public" INTEGER NOT NULL default '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal item
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittalItems" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"transmittal" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblTransmittals" ("id") ON DELETE CASCADE,
|
||||||
|
"document" INTEGER default NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
UNIQUE (transmittal, document, version)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access request objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblAros" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" TEXT NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access control objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" TEXT NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for acos/aros relation
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblArosAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"aro" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblAros" ("id") ON DELETE CASCADE,
|
||||||
|
"aco" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblAcos" ("id") ON DELETE CASCADE,
|
||||||
|
"create" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"read" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"update" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"delete" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE (aco, aro)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for tblSchedulerTask
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblSchedulerTask" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(100) DEFAULT NULL,
|
||||||
|
"description" TEXT DEFAULT NULL,
|
||||||
|
"disabled" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"extension" varchar(100) DEFAULT NULL,
|
||||||
|
"task" varchar(100) DEFAULT NULL,
|
||||||
|
"frequency" varchar(100) DEFAULT NULL,
|
||||||
|
"params" TEXT DEFAULT NULL,
|
||||||
|
"nextrun" TIMESTAMP DEFAULT NULL,
|
||||||
|
"lastrun" TIMESTAMP DEFAULT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for version
|
-- Table structure for version
|
||||||
--
|
--
|
||||||
|
@ -620,10 +818,16 @@ CREATE TABLE "tblVersion" (
|
||||||
-- Initial content for database
|
-- Initial content for database
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "tblUsers" VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (1, 'Admin', 1);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (2, 'Guest', 2);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (3, 'User', 0);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblUsers" VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
||||||
SELECT nextval('"tblUsers_id_seq"');
|
SELECT nextval('"tblUsers_id_seq"');
|
||||||
INSERT INTO "tblUsers" VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO "tblUsers" VALUES (2, 'guest', NULL, '', 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
||||||
SELECT nextval('"tblUsers_id_seq"');
|
SELECT nextval('"tblUsers_id_seq"');
|
||||||
INSERT INTO "tblFolders" VALUES (1, 'DMS', 0, '', 'DMS root', extract(epoch from now()), 1, 0, 2, 0);
|
INSERT INTO "tblFolders" VALUES (1, 'DMS', 0, '', 'DMS root', extract(epoch from now()), 1, 0, 2, 0);
|
||||||
SELECT nextval('"tblFolders_id_seq"');
|
SELECT nextval('"tblFolders_id_seq"');
|
||||||
INSERT INTO "tblVersion" VALUES (CURRENT_TIMESTAMP, 5, 1, 0);
|
INSERT INTO "tblVersion" VALUES (CURRENT_TIMESTAMP, 6, 0, 0);
|
||||||
|
|
|
@ -43,6 +43,20 @@ CREATE TABLE `tblAttributeDefinitions` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblRoles`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(50) default NULL,
|
||||||
|
`role` INTEGER NOT NULL default '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL default '',
|
||||||
|
UNIQUE (`name`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUsers`
|
-- Table structure for table `tblUsers`
|
||||||
--
|
--
|
||||||
|
@ -51,12 +65,13 @@ CREATE TABLE `tblUsers` (
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
`login` varchar(50) default NULL,
|
`login` varchar(50) default NULL,
|
||||||
`pwd` varchar(50) default NULL,
|
`pwd` varchar(50) default NULL,
|
||||||
|
`secret` varchar(50) default NULL,
|
||||||
`fullName` varchar(100) default NULL,
|
`fullName` varchar(100) default NULL,
|
||||||
`email` varchar(70) default NULL,
|
`email` varchar(70) default NULL,
|
||||||
`language` varchar(32) NOT NULL,
|
`language` varchar(32) NOT NULL,
|
||||||
`theme` varchar(32) NOT NULL,
|
`theme` varchar(32) NOT NULL,
|
||||||
`comment` text NOT NULL,
|
`comment` text NOT NULL,
|
||||||
`role` INTEGER NOT NULL default '0',
|
`role` INTEGER NOT NULL REFERENCES `tblRoles` (`id`),
|
||||||
`hidden` INTEGER NOT NULL default '0',
|
`hidden` INTEGER NOT NULL default '0',
|
||||||
`pwdExpiration` TEXT default NULL,
|
`pwdExpiration` TEXT default NULL,
|
||||||
`loginfailures` INTEGER NOT NULL default '0',
|
`loginfailures` INTEGER NOT NULL default '0',
|
||||||
|
@ -68,6 +83,19 @@ CREATE TABLE `tblUsers` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUserSubstitutes`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`user` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`substitute` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
UNIQUE (`user`, `substitute`)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUserPasswordRequest`
|
-- Table structure for table `tblUserPasswordRequest`
|
||||||
--
|
--
|
||||||
|
@ -135,7 +163,7 @@ CREATE TABLE `tblFolderAttributes` (
|
||||||
`folder` INTEGER default NULL REFERENCES `tblFolders` (`id`) ON DELETE CASCADE,
|
`folder` INTEGER default NULL REFERENCES `tblFolders` (`id`) ON DELETE CASCADE,
|
||||||
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
||||||
`value` text default NULL,
|
`value` text default NULL,
|
||||||
UNIQUE (folder, attrdef)
|
UNIQUE (`folder`, `attrdef`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -171,7 +199,7 @@ CREATE TABLE `tblDocumentAttributes` (
|
||||||
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
||||||
`value` text default NULL,
|
`value` text default NULL,
|
||||||
UNIQUE (document, attrdef)
|
UNIQUE (`document`, `attrdef`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -188,6 +216,7 @@ CREATE TABLE `tblDocumentApprovers` (
|
||||||
`required` INTEGER NOT NULL default '0',
|
`required` INTEGER NOT NULL default '0',
|
||||||
UNIQUE (`documentID`,`version`,`type`,`required`)
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -203,6 +232,7 @@ CREATE TABLE `tblDocumentApproveLog` (
|
||||||
`date` TEXT NOT NULL,
|
`date` TEXT NOT NULL,
|
||||||
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentApproveLogApproveID` ON `tblDocumentApproveLog` (`approveID`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -223,6 +253,7 @@ CREATE TABLE `tblDocumentContent` (
|
||||||
`mimeType` varchar(100) NOT NULL default '',
|
`mimeType` varchar(100) NOT NULL default '',
|
||||||
`fileSize` INTEGER,
|
`fileSize` INTEGER,
|
||||||
`checksum` char(32),
|
`checksum` char(32),
|
||||||
|
`revisiondate` TEXT default NULL,
|
||||||
UNIQUE (`document`,`version`)
|
UNIQUE (`document`,`version`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
@ -237,7 +268,7 @@ CREATE TABLE `tblDocumentContentAttributes` (
|
||||||
`content` INTEGER default NULL REFERENCES `tblDocumentContent` (`id`) ON DELETE CASCADE,
|
`content` INTEGER default NULL REFERENCES `tblDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
||||||
`value` text default NULL,
|
`value` text default NULL,
|
||||||
UNIQUE (content, attrdef)
|
UNIQUE (`content`, `attrdef`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -288,6 +319,21 @@ CREATE TABLE `tblDocumentLocks` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentCheckOuts`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` INTEGER REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`),
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL default '',
|
||||||
|
UNIQUE (`document`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblDocumentReviewers`
|
-- Table structure for table `tblDocumentReviewers`
|
||||||
--
|
--
|
||||||
|
@ -300,6 +346,7 @@ CREATE TABLE `tblDocumentReviewers` (
|
||||||
`required` INTEGER NOT NULL default '0',
|
`required` INTEGER NOT NULL default '0',
|
||||||
UNIQUE (`documentID`,`version`,`type`,`required`)
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -315,6 +362,72 @@ CREATE TABLE `tblDocumentReviewLog` (
|
||||||
`date` TEXT NOT NULL,
|
`date` TEXT NOT NULL,
|
||||||
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReviewLogReviewID` ON `tblDocumentReviewLog` (`reviewID`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRecipients`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentReceiptLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`receiptID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReceiptLogReceiptID` ON `tblDocumentReceiptLog` (`receiptID`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisors`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
`startdate` TEXT default NULL,
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisionLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`revisionID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisionLogRevisionID` ON `tblDocumentRevisionLog` (`revisionID`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -343,6 +456,7 @@ CREATE TABLE `tblDocumentStatusLog` (
|
||||||
`date` TEXT NOT NULL,
|
`date` TEXT NOT NULL,
|
||||||
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentStatusLogStatusID` ON `tblDocumentStatusLog` (`StatusID`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -512,7 +626,8 @@ CREATE TABLE `tblWorkflowActions` (
|
||||||
CREATE TABLE `tblWorkflows` (
|
CREATE TABLE `tblWorkflows` (
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
`name` text NOT NULL,
|
`name` text NOT NULL,
|
||||||
`initstate` INTEGER NOT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
|
`initstate` INTEGER NOT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
||||||
|
`layoutdata` text default NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -557,29 +672,13 @@ CREATE TABLE `tblWorkflowTransitionGroups` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `tblWorkflowLog`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowLog` (
|
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
|
||||||
`version` INTEGER default NULL,
|
|
||||||
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
|
||||||
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
|
||||||
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
|
||||||
`date` datetime NOT NULL,
|
|
||||||
`comment` text
|
|
||||||
) ;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowDocumentContent`
|
-- Table structure for table `tblWorkflowDocumentContent`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowDocumentContent` (
|
CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
`parentworkflow` INTEGER DEFAULT 0,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
||||||
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
`version` INTEGER DEFAULT NULL,
|
`version` INTEGER DEFAULT NULL,
|
||||||
|
@ -589,6 +688,21 @@ CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblWorkflowLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblWorkflowLog` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`workflowdocumentcontent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`comment` text
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
||||||
--
|
--
|
||||||
|
@ -596,7 +710,102 @@ CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
CREATE TABLE `tblWorkflowMandatoryWorkflow` (
|
CREATE TABLE `tblWorkflowMandatoryWorkflow` (
|
||||||
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
||||||
UNIQUE(userid, workflow)
|
UNIQUE(`userid`, `workflow`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
`public` INTEGER NOT NULL default '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal item
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`transmittal` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE,
|
||||||
|
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
UNIQUE (`transmittal`, `document`, `version`)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access request objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access control objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for acos/aros relation
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`aro` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAros` (`id`) ON DELETE CASCADE,
|
||||||
|
`aco` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
`create` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`read` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`update` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`delete` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE (`aco`, `aro`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblSchedulerTask`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` TEXT DEFAULT NULL,
|
||||||
|
`disabled` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` TEXT DEFAULT NULL,
|
||||||
|
`nextrun` TEXT DEFAULT NULL,
|
||||||
|
`lastrun` TEXT DEFAULT NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -618,7 +827,10 @@ CREATE TABLE `tblVersion` (
|
||||||
-- Initial content for database
|
-- Initial content for database
|
||||||
--
|
--
|
||||||
|
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, '', 0, 0, 0, NULL);
|
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, '', 0, 0, 0, NULL);
|
||||||
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, '', 0, 0, 0, NULL);
|
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, '', 0, 0, 0, NULL);
|
||||||
INSERT INTO `tblFolders` (`id`, `name`, `parent`, `folderList`, `comment`, `date`, `owner`, `inheritAccess`, `defaultAccess`, `sequence`) VALUES (1, 'DMS', NULL, '', 'DMS root', strftime('%s','now'), 1, 0, 2, 0);
|
INSERT INTO `tblFolders` (`id`, `name`, `parent`, `folderList`, `comment`, `date`, `owner`, `inheritAccess`, `defaultAccess`, `sequence`) VALUES (1, 'DMS', NULL, '', 'DMS root', strftime('%s','now'), 1, 0, 2, 0);
|
||||||
INSERT INTO `tblVersion` VALUES (DATETIME(), 5, 1, 0);
|
INSERT INTO `tblVersion` VALUES (DATETIME(), 6, 0, 0);
|
||||||
|
|
181
install/update-6.0.0/update-postgres.sql
Normal file
181
install/update-6.0.0/update-postgres.sql
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE "tblDocumentContent" ADD COLUMN "revisiondate" TIMESTAMP default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblUsers" ADD COLUMN "secret" varchar(50) default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflows" ADD COLUMN "layoutdata" text default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" ADD COLUMN "id" SERIAL UNIQUE;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" ADD COLUMN "workflowdocumentcontent" INTEGER NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
UPDATE "tblWorkflowLog" SET "workflowdocumentcontent" = "tblWorkflowDocumentContent"."id" FROM "tblWorkflowDocumentContent" WHERE "tblWorkflowLog"."document" = "tblWorkflowDocumentContent"."document" AND "tblWorkflowLog"."version" = "tblWorkflowDocumentContent"."version" AND "tblWorkflowLog"."workflow" = "tblWorkflowDocumentContent"."workflow";
|
||||||
|
|
||||||
|
INSERT INTO "tblWorkflowDocumentContent" ("parentworkflow", "workflow", "document", "version", "state", "date") SELECT 0 AS "parentworkflow", "workflow", "document", "version", NULL AS "state", max("date") AS "date" FROM "tblWorkflowLog" WHERE "workflowdocumentcontent" = 0 GROUP BY "workflow", "document", "version";
|
||||||
|
|
||||||
|
UPDATE "tblWorkflowLog" SET "workflowdocumentcontent" = "tblWorkflowDocumentContent"."id" FROM "tblWorkflowDocumentContent" WHERE "tblWorkflowLog"."document" = "tblWorkflowDocumentContent"."document" AND "tblWorkflowLog"."version" = "tblWorkflowDocumentContent"."version" AND "tblWorkflowLog"."workflow" = "tblWorkflowDocumentContent"."workflow";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" ADD CONSTRAINT "tblWorkflowLog_workflowdocumentcontent" FOREIGN KEY ("workflowdocumentcontent") REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" ADD COLUMN "parent" INTEGER DEFAULT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" ADD CONSTRAINT "tblWorkflowDocumentContent_parent" FOREIGN KEY ("parent") REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" DROP COLUMN "parentworkflow";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" DROP COLUMN "document";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" DROP COLUMN "version";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" DROP COLUMN "workflow";
|
||||||
|
|
||||||
|
CREATE TABLE "tblUserSubstitutes" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"user" INTEGER default null,
|
||||||
|
"substitute" INTEGER default null,
|
||||||
|
UNIQUE ("user", "substitute"),
|
||||||
|
CONSTRAINT "tblUserSubstitutes_user" FOREIGN KEY ("user") REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblUserSubstitutes_substitute" FOREIGN KEY ("user") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentCheckOuts" (
|
||||||
|
"document" INTEGER NOT NULL default '0',
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP NOT NULL,
|
||||||
|
"filename" varchar(255) NOT NULL default '',
|
||||||
|
CONSTRAINT "tblDocumentCheckOuts_document" FOREIGN KEY ("document") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblDocumentCheckOuts_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRecipients" (
|
||||||
|
"receiptID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0',
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE ("documentID","version","type","required"),
|
||||||
|
CONSTRAINT "tblDocumentRecipients_document" FOREIGN KEY ("documentID") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentReceiptLog" (
|
||||||
|
"receiptLogID" SERIAL UNIQUE,
|
||||||
|
"receiptID" INTEGER NOT NULL default '0',
|
||||||
|
"status" INTEGER NOT NULL default '0',
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"date" TIMESTAMP NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
CONSTRAINT "tblDocumentReceiptLog_recipient" FOREIGN KEY ("receiptID") REFERENCES "tblDocumentRecipients" ("receiptID") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblDocumentReceiptLog_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisors" (
|
||||||
|
"revisionID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0',
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
"startdate" TIMESTAMP default NULL,
|
||||||
|
UNIQUE ("documentID","version","type","required"),
|
||||||
|
CONSTRAINT "tblDocumentRevisors_document" FOREIGN KEY ("documentID") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisionLog" (
|
||||||
|
"revisionLogID" SERIAL UNIQUE,
|
||||||
|
"revisionID" INTEGER NOT NULL default '0',
|
||||||
|
"status" INTEGER NOT NULL default '0',
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"date" TIMESTAMP NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
CONSTRAINT "tblDocumentRevisionLog_revision" FOREIGN KEY ("revisionID") REFERENCES "tblDocumentRevisors" ("revisionID") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblDocumentRevisionLog_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittals" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" text NOT NULL,
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"public" INTEGER NOT NULL default '0',
|
||||||
|
CONSTRAINT "tblTransmittals_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittalItems" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"transmittal" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"document" INTEGER default NULL,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
UNIQUE ("transmittal", "document", "version"),
|
||||||
|
CONSTRAINT "tblTransmittalItems_document" FOREIGN KEY ("document") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblTransmittalItem_transmittal" FOREIGN KEY ("transmittal") REFERENCES "tblTransmittals" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblRoles" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(50) default NULL,
|
||||||
|
"role" INTEGER NOT NULL default '0',
|
||||||
|
"noaccess" varchar(30) NOT NULL default '',
|
||||||
|
UNIQUE ("name")
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (1, 'Admin', 1);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (2, 'Guest', 2);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (3, 'User', 0);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
|
||||||
|
ALTER TABLE "tblUsers" ALTER "role" DROP DEFAULT;
|
||||||
|
ALTER TABLE "tblUsers" ALTER "role" SET NOT NULL;
|
||||||
|
UPDATE "tblUsers" SET role=3 WHERE role=0;
|
||||||
|
ALTER TABLE "tblUsers" ADD CONSTRAINT "tblUsers_role" FOREIGN KEY ("role") REFERENCES "tblRoles" ("id");
|
||||||
|
|
||||||
|
CREATE TABLE "tblAros" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" text NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" varchar(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" text NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" varchar(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblArosAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"aro" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"aco" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"create" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"read" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"update" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"delete" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE ("aco", "aro"),
|
||||||
|
CONSTRAINT "tblArosAcos_acos" FOREIGN KEY ("aco") REFERENCES "tblAcos" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblArosAcos_aros" FOREIGN KEY ("aro") REFERENCES "tblAros" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblSchedulerTask" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(100) DEFAULT NULL,
|
||||||
|
"description" TEXT DEFAULT NULL,
|
||||||
|
"disabled" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"extension" varchar(100) DEFAULT NULL,
|
||||||
|
"task" varchar(100) DEFAULT NULL,
|
||||||
|
"frequency" varchar(100) DEFAULT NULL,
|
||||||
|
"params" TEXT DEFAULT NULL,
|
||||||
|
"nextrun" TIMESTAMP DEFAULT NULL,
|
||||||
|
"lastrun" TIMESTAMP DEFAULT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
UPDATE "tblVersion" set "major"=6, "minor"=0, "subminor"=0;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
206
install/update-6.0.0/update-sqlite3.sql
Normal file
206
install/update-6.0.0/update-sqlite3.sql
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE `tblDocumentContent` ADD COLUMN `revisiondate` TEXT default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `tblUsers` ADD COLUMN `secret` varchar(50) default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflows` ADD COLUMN `layoutdata` text default NULL;
|
||||||
|
|
||||||
|
CREATE TABLE `new_tblWorkflowDocumentContent` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
||||||
|
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER DEFAULT NULL,
|
||||||
|
`state` INTEGER DEFAULT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` datetime NOT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
INSERT INTO `new_tblWorkflowDocumentContent` (`parent`, `workflow`, `document`, `version`, `state`, `date`) SELECT NULL as `parent`, `workflow`, `document`, `version`, `state`, `date` FROM `tblWorkflowDocumentContent`;
|
||||||
|
|
||||||
|
INSERT INTO `new_tblWorkflowDocumentContent` (`parent`, `workflow`, `document`, `version`, `state`, `date`) SELECT NULL, `a`.`workflow`, `a`.`document`, `a`.`version`, NULL AS `state`, max(`a`.`date`) FROM `tblWorkflowLog` `a` LEFT JOIN `tblWorkflowDocumentContent` `b` ON `a`.`document`=`b`.`document` AND `a`.`version`=`b`.`version` AND `a`.`workflow`=`b`.`workflow` WHERE `b`.`document` IS NULL GROUP BY `a`.`document`, `a`.`version`, `a`.`workflow`;
|
||||||
|
|
||||||
|
CREATE TABLE `new_tblWorkflowLog` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`workflowdocumentcontent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`comment` text
|
||||||
|
) ;
|
||||||
|
|
||||||
|
INSERT INTO `new_tblWorkflowLog` (`id`, `workflowdocumentcontent`, `userid`, `transition`, `date`, `comment`) SELECT `a`.`id`, `b`.`id`, `a`.`userid`, `a`.`transition`, `a`.`date`, `a`.`comment` FROM `tblWorkflowLog` `a` LEFT JOIN `new_tblWorkflowDocumentContent` `b` ON `a`.`document`=`b`.`document` AND `a`.`version`=`b`.`version` AND `a`.`workflow`=`b`.`workflow` WHERE `b`.`document` IS NOT NULL;
|
||||||
|
|
||||||
|
DROP TABLE `tblWorkflowLog`;
|
||||||
|
|
||||||
|
ALTER TABLE `new_tblWorkflowLog` RENAME TO `tblWorkflowLog`;
|
||||||
|
|
||||||
|
DROP TABLE `tblWorkflowDocumentContent`;
|
||||||
|
|
||||||
|
ALTER TABLE `new_tblWorkflowDocumentContent` RENAME TO `tblWorkflowDocumentContent`;
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`user` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`substitute` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
UNIQUE (`user`, `substitute`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` INTEGER REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`),
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL default '',
|
||||||
|
UNIQUE (`document`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`receiptID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReceiptLogReceiptID` ON `tblDocumentReceiptLog` (`receiptID`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
`startdate` TEXT default NULL,
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`revisionID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisionLogRevisionID` ON `tblDocumentRevisionLog` (`revisionID`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
`public` INTEGER NOT NULL default '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`transmittal` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE,
|
||||||
|
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
UNIQUE (transmittal, document, version)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(50) default NULL,
|
||||||
|
`role` INTEGER NOT NULL default '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL default '',
|
||||||
|
UNIQUE (`name`)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
|
|
||||||
|
UPDATE `tblUsers` SET role=3 WHERE role=0;
|
||||||
|
|
||||||
|
CREATE TABLE `new_tblUsers` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`login` varchar(50) default NULL,
|
||||||
|
`pwd` varchar(50) default NULL,
|
||||||
|
`fullName` varchar(100) default NULL,
|
||||||
|
`email` varchar(70) default NULL,
|
||||||
|
`language` varchar(32) NOT NULL,
|
||||||
|
`theme` varchar(32) NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`role` INTEGER NOT NULL REFERENCES `tblRoles` (`id`),
|
||||||
|
`hidden` INTEGER NOT NULL default '0',
|
||||||
|
`pwdExpiration` TEXT default NULL,
|
||||||
|
`loginfailures` INTEGER NOT NULL default '0',
|
||||||
|
`disabled` INTEGER NOT NULL default '0',
|
||||||
|
`quota` INTEGER,
|
||||||
|
`homefolder` INTEGER default NULL REFERENCES `tblFolders` (`id`),
|
||||||
|
`secret` varchar(50) default NULL,
|
||||||
|
UNIQUE (`login`)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO new_tblUsers SELECT * FROM tblUsers;
|
||||||
|
|
||||||
|
DROP TABLE tblUsers;
|
||||||
|
|
||||||
|
ALTER TABLE new_tblUsers RENAME TO tblUsers;
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`aro` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAros` (`id`) ON DELETE CASCADE,
|
||||||
|
`aco` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
`create` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`read` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`update` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`delete` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE (aco, aro)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE INDEX `indDocumentStatusLogStatusID` ON `tblDocumentStatusLog` (`StatusID`);
|
||||||
|
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
|
||||||
|
CREATE INDEX `indDocumentApproveLogApproveID` ON `tblDocumentApproveLog` (`approveID`);
|
||||||
|
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
|
||||||
|
CREATE INDEX `indDocumentReviewLogReviewID` ON `tblDocumentReviewLog` (`reviewID`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` TEXT DEFAULT NULL,
|
||||||
|
`disabled` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` TEXT DEFAULT NULL,
|
||||||
|
`nextrun` TEXT DEFAULT NULL,
|
||||||
|
`lastrun` TEXT DEFAULT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
UPDATE tblVersion set major=6, minor=0, subminor=0;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
200
install/update-6.0.0/update.sql
Normal file
200
install/update-6.0.0/update.sql
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE `tblDocumentContent` ADD COLUMN `revisiondate` datetime DEFAULT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `tblUsers` ADD COLUMN `secret` varchar(50) DEFAULT NULL AFTER `pwd`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflows` ADD COLUMN `layoutdata` text DEFAULT NULL AFTER `initstate`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` ADD COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` ADD COLUMN `workflowdocumentcontent` int(11) NOT NULL DEFAULT '0' AFTER `id`;
|
||||||
|
|
||||||
|
UPDATE `tblWorkflowLog` a, `tblWorkflowDocumentContent` b SET a.`workflowdocumentcontent` = b.`id` WHERE a.`document` = b.`document` AND a.`version` = b.`version` AND a.`workflow` = b.`workflow`;
|
||||||
|
|
||||||
|
INSERT INTO `tblWorkflowDocumentContent` (`parentworkflow`, `workflow`, `document`, `version`, `state`, `date`) SELECT 0 AS `parentworkflow`, `workflow`, `document`, `version`, NULL AS `state`, max(`date`) AS `date` FROM `tblWorkflowLog` WHERE `workflowdocumentcontent` = 0 GROUP BY `workflow`, `document`, `version`;
|
||||||
|
|
||||||
|
UPDATE `tblWorkflowLog` a, `tblWorkflowDocumentContent` b SET a.`workflowdocumentcontent` = b.`id` WHERE a.`document` = b.`document` AND a.`version` = b.`version` AND a.`workflow` = b.`workflow`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` ADD CONSTRAINT `tblWorkflowLog_workflowdocumentcontent` FOREIGN KEY (`workflowdocumentcontent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` ADD COLUMN `parent` int(11) DEFAULT NULL AFTER `id`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` ADD CONSTRAINT `tblWorkflowDocumentContent_parent` FOREIGN KEY (`parent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` DROP COLUMN `parentworkflow`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP FOREIGN KEY `tblWorkflowLog_document`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP COLUMN `document`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP COLUMN `version`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP FOREIGN KEY `tblWorkflowLog_workflow`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP COLUMN `workflow`;
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`user` int(11) DEFAULT null,
|
||||||
|
`substitute` int(11) DEFAULT null,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (`user`, `substitute`),
|
||||||
|
CONSTRAINT `tblUserSubstitutes_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblUserSubstitutes_substitute` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`document`),
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRecipients_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`receiptID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptLogID`),
|
||||||
|
KEY `tblDocumentReceiptLog_receipt` (`receiptID`),
|
||||||
|
KEY `tblDocumentReceiptLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_recipient` FOREIGN KEY (`receiptID`) REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`startdate` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`revisionID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRevisors_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`revisionID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`revisionLogID`),
|
||||||
|
KEY `tblDocumentRevisionLog_revision` (`revisionID`),
|
||||||
|
KEY `tblDocumentRevisionLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_revision` FOREIGN KEY (`revisionID`) REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
`public` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `tblTransmittals_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`transmittal` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`document` int(11) DEFAULT NULL,
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (transmittal, document, version),
|
||||||
|
CONSTRAINT `tblTransmittalItems_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblTransmittalItem_transmittal` FOREIGN KEY (`transmittal`) REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(50) DEFAULT NULL,
|
||||||
|
`role` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (`name`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
|
ALTER TABLE `tblRoles` AUTO_INCREMENT=4;
|
||||||
|
|
||||||
|
ALTER TABLE tblUsers CHANGE role role int(11) NOT NULL;
|
||||||
|
UPDATE `tblUsers` SET role=3 WHERE role=0;
|
||||||
|
ALTER TABLE tblUsers ADD CONSTRAINT `tblUsers_role` FOREIGN KEY (`role`) REFERENCES `tblRoles` (`id`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`aro` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`aco` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`create` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`read` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`update` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`delete` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (aco, aro),
|
||||||
|
CONSTRAINT `tblArosAcos_acos` FOREIGN KEY (`aco`) REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblArosAcos_aros` FOREIGN KEY (`aro`) REFERENCES `tblAros` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` text DEFAULT NULL,
|
||||||
|
`disabled` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` text DEFAULT NULL,
|
||||||
|
`nextrun` datetime DEFAULT NULL,
|
||||||
|
`lastrun` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
UPDATE tblVersion set major=6, minor=0, subminor=0;
|
||||||
|
|
||||||
|
COMMIT;
|
52
install/update-6.0.0/update.txt
Normal file
52
install/update-6.0.0/update.txt
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
Caution when you update seeddms with workflow mode `advanced`
|
||||||
|
=============================================================
|
||||||
|
|
||||||
|
The previous database layout for tracking the workflow state of a
|
||||||
|
document content was not very well done. It did not allow to run
|
||||||
|
the document through another workflow at a later time, expecially
|
||||||
|
the same workflow, e.g. for a scheduled revision of a document.
|
||||||
|
|
||||||
|
Technical details
|
||||||
|
==================
|
||||||
|
This update modifies the tables tblWorkflowDocumentContent and
|
||||||
|
tblWorkflowLog. It adds a new autoincrement field as a primary key
|
||||||
|
(id) to tblWorkflowDocumentContent and references that field in
|
||||||
|
tblWorkflowLog (workflowdocumentcontent). Till now the two tables
|
||||||
|
where linked by the fields `document`, `version`, and `workflow` which will
|
||||||
|
be replaced by the two new fields. The fields `document`, `version`, and
|
||||||
|
`workflow` will be removed from tblWorkflowLog. tblWorkflowDocumentContent
|
||||||
|
contained just the workflows currently active for a particlar document.
|
||||||
|
From now on the table will also contain finished workflows, which
|
||||||
|
will have the field `state` set to null. This allows to run even the
|
||||||
|
same workflow again and still be able to distinguish the log entries.
|
||||||
|
|
||||||
|
MySQL
|
||||||
|
------
|
||||||
|
|
||||||
|
The update process will first add the new auto incrementing, primary
|
||||||
|
field to tblWorkflowDocumentContent and a referencing field to
|
||||||
|
tblWorkflowLog. It will then fill out the referencing field with the
|
||||||
|
automatically incremented field value from tblWorkflowDocumentContent
|
||||||
|
by joining the two tables with its common fields document, version,
|
||||||
|
and workflow. This will not fill out all referencing field values,
|
||||||
|
because once a workflow has ended the record in
|
||||||
|
tblWorkflowDocumentContent will be deleted and just the records in
|
||||||
|
tblWorkflowLog are kept. The still missing records in
|
||||||
|
tblWorkflowDocumentContent for already completed workflows will be
|
||||||
|
reconstructed from the records in tblWorkflowLog which do not have a
|
||||||
|
reference to tblWorkflowDocumentContent yet. Once that is done the
|
||||||
|
referencing field in tblWorkflowLog can be filled in a second pass.
|
||||||
|
The date of the new records in tblWorkflowDocumentContent will be
|
||||||
|
taken from the last record for that workflow in tblWorkflowLog. The
|
||||||
|
state of the new records will be set null, indicating that this
|
||||||
|
workflow is no longer active.
|
||||||
|
|
||||||
|
SQLite
|
||||||
|
-------
|
||||||
|
|
||||||
|
The update process will first create new table for tblWorkflowDocumentContent
|
||||||
|
containing a new field for the primary key field. It then copies the
|
||||||
|
records from the old table to the new table. The missing records for
|
||||||
|
workflows which has been finished already are recreated from the old
|
||||||
|
table `tblWorkflowLog`. Which is then replaced by a new table having
|
||||||
|
the foreign key to table `tblWorkflowDocumentContent`.
|
118
op/op.Acl.php
Normal file
118
op/op.Acl.php
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2012 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
require_once("../inc/inc.Settings.php");
|
||||||
|
require_once("../inc/inc.Utils.php");
|
||||||
|
require_once("../inc/inc.LogInit.php");
|
||||||
|
require_once("../inc/inc.Language.php");
|
||||||
|
require_once("../inc/inc.Init.php");
|
||||||
|
require_once("../inc/inc.Extension.php");
|
||||||
|
require_once("../inc/inc.DBInit.php");
|
||||||
|
require_once("../inc/inc.ClassUI.php");
|
||||||
|
require_once("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if (!$user->isAdmin()) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["action"])) $action=$_GET["action"];
|
||||||
|
else $action=NULL;
|
||||||
|
|
||||||
|
if($action == 'add_aro') {
|
||||||
|
if (isset($_GET["roleid"])) {
|
||||||
|
if(!($role = SeedDMS_Core_Role::getInstance((int) $_GET["roleid"], $dms))) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (isset($_GET["aroid"])) {
|
||||||
|
if(!($aro = SeedDMS_Aro::getInstance((int) $_GET["aroid"], $dms))) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["acoid"])) {
|
||||||
|
if(!($aco = SeedDMS_Aco::getInstance((int) $_GET["acoid"], $dms))) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($action) {
|
||||||
|
case "toggle_permission":
|
||||||
|
$acl = new SeedDMS_Acl($dms);
|
||||||
|
if($acl->toggle($aro, $aco))
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_toogle_permission'));
|
||||||
|
else
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_toogle_permission'));
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
case "add_permission":
|
||||||
|
$acl = new SeedDMS_Acl($dms);
|
||||||
|
if($acl->add($aro, $aco))
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_add_permission'));
|
||||||
|
else
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_add_permission'));
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
case "remove_permission":
|
||||||
|
$acl = new SeedDMS_Acl($dms);
|
||||||
|
if($acl->remove($aro, $aco))
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_remove_permission'));
|
||||||
|
else
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_remove_permission'));
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
case "add_aro":
|
||||||
|
if(SeedDMS_Aro::getInstance($role, $dms)) {
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_add_aro'));
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_add_aro'));
|
||||||
|
}
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
|
@ -69,8 +69,9 @@ if($settings->_quota > 0) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($user->isAdmin()) {
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
$ownerid = !empty($_POST['ownerid']) ? (int) $_POST["ownerid"] : null;
|
if ($accessop->check_controller_access($controller, array('action'=>'setOwner'))) {
|
||||||
|
$ownerid = (int) $_POST["ownerid"];
|
||||||
if($ownerid) {
|
if($ownerid) {
|
||||||
if(!($owner = $dms->getUser($ownerid))) {
|
if(!($owner = $dms->getUser($ownerid))) {
|
||||||
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_occured"));
|
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_occured"));
|
||||||
|
@ -173,10 +174,13 @@ default:
|
||||||
// Get the list of reviewers and approvers for this document.
|
// Get the list of reviewers and approvers for this document.
|
||||||
$reviewers = array();
|
$reviewers = array();
|
||||||
$approvers = array();
|
$approvers = array();
|
||||||
|
$recipients = array();
|
||||||
$reviewers["i"] = array();
|
$reviewers["i"] = array();
|
||||||
$reviewers["g"] = array();
|
$reviewers["g"] = array();
|
||||||
$approvers["i"] = array();
|
$approvers["i"] = array();
|
||||||
$approvers["g"] = array();
|
$approvers["g"] = array();
|
||||||
|
$recipients["i"] = array();
|
||||||
|
$recipients["g"] = array();
|
||||||
$workflow = null;
|
$workflow = null;
|
||||||
|
|
||||||
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
||||||
|
@ -193,6 +197,16 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
|
||||||
$reviewers["g"][] = $grp;
|
$reviewers["g"][] = $grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndReviewers"])) {
|
||||||
|
foreach ($_POST["grpIndReviewers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$reviewers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the list of individual approvers from the form.
|
// Retrieve the list of individual approvers from the form.
|
||||||
|
@ -207,6 +221,17 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
|
||||||
$approvers["g"][] = $grp;
|
$approvers["g"][] = $grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual approvers
|
||||||
|
if (isset($_POST["grpIndApprovers"])) {
|
||||||
|
foreach ($_POST["grpIndApprovers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$approvers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// add mandatory reviewers/approvers
|
// add mandatory reviewers/approvers
|
||||||
if($settings->_workflowMode == 'traditional') {
|
if($settings->_workflowMode == 'traditional') {
|
||||||
$mreviewers = getMandatoryReviewers($folder, null, $user);
|
$mreviewers = getMandatoryReviewers($folder, null, $user);
|
||||||
|
@ -244,6 +269,35 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual recipients from the form.
|
||||||
|
$recipients["i"] = array();
|
||||||
|
if (isset($_POST["indRecipients"])) {
|
||||||
|
foreach ($_POST["indRecipients"] as $ind) {
|
||||||
|
$recipients["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups from the form.
|
||||||
|
$recipients["g"] = array();
|
||||||
|
if (isset($_POST["grpRecipients"])) {
|
||||||
|
foreach ($_POST["grpRecipients"] as $grp) {
|
||||||
|
$recipients["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups whose members become individual recipients
|
||||||
|
if (isset($_POST["grpIndRecipients"])) {
|
||||||
|
foreach ($_POST["grpIndRecipients"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
/* Do not add the uploader itself and reviewers */
|
||||||
|
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
|
||||||
|
if(!in_array($member->getID(), $recipients["i"]))
|
||||||
|
$recipients["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function reArrayFiles(&$file_post) {
|
function reArrayFiles(&$file_post) {
|
||||||
$file_ary = array();
|
$file_ary = array();
|
||||||
$file_count = count($file_post['name']);
|
$file_count = count($file_post['name']);
|
||||||
|
@ -306,6 +360,31 @@ if(isset($_POST[$prefix.'-fine-uploader-uuids']) && $_POST[$prefix.'-fine-upload
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($settings->_libraryFolder) {
|
||||||
|
if(isset($_POST["librarydoc"]) && $_POST["librarydoc"]) {
|
||||||
|
if($clonedoc = $dms->getDocument($_POST["librarydoc"])) {
|
||||||
|
if($content = $clonedoc->getLatestContent()) {
|
||||||
|
$docsource = 'library';
|
||||||
|
$fullfile = tempnam(sys_get_temp_dir(), '');
|
||||||
|
if(SeedDMS_Core_File::copyFile($dms->contentDir . $content->getPath(), $fullfile)) {
|
||||||
|
if($_POST["name"]!="") {
|
||||||
|
$oext = pathinfo($content->getOriginalFileName(), PATHINFO_EXTENSION);
|
||||||
|
$origfilename = getFilenameByDocname(trim($_POST['name'])).".".$oext;
|
||||||
|
} else
|
||||||
|
$origfilename = $content->getOriginalFileName();
|
||||||
|
$file_ary[] = array(
|
||||||
|
'tmp_name' => $fullfile,
|
||||||
|
'type' => $content->getMimeType(),
|
||||||
|
'name' => $origfilename,
|
||||||
|
'size' => $content->getFileSize(),
|
||||||
|
'error' => 0,
|
||||||
|
'source' => 'library',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if($controller->hasHook('getDocument')) {
|
if($controller->hasHook('getDocument')) {
|
||||||
$file_ary = array_merge($file_ary, $controller->callHook('getDocument', $_POST));
|
$file_ary = array_merge($file_ary, $controller->callHook('getDocument', $_POST));
|
||||||
}
|
}
|
||||||
|
@ -393,6 +472,7 @@ foreach($file_ary as $file) {
|
||||||
$controller->setParam('sequence', $sequence);
|
$controller->setParam('sequence', $sequence);
|
||||||
$controller->setParam('reviewers', $reviewers);
|
$controller->setParam('reviewers', $reviewers);
|
||||||
$controller->setParam('approvers', $approvers);
|
$controller->setParam('approvers', $approvers);
|
||||||
|
$controller->setParam('recipients', $recipients);
|
||||||
$controller->setParam('reqversion', $reqversion);
|
$controller->setParam('reqversion', $reqversion);
|
||||||
$controller->setParam('versioncomment', $version_comment);
|
$controller->setParam('versioncomment', $version_comment);
|
||||||
$controller->setParam('attributes', $attributes);
|
$controller->setParam('attributes', $attributes);
|
||||||
|
@ -400,6 +480,7 @@ foreach($file_ary as $file) {
|
||||||
$controller->setParam('workflow', $workflow);
|
$controller->setParam('workflow', $workflow);
|
||||||
$controller->setParam('notificationgroups', $notgroups);
|
$controller->setParam('notificationgroups', $notgroups);
|
||||||
$controller->setParam('notificationusers', $notusers);
|
$controller->setParam('notificationusers', $notusers);
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
||||||
|
|
||||||
|
|
|
@ -73,4 +73,5 @@ if (!$document->addDocumentLink($docid, $user->getID(), $public)){
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=links");
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=links");
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
85
op/op.AddToTransmittal.php
Normal file
85
op/op.AddToTransmittal.php
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('addtotransmittal')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_READ) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$version_num = $_POST["version"];
|
||||||
|
$version = $document->getContentByVersion($version_num);
|
||||||
|
|
||||||
|
if (!is_object($version)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["assignTo"]) || !is_numeric($_POST["assignTo"]) || intval($_POST["assignTo"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$transmittalid = $_POST["assignTo"];
|
||||||
|
$transmittal = $dms->getTransmittal($transmittalid);
|
||||||
|
|
||||||
|
if (!is_object($transmittal)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($transmittal->getUser()->getID() != $user->getID()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_transmittal"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($transmittal->addContent($version)) {
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_to_transmittal')));
|
||||||
|
} else {
|
||||||
|
$session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('splash_error_add_to_transmittal')));
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("?documentid=".$documentid."&version".$version_num);
|
||||||
|
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
||||||
|
|
||||||
|
?>
|
49
op/op.AddTransmittal.php
Normal file
49
op/op.AddTransmittal.php
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('addtransmittal')) {
|
||||||
|
UI::exitError(getMLText("my_documents"), getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$comment = $_POST["comment"];
|
||||||
|
|
||||||
|
$transmittal = $dms->addTransmittal($name, $comment, $user);
|
||||||
|
|
||||||
|
if (!is_object($transmittal)) {
|
||||||
|
UI::exitError(getMLText("my_documents"), getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("?name=".$name);
|
||||||
|
|
||||||
|
header("Location:../out/out.MyDocuments.php");
|
||||||
|
|
||||||
|
?>
|
|
@ -53,9 +53,12 @@ if (isset($_COOKIE["mydms_session"])) {
|
||||||
echo json_encode(array('error'=>1));
|
echo json_encode(array('error'=>1));
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
if($user->isAdmin()) {
|
|
||||||
if($resArr["su"]) {
|
if($resArr["su"] && $su = $dms->getUser($resArr["su"])) {
|
||||||
$user = $dms->getUser($resArr["su"]);
|
if($user->isAdmin() || $user->maySwitchToUser($su)) {
|
||||||
|
$user = $su;
|
||||||
|
} else {
|
||||||
|
$session->resetSu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$dms->setUser($user);
|
$dms->setUser($user);
|
||||||
|
@ -63,6 +66,8 @@ if (isset($_COOKIE["mydms_session"])) {
|
||||||
$dms->checkWithinRootDir = true;
|
$dms->checkWithinRootDir = true;
|
||||||
$dms->setRootFolderID($user->getHomeFolder());
|
$dms->setRootFolderID($user->getHomeFolder());
|
||||||
}
|
}
|
||||||
|
$role = $user->getRole();
|
||||||
|
$dms->noReadForStatus = $role->getNoAccess();
|
||||||
|
|
||||||
include $settings->_rootDir . "languages/" . $resArr["language"] . "/lang.inc";
|
include $settings->_rootDir . "languages/" . $resArr["language"] . "/lang.inc";
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,11 +110,13 @@ switch($command) {
|
||||||
}
|
}
|
||||||
break; /* }}} */
|
break; /* }}} */
|
||||||
|
|
||||||
|
/* Used for document chooser */
|
||||||
case 'searchdocument': /* {{{ */
|
case 'searchdocument': /* {{{ */
|
||||||
if($user) {
|
if($user) {
|
||||||
$query = $_GET['query'];
|
$query = $_GET['query'];
|
||||||
|
$status = isset($_GET['status']) ? (is_array($_GET['status']) ? $_GET['status'] : array($_GET['status'])) : array();
|
||||||
|
|
||||||
$hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x1, $expirationstartdate=array(), $expirationenddate=array());
|
$hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status, $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x1, $expirationstartdate=array(), $expirationenddate=array());
|
||||||
if($hits) {
|
if($hits) {
|
||||||
$result = array();
|
$result = array();
|
||||||
foreach($hits['docs'] as $hit) {
|
foreach($hits['docs'] as $hit) {
|
||||||
|
@ -896,6 +903,7 @@ switch($command) {
|
||||||
$controller->setParam('workflow', $workflow);
|
$controller->setParam('workflow', $workflow);
|
||||||
$controller->setParam('notificationgroups', array());
|
$controller->setParam('notificationgroups', array());
|
||||||
$controller->setParam('notificationusers', array());
|
$controller->setParam('notificationusers', array());
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
||||||
|
|
||||||
|
@ -927,6 +935,41 @@ switch($command) {
|
||||||
}
|
}
|
||||||
break; /* }}} */
|
break; /* }}} */
|
||||||
|
|
||||||
|
/* Deprecated, has moved to op/op.TransmittalMgr.php */
|
||||||
|
case '___removetransmittalitem': /* {{{ */
|
||||||
|
if($user) {
|
||||||
|
if(!checkFormKey('removetransmittalitem', 'GET')) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
|
||||||
|
} else {
|
||||||
|
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
|
||||||
|
if($item) {
|
||||||
|
$transmittal = $item->getTransmittal();
|
||||||
|
if($transmittal) {
|
||||||
|
if ($transmittal->getUser()->getID() == $user->getID()) {
|
||||||
|
if($item->remove()) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break; /* }}} */
|
||||||
|
|
||||||
case 'updatedocument': /* {{{ */
|
case 'updatedocument': /* {{{ */
|
||||||
if($user) {
|
if($user) {
|
||||||
if(checkFormKey('')) {
|
if(checkFormKey('')) {
|
||||||
|
@ -1083,6 +1126,41 @@ switch($command) {
|
||||||
}
|
}
|
||||||
break; /* }}} */
|
break; /* }}} */
|
||||||
|
|
||||||
|
/* Deprecated, has moved to op/op.TransmittalMgr.php */
|
||||||
|
case '___updatetransmittalitem': /* {{{ */
|
||||||
|
if($user) {
|
||||||
|
if(!checkFormKey('updatetransmittalitem', 'GET')) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
|
||||||
|
} else {
|
||||||
|
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
|
||||||
|
if($item) {
|
||||||
|
$transmittal = $item->getTransmittal();
|
||||||
|
if($transmittal) {
|
||||||
|
if ($transmittal->getUser()->getID() == $user->getID()) {
|
||||||
|
if($item->updateContent()) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break; /* }}} */
|
||||||
|
|
||||||
case 'addfolder': /* {{{ */
|
case 'addfolder': /* {{{ */
|
||||||
if($user) {
|
if($user) {
|
||||||
if(checkFormKey('')) {
|
if(checkFormKey('')) {
|
||||||
|
|
|
@ -32,6 +32,7 @@ include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('approvedocument')) {
|
if(!checkFormKey('approvedocument')) {
|
||||||
|
@ -72,11 +73,8 @@ if ($latestContent->getVersion()!=$version) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create object for checking access to certain operations */
|
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings);
|
|
||||||
|
|
||||||
// verify if document may be approved
|
// verify if document may be approved
|
||||||
if (!$accessop->mayApprove()){
|
if (!$accessop->mayApprove($document)){
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +94,7 @@ $controller->setParam('type', $_POST['approvalType']);
|
||||||
$controller->setParam('status', $_POST['approvalStatus']);
|
$controller->setParam('status', $_POST['approvalStatus']);
|
||||||
$controller->setParam('content', $latestContent);
|
$controller->setParam('content', $latestContent);
|
||||||
$controller->setParam('file', !empty($_FILES["approvalfile"]["tmp_name"]) ? $_FILES["approvalfile"]["tmp_name"] : '');
|
$controller->setParam('file', !empty($_FILES["approvalfile"]["tmp_name"]) ? $_FILES["approvalfile"]["tmp_name"] : '');
|
||||||
$controller->setParam('group', !empty($_POST['approvalGroup']) ? $dms->getGroup($_POST['approvalGroup']) : null);
|
$controller->setParam('group', !empty($_POST['approvalGroup']) ? $dms->getGroup($_POST['approvalGroup']) : null);
|
||||||
if(!$controller()) {
|
if(!$controller()) {
|
||||||
$err = $controller->getErrorMsg();
|
$err = $controller->getErrorMsg();
|
||||||
if(is_string($err))
|
if(is_string($err))
|
||||||
|
|
56
op/op.CancelCheckOut.php
Normal file
56
op/op.CancelCheckOut.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
// SeedDMS. Document Management System
|
||||||
|
// Copyright (C) 2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
/* Check if the form data comes from a trusted request */
|
||||||
|
if(!checkFormKey('cancelcheckout')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
$checkoutstatus = $document->checkOutStatus();
|
||||||
|
/* Check out of files which has been changed, can only be canceled if allowed in the configuration */
|
||||||
|
if($checkoutstatus == 0 && empty($settings->_enableCancelCheckout)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(empty($_POST['confirm'])) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$document->cancelCheckOut()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_cancel_checkout"));
|
||||||
|
}
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_cancel_checkout')));
|
||||||
|
add_log_line("?documentid=".$documentid);
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
311
op/op.CheckInDocument.php
Normal file
311
op/op.CheckInDocument.php
Normal file
|
@ -0,0 +1,311 @@
|
||||||
|
<?php
|
||||||
|
// SeedDMS. Document Management System
|
||||||
|
// Copyright (C) 2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if post_max_size is to small, then $_POST will not be set and the content
|
||||||
|
* lenght will exceed post_max_size
|
||||||
|
*/
|
||||||
|
if(empty($_POST) && $_SERVER['CONTENT_LENGTH'] > SeedDMS_Core_File::parse_filesize(ini_get('post_max_size'))) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => '')),getMLText("uploading_postmaxsize"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the form data comes from a trusted request */
|
||||||
|
if(!checkFormKey('checkindocument')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user, 'checkinDocument') < M_READWRITE) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($settings->_quota > 0) {
|
||||||
|
$remain = checkQuota($user);
|
||||||
|
if ($remain < 0) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("quota_exceeded", array('bytes'=>SeedDMS_Core_File::format_filesize(abs($remain)))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->isLocked()) {
|
||||||
|
$lockingUser = $document->getLockingUser();
|
||||||
|
if (($lockingUser->getID() != $user->getID()) && ($document->getAccessMode($user) != M_ALL)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("no_update_cause_locked"));
|
||||||
|
}
|
||||||
|
else $document->setLocked(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$accessop->mayCheckIn($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_POST["comment"]))
|
||||||
|
$comment = $_POST["comment"];
|
||||||
|
else
|
||||||
|
$comment = "";
|
||||||
|
|
||||||
|
$oldexpires = $document->getExpires();
|
||||||
|
switch($_POST["presetexpdate"]) {
|
||||||
|
case "date":
|
||||||
|
$expires = makeTsFromDate($_POST["expdate"]);
|
||||||
|
// $tmp = explode('-', $_POST["expdate"]);
|
||||||
|
// $expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]);
|
||||||
|
break;
|
||||||
|
case "1w":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1], $tmp[2]+7, $tmp[0]);
|
||||||
|
break;
|
||||||
|
case "1m":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1]+1, $tmp[2], $tmp[0]);
|
||||||
|
break;
|
||||||
|
case "1y":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]+1);
|
||||||
|
break;
|
||||||
|
case "2y":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]+2);
|
||||||
|
break;
|
||||||
|
case "never":
|
||||||
|
default:
|
||||||
|
$expires = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the list of reviewers and approvers for this document.
|
||||||
|
$reviewers = array();
|
||||||
|
$approvers = array();
|
||||||
|
$recipients = array();
|
||||||
|
$reviewers["i"] = array();
|
||||||
|
$reviewers["g"] = array();
|
||||||
|
$approvers["i"] = array();
|
||||||
|
$approvers["g"] = array();
|
||||||
|
$recipients["i"] = array();
|
||||||
|
$recipients["g"] = array();
|
||||||
|
$workflow = null;
|
||||||
|
|
||||||
|
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
||||||
|
if($settings->_workflowMode == 'traditional') {
|
||||||
|
// Retrieve the list of individual reviewers from the form.
|
||||||
|
$reviewers["i"] = array();
|
||||||
|
if (isset($_POST["indReviewers"])) {
|
||||||
|
foreach ($_POST["indReviewers"] as $ind) {
|
||||||
|
$reviewers["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of reviewer groups from the form.
|
||||||
|
$reviewers["g"] = array();
|
||||||
|
if (isset($_POST["grpReviewers"])) {
|
||||||
|
foreach ($_POST["grpReviewers"] as $grp) {
|
||||||
|
$reviewers["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndReviewers"])) {
|
||||||
|
foreach ($_POST["grpIndReviewers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$reviewers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual approvers from the form.
|
||||||
|
$approvers["i"] = array();
|
||||||
|
if (isset($_POST["indApprovers"])) {
|
||||||
|
foreach ($_POST["indApprovers"] as $ind) {
|
||||||
|
$approvers["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of approver groups from the form.
|
||||||
|
$approvers["g"] = array();
|
||||||
|
if (isset($_POST["grpApprovers"])) {
|
||||||
|
foreach ($_POST["grpApprovers"] as $grp) {
|
||||||
|
$approvers["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual approvers
|
||||||
|
if (isset($_POST["grpIndApprovers"])) {
|
||||||
|
foreach ($_POST["grpIndApprovers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$approvers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add mandatory reviewers/approvers
|
||||||
|
if($settings->_workflowMode == 'traditional') {
|
||||||
|
$mreviewers = getMandatoryReviewers($folder, $document, $user);
|
||||||
|
if($mreviewers['i'])
|
||||||
|
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
|
||||||
|
if($mreviewers['g'])
|
||||||
|
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
|
||||||
|
}
|
||||||
|
$mapprovers = getMandatoryApprovers($folder, $document, $user);
|
||||||
|
if($mapprovers['i'])
|
||||||
|
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
|
||||||
|
if($mapprovers['g'])
|
||||||
|
$approvers['g'] = array_merge($approvers['g'], $mapprovers['g']);
|
||||||
|
|
||||||
|
if($settings->_workflowMode == 'traditional' && !$settings->_allowReviewerOnly) {
|
||||||
|
/* Check if reviewers are send but no approvers */
|
||||||
|
if(($reviewers["i"] || $reviewers["g"]) && !$approvers["i"] && !$approvers["g"]) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_uploading_reviewer_only"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif($settings->_workflowMode == 'advanced') {
|
||||||
|
if(!$workflows = $user->getMandatoryWorkflows()) {
|
||||||
|
if(isset($_POST["workflow"]))
|
||||||
|
$workflow = $dms->getWorkflow($_POST["workflow"]);
|
||||||
|
else
|
||||||
|
$workflow = null;
|
||||||
|
} else {
|
||||||
|
/* If there is excactly 1 mandatory workflow, then set no matter what has
|
||||||
|
* been posted in 'workflow', otherwise check if the posted workflow is in the
|
||||||
|
* list of mandatory workflows. If not, then take the first one.
|
||||||
|
*/
|
||||||
|
$workflow = array_shift($workflows);
|
||||||
|
foreach($workflows as $mw)
|
||||||
|
if($mw->getID() == $_POST['workflow']) {$workflow = $mw; break;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual recipients from the form.
|
||||||
|
$recipients["i"] = array();
|
||||||
|
if (isset($_POST["indRecipients"])) {
|
||||||
|
foreach ($_POST["indRecipients"] as $ind) {
|
||||||
|
$recipients["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups from the form.
|
||||||
|
$recipients["g"] = array();
|
||||||
|
if (isset($_POST["grpRecipients"])) {
|
||||||
|
foreach ($_POST["grpRecipients"] as $grp) {
|
||||||
|
$recipients["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups whose members become individual recipients
|
||||||
|
if (isset($_POST["grpIndRecipients"])) {
|
||||||
|
foreach ($_POST["grpIndRecipients"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
/* Do not add the uploader itself as recipient */
|
||||||
|
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
|
||||||
|
if(!in_array($member->getID(), $recipients["i"]))
|
||||||
|
$recipients["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_POST["attributes_version"]) && $_POST["attributes_version"]) {
|
||||||
|
$attributes = $_POST["attributes_version"];
|
||||||
|
foreach($attributes as $attrdefid=>$attribute) {
|
||||||
|
$attrdef = $dms->getAttributeDefinition($attrdefid);
|
||||||
|
if($attribute) {
|
||||||
|
switch($attrdef->getType()) {
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_date:
|
||||||
|
$attribute = date('Y-m-d', makeTsFromDate($attribute));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!$attrdef->validate($attribute, null, true)) {
|
||||||
|
$errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
|
||||||
|
}
|
||||||
|
} elseif($attrdef->getMinValues() > 0) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$attributes = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->setParam('documentsource', 'checkin');
|
||||||
|
$controller->setParam('folder', $folder);
|
||||||
|
$controller->setParam('document', $document);
|
||||||
|
$controller->setParam('fulltextservice', $fulltextservice);
|
||||||
|
$controller->setParam('comment', $comment);
|
||||||
|
if($oldexpires != $expires)
|
||||||
|
$controller->setParam('expires', $expires);
|
||||||
|
$controller->setParam('reviewers', $reviewers);
|
||||||
|
$controller->setParam('approvers', $approvers);
|
||||||
|
$controller->setParam('recipients', $recipients);
|
||||||
|
$controller->setParam('attributes', $attributes);
|
||||||
|
$controller->setParam('workflow', $workflow);
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
|
|
||||||
|
if(!$content = $controller()) {
|
||||||
|
$err = $controller->getErrorMsg();
|
||||||
|
if(is_string($err))
|
||||||
|
$errmsg = getMLText($err);
|
||||||
|
elseif(is_array($err)) {
|
||||||
|
$errmsg = getMLText($err[0], $err[1]);
|
||||||
|
} else {
|
||||||
|
$errmsg = $err;
|
||||||
|
}
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
|
||||||
|
} else {
|
||||||
|
if($controller->hasHook('cleanUpDocument')) {
|
||||||
|
$controller->callHook('cleanUpDocument', $document, $file);
|
||||||
|
}
|
||||||
|
// Send notification to subscribers.
|
||||||
|
if($notifier) {
|
||||||
|
$notifier->sendNewDocumentVersionMail($document, $user);
|
||||||
|
|
||||||
|
$notifier->sendChangedExpiryMail($document, $user, $oldexpires);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("checkin document ".$documentid." with version ".$content->getVersion());
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
||||||
|
|
79
op/op.CheckOutDocument.php
Normal file
79
op/op.CheckOutDocument.php
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<?php
|
||||||
|
// SeedDMS. Document Management System
|
||||||
|
// Copyright (C) 2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_GET["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$settings->_checkOutDir) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("checkout_is_disabled"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_READWRITE) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->isLocked()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("document_already_locked"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->isCheckedOut()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("document_already_checkedout"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($session->getSu()) {
|
||||||
|
$origuser = $dms->getUser($session->getUser());
|
||||||
|
$checkoutpath = sprintf($settings->_checkOutDir.'/', preg_replace('/[^A-Za-z0-9_-]/', '', $origuser->getLogin()));
|
||||||
|
} else {
|
||||||
|
$checkoutpath = sprintf($settings->_checkOutDir.'/', preg_replace('/[^A-Za-z0-9_-]/', '', $user->getLogin()));
|
||||||
|
}
|
||||||
|
if(!file_exists($checkoutpath) && $settings->_createCheckOutDir) {
|
||||||
|
SeedDMS_Core_File::makeDir($checkoutpath);
|
||||||
|
}
|
||||||
|
if(!file_exists($checkoutpath)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("checkoutpath_does_not_exist"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$document->checkOut($user, $checkoutpath)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_document_checkedout')));
|
||||||
|
|
||||||
|
add_log_line();
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
60
op/op.Cron.php
Normal file
60
op/op.Cron.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2016 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
require_once("../inc/inc.Settings.php");
|
||||||
|
require_once("../inc/inc.Utils.php");
|
||||||
|
require_once("../inc/inc.LogInit.php");
|
||||||
|
require_once("../inc/inc.Language.php");
|
||||||
|
require_once("../inc/inc.Init.php");
|
||||||
|
require_once("../inc/inc.Extension.php");
|
||||||
|
require_once("../inc/inc.DBInit.php");
|
||||||
|
require_once("../inc/inc.ClassController.php");
|
||||||
|
require_once("../inc/inc.Scheduler.php");
|
||||||
|
require_once("../inc/inc.BasicAuthentication.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
|
||||||
|
if($user->getLogin() != 'cli_scheduler') {
|
||||||
|
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
|
||||||
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
|
echo "Wrong user";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$mode = 'list';
|
||||||
|
if(!empty($_GET['mode']) && in_array($_GET['mode'], array('list', 'run', 'dryrun', 'check')))
|
||||||
|
$mode = $_GET['mode'];
|
||||||
|
$task = '';
|
||||||
|
if(!empty($_GET['task']))
|
||||||
|
$task = $_GET['task'];
|
||||||
|
|
||||||
|
$controller->setParam('settings', $settings);
|
||||||
|
$controller->setParam('logger', $logger);
|
||||||
|
$controller->setParam('mode', $mode);
|
||||||
|
$controller->setParam('task', $task);
|
||||||
|
if(!$controller->run()) {
|
||||||
|
echo getMLText("error_occured");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line();
|
||||||
|
exit();
|
||||||
|
|
|
@ -32,6 +32,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => "")),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($_GET["version"])) { /* {{{ */
|
if (isset($_GET["version"])) { /* {{{ */
|
||||||
|
|
||||||
|
@ -98,19 +102,9 @@ elseif (isset($_GET["file"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_file_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_file_id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!file_exists($dms->contentDir . $file->getPath())) {
|
$controller->setParam('file', $file);
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("missing_file"));
|
$controller->setParam('type', 'file');
|
||||||
}
|
$controller->run();
|
||||||
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
header("Content-Length: " . filesize($dms->contentDir . $file->getPath() ));
|
|
||||||
$efilename = rawurlencode($file->getOriginalFileName());
|
|
||||||
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Content-Type: " . $file->getMimeType());
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($dms->contentDir . $file->getPath());
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["arkname"])) { /* {{{ */
|
elseif (isset($_GET["arkname"])) { /* {{{ */
|
||||||
$filename = basename($_GET["arkname"]);
|
$filename = basename($_GET["arkname"]);
|
||||||
|
@ -130,16 +124,9 @@ elseif (isset($_GET["arkname"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
header('Content-Description: File Transfer');
|
$controller->setParam('basedir', $backupdir);
|
||||||
header("Content-Type: application/zip");
|
$controller->setParam('file', $filename);
|
||||||
header("Content-Transfer-Encoding: binary");
|
$controller->archive();
|
||||||
header("Content-Length: " . filesize($backupdir . $filename ));
|
|
||||||
$efilename = rawurlencode($filename);
|
|
||||||
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($backupdir .$filename );
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["logname"])) { /* {{{ */
|
elseif (isset($_GET["logname"])) { /* {{{ */
|
||||||
$filename = basename($_GET["logname"], '.log').'.log';
|
$filename = basename($_GET["logname"], '.log').'.log';
|
||||||
|
@ -158,15 +145,10 @@ elseif (isset($_GET["logname"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Content-Type: text/plain");
|
$controller->setParam('file', $filename);
|
||||||
header("Content-Transfer-Encoding: binary");
|
$controller->setParam('basedir', $settings->_contentDir . 'log/');
|
||||||
header("Content-Length: " . filesize($settings->_contentDir.'log/' . $filename ));
|
$controller->log();
|
||||||
$efilename = rawurlencode($filename);
|
|
||||||
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($settings->_contentDir . 'log/' . $filename );
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["vfile"])) { /* {{{ */
|
elseif (isset($_GET["vfile"])) { /* {{{ */
|
||||||
|
|
||||||
|
@ -215,14 +197,9 @@ elseif (isset($_GET["dumpname"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Content-Type: application/zip");
|
$controller->setParam('basedir', $backupdir);
|
||||||
header("Content-Transfer-Encoding: binary");
|
$controller->setParam('file', $filename);
|
||||||
header("Content-Length: " . filesize($backupdir . $filename ));
|
$controller->sqldump();
|
||||||
$efilename = rawurlencode($filename);
|
|
||||||
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($backupdir .$filename );
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["reviewlogid"])) { /* {{{ */
|
elseif (isset($_GET["reviewlogid"])) { /* {{{ */
|
||||||
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
|
@ -243,22 +220,15 @@ elseif (isset($_GET["reviewlogid"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
$filename = $dms->contentDir . $document->getDir().'r'.(int) $_GET['reviewlogid'];
|
$controller->setParam('document', $document);
|
||||||
if (!file_exists($filename) ) {
|
$controller->setParam('reviewlogid', (int) $_GET['reviewlogid']);
|
||||||
|
$controller->setParam('type', 'review');
|
||||||
|
$controller->run();
|
||||||
|
switch($controller->getErrorNo()) {
|
||||||
|
case 1:
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
|
||||||
$mimetype = finfo_file($finfo, $filename);
|
|
||||||
|
|
||||||
header("Content-Type: ".$mimetype);
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
header("Content-Length: " . filesize($filename ));
|
|
||||||
header("Content-Disposition: attachment; filename=\"review-" . $document->getID()."-".(int) $_GET['reviewlogid'] . get_extension($mimetype) . "\"");
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($filename);
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["approvelogid"])) { /* {{{ */
|
elseif (isset($_GET["approvelogid"])) { /* {{{ */
|
||||||
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
|
@ -279,21 +249,15 @@ elseif (isset($_GET["approvelogid"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
$filename = $dms->contentDir . $document->getDir().'a'.(int) $_GET['approvelogid'];
|
$controller->setParam('document', $document);
|
||||||
if (!file_exists($filename) ) {
|
$controller->setParam('approvelogid', (int) $_GET['approvelogid']);
|
||||||
|
$controller->setParam('type', 'approval');
|
||||||
|
$controller->run();
|
||||||
|
switch($controller->getErrorNo()) {
|
||||||
|
case 1:
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
|
||||||
$mimetype = finfo_file($finfo, $filename);
|
|
||||||
|
|
||||||
header("Content-Type: ".$mimetype);
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
header("Content-Length: " . filesize($filename ));
|
|
||||||
header("Content-Disposition: attachment; filename=\"approval-" . $document->getID()."-".(int) $_GET['approvelogid'] . get_extension($mimetype) . "\"");
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($filename);
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
add_log_line();
|
add_log_line();
|
||||||
|
|
|
@ -34,6 +34,11 @@ if(!checkFormKey('editattributes')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('EditAttributes', $_POST)) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,11 @@ if(!checkFormKey('editcomment')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('EditComment', $_POST)) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('editdocument')) {
|
if(!checkFormKey('editdocument')) {
|
||||||
|
|
|
@ -32,6 +32,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('editdocumentfile')) {
|
if(!checkFormKey('editdocumentfile')) {
|
||||||
|
|
|
@ -31,6 +31,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('editfolder')) {
|
if(!checkFormKey('editfolder')) {
|
||||||
|
|
|
@ -28,28 +28,38 @@ include("../inc/inc.DBInit.php");
|
||||||
include("../inc/inc.ClassUI.php");
|
include("../inc/inc.ClassUI.php");
|
||||||
include("../inc/inc.Authentication.php");
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('EditOnline', $_POST)) {
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('access_denied')));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_doc_id')));
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$documentid = $_POST["documentid"];
|
$documentid = $_POST["documentid"];
|
||||||
$document = $dms->getDocument($documentid);
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
if (!is_object($document)) {
|
if (!is_object($document)) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_doc_id')));
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$folder = $document->getFolder();
|
$folder = $document->getFolder();
|
||||||
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
||||||
|
|
||||||
if ($document->getAccessMode($user, 'editOnline') < M_READWRITE) {
|
if ($document->getAccessMode($user, 'editOnline') < M_READWRITE) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
echo json_encode(array('success'=>false, 'message'=>getMLText('access_denied')));
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($document->isLocked()) {
|
if($document->isLocked()) {
|
||||||
$lockingUser = $document->getLockingUser();
|
$lockingUser = $document->getLockingUser();
|
||||||
if (($lockingUser->getID() != $user->getID()) && ($document->getAccessMode($user, 'editOnline') != M_ALL)) {
|
if (($lockingUser->getID() != $user->getID()) && ($document->getAccessMode($user, 'editOnline') != M_ALL)) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("lock_message", array("email" => $lockingUser->getEmail(), "username" => htmlspecialchars($lockingUser->getFullName()))));
|
echo json_encode(array('success'=>false, 'message'=>getMLText("lock_message", array("email" => $lockingUser->getEmail(), "username" => htmlspecialchars($lockingUser->getFullName())))));
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,26 +125,21 @@ function renderGroupData($colname, $objdata) { /* {{{ */
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
function getRoleData($colname, $coldata, $objdata) { /* {{{ */
|
function getRoleData($colname, $coldata, $objdata) { /* {{{ */
|
||||||
switch($coldata) {
|
global $dms;
|
||||||
case 'admin':
|
if($role = $dms->getRoleByName($coldata)) {
|
||||||
$role = 1;
|
$objdata['role'] = $role;
|
||||||
break;
|
} else {
|
||||||
case 'guest':
|
$objdata['role'] = null;
|
||||||
$role = 2;
|
|
||||||
break;
|
|
||||||
case 'user':
|
|
||||||
$role = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$role = 0;
|
|
||||||
$objdata['__logs__'][] = array('type'=>'error', 'msg'=> "No such role with name '".$coldata."'");
|
$objdata['__logs__'][] = array('type'=>'error', 'msg'=> "No such role with name '".$coldata."'");
|
||||||
}
|
}
|
||||||
$objdata['role'] = $role;
|
|
||||||
return $objdata;
|
return $objdata;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
function renderRoleData($colname, $objdata) { /* {{{ */
|
function renderRoleData($colname, $objdata) { /* {{{ */
|
||||||
return ($objdata[$colname] == 1 ? 'admin' : ($objdata[$colname] == 2 ? 'guest' : 'user'));
|
$html = '';
|
||||||
|
if($objdata[$colname])
|
||||||
|
$html .= $objdata[$colname]->getName();
|
||||||
|
return $html;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
if (!$user->isAdmin()) {
|
if (!$user->isAdmin()) {
|
||||||
|
@ -318,7 +313,7 @@ if (isset($_FILES['userdata']) && $_FILES['userdata']['error'] == 0) {
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
if($view) {
|
if($view) {
|
||||||
$view->setParam('log', $log);
|
$view->setParam('log', $log);
|
||||||
$view->setParam('newusers', $newusers);
|
$view->setParam('newusers', $newusers);
|
||||||
|
|
|
@ -29,6 +29,11 @@ require_once("inc/inc.DBInit.php");
|
||||||
require_once("inc/inc.ClassUI.php");
|
require_once("inc/inc.ClassUI.php");
|
||||||
require_once("inc/inc.Authentication.php");
|
require_once("inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('LockDocument', $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('lockdocument', 'GET')) {
|
if(!checkFormKey('lockdocument', 'GET')) {
|
||||||
UI::exitError(getMLText("document_title"), getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title"), getMLText("invalid_request_token"));
|
||||||
|
@ -45,6 +50,11 @@ if (!is_object($document)) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('LockDocument', $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
$folder = $document->getFolder();
|
$folder = $document->getFolder();
|
||||||
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,11 @@ if(!checkFormKey('movedocument', 'GET')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('MoveDocument', $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,11 @@ if(!checkFormKey('movefolder', 'GET')) {
|
||||||
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('MoveFolder', $_POST)) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) {
|
if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) {
|
||||||
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id"));
|
UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,13 @@ include("../inc/inc.DBInit.php");
|
||||||
include("../inc/inc.ClassUI.php");
|
include("../inc/inc.ClassUI.php");
|
||||||
include("../inc/inc.Authentication.php");
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
//$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if(!$accessop->check_controller_access($tmp[1] /*$controller*/)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('overridecontentstatus')) {
|
if(!checkFormKey('overridecontentstatus')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
@ -58,7 +65,7 @@ if (!is_object($content)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($_POST["overrideStatus"]) || !is_numeric($_POST["overrideStatus"]) ||
|
if (!isset($_POST["overrideStatus"]) || !is_numeric($_POST["overrideStatus"]) ||
|
||||||
(intval($_POST["overrideStatus"])<-3 && intval($_POST["overrideStatus"])>2)) {
|
(intval($_POST["overrideStatus"]) != S_RELEASED && intval($_POST["overrideStatus"]) != S_OBSOLETE && intval($_POST["overrideStatus"]) != S_DRAFT && intval($_POST["overrideStatus"]) != S_NEEDS_CORRECTION)) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_status"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_status"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
105
op/op.ReceiptDocument.php
Normal file
105
op/op.ReceiptDocument.php
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('receiptdocument')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify if document may be receіpted
|
||||||
|
if (!$accessop->mayReceipt($document)){
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = $_POST["version"];
|
||||||
|
$content = $document->getContentByVersion($version);
|
||||||
|
|
||||||
|
if (!is_object($content)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// operation is only allowed for the last document version
|
||||||
|
$latestContent = $document->getLatestContent();
|
||||||
|
if ($latestContent->getVersion()!=$version) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["receiptStatus"]) || !is_numeric($_POST["receiptStatus"]) ||
|
||||||
|
(intval($_POST["receiptStatus"])!=1 && intval($_POST["receiptStatus"])!=-1)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_receipt_status"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->setParam('document', $document);
|
||||||
|
$controller->setParam('content', $latestContent);
|
||||||
|
$controller->setParam('receiptstatus', $_POST["receiptStatus"]);
|
||||||
|
$controller->setParam('receipttype', $_POST["receiptType"]);
|
||||||
|
if ($_POST["receiptType"] == "grp") {
|
||||||
|
$group = $dms->getGroup($_POST['receiptGroup']);
|
||||||
|
} else {
|
||||||
|
$group = null;
|
||||||
|
}
|
||||||
|
$controller->setParam('group', $group);
|
||||||
|
$controller->setParam('comment', $_POST["comment"]);
|
||||||
|
if(!$controller->run()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText($controller->getErrorMsg()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_POST["receiptType"] == "ind" || $_POST["receiptType"] == "grp") {
|
||||||
|
if($notifier) {
|
||||||
|
$receiptlog = $latestContent->getReceiptLog();
|
||||||
|
$notifier->sendSubmittedReceiptMail($latestContent, $user, $receiptlog ? $receiptlog[0] : false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("documentid=".$documentid."&version=".$version);
|
||||||
|
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=recipients");
|
|
@ -31,6 +31,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('removedocument')) {
|
if(!checkFormKey('removedocument')) {
|
||||||
|
|
|
@ -27,6 +27,11 @@ include("../inc/inc.DBInit.php");
|
||||||
include("../inc/inc.ClassUI.php");
|
include("../inc/inc.ClassUI.php");
|
||||||
include("../inc/inc.Authentication.php");
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('RemoveDocumentFile', $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('removedocumentfile')) {
|
if(!checkFormKey('removedocumentfile')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
|
|
@ -44,10 +44,10 @@ if (!is_object($document)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create object for checking access to certain operations */
|
/* Create object for checking access to certain operations */
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings);
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
|
||||||
// verify if document may be reviewed
|
// verify if document may be reviewed
|
||||||
if (!$accessop->mayRemoveVersion()){
|
if (!$accessop->mayRemoveVersion($document)){
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('reviewdocument')) {
|
if(!checkFormKey('reviewdocument')) {
|
||||||
|
@ -72,11 +73,8 @@ if ($latestContent->getVersion()!=$version) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create object for checking access to certain operations */
|
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings);
|
|
||||||
|
|
||||||
// verify if document may be reviewed
|
// verify if document may be reviewed
|
||||||
if (!$accessop->mayReview()){
|
if (!$accessop->mayReview($document)){
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
120
op/op.ReviseDocument.php
Normal file
120
op/op.ReviseDocument.php
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('revisedocument')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify if document maybe revised
|
||||||
|
if (!$accessop->mayRevise($document)){
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = $_POST["version"];
|
||||||
|
$content = $document->getContentByVersion($version);
|
||||||
|
|
||||||
|
if (!is_object($content)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// operation is only allowed for the last document version
|
||||||
|
$latestContent = $document->getLatestContent();
|
||||||
|
if ($latestContent->getVersion()!=$version) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$olddocstatus = $content->getStatus();
|
||||||
|
|
||||||
|
if (!isset($_POST["revisionStatus"]) || !is_numeric($_POST["revisionStatus"]) ||
|
||||||
|
(!in_array(intval($_POST["revisionStatus"]), array(1, -1, 6)))) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_revision_status"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->setParam('document', $document);
|
||||||
|
$controller->setParam('content', $content);
|
||||||
|
$controller->setParam('revisionstatus', $_POST["revisionStatus"]);
|
||||||
|
$controller->setParam('revisiontype', $_POST["revisionType"]);
|
||||||
|
if ($_POST["revisionType"] == "grp") {
|
||||||
|
$group = $dms->getGroup($_POST['revisionGroup']);
|
||||||
|
} else {
|
||||||
|
$group = null;
|
||||||
|
}
|
||||||
|
$controller->setParam('group', $group);
|
||||||
|
$controller->setParam('comment', $_POST["comment"]);
|
||||||
|
$controller->setParam('onevotereject', $settings->_enableRevisionOneVoteReject);
|
||||||
|
if(!$controller->run()) {
|
||||||
|
$err = $controller->getErrorMsg();
|
||||||
|
if(is_string($err))
|
||||||
|
$errmsg = getMLText($err);
|
||||||
|
elseif(is_array($err)) {
|
||||||
|
$errmsg = getMLText($err[0], $err[1]);
|
||||||
|
} else {
|
||||||
|
$errmsg = $err;
|
||||||
|
}
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText($errmsg));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($notifier) {
|
||||||
|
if ($_POST["revisionType"] == "ind" || $_POST["revisionType"] == "grp") {
|
||||||
|
$revisionlog = $latestContent->getRevisionLog();
|
||||||
|
$notifier->sendSubmittedRevisionMail($latestContent, $user, $revisionlog ? $revisionlog[0] : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send notification about status change only if status has actually changed */
|
||||||
|
if($controller->oldstatus != $controller->newstatus)
|
||||||
|
$notifier->sendChangedDocumentStatusMail($latestContent, $user, $controller->oldstatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("documentid=".$documentid."&version=".$version);
|
||||||
|
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=revision");
|
133
op/op.RoleMgr.php
Normal file
133
op/op.RoleMgr.php
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2012 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST["action"])) $action=$_POST["action"];
|
||||||
|
else $action=NULL;
|
||||||
|
|
||||||
|
if(!in_array($action, array('addrole', 'removerole', 'editrole')))
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("unknown_command"));
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey($action)) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$roleid = 0;
|
||||||
|
if(in_array($action, array('removerole', 'editrole'))) {
|
||||||
|
if (isset($_POST["roleid"])) {
|
||||||
|
$roleid = $_POST["roleid"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($roleid) || !is_numeric($roleid) || intval($roleid)<1) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_role_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$roleobj = $dms->getRole($roleid);
|
||||||
|
|
||||||
|
if (!is_object($roleobj)) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_role_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->setParam('roleobj', $roleobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add new role ---------------------------------------------------------
|
||||||
|
if ($action == "addrole") {
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$role = preg_replace('/[^0-2]+/', '', $_POST["role"]);
|
||||||
|
|
||||||
|
if (is_object($dms->getRoleByName($name))) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("role_exists"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($role === '') {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_role_type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->setParam('name', $name);
|
||||||
|
$controller->setParam('role', $role);
|
||||||
|
|
||||||
|
$newRole = $controller($_POST);
|
||||||
|
if ($newRole) {
|
||||||
|
}
|
||||||
|
else UI::exitError(getMLText("admin_tools"),getMLText("error_occured"));
|
||||||
|
|
||||||
|
$roleid=$newRole->getID();
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_role')));
|
||||||
|
|
||||||
|
add_log_line(".php&action=".$action."&name=".$name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete role ------------------------------------------------------------
|
||||||
|
else if ($action == "removerole") {
|
||||||
|
|
||||||
|
if (!$controller($_POST)) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line(".php&action=".$action."&roleid=".$roleid);
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_rm_role')));
|
||||||
|
$roleid=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// modify role ------------------------------------------------------------
|
||||||
|
else if ($action == "editrole") {
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$role = preg_replace('/[^0-2]+/', '', $_POST["role"]);
|
||||||
|
$noaccess = isset($_POST['noaccess']) ? $_POST['noaccess'] : null;
|
||||||
|
|
||||||
|
$controller->setParam('name', $name);
|
||||||
|
$controller->setParam('role', $role);
|
||||||
|
$controller->setParam('noaccess', $noaccess);
|
||||||
|
|
||||||
|
if (!$controller($_POST)) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_edit_role')));
|
||||||
|
add_log_line(".php&action=".$action."&roleid=".$roleid);
|
||||||
|
}
|
||||||
|
|
||||||
|
header("Location:../out/out.RoleMgr.php?roleid=".$roleid);
|
||||||
|
|
||||||
|
?>
|
144
op/op.SchedulerTaskMgr.php
Normal file
144
op/op.SchedulerTaskMgr.php
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2012 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.Scheduler.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if ($user->isGuest()) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST["action"])) $action=$_POST["action"];
|
||||||
|
else $action=NULL;
|
||||||
|
|
||||||
|
$scheduler = new SeedDMS_Scheduler($dms->getDB());
|
||||||
|
|
||||||
|
// add new task ---------------------------------------------------
|
||||||
|
if ($action == "addtask") { /* {{{ */
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('addtask')) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$extension = $_POST["extension"];
|
||||||
|
$task = $_POST["task"];
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$description = $_POST["description"];
|
||||||
|
$frequency = $_POST["frequency"];
|
||||||
|
$disabled = isset($_POST["disabled"]) ? $_POST["disabled"] : 0;
|
||||||
|
$params = isset($_POST["params"]) ? $_POST["params"] : null;
|
||||||
|
|
||||||
|
$newtask = $scheduler->addTask($extension, $task, $name, $description, $frequency, $disabled, $params);
|
||||||
|
if ($newtask) {
|
||||||
|
}
|
||||||
|
else UI::exitError(getMLText("admin_tools"),getMLText("error_occured"));
|
||||||
|
|
||||||
|
$taskid=$newtask->getID();
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_task')));
|
||||||
|
|
||||||
|
add_log_line(".php&action=addtask&name=".$name);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
// modify task ----------------------------------------------------
|
||||||
|
else if ($action == "edittask") { /* {{{ */
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('edittask')) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["taskid"]) || !is_numeric($_POST["taskid"]) || intval($_POST["taskid"])<1) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_task"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$taskid=$_POST["taskid"];
|
||||||
|
$editedtask = $scheduler->getTask($taskid);
|
||||||
|
|
||||||
|
if (!is_object($editedtask)) {
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("invalid_task"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$description = $_POST["description"];
|
||||||
|
$frequency = $_POST["frequency"];
|
||||||
|
$disabled = isset($_POST["disabled"]) ? $_POST["disabled"] : 0;
|
||||||
|
$params = isset($_POST["params"]) ? $_POST["params"] : null;
|
||||||
|
|
||||||
|
if ($editedtask->getName() != $name)
|
||||||
|
$editedtask->setName($name);
|
||||||
|
if ($editedtask->getDescription() != $description)
|
||||||
|
$editedtask->setDescription($description);
|
||||||
|
$editedtask->setDisabled($disabled);
|
||||||
|
$editedtask->setParameter($params);
|
||||||
|
if($editedtask->setFrequency($frequency))
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_edit_task')));
|
||||||
|
else
|
||||||
|
$session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('error_edit_task')));
|
||||||
|
add_log_line(".php&action=edittask&taskid=".$taskid);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
// delete task -------------------------------------------------------------
|
||||||
|
else if ($action == "removetask") { /* {{{ */
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
|
||||||
|
/* Check if the form data comes from a trusted request */
|
||||||
|
if(!checkFormKey('removetask')) {
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText("invalid_request_token")));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["taskid"]) || !is_numeric($_POST["taskid"]) || intval($_POST["taskid"])<1) {
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText("invalid_task")));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$taskid=$_POST["taskid"];
|
||||||
|
$task = $scheduler->getTask($taskid);
|
||||||
|
|
||||||
|
if (!is_object($task)) {
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText("invalid_task")));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$task->remove()) {
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText("error_occured")));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("?taskid=".$_POST["taskid"]."&action=removetask");
|
||||||
|
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>getMLText("task_removed")));
|
||||||
|
exit;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
|
||||||
|
header("Location:../out/out.SchedulerTaskMgr.php");
|
||||||
|
|
|
@ -31,7 +31,7 @@ include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
if (!$accessop->check_controller_access($controller, $_GET)) {
|
if (!$accessop->check_controller_access($controller, $_GET)) {
|
||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
echo json_encode(array('success'=>false, 'message'=>getMLText('access_denied')));
|
echo json_encode(array('success'=>false, 'message'=>getMLText('access_denied')));
|
||||||
|
|
279
op/op.SetRecipients.php
Normal file
279
op/op.SetRecipients.php
Normal file
|
@ -0,0 +1,279 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_READWRITE) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = $_POST["version"];
|
||||||
|
$content = $document->getContentByVersion($version);
|
||||||
|
|
||||||
|
if (!is_object($content)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
// Retrieve a list of all users and groups that have read rights.
|
||||||
|
// Afterwards, reorganize them in two arrays with its key being the
|
||||||
|
// userid or groupid
|
||||||
|
$docAccess = $document->getReadAccessList($settings->_enableAdminReceipt, $settings->_enableOwnerReceipt);
|
||||||
|
$accessIndex = array("i"=>array(), "g"=>array());
|
||||||
|
foreach ($docAccess["users"] as $i=>$da) {
|
||||||
|
$accessIndex["i"][$da->getID()] = $da;
|
||||||
|
}
|
||||||
|
foreach ($docAccess["groups"] as $i=>$da) {
|
||||||
|
$accessIndex["g"][$da->getID()] = $da;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve list of currently assigned recipients, along with
|
||||||
|
// their latest status.
|
||||||
|
$receiptStatus = $content->getReceiptStatus();
|
||||||
|
// Index the receipt results for easy cross-reference with the Approvers List.
|
||||||
|
$receiptIndex = array("i"=>array(), "g"=>array());
|
||||||
|
foreach ($receiptStatus as $i=>$rs) {
|
||||||
|
if ($rs["status"]!=S_LOG_USER_REMOVED) {
|
||||||
|
if ($rs["type"]==0) {
|
||||||
|
$receiptIndex["i"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
||||||
|
}
|
||||||
|
else if ($rs["type"]==1) {
|
||||||
|
$receiptIndex["g"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get List of ind. reviewers, because they are taken out from the receivers
|
||||||
|
* if added as group.
|
||||||
|
*/
|
||||||
|
$reviewStatus = $content->getReviewStatus();
|
||||||
|
$reviewerids = [];
|
||||||
|
foreach ($reviewStatus as $r) {
|
||||||
|
if($r["type"] == 0 && $r["status"] > -2) {
|
||||||
|
$reviewerids[] = $r['required'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Get the list of proposed recipients, stripping out any duplicates.
|
||||||
|
$pIndRev = (isset($_POST["indRecipients"]) ? array_values(array_unique($_POST["indRecipients"])) : array());
|
||||||
|
// Retrieve the list of recipient groups whose members become individual recipients
|
||||||
|
if (isset($_POST["grpIndRecipients"])) {
|
||||||
|
foreach ($_POST["grpIndRecipients"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
/* Do not add the uploader itself and reviewers */
|
||||||
|
if(!$settings->_enableFilterReceipt || ($member->getID() != $content->getUser()->getID() && !in_array($member->getID(), $reviewerids)))
|
||||||
|
if(!in_array($member->getID(), $pIndRev))
|
||||||
|
$pIndRev[] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pGrpRev = (isset($_POST["grpRecipients"]) ? array_values(array_unique($_POST["grpRecipients"])) : array());
|
||||||
|
foreach ($pIndRev as $p) {
|
||||||
|
if (is_numeric($p)) {
|
||||||
|
if (isset($accessIndex["i"][$p])) {
|
||||||
|
// Proposed recipient is on the list of possible recipients.
|
||||||
|
if (!isset($receiptIndex["i"][$p])) {
|
||||||
|
// Proposed recipient is not a current recipient, so add as a new
|
||||||
|
// recipient.
|
||||||
|
$res = $content->addIndRecipient($accessIndex["i"][$p], $user);
|
||||||
|
$unm = $accessIndex["i"][$p]->getFullName();
|
||||||
|
$uml = $accessIndex["i"][$p]->getEmail();
|
||||||
|
|
||||||
|
switch ($res) {
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_assigned"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
// email error
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Send an email notification to the new recipient.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendAddReceiptMail($content, $user, $accessIndex["i"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Proposed recipient is already in the list of recipients.
|
||||||
|
// Remove recipient from the index of possible recipients. If there are
|
||||||
|
// any recipients left over in the list of possible recipients, they
|
||||||
|
// will be removed from the receipt process for this document revision.
|
||||||
|
unset($receiptIndex["i"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($receiptIndex["i"]) > 0) {
|
||||||
|
foreach ($receiptIndex["i"] as $rx=>$rv) {
|
||||||
|
if ($rv["status"] == 0) {
|
||||||
|
// User is to be removed from the recipients list.
|
||||||
|
if (!isset($accessIndex["i"][$rx])) {
|
||||||
|
// User does not have any receipt privileges for this document
|
||||||
|
// revision or does not exist.
|
||||||
|
$res = $content->delIndRecipient($dms->getUser($rx), $user, getMLText("removed_recipient"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$res = $content->delIndRecipient($accessIndex["i"][$rx], $user);
|
||||||
|
$unm = $accessIndex["i"][$rx]->getFullName();
|
||||||
|
$uml = $accessIndex["i"][$rx]->getEmail();
|
||||||
|
switch ($res) {
|
||||||
|
case 0:
|
||||||
|
// Send an email notification to the recipients.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendDeleteReceiptMail($content, $user, $accessIndex["i"][$rx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_removed"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
// email error
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($pGrpRev as $p) {
|
||||||
|
if (is_numeric($p)) {
|
||||||
|
if (isset($accessIndex["g"][$p])) {
|
||||||
|
// Proposed recipient is on the list of possible recipients.
|
||||||
|
if (!isset($receiptIndex["g"][$p])) {
|
||||||
|
// Proposed recipient is not a current recipient, so add as a new
|
||||||
|
// recipient.
|
||||||
|
$res = $content->addGrpRecipient($accessIndex["g"][$p], $user);
|
||||||
|
$gnm = $accessIndex["g"][$p]->getName();
|
||||||
|
switch ($res) {
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_assigned"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
// email error
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Send an email notification to the new recipient.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendAddReceiptMail($content, $user, $accessIndex["g"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Remove recipient from the index of possible recipients.
|
||||||
|
unset($receiptIndex["g"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($receiptIndex["g"]) > 0) {
|
||||||
|
foreach ($receiptIndex["g"] as $rx=>$rv) {
|
||||||
|
if ($rv["status"] == 0) {
|
||||||
|
// Group is to be removed from the recipientist.
|
||||||
|
if (!isset($accessIndex["g"][$rx])) {
|
||||||
|
// Group does not have any receipt privileges for this document
|
||||||
|
// revision or does not exist.
|
||||||
|
$res = $content->delGrpRecipient($dms->getGroup($rx), $user, getMLText("removed_recipient"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$res = $content->delGrpRecipient($accessIndex["g"][$rx], $user);
|
||||||
|
$gnm = $accessIndex["g"][$rx]->getName();
|
||||||
|
switch ($res) {
|
||||||
|
case 0:
|
||||||
|
// Send an email notification to the recipients group.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendDeleteReceiptMail($content, $user, $accessIndex["g"][$rx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_removed"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
// email error
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("?documentid=".$documentid);
|
||||||
|
header("Location:../out/out.DocumentVersionDetail.php?documentid=".$documentid."&version=".$version);
|
||||||
|
|
||||||
|
?>
|
|
@ -82,7 +82,7 @@ $approvalStatus = $content->getApprovalStatus();
|
||||||
// Index the review results for easy cross-reference with the reviewers List.
|
// Index the review results for easy cross-reference with the reviewers List.
|
||||||
$reviewIndex = array("i"=>array(), "g"=>array());
|
$reviewIndex = array("i"=>array(), "g"=>array());
|
||||||
foreach ($reviewStatus as $i=>$rs) {
|
foreach ($reviewStatus as $i=>$rs) {
|
||||||
if ($rs["status"]!=-2) {
|
if ($rs["status"]!=S_LOG_USER_REMOVED) {
|
||||||
if ($rs["type"]==0) {
|
if ($rs["type"]==0) {
|
||||||
$reviewIndex["i"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
$reviewIndex["i"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ foreach ($reviewStatus as $i=>$rs) {
|
||||||
// Index the approval results for easy cross-reference with the approvers List.
|
// Index the approval results for easy cross-reference with the approvers List.
|
||||||
$approvalIndex = array("i"=>array(), "g"=>array());
|
$approvalIndex = array("i"=>array(), "g"=>array());
|
||||||
foreach ($approvalStatus as $i=>$rs) {
|
foreach ($approvalStatus as $i=>$rs) {
|
||||||
if ($rs["status"]!=-2) {
|
if ($rs["status"]!=S_LOG_USER_REMOVED) {
|
||||||
if ($rs["type"]==0) {
|
if ($rs["type"]==0) {
|
||||||
$approvalIndex["i"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
$approvalIndex["i"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,18 @@ foreach ($approvalStatus as $i=>$rs) {
|
||||||
|
|
||||||
// Get the list of proposed reviewers, stripping out any duplicates.
|
// Get the list of proposed reviewers, stripping out any duplicates.
|
||||||
$pIndRev = (isset($_POST["indReviewers"]) ? array_values(array_unique($_POST["indReviewers"])) : array());
|
$pIndRev = (isset($_POST["indReviewers"]) ? array_values(array_unique($_POST["indReviewers"])) : array());
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndReviewers"])) {
|
||||||
|
foreach ($_POST["grpIndReviewers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
if(!in_array($member->getID(), $pIndRev))
|
||||||
|
$pIndRev[] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
$pGrpRev = (isset($_POST["grpReviewers"]) ? array_values(array_unique($_POST["grpReviewers"])) : array());
|
$pGrpRev = (isset($_POST["grpReviewers"]) ? array_values(array_unique($_POST["grpReviewers"])) : array());
|
||||||
if($user->getID() != $owner->getID()) {
|
if($user->getID() != $owner->getID()) {
|
||||||
$res=$owner->getMandatoryReviewers();
|
$res=$owner->getMandatoryReviewers();
|
||||||
|
@ -282,6 +294,18 @@ if (count($reviewIndex["g"]) > 0) {
|
||||||
|
|
||||||
// Get the list of proposed approvers, stripping out any duplicates.
|
// Get the list of proposed approvers, stripping out any duplicates.
|
||||||
$pIndApp = (isset($_POST["indApprovers"]) ? array_values(array_unique($_POST["indApprovers"])) : array());
|
$pIndApp = (isset($_POST["indApprovers"]) ? array_values(array_unique($_POST["indApprovers"])) : array());
|
||||||
|
// Retrieve the list of approver groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndApprovers"])) {
|
||||||
|
foreach ($_POST["grpIndApprovers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
if(!in_array($member->getID(), $pIndApp))
|
||||||
|
$pIndApp[] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
$pGrpApp = (isset($_POST["grpApprovers"]) ? array_values(array_unique($_POST["grpApprovers"])) : array());
|
$pGrpApp = (isset($_POST["grpApprovers"]) ? array_values(array_unique($_POST["grpApprovers"])) : array());
|
||||||
if($user->getID() != $owner->getID()) {
|
if($user->getID() != $owner->getID()) {
|
||||||
$res=$owner->getMandatoryApprovers();
|
$res=$owner->getMandatoryApprovers();
|
||||||
|
@ -458,7 +482,7 @@ if (count($approvalIndex["g"]) > 0) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$content->verifyStatus(false,$user);
|
$content->verifyStatus(false, $user, '', $settings->_initialDocumentStatus);
|
||||||
|
|
||||||
add_log_line("?documentid=".$documentid);
|
add_log_line("?documentid=".$documentid);
|
||||||
header("Location:../out/out.DocumentVersionDetail.php?documentid=".$documentid."&version=".$version);
|
header("Location:../out/out.DocumentVersionDetail.php?documentid=".$documentid."&version=".$version);
|
||||||
|
|
286
op/op.SetRevisors.php
Normal file
286
op/op.SetRevisors.php
Normal file
|
@ -0,0 +1,286 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_ALL) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = $_POST["version"];
|
||||||
|
$content = $document->getContentByVersion($version);
|
||||||
|
|
||||||
|
if (!is_object($content)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST["startdate"])) {
|
||||||
|
$ts = makeTsFromDate($_POST["startdate"]);
|
||||||
|
} else {
|
||||||
|
$ts = time();
|
||||||
|
}
|
||||||
|
$startdate = date('Y-m-d', $ts);
|
||||||
|
|
||||||
|
if(!$content->setRevisionDate($startdate)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
// Retrieve a list of all users and groups that have read rights.
|
||||||
|
// Afterwards, reorganize them in two arrays with its key being the
|
||||||
|
// userid or groupid
|
||||||
|
$docAccess = $document->getReadAccessList($settings->_enableAdminRevApp, $settings->_enableOwnerRevApp);
|
||||||
|
$accessIndex = array("i"=>array(), "g"=>array());
|
||||||
|
foreach ($docAccess["users"] as $i=>$da) {
|
||||||
|
$accessIndex["i"][$da->getID()] = $da;
|
||||||
|
}
|
||||||
|
foreach ($docAccess["groups"] as $i=>$da) {
|
||||||
|
$accessIndex["g"][$da->getID()] = $da;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve list of currently assigned recipients, along with
|
||||||
|
// their latest status.
|
||||||
|
$revisionStatus = $content->getRevisionStatus();
|
||||||
|
// Index the revision results for easy cross-reference with the Approvers List.
|
||||||
|
$revisionIndex = array("i"=>array(), "g"=>array());
|
||||||
|
foreach ($revisionStatus as $i=>$rs) {
|
||||||
|
if ($rs["status"]!=S_LOG_USER_REMOVED) {
|
||||||
|
if ($rs["type"]==0) {
|
||||||
|
$revisionIndex["i"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
||||||
|
}
|
||||||
|
else if ($rs["type"]==1) {
|
||||||
|
$revisionIndex["g"][$rs["required"]] = array("status"=>$rs["status"], "idx"=>$i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the list of proposed revisors, stripping out any duplicates.
|
||||||
|
$pIndRev = (isset($_POST["indRevisors"]) ? array_values(array_unique($_POST["indRevisors"])) : array());
|
||||||
|
// Retrieve the list of revisor groups whose members become individual revisors
|
||||||
|
if (isset($_POST["grpIndRevisors"])) {
|
||||||
|
foreach ($_POST["grpIndRevisors"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
if(!in_array($member->getID(), $pIndRev))
|
||||||
|
$pIndRev[] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pGrpRev = (isset($_POST["grpRevisors"]) ? array_values(array_unique($_POST["grpRevisors"])) : array());
|
||||||
|
foreach ($pIndRev as $p) {
|
||||||
|
if (is_numeric($p)) {
|
||||||
|
if (isset($accessIndex["i"][$p])) {
|
||||||
|
// Proposed recipient is on the list of possible recipients.
|
||||||
|
if (!isset($revisionIndex["i"][$p])) {
|
||||||
|
// Proposed recipient is not a current recipient, so add as a new
|
||||||
|
// recipient.
|
||||||
|
$res = $content->addIndRevisor($accessIndex["i"][$p], $user);
|
||||||
|
$unm = $accessIndex["i"][$p]->getFullName();
|
||||||
|
$uml = $accessIndex["i"][$p]->getEmail();
|
||||||
|
|
||||||
|
switch ($res) {
|
||||||
|
case 0:
|
||||||
|
// Send an email notification to the new recipient.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendAddRevisionMail($content, $user, $accessIndex["i"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("revisor_already_assigned"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
// email error
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Proposed recipient is already in the list of recipients.
|
||||||
|
// Remove revisor from the index of possible revisors. If there are
|
||||||
|
// any revisors left over in the list of possible revisors, they
|
||||||
|
// will be removed from the revision process for this document revision.
|
||||||
|
unset($revisionIndex["i"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($revisionIndex["i"]) > 0) {
|
||||||
|
foreach ($revisionIndex["i"] as $rx=>$rv) {
|
||||||
|
// if ($rv["status"] == 0) {
|
||||||
|
// User is to be removed from the recipients list.
|
||||||
|
if (!isset($accessIndex["i"][$rx])) {
|
||||||
|
// User does not have any revision privileges for this document
|
||||||
|
// revision or does not exist.
|
||||||
|
$res = $content->delIndRevisor($dms->getUser($rx), $user, getMLText("removed_revisor"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$res = $content->delIndRevisor($accessIndex["i"][$rx], $user);
|
||||||
|
$unm = $accessIndex["i"][$rx]->getFullName();
|
||||||
|
$uml = $accessIndex["i"][$rx]->getEmail();
|
||||||
|
switch ($res) {
|
||||||
|
case 0:
|
||||||
|
// Send an email notification to the recipients.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendDeleteRevisionMail($content, $user, $accessIndex["i"][$rx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_removed"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_was_active"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($pGrpRev as $p) {
|
||||||
|
if (is_numeric($p)) {
|
||||||
|
if (isset($accessIndex["g"][$p])) {
|
||||||
|
// Proposed recipient is on the list of possible recipients.
|
||||||
|
if (!isset($revisionIndex["g"][$p])) {
|
||||||
|
// Proposed recipient is not a current recipient, so add as a new
|
||||||
|
// recipient.
|
||||||
|
$res = $content->addGrpRevisor($accessIndex["g"][$p], $user);
|
||||||
|
$gnm = $accessIndex["g"][$p]->getName();
|
||||||
|
switch ($res) {
|
||||||
|
case 0:
|
||||||
|
// Send an email notification to the new recipient.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendAddRevisionMail($content, $user, $accessIndex["g"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_assigned"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
// email error
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Remove recipient from the index of possible revisors.
|
||||||
|
unset($revisionIndex["g"][$p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($revisionIndex["g"]) > 0) {
|
||||||
|
foreach ($revisionIndex["g"] as $rx=>$rv) {
|
||||||
|
// if ($rv["status"] == 0) {
|
||||||
|
// Group is to be removed from the recipientist.
|
||||||
|
if (!isset($accessIndex["g"][$rx])) {
|
||||||
|
// Group does not have any revision privileges for this document
|
||||||
|
// revision or does not exist.
|
||||||
|
$res = $content->delGrpRevisor($dms->getGroup($rx), $user, getMLText("removed_revisor"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$res = $content->delGrpRevisor($accessIndex["g"][$rx], $user);
|
||||||
|
$gnm = $accessIndex["g"][$rx]->getName();
|
||||||
|
switch ($res) {
|
||||||
|
case 0:
|
||||||
|
// Send an email notification to the recipients group.
|
||||||
|
if($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendDeleteRevisionMail($content, $user, $accessIndex["g"][$rx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error"));
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_already_removed"));
|
||||||
|
break;
|
||||||
|
case -4:
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("recipient_was_active"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If all revisors has been removed, then clear the next revision date */
|
||||||
|
if(!$pIndRev && !$pGrpRev) {
|
||||||
|
$content->setRevisionDate(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recheck status, because all revisors could have been removed */
|
||||||
|
$content->verifyStatus(false, $user, getMLText('automatic_status_update'), $settings->_initialDocumentStatus);
|
||||||
|
|
||||||
|
add_log_line("?documentid=".$documentid);
|
||||||
|
header("Location:../out/out.DocumentVersionDetail.php?documentid=".$documentid."&version=".$version);
|
||||||
|
|
||||||
|
?>
|
|
@ -139,8 +139,10 @@ if ($action == "saveSettings")
|
||||||
setBoolValue("enableSessionList");
|
setBoolValue("enableSessionList");
|
||||||
setBoolValue("enableClipboard");
|
setBoolValue("enableClipboard");
|
||||||
setBoolValue("alwaysShowClipboard");
|
setBoolValue("alwaysShowClipboard");
|
||||||
|
setBoolValue("enableMenuTransmittals");
|
||||||
setBoolValue("enableMenuTasks");
|
setBoolValue("enableMenuTasks");
|
||||||
setBoolValue("alwaysShowMenuTasks");
|
setBoolValue("alwaysShowMenuTasks");
|
||||||
|
$settings->_tasksInMenu = isset($_POST["tasksInMenu"]) ? $_POST["tasksInMenu"] : array();
|
||||||
setBoolValue("enableDropFolderList");
|
setBoolValue("enableDropFolderList");
|
||||||
setBoolValue("enableDropUpload");
|
setBoolValue("enableDropUpload");
|
||||||
setBoolValue("enableMultiUpload");
|
setBoolValue("enableMultiUpload");
|
||||||
|
@ -157,6 +159,7 @@ if ($action == "saveSettings")
|
||||||
setStrValue("sortFoldersDefault");
|
setStrValue("sortFoldersDefault");
|
||||||
setStrValue("defaultDocPosition");
|
setStrValue("defaultDocPosition");
|
||||||
setStrValue("defaultFolderPosition");
|
setStrValue("defaultFolderPosition");
|
||||||
|
setIntValue("libraryFolder");
|
||||||
|
|
||||||
// SETTINGS - SITE - WEBDAV
|
// SETTINGS - SITE - WEBDAV
|
||||||
setBoolValue("enableWebdavReplaceDoc");
|
setBoolValue("enableWebdavReplaceDoc");
|
||||||
|
@ -182,6 +185,8 @@ if ($action == "saveSettings")
|
||||||
setDirValue("extraPath");
|
setDirValue("extraPath");
|
||||||
setDirValue("dropFolderDir");
|
setDirValue("dropFolderDir");
|
||||||
setDirValue("backupDir");
|
setDirValue("backupDir");
|
||||||
|
setDirValue("checkOutDir");
|
||||||
|
setBoolValue("createCheckOutDir");
|
||||||
setStrValue("repositoryUrl");
|
setStrValue("repositoryUrl");
|
||||||
setDirValue("proxyUrl");
|
setDirValue("proxyUrl");
|
||||||
setDirValue("proxyUser");
|
setDirValue("proxyUser");
|
||||||
|
@ -197,6 +202,7 @@ if ($action == "saveSettings")
|
||||||
// SETTINGS - SYSTEM - AUTHENTICATION
|
// SETTINGS - SYSTEM - AUTHENTICATION
|
||||||
setBoolValue("enableGuestLogin");
|
setBoolValue("enableGuestLogin");
|
||||||
setBoolValue("enableGuestAutoLogin");
|
setBoolValue("enableGuestAutoLogin");
|
||||||
|
setBoolValue("enable2FactorAuthentication");
|
||||||
setBoolValue("enableLoginByEmail");
|
setBoolValue("enableLoginByEmail");
|
||||||
setBoolValue("restricted");
|
setBoolValue("restricted");
|
||||||
setBoolValue("enableUserImage");
|
setBoolValue("enableUserImage");
|
||||||
|
@ -249,11 +255,19 @@ if ($action == "saveSettings")
|
||||||
// SETTINGS - ADVANCED - EDITION
|
// SETTINGS - ADVANCED - EDITION
|
||||||
setStrValue("versioningFileName");
|
setStrValue("versioningFileName");
|
||||||
setStrValue("presetExpirationDate");
|
setStrValue("presetExpirationDate");
|
||||||
|
setStrValue("initialDocumentStatus");
|
||||||
setStrValue("workflowMode");
|
setStrValue("workflowMode");
|
||||||
|
setBoolValue("enableReceiptWorkflow");
|
||||||
|
setBoolValue("enableReceiptReject");
|
||||||
|
setBoolValue("disableReceiptComment");
|
||||||
|
setBoolValue("enableRevisionWorkflow");
|
||||||
|
setBoolValue("enableRevisionOnVoteReject");
|
||||||
setBoolValue("allowReviewerOnly");
|
setBoolValue("allowReviewerOnly");
|
||||||
|
setBoolValue("allowChangeRevAppInProcess");
|
||||||
setBoolValue("enableAdminRevApp");
|
setBoolValue("enableAdminRevApp");
|
||||||
setBoolValue("enableOwnerRevApp");
|
setBoolValue("enableOwnerRevApp");
|
||||||
setBoolValue("enableSelfRevApp");
|
setBoolValue("enableSelfRevApp");
|
||||||
|
setBoolValue("enableSelfReceipt");
|
||||||
setBoolValue("addManagerAsReviewer");
|
setBoolValue("addManagerAsReviewer");
|
||||||
setBoolValue("addManagerAsApprover");
|
setBoolValue("addManagerAsApprover");
|
||||||
setArrayValue("globalReviewer");
|
setArrayValue("globalReviewer");
|
||||||
|
@ -262,11 +276,17 @@ if ($action == "saveSettings")
|
||||||
setArrayValue("globalGroupApprover");
|
setArrayValue("globalGroupApprover");
|
||||||
setBoolValue("enableUpdateRevApp");
|
setBoolValue("enableUpdateRevApp");
|
||||||
setBoolValue("enableRemoveRevApp");
|
setBoolValue("enableRemoveRevApp");
|
||||||
|
setBoolValue("enableAdminReceipt");
|
||||||
|
setBoolValue("enableOwnerReceipt");
|
||||||
|
setBoolValue("enableUpdateReceipt");
|
||||||
|
setBoolValue("enableFilterReceipt");
|
||||||
setBoolValue("enableVersionDeletion");
|
setBoolValue("enableVersionDeletion");
|
||||||
setBoolValue("enableVersionModification");
|
setBoolValue("enableVersionModification");
|
||||||
setBoolValue("enableDuplicateDocNames");
|
setBoolValue("enableDuplicateDocNames");
|
||||||
setBoolValue("enableDuplicateSubFolderNames");
|
setBoolValue("enableDuplicateSubFolderNames");
|
||||||
|
setBoolValue("enableCancelCheckout");
|
||||||
setBoolValue("overrideMimeType");
|
setBoolValue("overrideMimeType");
|
||||||
|
setBoolValue("advancedAcl");
|
||||||
setBoolValue("removeFromDropFolder");
|
setBoolValue("removeFromDropFolder");
|
||||||
setBoolValue("uploadedAttachmentIsPublic");
|
setBoolValue("uploadedAttachmentIsPublic");
|
||||||
|
|
||||||
|
|
40
op/op.Setup2Factor.php
Normal file
40
op/op.Setup2Factor.php
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2009-2012 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
include("../inc/inc.ClassPasswordStrength.php");
|
||||||
|
include("../inc/inc.ClassPasswordHistoryManager.php");
|
||||||
|
|
||||||
|
if ($user->isGuest()) {
|
||||||
|
UI::exitError(getMLText("2_fact_auth"),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$secret = $_POST["secret"];
|
||||||
|
|
||||||
|
$user->setSecret($secret);
|
||||||
|
|
||||||
|
header("Location:../out/out.Setup2Factor.php");
|
|
@ -37,7 +37,17 @@ if (!isset($_GET["userid"])) {
|
||||||
|
|
||||||
/* Check if user is allowed to switch to a different user */
|
/* Check if user is allowed to switch to a different user */
|
||||||
if (!$user->isAdmin()) {
|
if (!$user->isAdmin()) {
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
$substitutes = $user->getReverseSubstitutes();
|
||||||
|
$found = false;
|
||||||
|
foreach($substitutes as $subsuser) {
|
||||||
|
/* Make sure a substitution is allowed and the substituted user
|
||||||
|
* is not an admin.
|
||||||
|
*/
|
||||||
|
if($subsuser->getID() == $_GET["userid"] && !$subsuser->isAdmin())
|
||||||
|
$found = true;
|
||||||
|
}
|
||||||
|
if(!$found)
|
||||||
|
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
$session->setSu($_GET['userid']);
|
$session->setSu($_GET['userid']);
|
||||||
|
|
77
op/op.TimelineFeedPreview.php
Normal file
77
op/op.TimelineFeedPreview.php
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2016 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
include("../inc/inc.BasicAuthentication.php");
|
||||||
|
|
||||||
|
if(empty($_GET['hash']))
|
||||||
|
exit;
|
||||||
|
|
||||||
|
$token = new SeedDMS_JwtToken($settings->_encryptionKey);
|
||||||
|
if(!($tokenstr = $token->jwtDecode($_GET['hash'])))
|
||||||
|
exit;
|
||||||
|
|
||||||
|
$tokendata = json_decode($tokenstr, true);
|
||||||
|
|
||||||
|
if (!isset($tokendata['d']) || !is_numeric($tokendata['d'])) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$document = $dms->getDocument($tokendata['d']);
|
||||||
|
if (!is_object($document)) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($tokendata['u']) || !is_numeric($tokendata['u'])) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = $dms->getUser($tokendata['u']);
|
||||||
|
if (!is_object($user)) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_READ) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($tokendata['v']) || !is_numeric($tokendata['v'])) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller = Controller::factory('Preview', array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$controller->setParam('width', !empty($tokendata["w"]) ? $tokendata["w"] : null);
|
||||||
|
$controller->setParam('document', $document);
|
||||||
|
$controller->setParam('version', $tokendata['v']);
|
||||||
|
$controller->setParam('type', 'version');
|
||||||
|
if(!$controller->run()) {
|
||||||
|
header('Content-Type: image/svg+xml');
|
||||||
|
readfile('../views/'.$theme.'/images/empty.svg');
|
||||||
|
exit;
|
||||||
|
}
|
|
@ -31,7 +31,7 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
if (!$accessop->check_controller_access($controller, $_POST)) {
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
51
op/op.TransmittalDownload.php
Normal file
51
op/op.TransmittalDownload.php
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2011-2013 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
|
||||||
|
if(isset($_GET["transmittalid"])) {
|
||||||
|
$transmittalid = $_GET["transmittalid"];
|
||||||
|
$transmittal = $dms->getTransmittal($transmittalid);
|
||||||
|
|
||||||
|
if (!is_object($transmittal)) {
|
||||||
|
UI::exitError(getMLText("my_account"), getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($transmittal->getUser()->getID() != $user->getID()) {
|
||||||
|
UI::exitError(getMLText("my_account"), getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$controller->setParam('transmittal', $transmittal);
|
||||||
|
$controller->run();
|
||||||
|
}
|
197
op/op.TransmittalMgr.php
Normal file
197
op/op.TransmittalMgr.php
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2012 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program 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 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if ($user->isGuest()) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST["action"])) $action=$_POST["action"];
|
||||||
|
else $action=NULL;
|
||||||
|
|
||||||
|
// add new transmittal ---------------------------------------------------
|
||||||
|
if ($action == "addtransmittal") { /* {{{ */
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('addtransmittal')) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$comment = $_POST["comment"];
|
||||||
|
|
||||||
|
$newTransmittal = $dms->addTransmittal($name, $comment, $user);
|
||||||
|
if ($newTransmittal) {
|
||||||
|
}
|
||||||
|
else UI::exitError(getMLText("my_transmittals"),getMLText("access_denied"));
|
||||||
|
|
||||||
|
$transmittalid=$newTransmittal->getID();
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_transmittal')));
|
||||||
|
|
||||||
|
add_log_line(".php&action=addtransmittal&name=".$name);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
// delete transmittal ------------------------------------------------------------
|
||||||
|
else if ($action == "removetransmittal") { /* {{{ */
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('removetransmittal')) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST["transmittalid"])) {
|
||||||
|
$transmittalid = $_POST["transmittalid"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($transmittalid) || !is_numeric($transmittalid) || intval($transmittalid)<1) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_transmittal_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$transmittalToRemove = $dms->getTransmittal($transmittalid);
|
||||||
|
if (!is_object($transmittalToRemove)) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_transmittal_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$transmittalToRemove->remove()) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
add_log_line(".php&action=removetransmittal&transmittalid=".$transmittalid);
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_rm_transmittal')));
|
||||||
|
$transmittalid=-1;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
// modify transmittal ----------------------------------------------------
|
||||||
|
else if ($action == "edittransmittal") { /* {{{ */
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('edittransmittal')) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["transmittalid"]) || !is_numeric($_POST["transmittalid"]) || intval($_POST["transmittalid"])<1) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_transmittal"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$transmittalid=$_POST["transmittalid"];
|
||||||
|
$editedTransmittal = $dms->getTransmittal($transmittalid);
|
||||||
|
|
||||||
|
if (!is_object($editedTransmittal)) {
|
||||||
|
UI::exitError(getMLText("my_transmittals"),getMLText("invalid_transmittal"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$comment = $_POST["comment"];
|
||||||
|
|
||||||
|
if ($editedTransmittal->getName() != $name)
|
||||||
|
$editedTransmittal->setName($name);
|
||||||
|
if ($editedTransmittal->getComment() != $comment)
|
||||||
|
$editedTransmittal->setComment($comment);
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_edit_transmittal')));
|
||||||
|
add_log_line(".php&action=edittransmittal&transmittalid=".$transmittalid);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
// remove transmittal item ------------------------------------------------
|
||||||
|
else if ($action == "removetransmittalitem") { /* {{{ */
|
||||||
|
|
||||||
|
if(!checkFormKey('removetransmittalitem', 'POST')) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
|
||||||
|
} else {
|
||||||
|
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
|
||||||
|
if($item) {
|
||||||
|
$transmittal = $item->getTransmittal();
|
||||||
|
if($transmittal) {
|
||||||
|
if ($transmittal->getUser()->getID() == $user->getID()) {
|
||||||
|
if($item->remove()) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
add_log_line(".php&action=removetransmittalitem&id=".$_REQUEST['id']);
|
||||||
|
exit;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
// update transmittal item ------------------------------------------------
|
||||||
|
else if ($action == "updatetransmittalitem") { /* {{{ */
|
||||||
|
if(!checkFormKey('updatetransmittalitem', 'POST')) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
|
||||||
|
} else {
|
||||||
|
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
|
||||||
|
if($item) {
|
||||||
|
$transmittal = $item->getTransmittal();
|
||||||
|
if($transmittal) {
|
||||||
|
if ($transmittal->getUser()->getID() == $user->getID()) {
|
||||||
|
if($item->updateContent()) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'Error updating transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
add_log_line(".php&action=updatetransmittalitem&id=".$_REQUEST['id']);
|
||||||
|
exit;
|
||||||
|
} /* }}} */
|
||||||
|
else UI::exitError(getMLText("my_transmittals"),getMLText("unknown_command"));
|
||||||
|
|
||||||
|
header("Location:../out/out.TransmittalMgr.php?transmittalid=".$transmittalid);
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,11 @@ require_once("inc/inc.DBInit.php");
|
||||||
require_once("inc/inc.ClassUI.php");
|
require_once("inc/inc.ClassUI.php");
|
||||||
require_once("inc/inc.Authentication.php");
|
require_once("inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('UnlockDocument', $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('unlockdocument', 'GET')) {
|
if(!checkFormKey('unlockdocument', 'GET')) {
|
||||||
UI::exitError(getMLText("document_title"), getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title"), getMLText("invalid_request_token"));
|
||||||
|
@ -44,6 +49,11 @@ if (!is_object($document)) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('LockDocument', $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
$folder = $document->getFolder();
|
$folder = $document->getFolder();
|
||||||
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,10 @@ include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
/* if post_max_size is to small, then $_POST will not be set and the content
|
/* if post_max_size is to small, then $_POST will not be set and the content
|
||||||
* lenght will exceed post_max_size
|
* lenght will exceed post_max_size
|
||||||
|
@ -210,10 +214,13 @@ default:
|
||||||
// Get the list of reviewers and approvers for this document.
|
// Get the list of reviewers and approvers for this document.
|
||||||
$reviewers = array();
|
$reviewers = array();
|
||||||
$approvers = array();
|
$approvers = array();
|
||||||
|
$recipients = array();
|
||||||
$reviewers["i"] = array();
|
$reviewers["i"] = array();
|
||||||
$reviewers["g"] = array();
|
$reviewers["g"] = array();
|
||||||
$approvers["i"] = array();
|
$approvers["i"] = array();
|
||||||
$approvers["g"] = array();
|
$approvers["g"] = array();
|
||||||
|
$recipients["i"] = array();
|
||||||
|
$recipients["g"] = array();
|
||||||
$workflow = null;
|
$workflow = null;
|
||||||
|
|
||||||
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
||||||
|
@ -232,6 +239,16 @@ default:
|
||||||
$reviewers["g"][] = $grp;
|
$reviewers["g"][] = $grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndReviewers"])) {
|
||||||
|
foreach ($_POST["grpIndReviewers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$reviewers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the list of individual approvers from the form.
|
// Retrieve the list of individual approvers from the form.
|
||||||
|
@ -248,6 +265,16 @@ default:
|
||||||
$approvers["g"][] = $grp;
|
$approvers["g"][] = $grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual approvers
|
||||||
|
if (isset($_POST["grpIndApprovers"])) {
|
||||||
|
foreach ($_POST["grpIndApprovers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$approvers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// add mandatory reviewers/approvers
|
// add mandatory reviewers/approvers
|
||||||
if($settings->_workflowMode == 'traditional') {
|
if($settings->_workflowMode == 'traditional') {
|
||||||
|
@ -262,6 +289,13 @@ default:
|
||||||
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
|
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
|
||||||
if($mapprovers['g'])
|
if($mapprovers['g'])
|
||||||
$approvers['g'] = array_merge($approvers['g'], $mapprovers['g']);
|
$approvers['g'] = array_merge($approvers['g'], $mapprovers['g']);
|
||||||
|
|
||||||
|
if($settings->_workflowMode == 'traditional' && !$settings->_allowReviewerOnly) {
|
||||||
|
/* Check if reviewers are send but no approvers */
|
||||||
|
if(($reviewers["i"] || $reviewers["g"]) && !$approvers["i"] && !$approvers["g"]) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_uploading_reviewer_only"));
|
||||||
|
}
|
||||||
|
}
|
||||||
} elseif($settings->_workflowMode == 'advanced') {
|
} elseif($settings->_workflowMode == 'advanced') {
|
||||||
if(!$workflows = $user->getMandatoryWorkflows()) {
|
if(!$workflows = $user->getMandatoryWorkflows()) {
|
||||||
if(isset($_POST["workflow"]))
|
if(isset($_POST["workflow"]))
|
||||||
|
@ -279,6 +313,35 @@ default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual recipients from the form.
|
||||||
|
$recipients["i"] = array();
|
||||||
|
if (isset($_POST["indRecipients"])) {
|
||||||
|
foreach ($_POST["indRecipients"] as $ind) {
|
||||||
|
$recipients["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups from the form.
|
||||||
|
$recipients["g"] = array();
|
||||||
|
if (isset($_POST["grpRecipients"])) {
|
||||||
|
foreach ($_POST["grpRecipients"] as $grp) {
|
||||||
|
$recipients["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups whose members become individual recipients
|
||||||
|
if (isset($_POST["grpIndRecipients"])) {
|
||||||
|
foreach ($_POST["grpIndRecipients"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
/* Do not add the uploader itself as recipient */
|
||||||
|
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
|
||||||
|
if(!in_array($member->getID(), $recipients["i"]))
|
||||||
|
$recipients["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(isset($_POST["attributes_version"]) && $_POST["attributes_version"]) {
|
if(isset($_POST["attributes_version"]) && $_POST["attributes_version"]) {
|
||||||
$attributes = $_POST["attributes_version"];
|
$attributes = $_POST["attributes_version"];
|
||||||
foreach($attributes as $attrdefid=>$attribute) {
|
foreach($attributes as $attrdefid=>$attribute) {
|
||||||
|
@ -315,8 +378,10 @@ default:
|
||||||
$controller->setParam('userfiletype', $userfiletype);
|
$controller->setParam('userfiletype', $userfiletype);
|
||||||
$controller->setParam('reviewers', $reviewers);
|
$controller->setParam('reviewers', $reviewers);
|
||||||
$controller->setParam('approvers', $approvers);
|
$controller->setParam('approvers', $approvers);
|
||||||
|
$controller->setParam('recipients', $recipients);
|
||||||
$controller->setParam('attributes', $attributes);
|
$controller->setParam('attributes', $attributes);
|
||||||
$controller->setParam('workflow', $workflow);
|
$controller->setParam('workflow', $workflow);
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
|
|
||||||
if(!$content = $controller()) {
|
if(!$content = $controller()) {
|
||||||
|
|
|
@ -155,7 +155,7 @@ if( move_uploaded_file( $source_file_path, $target_file_path ) ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
|
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
|
||||||
$contentResult=$document->addContent($comment, $user, $userfiletmp, basename($userfilename), $fileType, $userfiletype, $reviewers, $approvers);
|
$contentResult=$document->addContent($comment, $user, $userfiletmp, basename($userfilename), $fileType, $userfiletype, $reviewers, $approvers, $version=0, null, null, $settings->_initialDocumentStatus);
|
||||||
unlink($userfiletmp);
|
unlink($userfiletmp);
|
||||||
if (is_bool($contentResult) && !$contentResult) {
|
if (is_bool($contentResult) && !$contentResult) {
|
||||||
echo getMLText("error_occured");
|
echo getMLText("error_occured");
|
||||||
|
|
|
@ -34,7 +34,7 @@ if (!$user->isAdmin()) {
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
if (!$accessop->check_controller_access('UsrMgr', $_POST)) {
|
if (!$accessop->check_controller_access('UsrMgr', $_POST)) {
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ if ($action == "adduser") {
|
||||||
if ($settings->_strictFormCheck && !$comment) {
|
if ($settings->_strictFormCheck && !$comment) {
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("user_comment_missing"));
|
UI::exitError(getMLText("admin_tools"),getMLText("user_comment_missing"));
|
||||||
}
|
}
|
||||||
$role = preg_replace('/[^0-2]+/', '', $_POST["role"]);
|
$role = $dms->getRole($_POST["role"]);
|
||||||
$isHidden = (isset($_POST["ishidden"]) && $_POST["ishidden"]==1 ? 1 : 0);
|
$isHidden = (isset($_POST["ishidden"]) && $_POST["ishidden"]==1 ? 1 : 0);
|
||||||
$isDisabled = (isset($_POST["isdisabled"]) && $_POST["isdisabled"]==1 ? 1 : 0);
|
$isDisabled = (isset($_POST["isdisabled"]) && $_POST["isdisabled"]==1 ? 1 : 0);
|
||||||
$homefolder = (isset($_POST["homefolder"]) ? $_POST["homefolder"] : 0);
|
$homefolder = (isset($_POST["homefolder"]) ? $_POST["homefolder"] : 0);
|
||||||
|
@ -103,6 +103,14 @@ if ($action == "adduser") {
|
||||||
$group->addUser($newUser);
|
$group->addUser($newUser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set substitute user if set */
|
||||||
|
if(isset($_POST["substitute"]) && $_POST["substitute"]) {
|
||||||
|
foreach($_POST["substitute"] as $substitute) {
|
||||||
|
$subsuser = $dms->getUser($substitute);
|
||||||
|
$newUser->addSubstitute($subsuser);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
else UI::exitError(getMLText("admin_tools"),getMLText("access_denied"));
|
||||||
|
|
||||||
|
@ -227,6 +235,10 @@ else if ($action == "removefromprocesses") {
|
||||||
$_POST["status"]["review"] = array();
|
$_POST["status"]["review"] = array();
|
||||||
if(!isset($_POST["status"]["approval"]))
|
if(!isset($_POST["status"]["approval"]))
|
||||||
$_POST["status"]["approval"] = array();
|
$_POST["status"]["approval"] = array();
|
||||||
|
if(!isset($_POST["status"]["receipt"]))
|
||||||
|
$_POST["status"]["receipt"] = array();
|
||||||
|
if(!isset($_POST["status"]["revision"]))
|
||||||
|
$_POST["status"]["revision"] = array();
|
||||||
if(!empty($_POST['needsdocs']) && empty($_POST['docs'])) {
|
if(!empty($_POST['needsdocs']) && empty($_POST['docs'])) {
|
||||||
$session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('error_rm_user_processes_no_docs')));
|
$session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('error_rm_user_processes_no_docs')));
|
||||||
} else {
|
} else {
|
||||||
|
@ -362,7 +374,7 @@ else if ($action == "edituser") {
|
||||||
$email = $_POST["email"];
|
$email = $_POST["email"];
|
||||||
$comment = $_POST["comment"];
|
$comment = $_POST["comment"];
|
||||||
$theme = $_POST["theme"];
|
$theme = $_POST["theme"];
|
||||||
$role = preg_replace('/[^0-2]+/', '', $_POST["role"]);
|
$role = $dms->getRole($_POST["role"]);
|
||||||
$isHidden = (isset($_POST["ishidden"]) && $_POST["ishidden"]==1 ? 1 : 0);
|
$isHidden = (isset($_POST["ishidden"]) && $_POST["ishidden"]==1 ? 1 : 0);
|
||||||
$isDisabled = (isset($_POST["isdisabled"]) && $_POST["isdisabled"]==1 ? 1 : 0);
|
$isDisabled = (isset($_POST["isdisabled"]) && $_POST["isdisabled"]==1 ? 1 : 0);
|
||||||
$homefolder = (isset($_POST["homefolder"]) ? $_POST["homefolder"] : 0);
|
$homefolder = (isset($_POST["homefolder"]) ? $_POST["homefolder"] : 0);
|
||||||
|
@ -384,9 +396,9 @@ else if ($action == "edituser") {
|
||||||
}
|
}
|
||||||
if ($editedUser->getLogin() != $login)
|
if ($editedUser->getLogin() != $login)
|
||||||
$editedUser->setLogin($login);
|
$editedUser->setLogin($login);
|
||||||
if($pwdexpiration)
|
if($pwdexpiration != 'keep')
|
||||||
$editedUser->setPwdExpiration($pwdexpiration);
|
$editedUser->setPwdExpiration($pwdexpiration);
|
||||||
if(($role == SeedDMS_Core_User::role_guest) && $clearpwd) {
|
if($role->isGuest() && $clearpwd) {
|
||||||
$editedUser->setPwd('');
|
$editedUser->setPwd('');
|
||||||
} else {
|
} else {
|
||||||
if (isset($pwd) && ($pwd != "")) {
|
if (isset($pwd) && ($pwd != "")) {
|
||||||
|
@ -478,6 +490,26 @@ else if ($action == "edituser") {
|
||||||
$group->removeUser($editedUser);
|
$group->removeUser($editedUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set substitute user if set */
|
||||||
|
if(isset($_POST["substitute"]) && $_POST["substitute"])
|
||||||
|
$newsubs = $_POST['substitute'];
|
||||||
|
else
|
||||||
|
$newsubs = array();
|
||||||
|
$oldsubs = array();
|
||||||
|
foreach($editedUser->getSubstitutes() as $k)
|
||||||
|
$oldsubs[] = $k->getID();
|
||||||
|
|
||||||
|
$addsubs = array_diff($newsubs, $oldsubs);
|
||||||
|
foreach($addsubs as $subid) {
|
||||||
|
$subsuser = $dms->getUser($subid);
|
||||||
|
$editedUser->addSubstitute($subsuser);
|
||||||
|
}
|
||||||
|
$delsubs = array_diff($oldsubs, $newsubs);
|
||||||
|
foreach($delsubs as $subid) {
|
||||||
|
$subsuser = $dms->getUser($subid);
|
||||||
|
$editedUser->removeSubstitute($subsuser);
|
||||||
|
}
|
||||||
|
|
||||||
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_edit_user')));
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_edit_user')));
|
||||||
add_log_line(".php&action=edituser&userid=".$userid);
|
add_log_line(".php&action=edituser&userid=".$userid);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => "")),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
$documentid = $_GET["documentid"];
|
$documentid = $_GET["documentid"];
|
||||||
if (!isset($documentid) || !is_numeric($documentid) || intval($documentid)<1) {
|
if (!isset($documentid) || !is_numeric($documentid) || intval($documentid)<1) {
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user