mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
Compare commits
4342 Commits
1.70RC2
...
2022.01.07
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1746af927b | ||
|
|
2eca8ffba2 | ||
|
|
6ef0c06a19 | ||
|
|
af68f1a16e | ||
|
|
f429839a17 | ||
|
|
66770e602a | ||
|
|
f760131cf5 | ||
|
|
cdc1d5064f | ||
|
|
3b707d29b9 | ||
|
|
df632bb1f0 | ||
|
|
74cb453995 | ||
|
|
f8eec94b04 | ||
|
|
697efacc58 | ||
|
|
ff9cff8f44 | ||
|
|
d78388646d | ||
|
|
05ffcdeef7 | ||
|
|
3b8e347a9e | ||
|
|
37f160f698 | ||
|
|
6f1446339c | ||
|
|
fed44dc366 | ||
|
|
c71ec34998 | ||
|
|
157bda8f51 | ||
|
|
d80e5bc792 | ||
|
|
f9669e8158 | ||
|
|
04c83c608b | ||
|
|
9f50037e11 | ||
|
|
33fd741ba7 | ||
|
|
035c3f9319 | ||
|
|
3df922340d | ||
|
|
72b9190e2f | ||
|
|
8fe1bdf39a | ||
|
|
f78bf2bc8a | ||
|
|
a1f0a69874 | ||
|
|
8a26b2f433 | ||
|
|
a18784d2c7 | ||
|
|
3c25a987fd | ||
|
|
7cebc4ef42 | ||
|
|
a8ab46d5c8 | ||
|
|
8bac5a8c54 | ||
|
|
801a41ae10 | ||
|
|
47e37afe12 | ||
|
|
942bf7d8cb | ||
|
|
0e8d573819 | ||
|
|
2bdfd7401e | ||
|
|
68dd6b1e23 | ||
|
|
2fe85ae0e5 | ||
|
|
e9fa1c3b5e | ||
|
|
f543b83cfc | ||
|
|
2d917ca11a | ||
|
|
2c830627ef | ||
|
|
46003a3509 | ||
|
|
6b0412586e | ||
|
|
36ca7ffbdb | ||
|
|
e5244f1fec | ||
|
|
359a7272e8 | ||
|
|
82cd3a7e56 | ||
|
|
a2e78fd08a | ||
|
|
a48b5e9d65 | ||
|
|
f4c4d9ea8c | ||
|
|
02ed45fa61 | ||
|
|
ad227ea2ee | ||
|
|
d7e2358d3e | ||
|
|
196e98e4a7 | ||
|
|
00bc45fba1 | ||
|
|
62c0d3f07f | ||
|
|
d42574a16c | ||
|
|
a854b04293 | ||
|
|
96632da4d7 | ||
|
|
cf18d6b1e9 | ||
|
|
262e2e1b85 | ||
|
|
743c46de70 | ||
|
|
9624bc96c9 | ||
|
|
1643bb7d59 | ||
|
|
edad5a838f | ||
|
|
fb35226e20 | ||
|
|
40605737b1 | ||
|
|
01a62e099e | ||
|
|
80748bb66b | ||
|
|
c6c77e9bc4 | ||
|
|
1f462648c4 | ||
|
|
099256e5d4 | ||
|
|
8735d24122 | ||
|
|
b2fc3967d3 | ||
|
|
0ec02cfa56 | ||
|
|
ade36d6876 | ||
|
|
73313d7dae | ||
|
|
7db9865ffa | ||
|
|
40656cb70b | ||
|
|
b5a07f3e79 | ||
|
|
66877ce9b1 | ||
|
|
57b067b4e2 | ||
|
|
74999e9394 | ||
|
|
f4d6f1e5ee | ||
|
|
096f670eb3 | ||
|
|
bceaca49bf | ||
|
|
5e94c84516 | ||
|
|
28dc14e739 | ||
|
|
d5d28e80cb | ||
|
|
f1eea76249 | ||
|
|
0976404eda | ||
|
|
8074c9a7c6 | ||
|
|
513af43fca | ||
|
|
afd5d76992 | ||
|
|
a31da5f880 | ||
|
|
be470f50ec | ||
|
|
a04494346e | ||
|
|
797533459e | ||
|
|
22e879ef18 | ||
|
|
dc6bc5b4d6 | ||
|
|
a6c7457c59 | ||
|
|
b609cfba2a | ||
|
|
345980f457 | ||
|
|
5a86a0a8cb | ||
|
|
24c1ce3f4a | ||
|
|
fc65c2583e | ||
|
|
1df3c33f69 | ||
|
|
98a9cc7436 | ||
|
|
ff88d4649c | ||
|
|
8c61306a8d | ||
|
|
6496e34868 | ||
|
|
7d6c9d517c | ||
|
|
d918d8ffd1 | ||
|
|
ca61ea09d0 | ||
|
|
faff230d42 | ||
|
|
c288c3d071 | ||
|
|
500a22b0b6 | ||
|
|
ba1317d245 | ||
|
|
5cfbfc5071 | ||
|
|
bf4b9d5355 | ||
|
|
904f0bc202 | ||
|
|
94c546bd0f | ||
|
|
64f1e10a5e | ||
|
|
8b20da78ff | ||
|
|
1be4ef437d | ||
|
|
76da9c3247 | ||
|
|
1e4dcc23d7 | ||
|
|
9c95e7fd96 | ||
|
|
cea5f57c60 | ||
|
|
19e6d37b62 | ||
|
|
018979d17f | ||
|
|
8bd398cbd6 | ||
|
|
59872b14cf | ||
|
|
c5240d72e1 | ||
|
|
77b54f9a10 | ||
|
|
b5bcb5b3bb | ||
|
|
87c500138b | ||
|
|
f3f384ebcc | ||
|
|
08de2eacd6 | ||
|
|
b763d968fe | ||
|
|
3b05eba2e2 | ||
|
|
b6d2c72a40 | ||
|
|
e6d2c9791d | ||
|
|
91a0eeb29a | ||
|
|
8c9c4865f2 | ||
|
|
6fbd4a7c88 | ||
|
|
239adaa129 | ||
|
|
9f8c82b649 | ||
|
|
7875bb6ebd | ||
|
|
a33abf3f56 | ||
|
|
1fadadcdb5 | ||
|
|
a294dec0dc | ||
|
|
5de75e6a8a | ||
|
|
4b44be2e54 | ||
|
|
b5f1d63175 | ||
|
|
1c5695df7e | ||
|
|
1808ad9ad7 | ||
|
|
8dc5e81374 | ||
|
|
b899056a8e | ||
|
|
f884c47ad8 | ||
|
|
07eae639b6 | ||
|
|
d2349bd713 | ||
|
|
28ee3c6e8f | ||
|
|
4430f269f7 | ||
|
|
a72f7d63f6 | ||
|
|
859b6f8ac5 | ||
|
|
a7f238aba3 | ||
|
|
e0cff27aae | ||
|
|
d9c4a6ec76 | ||
|
|
4d95bc4255 | ||
|
|
fdea0144b0 | ||
|
|
7398a373c2 | ||
|
|
c88e45cde8 | ||
|
|
f77848e3d9 | ||
|
|
5ed78cc3b6 | ||
|
|
1b4593bb62 | ||
|
|
c620e26644 | ||
|
|
74af24c3db | ||
|
|
ac1f32f773 | ||
|
|
99c7dbb332 | ||
|
|
b0632b8910 | ||
|
|
d26a9615c0 | ||
|
|
f609d6e0b2 | ||
|
|
e5042712b6 | ||
|
|
bf93d3af04 | ||
|
|
ea43abe392 | ||
|
|
0e74314ddc | ||
|
|
54eabd6a74 | ||
|
|
2f52473566 | ||
|
|
98e7250b3c | ||
|
|
882438f5e0 | ||
|
|
bb93dddd39 | ||
|
|
59f6a8a933 | ||
|
|
8ce83f3cd0 | ||
|
|
745e402da9 | ||
|
|
6cbe1c92d5 | ||
|
|
54fc2fb4c6 | ||
|
|
adc2815ab5 | ||
|
|
75f9f647ee | ||
|
|
f14f7dbb72 | ||
|
|
4978618e9a | ||
|
|
59b9f4f15b | ||
|
|
7ff0ce5369 | ||
|
|
93bd278819 | ||
|
|
b97b1f3690 | ||
|
|
307f374be1 | ||
|
|
17f701824e | ||
|
|
c7b89dcf71 | ||
|
|
fc527a947f | ||
|
|
d0520690a2 | ||
|
|
315d020b6f | ||
|
|
8a4bcdef52 | ||
|
|
727ef34c6d | ||
|
|
d8bc06d05d | ||
|
|
def214dde2 | ||
|
|
219f948c4a | ||
|
|
72193eccf0 | ||
|
|
7eb85c6a3d | ||
|
|
954c667173 | ||
|
|
33c738df5f | ||
|
|
2141fe298f | ||
|
|
8e73f512b4 | ||
|
|
92dddb8fd8 | ||
|
|
e9869f4c88 | ||
|
|
52597d4dcb | ||
|
|
dc7ce27b81 | ||
|
|
4242595a66 | ||
|
|
50b9a11503 | ||
|
|
621a723602 | ||
|
|
6260cc3655 | ||
|
|
300e668327 | ||
|
|
3cf274c37a | ||
|
|
2ca356ee5c | ||
|
|
ca8751c40c | ||
|
|
3c7e97d2d9 | ||
|
|
dbe2d690da | ||
|
|
949410e2cc | ||
|
|
100f856b5f | ||
|
|
d7bee01454 | ||
|
|
5566081986 | ||
|
|
29f7dd93f3 | ||
|
|
3dd8db5728 | ||
|
|
17e70d11f5 | ||
|
|
f8afd439b2 | ||
|
|
0dc61b1c26 | ||
|
|
de6c4fcb17 | ||
|
|
57f5c854ff | ||
|
|
4f4523ab77 | ||
|
|
e34e632519 | ||
|
|
f810b902a6 | ||
|
|
fd5bdc1484 | ||
|
|
e3a12ae6c5 | ||
|
|
c9c5664ec6 | ||
|
|
75cff549ce | ||
|
|
885cb6915d | ||
|
|
f9396a4ecf | ||
|
|
f1a03329e5 | ||
|
|
f65be671a3 | ||
|
|
fa9e8f6cba | ||
|
|
67a3e76cfe | ||
|
|
e4569c0bb8 | ||
|
|
6f1a62e917 | ||
|
|
3f6e21f15a | ||
|
|
46c4287c67 | ||
|
|
1ea1826a27 | ||
|
|
151457daf0 | ||
|
|
38cc21fa3a | ||
|
|
77f759f258 | ||
|
|
07c04061c2 | ||
|
|
d4bf6ed0c8 | ||
|
|
ebd46efe81 | ||
|
|
24d193efb0 | ||
|
|
3b2a63178f | ||
|
|
78f60afb85 | ||
|
|
52a7957789 | ||
|
|
6870583b1c | ||
|
|
9ffe514350 | ||
|
|
fc6e04497a | ||
|
|
cfb3f9a3ca | ||
|
|
d47fac791e | ||
|
|
490b70c2d3 | ||
|
|
3eecdd9ada | ||
|
|
7bdbc5417c | ||
|
|
2cd07dcb72 | ||
|
|
adb83ade67 | ||
|
|
a90f5da8b0 | ||
|
|
38937a4f83 | ||
|
|
31f35a23ee | ||
|
|
74de010d3c | ||
|
|
a9e4c880df | ||
|
|
b7fe265604 | ||
|
|
25c4af5a9f | ||
|
|
b3ecf702e1 | ||
|
|
c34a3cc7e7 | ||
|
|
158783f2d1 | ||
|
|
624192d301 | ||
|
|
e9be139ed0 | ||
|
|
2b9195ed9c | ||
|
|
dfdfecba57 | ||
|
|
2d6fec13fb | ||
|
|
216f340468 | ||
|
|
a4211a7e55 | ||
|
|
d6a2488fde | ||
|
|
d4d60439b6 | ||
|
|
75edd0d8ef | ||
|
|
b4e6e21094 | ||
|
|
8c48bc926e | ||
|
|
031b6fb30d | ||
|
|
647542e462 | ||
|
|
dbf28d83f3 | ||
|
|
142acdd42f | ||
|
|
ce103d30d3 | ||
|
|
556d65e8b4 | ||
|
|
e0cf070bd0 | ||
|
|
70c5a336c2 | ||
|
|
f82d5fbd2d | ||
|
|
31418ba6f7 | ||
|
|
3c10bb2669 | ||
|
|
0e009a2762 | ||
|
|
cfd718872b | ||
|
|
f57b278ef8 | ||
|
|
730833feff | ||
|
|
4168dda535 | ||
|
|
639261a5a4 | ||
|
|
c4db6fac13 | ||
|
|
264ac7662d | ||
|
|
8237ed1a1d | ||
|
|
f82cb73100 | ||
|
|
15fc27681f | ||
|
|
81beb3285e | ||
|
|
39ff3798ca | ||
|
|
8826b0dba0 | ||
|
|
e56884c1d8 | ||
|
|
95b81193e7 | ||
|
|
508e93483e | ||
|
|
c55d9b4042 | ||
|
|
aef47609a3 | ||
|
|
5bb3c077b0 | ||
|
|
501304c51f | ||
|
|
d9c1a385e0 | ||
|
|
d6c51427a0 | ||
|
|
2cf5a4317d | ||
|
|
b344e3a749 | ||
|
|
6751ff1af3 | ||
|
|
7006796f6b | ||
|
|
1d11d4bca8 | ||
|
|
43af32585a | ||
|
|
7aa5d399e9 | ||
|
|
004e161895 | ||
|
|
ba1c6d44c6 | ||
|
|
87a08077ed | ||
|
|
33b6a4e6cd | ||
|
|
29b0af1d62 | ||
|
|
7e3b0f7aed | ||
|
|
135c5988ba | ||
|
|
67dfd6b036 | ||
|
|
162eb0c958 | ||
|
|
a2dcc42f68 | ||
|
|
6b7f6dcb19 | ||
|
|
fbcf9ccbd6 | ||
|
|
02e4e71b5d | ||
|
|
a71ba82521 | ||
|
|
cda0e3cee3 | ||
|
|
1218638794 | ||
|
|
761694cdcc | ||
|
|
bb63e3a1f1 | ||
|
|
a9b1d84b6e | ||
|
|
a465614506 | ||
|
|
3055ef208e | ||
|
|
e6cf9dce1c | ||
|
|
9232535763 | ||
|
|
091c44bb45 | ||
|
|
f088249260 | ||
|
|
dc108576e1 | ||
|
|
5c4da38a52 | ||
|
|
1e0a19f865 | ||
|
|
390e84a96a | ||
|
|
4a91a8e4c3 | ||
|
|
0b1d6d5e04 | ||
|
|
a5eed483e5 | ||
|
|
4e9622fde7 | ||
|
|
f6447c3343 | ||
|
|
605d4a89ac | ||
|
|
b5d4b8514a | ||
|
|
5470a3d808 | ||
|
|
d845e6b520 | ||
|
|
ee4d8a1939 | ||
|
|
acbd233345 | ||
|
|
77d1e51ce4 | ||
|
|
af7e75c2df | ||
|
|
9b4519978b | ||
|
|
8244b3d731 | ||
|
|
0d721900f9 | ||
|
|
585de5dbc6 | ||
|
|
7b85394a8b | ||
|
|
3b842798b8 | ||
|
|
1aaf3c1cb5 | ||
|
|
84206f701a | ||
|
|
9e62c3df7e | ||
|
|
430a2529db | ||
|
|
6911a928af | ||
|
|
cf9b7f1cb5 | ||
|
|
f695bbdc8b | ||
|
|
40a4291b07 | ||
|
|
97bd0a11f3 | ||
|
|
9b77d390c0 | ||
|
|
c0a6240764 | ||
|
|
86e0b058e5 | ||
|
|
c0a107cbfd | ||
|
|
7912623810 | ||
|
|
b72b740d7a | ||
|
|
395ab7ff9e | ||
|
|
bb75b3ea75 | ||
|
|
6bc22fe060 | ||
|
|
7e634e75cd | ||
|
|
3770bf44ed | ||
|
|
30914437b2 | ||
|
|
892a9b98fa | ||
|
|
a791befd49 | ||
|
|
76812b3233 | ||
|
|
3b000189fd | ||
|
|
b066feeb7e | ||
|
|
f7872d0d84 | ||
|
|
46e5d8e669 | ||
|
|
57018bfba7 | ||
|
|
3f7e7c50b3 | ||
|
|
90065605a9 | ||
|
|
956128683a | ||
|
|
a0dd270578 | ||
|
|
d71067d246 | ||
|
|
f8567bca79 | ||
|
|
455e417a70 | ||
|
|
99b525d42f | ||
|
|
41ccb34bd4 | ||
|
|
277d6fdd45 | ||
|
|
f40b8e9a75 | ||
|
|
eb580ab82b | ||
|
|
7eaa7f6f29 | ||
|
|
358f92e720 | ||
|
|
fde3699ebc | ||
|
|
705525cc1d | ||
|
|
38fed7b55e | ||
|
|
ec494c2e0f | ||
|
|
fd80dcee61 | ||
|
|
366d87e6ec | ||
|
|
f7e2685213 | ||
|
|
c2ef8fc188 | ||
|
|
8ea8c411d6 | ||
|
|
09f82a6079 | ||
|
|
91106be934 | ||
|
|
772a1527f0 | ||
|
|
e39db26c13 | ||
|
|
56bb513bdc | ||
|
|
0d511c58ed | ||
|
|
7ddd6fa22a | ||
|
|
256ea606ed | ||
|
|
e767dcc5cf | ||
|
|
381850ec4b | ||
|
|
382af99ade | ||
|
|
d719a0d52a | ||
|
|
68d2bd7ea9 | ||
|
|
d30c10f9dc | ||
|
|
9da9616cc4 | ||
|
|
87ca31fc45 | ||
|
|
193cbdb7aa | ||
|
|
55e7df18f5 | ||
|
|
f850635260 | ||
|
|
aecaf3fae9 | ||
|
|
fe4c687bdf | ||
|
|
c5f185462a | ||
|
|
0b80ffa1d0 | ||
|
|
5cafdcd4ee | ||
|
|
57d72d2cf6 | ||
|
|
5ccc2b1d2a | ||
|
|
ea654cf9e6 | ||
|
|
cb926c4178 | ||
|
|
d7b47ab8b1 | ||
|
|
5fe0ef3646 | ||
|
|
1a10acbb90 | ||
|
|
b565a0375c | ||
|
|
87f842203c | ||
|
|
b03b5830b1 | ||
|
|
9577bb77da | ||
|
|
431172515a | ||
|
|
2c64625eac | ||
|
|
9687847630 | ||
|
|
c9239e2d87 | ||
|
|
3931174890 | ||
|
|
a9b062a9d5 | ||
|
|
8578df57c6 | ||
|
|
7b621afa98 | ||
|
|
ef83160308 | ||
|
|
fad42f373e | ||
|
|
d3f66dd7bb | ||
|
|
85fefdfabd | ||
|
|
e36fb09ce5 | ||
|
|
bdcb8da2db | ||
|
|
4be7385628 | ||
|
|
7ed4bf46d7 | ||
|
|
98dd451502 | ||
|
|
c5ded4ceac | ||
|
|
8ba2bf39ff | ||
|
|
0bafacbee3 | ||
|
|
ff9292bc42 | ||
|
|
4df334ae86 | ||
|
|
7e10a613b6 | ||
|
|
eece2a13c5 | ||
|
|
1165e639fd | ||
|
|
ab9ffb45fd | ||
|
|
e2cf3095e4 | ||
|
|
0caa0ee004 | ||
|
|
464fcc54ce | ||
|
|
049374b8ad | ||
|
|
6b392f55c6 | ||
|
|
421076062c | ||
|
|
9b86b92a65 | ||
|
|
ec0e733fc6 | ||
|
|
a62b8103a0 | ||
|
|
1eedc99114 | ||
|
|
c8774abbab | ||
|
|
8d2217aa88 | ||
|
|
85d0a88420 | ||
|
|
a66b6d7392 | ||
|
|
0ebcc3c06d | ||
|
|
f534883d62 | ||
|
|
4726671035 | ||
|
|
bdd54afc8a | ||
|
|
d511976ba6 | ||
|
|
f83ed6dfb2 | ||
|
|
4137e7f25e | ||
|
|
aca46b76b1 | ||
|
|
4c773738d7 | ||
|
|
eb8ab94e01 | ||
|
|
11f5fb4aa2 | ||
|
|
f025733926 | ||
|
|
9e2b8e2003 | ||
|
|
ef081848b0 | ||
|
|
6aa1eea2fd | ||
|
|
ab5aa4d83b | ||
|
|
a8005293af | ||
|
|
81891e0976 | ||
|
|
fcf146fccc | ||
|
|
8729e3f040 | ||
|
|
10673362a6 | ||
|
|
a8a70e43cb | ||
|
|
369b3402be | ||
|
|
bc70548627 | ||
|
|
39245b93d9 | ||
|
|
1f8582b8fa | ||
|
|
acb1bdc8e1 | ||
|
|
cd7a102dc9 | ||
|
|
58ed22a326 | ||
|
|
5771c7f798 | ||
|
|
9598927dec | ||
|
|
abffbb8598 | ||
|
|
36b9d01917 | ||
|
|
417eec1d45 | ||
|
|
0eb823ef89 | ||
|
|
56c9435512 | ||
|
|
98bd901545 | ||
|
|
e9607c30fb | ||
|
|
281e3f0c79 | ||
|
|
4f98b59e4f | ||
|
|
1d40791557 | ||
|
|
212cd8378c | ||
|
|
ae108f1e14 | ||
|
|
e7ed902f24 | ||
|
|
3d93f793d5 | ||
|
|
9257b7ac52 | ||
|
|
28d131f74d | ||
|
|
76e1ae3596 | ||
|
|
8357cfc9b5 | ||
|
|
1250f389af | ||
|
|
d0ae6ee21a | ||
|
|
40f5bd9444 | ||
|
|
c3ea05b862 | ||
|
|
488c6f5f64 | ||
|
|
a1940e3ab9 | ||
|
|
eda873911a | ||
|
|
048f890dcb | ||
|
|
28c31fc101 | ||
|
|
852c6576cf | ||
|
|
00a5fc0142 | ||
|
|
48cca34055 | ||
|
|
b2c5298400 | ||
|
|
cf5d5e6974 | ||
|
|
3266485307 | ||
|
|
d27ae45512 | ||
|
|
c9f0ea47b7 | ||
|
|
d5100660fb | ||
|
|
5c07327467 | ||
|
|
1e374d3a25 | ||
|
|
d68c419bab | ||
|
|
a9c4d0dee5 | ||
|
|
75a453e598 | ||
|
|
404f23e7e6 | ||
|
|
104be16061 | ||
|
|
742301edf8 | ||
|
|
c3734f2e09 | ||
|
|
e0cd4f2e0a | ||
|
|
db6042a30e | ||
|
|
0e233e7027 | ||
|
|
8e5d41bfea | ||
|
|
8bb03195b5 | ||
|
|
de2bafd5a0 | ||
|
|
4c08d06e93 | ||
|
|
ab5b58f3ae | ||
|
|
31f637bc51 | ||
|
|
fbcfdb3fea | ||
|
|
b1c650bb72 | ||
|
|
209a3fb381 | ||
|
|
772a11cb1d | ||
|
|
758f7770a1 | ||
|
|
b319eb188a | ||
|
|
8ad7547640 | ||
|
|
8b060745ef | ||
|
|
baf2037ca1 | ||
|
|
7bf00e30e6 | ||
|
|
55c983c565 | ||
|
|
6a4cd70811 | ||
|
|
851f8dedec | ||
|
|
652a580ec6 | ||
|
|
0d2a2134b9 | ||
|
|
a330d3e943 | ||
|
|
0034f78edc | ||
|
|
27e71ebfc7 | ||
|
|
f0f3ddef87 | ||
|
|
f65478ee36 | ||
|
|
4bd7d63d9c | ||
|
|
bf31b23878 | ||
|
|
c2ba6d87b2 | ||
|
|
978a53852a | ||
|
|
d20a186e5e | ||
|
|
c384ec373a | ||
|
|
c5e0a18dfa | ||
|
|
4d1ab9ee9f | ||
|
|
02384dc26f | ||
|
|
e46a53f188 | ||
|
|
0343254cad | ||
|
|
9aaafa5015 | ||
|
|
04bd78e91a | ||
|
|
7ce17c7fb3 | ||
|
|
2a796d3bf5 | ||
|
|
944aa6b13e | ||
|
|
58add600d6 | ||
|
|
b1089de1ad | ||
|
|
69c1e2ccc2 | ||
|
|
6ec23d9d69 | ||
|
|
de3072c67e | ||
|
|
35f6d3eb90 | ||
|
|
f0ffcc6944 | ||
|
|
5ab3f71551 | ||
|
|
cef3b9294d | ||
|
|
11e3075347 | ||
|
|
0008631771 | ||
|
|
8e5caaca55 | ||
|
|
8c962e8b60 | ||
|
|
7ebcba3c21 | ||
|
|
7ac45dbd32 | ||
|
|
b83488d08a | ||
|
|
5528b701fb | ||
|
|
8767d103f0 | ||
|
|
ca66656a8e | ||
|
|
41e299aaaf | ||
|
|
c3f44ef70a | ||
|
|
fa44e66bd9 | ||
|
|
0b944c4222 | ||
|
|
11abc789a0 | ||
|
|
15e2cdaad0 | ||
|
|
10b6973f0d | ||
|
|
24cd9f257c | ||
|
|
8ecb49709e | ||
|
|
e12d20ab85 | ||
|
|
8b7f7b16a8 | ||
|
|
117e57d7b0 | ||
|
|
56b3f9355a | ||
|
|
70af08616f | ||
|
|
6066cb708e | ||
|
|
c1b6bd4679 | ||
|
|
88617759f6 | ||
|
|
3df98602ee | ||
|
|
3da989e37f | ||
|
|
f735237b3a | ||
|
|
125330b695 | ||
|
|
11199eabf3 | ||
|
|
12b4eb64ba | ||
|
|
d62fd25db5 | ||
|
|
58851aadb0 | ||
|
|
322049196c | ||
|
|
ce85801dcf | ||
|
|
04ad29d7c9 | ||
|
|
92f532c694 | ||
|
|
9188979367 | ||
|
|
b21379952b | ||
|
|
900c5c8351 | ||
|
|
5cab342c8c | ||
|
|
69e4bc2650 | ||
|
|
cabd712b75 | ||
|
|
fe4266a41e | ||
|
|
07fa8232e4 | ||
|
|
d02ec9bec6 | ||
|
|
47a508b9ea | ||
|
|
6c620b09c9 | ||
|
|
cb822c44ce | ||
|
|
aa9d5ce04e | ||
|
|
8876cb91c9 | ||
|
|
91b1007083 | ||
|
|
17e227236f | ||
|
|
22ba4c86bb | ||
|
|
017d9c8290 | ||
|
|
2f7c930859 | ||
|
|
983637973b | ||
|
|
bb2e0f0b7d | ||
|
|
0d8a3b84fe | ||
|
|
3503652df3 | ||
|
|
1a82e48b3d | ||
|
|
f5a86814a9 | ||
|
|
bde3b691ff | ||
|
|
ed53db1bdc | ||
|
|
ecbd62676b | ||
|
|
b343ebec15 | ||
|
|
99e1de2503 | ||
|
|
94f8c495d2 | ||
|
|
1fc11c65a5 | ||
|
|
f7700b9279 | ||
|
|
4007568d93 | ||
|
|
208134e970 | ||
|
|
bda5d481b2 | ||
|
|
00609f5a5d | ||
|
|
066e783a37 | ||
|
|
3e1bf001c7 | ||
|
|
09f52a32a6 | ||
|
|
73c14a9ad0 | ||
|
|
8cc826a57b | ||
|
|
02e17f9845 | ||
|
|
3e18a25ed3 | ||
|
|
4c31106839 | ||
|
|
2b8ff1d090 | ||
|
|
9e7690054d | ||
|
|
2e6fdce592 | ||
|
|
eee40c2130 | ||
|
|
818fe3adfc | ||
|
|
f6bfaf415f | ||
|
|
35a3190b28 | ||
|
|
65edebca2e | ||
|
|
aef9be8d9b | ||
|
|
3acb9f1842 | ||
|
|
9f7271178f | ||
|
|
5038deaf97 | ||
|
|
d6e04156f1 | ||
|
|
07d7f10622 | ||
|
|
78a1058aa1 | ||
|
|
f16894869a | ||
|
|
31240fa50d | ||
|
|
0f7c2c83b3 | ||
|
|
22e43c84fc | ||
|
|
f9160677c3 | ||
|
|
0b1f04abe3 | ||
|
|
c28b4d39ad | ||
|
|
519efe633f | ||
|
|
cf680eba4a | ||
|
|
63c78f986d | ||
|
|
57d8b0c803 | ||
|
|
722e18c07d | ||
|
|
a66ec00587 | ||
|
|
2b5100c019 | ||
|
|
cae906d226 | ||
|
|
1ebe773b6e | ||
|
|
594f005476 | ||
|
|
027e37545b | ||
|
|
4fc82ab7c1 | ||
|
|
565e163b3e | ||
|
|
e6c26dde7b | ||
|
|
6e8acc0f4c | ||
|
|
b7fff50d31 | ||
|
|
a2d240ee4a | ||
|
|
a69f6925e9 | ||
|
|
c4544832d2 | ||
|
|
74da05e6e8 | ||
|
|
af24e3b284 | ||
|
|
fb68d0bff3 | ||
|
|
d3a2ba26ba | ||
|
|
2f70ec5cb6 | ||
|
|
e9dcb986f9 | ||
|
|
93b6fe7aab | ||
|
|
d6aadef2b8 | ||
|
|
4e0fb6bf65 | ||
|
|
93c4f99619 | ||
|
|
7c489cb9aa | ||
|
|
1d74cc8225 | ||
|
|
8021529a41 | ||
|
|
2791f60a58 | ||
|
|
88e88be756 | ||
|
|
13d42ae288 | ||
|
|
5408cc6015 | ||
|
|
c97fbba173 | ||
|
|
79d9e806d5 | ||
|
|
12589ffbe0 | ||
|
|
f21b62241a | ||
|
|
b6cd10b51e | ||
|
|
e7344cdc24 | ||
|
|
4e118493d2 | ||
|
|
590b526079 | ||
|
|
b051e8cc46 | ||
|
|
952c2e570e | ||
|
|
d9834eae6d | ||
|
|
1901686a2a | ||
|
|
9efe4f41bf | ||
|
|
3fad296e3f | ||
|
|
100b101e60 | ||
|
|
b66022fb64 | ||
|
|
3e354868ea | ||
|
|
a6fda6c76a | ||
|
|
7ea08a0f6b | ||
|
|
dda6726a43 | ||
|
|
70deb278e5 | ||
|
|
017934ab8e | ||
|
|
c8c98ebc02 | ||
|
|
939d49db57 | ||
|
|
9994a214b5 | ||
|
|
5d44ff8ca5 | ||
|
|
60cef9fa49 | ||
|
|
dda98b2902 | ||
|
|
19ddc9de97 | ||
|
|
7985344042 | ||
|
|
9173e9e56a | ||
|
|
259768f92f | ||
|
|
e61716e25c | ||
|
|
99d747aabe | ||
|
|
d789e0d5a4 | ||
|
|
6524bbed43 | ||
|
|
11ad8a8398 | ||
|
|
9b9dfbe46a | ||
|
|
12c67f4244 | ||
|
|
cd66d335e8 | ||
|
|
20a33eb69f | ||
|
|
ee0fabca8e | ||
|
|
527d0b85ad | ||
|
|
4a72a0535b | ||
|
|
361d2246ed | ||
|
|
ffd8a9e87b | ||
|
|
0d518e44c7 | ||
|
|
be347da9f2 | ||
|
|
c01b2ca4be | ||
|
|
12ad4d2a22 | ||
|
|
18d992b96d | ||
|
|
59c74c6101 | ||
|
|
cf4f552595 | ||
|
|
c6a16823b0 | ||
|
|
0eb6185b6c | ||
|
|
d11e99b918 | ||
|
|
ff721ae820 | ||
|
|
dab605f50d | ||
|
|
cd40f04443 | ||
|
|
160e5696fe | ||
|
|
e98cd4ef55 | ||
|
|
79fddf1395 | ||
|
|
753e8bc049 | ||
|
|
2ae59b049c | ||
|
|
140429c931 | ||
|
|
ad756617dd | ||
|
|
8812cd18ad | ||
|
|
ce71fe2b06 | ||
|
|
360366b9f5 | ||
|
|
29f4123ab8 | ||
|
|
9fdcffda2f | ||
|
|
52d1b9a270 | ||
|
|
068f5942e7 | ||
|
|
703cefaf19 | ||
|
|
b9d326e9de | ||
|
|
06917327d8 | ||
|
|
df92aaae56 | ||
|
|
cafb03393c | ||
|
|
3d32557177 | ||
|
|
ea1f72b8b7 | ||
|
|
993b6759cc | ||
|
|
b89ff616f0 | ||
|
|
9e37959a50 | ||
|
|
40f740de59 | ||
|
|
500608b383 | ||
|
|
02c05a6c63 | ||
|
|
4b4444e8d7 | ||
|
|
bbeaf76a68 | ||
|
|
82c289b2f5 | ||
|
|
fd461b8e9e | ||
|
|
7d8a5a2bdf | ||
|
|
edda670b4f | ||
|
|
ccfac74cc3 | ||
|
|
0359e75de7 | ||
|
|
f709ea2a95 | ||
|
|
1cd7e27911 | ||
|
|
e17d0e990d | ||
|
|
43169bc512 | ||
|
|
0015300b19 | ||
|
|
a52c59a36b | ||
|
|
6ce89a9f57 | ||
|
|
78d2c42bdd | ||
|
|
fce7fdbee5 | ||
|
|
a717ec0ae7 | ||
|
|
0ce8eafe6c | ||
|
|
c0b07307f5 | ||
|
|
8751bd75da | ||
|
|
15f23769d6 | ||
|
|
2d175fd575 | ||
|
|
01bfdf52ff | ||
|
|
bdeb4b4dcc | ||
|
|
bdfbb57504 | ||
|
|
c0eebdf74b | ||
|
|
851b460a32 | ||
|
|
aca775a96e | ||
|
|
41750808f0 | ||
|
|
b0458ddda5 | ||
|
|
5a317c5d3e | ||
|
|
af7c14b2f2 | ||
|
|
d151524ed9 | ||
|
|
175acc86e2 | ||
|
|
bb07acf45e | ||
|
|
38d1c756f3 | ||
|
|
6c89913bc6 | ||
|
|
efa72cb697 | ||
|
|
a31fec5fb9 | ||
|
|
2349d2320f | ||
|
|
166e5b73fa | ||
|
|
a39b87f9fd | ||
|
|
162f945a9e | ||
|
|
5be5f54351 | ||
|
|
dfe9f5b05c | ||
|
|
4c1e28fe39 | ||
|
|
bf67168c7a | ||
|
|
b30ed702d3 | ||
|
|
9c33caf74e | ||
|
|
65e1ab616b | ||
|
|
13c5dd7b72 | ||
|
|
abeb546116 | ||
|
|
b37dc9900c | ||
|
|
b27cd0c914 | ||
|
|
446b40d8a6 | ||
|
|
6ba1d28f13 | ||
|
|
5a226ff95a | ||
|
|
01f4af6876 | ||
|
|
0ee173475e | ||
|
|
1e36112c06 | ||
|
|
c149701f3f | ||
|
|
752a36d88a | ||
|
|
ed81030976 | ||
|
|
54322ca949 | ||
|
|
738b159e95 | ||
|
|
e43302b821 | ||
|
|
4f5b9233f4 | ||
|
|
149778000a | ||
|
|
3641da1faa | ||
|
|
7c4df9b1c4 | ||
|
|
7260678620 | ||
|
|
292c20d317 | ||
|
|
8fe8739897 | ||
|
|
75bd285f5c | ||
|
|
822766c831 | ||
|
|
8440bde9d7 | ||
|
|
6c792b208c | ||
|
|
a4b869a381 | ||
|
|
db0b48f1ad | ||
|
|
e8f2e4f50c | ||
|
|
5cd201440e | ||
|
|
5c6c76b898 | ||
|
|
5b1486cb6f | ||
|
|
4847ce054b | ||
|
|
ec42fe7d7d | ||
|
|
116e405ae3 | ||
|
|
202a92998a | ||
|
|
f06618fdaf | ||
|
|
a8bd031935 | ||
|
|
d0dd92578b | ||
|
|
07a20ed5ad | ||
|
|
95f60c78b3 | ||
|
|
b5228e547c | ||
|
|
29be020e32 | ||
|
|
8b443ed10b | ||
|
|
ae5abbd039 | ||
|
|
9d24c6091b | ||
|
|
6d2b6259a9 | ||
|
|
2c7425bc51 | ||
|
|
6c75fc3506 | ||
|
|
46ab5829b7 | ||
|
|
5c5daf053b | ||
|
|
3cb9bf984b | ||
|
|
4b59d79977 | ||
|
|
7fc987f1a2 | ||
|
|
f14fd6bf5a | ||
|
|
d3f3a14b1f | ||
|
|
b812a1b06f | ||
|
|
4f95722915 | ||
|
|
2282c19f46 | ||
|
|
ccc28ba54c | ||
|
|
a512465d07 | ||
|
|
1bb18abf5a | ||
|
|
1fec4b33b2 | ||
|
|
6266aab466 | ||
|
|
31bff169a2 | ||
|
|
2f956ed400 | ||
|
|
b16831fc86 | ||
|
|
ee74a25eae | ||
|
|
80eb314d03 | ||
|
|
fd6478c7f5 | ||
|
|
56ba332dc5 | ||
|
|
14deac00f6 | ||
|
|
481ca5194a | ||
|
|
0cb4a2cfcc | ||
|
|
c6d6c2323c | ||
|
|
d65c52f6ea | ||
|
|
fb7095f2d3 | ||
|
|
c16689d936 | ||
|
|
9f3bf545bf | ||
|
|
09c8c97b4e | ||
|
|
4cb6c9e2e8 | ||
|
|
aef9f98095 | ||
|
|
e143c6b5b4 | ||
|
|
c570c1c0eb | ||
|
|
4bc3fe0c1b | ||
|
|
1f46339900 | ||
|
|
a4f354161d | ||
|
|
8a7bc4583b | ||
|
|
8468a3de7c | ||
|
|
e4ff7b43f2 | ||
|
|
220396d016 | ||
|
|
91f01abbae | ||
|
|
7eda617af9 | ||
|
|
595a22efc3 | ||
|
|
d2578e5be5 | ||
|
|
0cd1485f85 | ||
|
|
ab1dcd0e45 | ||
|
|
8281f488f3 | ||
|
|
c4a1879ae9 | ||
|
|
fcc51b591e | ||
|
|
1b44334361 | ||
|
|
7ec677f021 | ||
|
|
08201b0f00 | ||
|
|
89055d2ae9 | ||
|
|
7393159f26 | ||
|
|
dda2b4af11 | ||
|
|
7e1bc19a13 | ||
|
|
650f1df0ee | ||
|
|
f7bfa82517 | ||
|
|
b0bf31b29c | ||
|
|
54bb9a8f5a | ||
|
|
7a38c1055a | ||
|
|
cda557b6fb | ||
|
|
e1fc272e1c | ||
|
|
aa9b32a383 | ||
|
|
c836e29d2f | ||
|
|
39b919c38a | ||
|
|
4b8d06dfe8 | ||
|
|
b3cfcc1a5e | ||
|
|
41f1a65ce6 | ||
|
|
f8800384e0 | ||
|
|
765bb3886d | ||
|
|
1768104d47 | ||
|
|
ab2f4b339a | ||
|
|
531b1dfa33 | ||
|
|
935719fd43 | ||
|
|
120d928402 | ||
|
|
6ad29aaf3c | ||
|
|
ea48c6d68c | ||
|
|
34c8f21cc6 | ||
|
|
18913eedae | ||
|
|
9b159268bd | ||
|
|
a6cd5656f8 | ||
|
|
c93deb7696 | ||
|
|
0699e895fd | ||
|
|
1f700f7842 | ||
|
|
3db50096c5 | ||
|
|
36bb614a27 | ||
|
|
968471ec4a | ||
|
|
401a518f0f | ||
|
|
96af6b252a | ||
|
|
6bac9c2432 | ||
|
|
ad44a6ccee | ||
|
|
d7f6f28413 | ||
|
|
6161307cbb | ||
|
|
96952817c1 | ||
|
|
c8d4a9a671 | ||
|
|
f059a7732f | ||
|
|
adefd95fb6 | ||
|
|
a0935e8613 | ||
|
|
bebc9c9dd4 | ||
|
|
82507aabcb | ||
|
|
4e8d336527 | ||
|
|
9977f33461 | ||
|
|
4e11baa579 | ||
|
|
ef82df5e72 | ||
|
|
506ae1cbc6 | ||
|
|
6156ce48ac | ||
|
|
cd32b69d86 | ||
|
|
1ca38386b7 | ||
|
|
ef48f51834 | ||
|
|
8bcd6b9e53 | ||
|
|
7c22ea6b01 | ||
|
|
b5034fd925 | ||
|
|
a765a71474 | ||
|
|
f3ad6e66e8 | ||
|
|
3713f98f7b | ||
|
|
0c6778b5a3 | ||
|
|
f56f1160ba | ||
|
|
cc184b7c58 | ||
|
|
53fdf2bbbf | ||
|
|
033635fb43 | ||
|
|
40682bc842 | ||
|
|
9da26358ba | ||
|
|
2f0550de8e | ||
|
|
f6a1d603a9 | ||
|
|
764521414f | ||
|
|
ffe44706c2 | ||
|
|
41cab2f652 | ||
|
|
35fada7fcd | ||
|
|
5b8fb68f65 | ||
|
|
f5e668b716 | ||
|
|
acbc03dc82 | ||
|
|
294281e0ac | ||
|
|
2d450d4dbd | ||
|
|
e2865fafde | ||
|
|
aa546d87ff | ||
|
|
72e637d389 | ||
|
|
842f7045f8 | ||
|
|
4f4f3a0370 | ||
|
|
6a354f8757 | ||
|
|
abd9aaa567 | ||
|
|
32c4f984e9 | ||
|
|
86e806d021 | ||
|
|
32cff8af6d | ||
|
|
40ac2124d8 | ||
|
|
a107d0586f | ||
|
|
8a94000d98 | ||
|
|
bb90261521 | ||
|
|
fd246bc83b | ||
|
|
018a97fb8e | ||
|
|
9d10ee2da5 | ||
|
|
8a62942894 | ||
|
|
71cabea03e | ||
|
|
a37cd62d7e | ||
|
|
f180a5cd70 | ||
|
|
4405a1fbf7 | ||
|
|
7603587ce3 | ||
|
|
27a06f6cfa | ||
|
|
190204a47f | ||
|
|
7e4003968d | ||
|
|
174dfbe95e | ||
|
|
9fef6dd2d3 | ||
|
|
4ac51a7e58 | ||
|
|
8487dde026 | ||
|
|
52bdf64cdb | ||
|
|
e254d6978e | ||
|
|
9eb15a25a5 | ||
|
|
8a63200ab9 | ||
|
|
b18ffc350f | ||
|
|
1340bc9902 | ||
|
|
df36523d6c | ||
|
|
e626b65f5d | ||
|
|
3ea8a75b3f | ||
|
|
6fed9375d3 | ||
|
|
7764c60797 | ||
|
|
141567f303 | ||
|
|
ecb2b05c5a | ||
|
|
eda60a7142 | ||
|
|
e5fc8bfb2c | ||
|
|
d8cdba262b | ||
|
|
20f3b19f29 | ||
|
|
52ef0c8bcb | ||
|
|
85aeb059fc | ||
|
|
edfbad2432 | ||
|
|
ea5b0362df | ||
|
|
1c7d5a5803 | ||
|
|
adb7035f3e | ||
|
|
31f9611478 | ||
|
|
543da46457 | ||
|
|
6409cb276f | ||
|
|
c07e2e48d0 | ||
|
|
df8613f6be | ||
|
|
3b35e5a44d | ||
|
|
69216c8902 | ||
|
|
3fcafbd76b | ||
|
|
a45772bceb | ||
|
|
aa0be76c6b | ||
|
|
3581f2c818 | ||
|
|
469e6b301c | ||
|
|
854af92f3d | ||
|
|
bacf832158 | ||
|
|
31744be691 | ||
|
|
59155b9f6c | ||
|
|
9692e67aab | ||
|
|
3ab3b79bc7 | ||
|
|
132713f274 | ||
|
|
62f7347178 | ||
|
|
3dcb0b2c69 | ||
|
|
9e962b468e | ||
|
|
d87283b7d7 | ||
|
|
e442cacf5f | ||
|
|
f8ed5b37ac | ||
|
|
c36d873636 | ||
|
|
ca2f45fc41 | ||
|
|
3a3f8546d1 | ||
|
|
42befd9ce7 | ||
|
|
0f315f414d | ||
|
|
44c35c7fb3 | ||
|
|
b1a4d839ac | ||
|
|
1ad46b484f | ||
|
|
67420e5416 | ||
|
|
166cec0483 | ||
|
|
2c3aace7a9 | ||
|
|
d3e40d7c3d | ||
|
|
efad824fe3 | ||
|
|
3bb6962ccc | ||
|
|
6edb94758e | ||
|
|
e8e70bc81b | ||
|
|
269bbb71f3 | ||
|
|
5cfee0974e | ||
|
|
a08454a09a | ||
|
|
ce371e45ae | ||
|
|
82808be0c7 | ||
|
|
f124ec7131 | ||
|
|
3ea94fc5e0 | ||
|
|
afac6a9a89 | ||
|
|
80864c7ca4 | ||
|
|
19765848d5 | ||
|
|
21b3ca0b2f | ||
|
|
710fdef0fb | ||
|
|
4f0237209a | ||
|
|
8f5c40487c | ||
|
|
5cecd2be81 | ||
|
|
c24b79cb9d | ||
|
|
0e804d0bba | ||
|
|
c749f9ead4 | ||
|
|
87f8317b97 | ||
|
|
e6e4ecacaf | ||
|
|
d458bb9a45 | ||
|
|
362bf7b141 | ||
|
|
9c81766b78 | ||
|
|
28580103f3 | ||
|
|
1f93ca1cf8 | ||
|
|
2778175752 | ||
|
|
3e0ed5b0af | ||
|
|
325bd510ff | ||
|
|
2b5a327e53 | ||
|
|
c322946c32 | ||
|
|
aefee9c92b | ||
|
|
172f7f7085 | ||
|
|
bb9d2a0a69 | ||
|
|
2d9cc286f0 | ||
|
|
6629faa4d5 | ||
|
|
d3d397cf70 | ||
|
|
8c91b37dc8 | ||
|
|
fc4b33f7f0 | ||
|
|
918da6e0ee | ||
|
|
963f487648 | ||
|
|
ba1c49e23a | ||
|
|
95a27fe2c9 | ||
|
|
2951f96daf | ||
|
|
9bf2e07006 | ||
|
|
332274f2a8 | ||
|
|
35c052e605 | ||
|
|
91de1dbd27 | ||
|
|
3bc392fdc4 | ||
|
|
79c14ad801 | ||
|
|
0f7503875c | ||
|
|
75e1eac785 | ||
|
|
f77b0a51f4 | ||
|
|
8cef1dd51a | ||
|
|
8bdc1590dd | ||
|
|
ea0cf96a4a | ||
|
|
1bd96f6a88 | ||
|
|
5f4bd19dcc | ||
|
|
843f59b492 | ||
|
|
f9ccf9e6aa | ||
|
|
3275c03a21 | ||
|
|
a1a9229852 | ||
|
|
fc09245cdb | ||
|
|
6ac6646ac2 | ||
|
|
db8ebcc3d5 | ||
|
|
e0aa053e95 | ||
|
|
c8a24374fb | ||
|
|
cde9ac63aa | ||
|
|
b2d3aa8c11 | ||
|
|
ed786dfb11 | ||
|
|
cc93f008a4 | ||
|
|
2284432057 | ||
|
|
c623748d27 | ||
|
|
954f905c8c | ||
|
|
f23d1faa33 | ||
|
|
1f8bfdac5f | ||
|
|
b580da9e9f | ||
|
|
46a188093a | ||
|
|
1c7f6438ff | ||
|
|
f9da7afd75 | ||
|
|
9d49dd2f40 | ||
|
|
fb8e19285b | ||
|
|
505abb3029 | ||
|
|
2014598eaf | ||
|
|
1b39c345af | ||
|
|
bdb1812705 | ||
|
|
0b8bcafb72 | ||
|
|
c0c699eab6 | ||
|
|
5a99c2dcef | ||
|
|
cbce5729fd | ||
|
|
7290245729 | ||
|
|
5c1bb564f2 | ||
|
|
94ee854196 | ||
|
|
91602c0be5 | ||
|
|
a31f287b2b | ||
|
|
f3a0d82304 | ||
|
|
f2669bb875 | ||
|
|
4801559edc | ||
|
|
9496b71bb7 | ||
|
|
ba1e8cc448 | ||
|
|
d307adbbef | ||
|
|
933bc0a9e3 | ||
|
|
ee7319c702 | ||
|
|
aa63d11816 | ||
|
|
b1b402b011 | ||
|
|
5931e8f813 | ||
|
|
52a5a54bb3 | ||
|
|
7ca987fb1c | ||
|
|
66dbf21df0 | ||
|
|
cc0d42f34f | ||
|
|
38a79d8d3e | ||
|
|
9420420622 | ||
|
|
ce1139f114 | ||
|
|
d8ce0416fa | ||
|
|
a0e696eca4 | ||
|
|
6b20ffeeba | ||
|
|
ac1c0c90e7 | ||
|
|
3663384ccf | ||
|
|
ecf8d437c7 | ||
|
|
3c07fc0387 | ||
|
|
8bd2b9d7a7 | ||
|
|
b2b78c67f4 | ||
|
|
94147c23b1 | ||
|
|
ba588c9edf | ||
|
|
8810f453df | ||
|
|
c7d42305a3 | ||
|
|
40025db415 | ||
|
|
c0b8a8b8eb | ||
|
|
92416b4661 | ||
|
|
aaa93b1bcc | ||
|
|
b328331d7c | ||
|
|
f51079e065 | ||
|
|
534c622980 | ||
|
|
6cc1cb5afa | ||
|
|
2372d5ca92 | ||
|
|
331af8cd24 | ||
|
|
d58b8fffdc | ||
|
|
e5d05b88bc | ||
|
|
61f823b6be | ||
|
|
06f23d5754 | ||
|
|
e567f1386a | ||
|
|
15a734ace6 | ||
|
|
6f0309b6a7 | ||
|
|
08191278d7 | ||
|
|
6a4b31ffe6 | ||
|
|
a150757a97 | ||
|
|
8eded14f85 | ||
|
|
b311f85ca0 | ||
|
|
9423c8135f | ||
|
|
5221907ef8 | ||
|
|
4cc1847ea6 | ||
|
|
2a0032a199 | ||
|
|
9b722eacdb | ||
|
|
c6f15411e3 | ||
|
|
90a16b7149 | ||
|
|
2df9741cd6 | ||
|
|
497b8bfce5 | ||
|
|
0fdbb8d8a1 | ||
|
|
7a8a2fbf77 | ||
|
|
1e48cb831a | ||
|
|
9e96732b73 | ||
|
|
e863906eaa | ||
|
|
13ec6e2dca | ||
|
|
968e7222fd | ||
|
|
a84159ee70 | ||
|
|
703f9deb9a | ||
|
|
07147f13a8 | ||
|
|
a57d9d41c3 | ||
|
|
a40f66fc94 | ||
|
|
097c97ca32 | ||
|
|
3e1d418269 | ||
|
|
5ee7b3fcbf | ||
|
|
15adf97174 | ||
|
|
4bd5befaaa | ||
|
|
5fe6272915 | ||
|
|
7a01a1f33f | ||
|
|
92759aa9dc | ||
|
|
65e21190b9 | ||
|
|
f6877631d9 | ||
|
|
1e4fa8432b | ||
|
|
ed5423368e | ||
|
|
673acad72c | ||
|
|
efc04cc82d | ||
|
|
b880f7c946 | ||
|
|
7304de0102 | ||
|
|
a64601afcc | ||
|
|
79ce3c0d74 | ||
|
|
83c31ad2b4 | ||
|
|
3bcb769965 | ||
|
|
75e0b8f4c2 | ||
|
|
78ef0fdaf4 | ||
|
|
8d29ff2d61 | ||
|
|
eea79da1ae | ||
|
|
cb5447f86e | ||
|
|
8cb31ad524 | ||
|
|
6ca52a0db1 | ||
|
|
25e30672c8 | ||
|
|
abcab2aadf | ||
|
|
19bb8f7595 | ||
|
|
0427956e8b | ||
|
|
78bf40282a | ||
|
|
6c6a82f8e6 | ||
|
|
4b9cc7be08 | ||
|
|
dc2d6b8160 | ||
|
|
083456e33a | ||
|
|
80e43e8634 | ||
|
|
e99b8ed453 | ||
|
|
4aba36b756 | ||
|
|
2ebf654973 | ||
|
|
f560fb86d8 | ||
|
|
981689aa26 | ||
|
|
b3fd266c31 | ||
|
|
062b7a5986 | ||
|
|
088b1ee1c2 | ||
|
|
1d572bb4b6 | ||
|
|
cf8e033831 | ||
|
|
43977a74cc | ||
|
|
d67e96539b | ||
|
|
09d1aff6a8 | ||
|
|
41c5a49abc | ||
|
|
eacff9025e | ||
|
|
f56b8f8e42 | ||
|
|
8ab221e5a8 | ||
|
|
21e51c8455 | ||
|
|
3234896caf | ||
|
|
b00dd1c5f5 | ||
|
|
992a3f9d1c | ||
|
|
6b280b5aa4 | ||
|
|
e6713520c7 | ||
|
|
4f75b0343e | ||
|
|
097ebccdcd | ||
|
|
954e1de4da | ||
|
|
63dc79699d | ||
|
|
63f342bbdb | ||
|
|
7c9b90ed7d | ||
|
|
00e45b60ad | ||
|
|
d1a7a37909 | ||
|
|
1c12b52ada | ||
|
|
722fe40899 | ||
|
|
b2e7ebf43d | ||
|
|
3ed8e768aa | ||
|
|
d362691389 | ||
|
|
4b7c54d5b5 | ||
|
|
fbd0407863 | ||
|
|
7bab1b4297 | ||
|
|
cfce9e9887 | ||
|
|
9df2a96027 | ||
|
|
d967c719f5 | ||
|
|
ec80a5aa70 | ||
|
|
0c95f178ca | ||
|
|
e0405b15df | ||
|
|
e029f30acf | ||
|
|
44ed836b7c | ||
|
|
00401201d1 | ||
|
|
726491feee | ||
|
|
36a94e1399 | ||
|
|
855c83a325 | ||
|
|
d9e65719d3 | ||
|
|
c774070feb | ||
|
|
5aeff8c9c0 | ||
|
|
4d5f5cf04b | ||
|
|
1d6b87ffa7 | ||
|
|
3b82435740 | ||
|
|
17499abfd0 | ||
|
|
9a57deb9ab | ||
|
|
089c58310c | ||
|
|
647de5d473 | ||
|
|
b223b121d1 | ||
|
|
49fbb37542 | ||
|
|
1496192756 | ||
|
|
f34cd50b9c | ||
|
|
20f46bea61 | ||
|
|
f4ff8d37d5 | ||
|
|
15108645d4 | ||
|
|
b5e8f32f1f | ||
|
|
4027c41c73 | ||
|
|
7037139ab3 | ||
|
|
b976fe4bad | ||
|
|
d674a201ee | ||
|
|
d4a3e292ed | ||
|
|
50084e47f7 | ||
|
|
6e0a16a4d1 | ||
|
|
5e87d8de18 | ||
|
|
9a6c2fa7c8 | ||
|
|
f440f91233 | ||
|
|
ccf364f2dd | ||
|
|
3c5baae568 | ||
|
|
7710ff32a6 | ||
|
|
e081d2b73a | ||
|
|
0c77fa43ff | ||
|
|
6ee4353bbd | ||
|
|
bddab24d48 | ||
|
|
45f9a32e59 | ||
|
|
39b297fd00 | ||
|
|
fd2167d679 | ||
|
|
d07249e1b2 | ||
|
|
31dc59c9d5 | ||
|
|
f3e82dac19 | ||
|
|
41db80dba8 | ||
|
|
8efe922b50 | ||
|
|
a5d22d287c | ||
|
|
793095900b | ||
|
|
ee63292e55 | ||
|
|
9fbcde3ca0 | ||
|
|
9e48c8e359 | ||
|
|
da07f50e49 | ||
|
|
cc872cd2b4 | ||
|
|
a3fa1e541c | ||
|
|
b579e823bd | ||
|
|
fc5b1ec85e | ||
|
|
e0c2037831 | ||
|
|
9f44d6b75b | ||
|
|
b6f2fff42b | ||
|
|
f10e54e47b | ||
|
|
704e0c1dc1 | ||
|
|
067ac8fb56 | ||
|
|
4428089146 | ||
|
|
44ce674166 | ||
|
|
0c79a9acde | ||
|
|
ebfc2715e7 | ||
|
|
b0dbc9dc18 | ||
|
|
507cdf75a5 | ||
|
|
8f8492b0be | ||
|
|
457e715188 | ||
|
|
3fad827b9f | ||
|
|
8bd571c78d | ||
|
|
1724521ebf | ||
|
|
b0fb3596aa | ||
|
|
38ff8340e4 | ||
|
|
f759ea4bc2 | ||
|
|
fb228d72b1 | ||
|
|
916361a3be | ||
|
|
011d0cad8c | ||
|
|
408c40f699 | ||
|
|
4173f6d775 | ||
|
|
e6f3c22064 | ||
|
|
a013518eac | ||
|
|
9c88cacb3d | ||
|
|
d49bf04b15 | ||
|
|
1dbd5dc5bc | ||
|
|
c103706a54 | ||
|
|
b0a027df52 | ||
|
|
868641378a | ||
|
|
11baae3107 | ||
|
|
7526bb430f | ||
|
|
7dbef77687 | ||
|
|
ed8125042e | ||
|
|
25b2655d0f | ||
|
|
145a264154 | ||
|
|
3e33170ae0 | ||
|
|
d18bf68f0e | ||
|
|
368917e108 | ||
|
|
cdea4c3911 | ||
|
|
b4b9b55bbf | ||
|
|
6092c63df4 | ||
|
|
fda5132184 | ||
|
|
6a9fb25a18 | ||
|
|
18d7344690 | ||
|
|
ba50cf20a0 | ||
|
|
7bd6e126e2 | ||
|
|
f7521c81d5 | ||
|
|
f483a2dc2f | ||
|
|
9769d5af06 | ||
|
|
0a2dc3563e | ||
|
|
e9f0157b2b | ||
|
|
e8e566fcdd | ||
|
|
72b7d22cef | ||
|
|
f79da476fd | ||
|
|
ef31b7844c | ||
|
|
f1ed1bf115 | ||
|
|
23ea028965 | ||
|
|
42046a614f | ||
|
|
36055f56e6 | ||
|
|
b693cb30fc | ||
|
|
20377d4ff5 | ||
|
|
570d732b0e | ||
|
|
d9d2b1de70 | ||
|
|
0a7eaaf36f | ||
|
|
36dd3e496d | ||
|
|
83fd914d7b | ||
|
|
281c6b13fa | ||
|
|
00b7b1221c | ||
|
|
56cbf0ff3f | ||
|
|
f852a4d341 | ||
|
|
7c8c7d482a | ||
|
|
9e95ae2cb0 | ||
|
|
0d2d935f17 | ||
|
|
eeb320a825 | ||
|
|
9452d4dbe3 | ||
|
|
03d2387cdd | ||
|
|
61b325ccb9 | ||
|
|
e57de9a4de | ||
|
|
a259ab9541 | ||
|
|
96946f3a1e | ||
|
|
08569276eb | ||
|
|
edc4be2d44 | ||
|
|
8cd6fb7ae2 | ||
|
|
a5afa90790 | ||
|
|
f634eb8d37 | ||
|
|
694b61a67b | ||
|
|
88f0d00a15 | ||
|
|
e31088fd2e | ||
|
|
1d7bb63710 | ||
|
|
64422c60bb | ||
|
|
a8b082ed4b | ||
|
|
5a5ade0d60 | ||
|
|
7e24e2dcfb | ||
|
|
930579d983 | ||
|
|
af1ed5349f | ||
|
|
9dcf71dc31 | ||
|
|
8bf9af0ed8 | ||
|
|
aecfad5871 | ||
|
|
3edd155898 | ||
|
|
2c419c0b2e | ||
|
|
2fb67e7042 | ||
|
|
82847f07b2 | ||
|
|
29483b2625 | ||
|
|
7fc59e79f3 | ||
|
|
79b3e21148 | ||
|
|
ee91117010 | ||
|
|
0548037ff3 | ||
|
|
46002632bb | ||
|
|
9659ac1611 | ||
|
|
bbc497e68d | ||
|
|
d7ec7574ad | ||
|
|
2f476d9e61 | ||
|
|
c74f37f0de | ||
|
|
d27a62cbfc | ||
|
|
8029e491a3 | ||
|
|
fe56268421 | ||
|
|
2db6fabbe9 | ||
|
|
035e89801a | ||
|
|
a7280da30c | ||
|
|
ac2920820d | ||
|
|
fcecc4b31e | ||
|
|
4abef50ca0 | ||
|
|
5e16445b08 | ||
|
|
be593b8185 | ||
|
|
ca27cb9981 | ||
|
|
5b64e629c9 | ||
|
|
18640826b6 | ||
|
|
e4d3239831 | ||
|
|
e834eadbe1 | ||
|
|
0ec8f66972 | ||
|
|
28b49aab70 | ||
|
|
458c462f49 | ||
|
|
6f6e2a1254 | ||
|
|
f46a3d69e1 | ||
|
|
fa787ed082 | ||
|
|
b5b748f993 | ||
|
|
3bdcf655fd | ||
|
|
284755f298 | ||
|
|
ad5eed96e7 | ||
|
|
431c830ea0 | ||
|
|
da047427a5 | ||
|
|
69da1dca5f | ||
|
|
cc61501f63 | ||
|
|
4ced2d3392 | ||
|
|
7c72bfdf6b | ||
|
|
b8878e1458 | ||
|
|
abd40cec1b | ||
|
|
cc18da4f28 | ||
|
|
1a39039162 | ||
|
|
cf9dd72ea5 | ||
|
|
b7cdf81665 | ||
|
|
8497a05fd1 | ||
|
|
7db4eec45c | ||
|
|
cd822b545a | ||
|
|
e872581d3c | ||
|
|
defe9e094c | ||
|
|
5662735cb8 | ||
|
|
05c96da98f | ||
|
|
8646dce21b | ||
|
|
ea53fc190b | ||
|
|
99a3eabbaf | ||
|
|
c57bd386f2 | ||
|
|
f2a52b03df | ||
|
|
860e1ccfaa | ||
|
|
49967b38d4 | ||
|
|
36038fff6d | ||
|
|
c5958954b0 | ||
|
|
d0d63016ca | ||
|
|
35f2484adf | ||
|
|
662b5bde31 | ||
|
|
388a4ed75b | ||
|
|
c2cf496ded | ||
|
|
8a172f02a9 | ||
|
|
f27935ea61 | ||
|
|
5311b522b7 | ||
|
|
ea682e218d | ||
|
|
aa5f7ef2a8 | ||
|
|
043df0aec3 | ||
|
|
63a2e18760 | ||
|
|
c3ced7ed03 | ||
|
|
f597e14b3d | ||
|
|
aff4ba9115 | ||
|
|
554e0805e3 | ||
|
|
f4efa74a23 | ||
|
|
ddc19587fa | ||
|
|
5f1232727e | ||
|
|
9c373e8f0a | ||
|
|
83942d788f | ||
|
|
73d6fec6f3 | ||
|
|
a37b5deaa1 | ||
|
|
3b9de847e7 | ||
|
|
924f1f1e48 | ||
|
|
7bdebbe25b | ||
|
|
8f46c25dc9 | ||
|
|
8bb4a03639 | ||
|
|
7b5bc5e057 | ||
|
|
2c62218fd6 | ||
|
|
35582a5e6a | ||
|
|
20340fd31f | ||
|
|
d6d7664b48 | ||
|
|
ce97e63876 | ||
|
|
378b98ff89 | ||
|
|
ce31199e57 | ||
|
|
227f3b2924 | ||
|
|
5076f1354c | ||
|
|
e5a34388ae | ||
|
|
6a5f65c018 | ||
|
|
6d5f41b3d8 | ||
|
|
64f10ead63 | ||
|
|
575dae446f | ||
|
|
9b438576f2 | ||
|
|
cbd32f1a07 | ||
|
|
516182ec40 | ||
|
|
4ad3a68d80 | ||
|
|
2f9ba32c07 | ||
|
|
dfc45a2904 | ||
|
|
563fdffb67 | ||
|
|
f2e9c5e2c0 | ||
|
|
86a591364c | ||
|
|
2a82485f81 | ||
|
|
e13549d361 | ||
|
|
a85c1bd7d3 | ||
|
|
946679f490 | ||
|
|
b6f27eac18 | ||
|
|
2cc82145a3 | ||
|
|
2dae0f2d8e | ||
|
|
412f6edc36 | ||
|
|
764791b8e5 | ||
|
|
bd20d6ae7d | ||
|
|
8db0bf7bea | ||
|
|
cff6aa72fc | ||
|
|
63ddf06057 | ||
|
|
3d9d57b7fa | ||
|
|
2c1734aea6 | ||
|
|
301c39aad0 | ||
|
|
5be346c89d | ||
|
|
e4eaf0037e | ||
|
|
8f97be82cb | ||
|
|
4ab7f92b82 | ||
|
|
0ec95a7729 | ||
|
|
98c38716cd | ||
|
|
6a46df780c | ||
|
|
7788198f26 | ||
|
|
3010963283 | ||
|
|
6522524c0f | ||
|
|
160434c114 | ||
|
|
36acb9ac12 | ||
|
|
1a06783dab | ||
|
|
ec38ee9abc | ||
|
|
2e82551b7c | ||
|
|
49121fb945 | ||
|
|
6e436f55c3 | ||
|
|
afb0131a28 | ||
|
|
92588282a6 | ||
|
|
765e997976 | ||
|
|
ddbf6a2e7a | ||
|
|
8567e912a3 | ||
|
|
42e4f168d1 | ||
|
|
7c98f2809c | ||
|
|
e68b529a34 | ||
|
|
1ed4987277 | ||
|
|
a5d1f0995c | ||
|
|
b6951df72e | ||
|
|
b1c31048a9 | ||
|
|
e13faa1b66 | ||
|
|
9349aca76e | ||
|
|
4946726d1e | ||
|
|
72c7800c02 | ||
|
|
e4c35b2ba2 | ||
|
|
bccb885508 | ||
|
|
7b7e0e0522 | ||
|
|
991d1d82b8 | ||
|
|
5832205624 | ||
|
|
8aeea4d212 | ||
|
|
e1934cd1b0 | ||
|
|
056cce2f97 | ||
|
|
61f6463e59 | ||
|
|
a929552c3d | ||
|
|
10cd02d2e7 | ||
|
|
afac50c18f | ||
|
|
24ade35df8 | ||
|
|
d50341ff8e | ||
|
|
54bd6d5336 | ||
|
|
7bc26787db | ||
|
|
e923f816a4 | ||
|
|
c6e4439ab9 | ||
|
|
94f66da84e | ||
|
|
384399c1c8 | ||
|
|
7bac63310f | ||
|
|
f85de2c960 | ||
|
|
173b516270 | ||
|
|
3af25610b8 | ||
|
|
0898ed8c00 | ||
|
|
0d0b056f6b | ||
|
|
3f6b572f51 | ||
|
|
1a2b906e0a | ||
|
|
d48331b706 | ||
|
|
d95cc62c8e | ||
|
|
f04aa78fd7 | ||
|
|
b03d355d69 | ||
|
|
834e7c1abb | ||
|
|
c37caa95a4 | ||
|
|
3ffcc5d5ba | ||
|
|
52fa87a7c6 | ||
|
|
0ddcfbeed7 | ||
|
|
a2f56682e6 | ||
|
|
edc4af6da5 | ||
|
|
283354d4d9 | ||
|
|
c3fbc573e2 | ||
|
|
e7f0091b48 | ||
|
|
446327dffd | ||
|
|
03a0449662 | ||
|
|
3fb72dfc24 | ||
|
|
7c4ccde69b | ||
|
|
167a50816f | ||
|
|
a753b868e6 | ||
|
|
0958c9da44 | ||
|
|
bdee98feb0 | ||
|
|
6f9c76c9ba | ||
|
|
c4fdf075b3 | ||
|
|
0a19874ef3 | ||
|
|
39af07cc22 | ||
|
|
7ac3a264da | ||
|
|
8951b45a39 | ||
|
|
a4e4315002 | ||
|
|
3a9d108b76 | ||
|
|
651a4ae2bf | ||
|
|
75007db630 | ||
|
|
d0adfebf7a | ||
|
|
f9e8496d3f | ||
|
|
f583b741d4 | ||
|
|
1d80b166b1 | ||
|
|
42e59ee564 | ||
|
|
e2c82086be | ||
|
|
e9d47f046d | ||
|
|
4acc73ac19 | ||
|
|
96c27efa68 | ||
|
|
52ad4435ac | ||
|
|
b6426dd202 | ||
|
|
abbdbdbc18 | ||
|
|
9ad6c20d42 | ||
|
|
d96c854756 | ||
|
|
ac4c578396 | ||
|
|
5d527c8e72 | ||
|
|
15ef6c77dc | ||
|
|
8b990ac273 | ||
|
|
99ffe9eac2 | ||
|
|
3d8dda23ce | ||
|
|
4fe5df51fa | ||
|
|
d7d6aa78f5 | ||
|
|
3646cb0ce6 | ||
|
|
e2bd1b8ba3 | ||
|
|
b061f7e405 | ||
|
|
78f38f1a48 | ||
|
|
eeec81bf3b | ||
|
|
4682096d98 | ||
|
|
ca369e2df5 | ||
|
|
1a6efebea4 | ||
|
|
bba3a45f0f | ||
|
|
de83a273a9 | ||
|
|
ba2954baf4 | ||
|
|
9e4f2ee3e7 | ||
|
|
0c6ad58bca | ||
|
|
8319ec988f | ||
|
|
fc65476918 | ||
|
|
42b45408ed | ||
|
|
792f0b5c7a | ||
|
|
b68e0600bd | ||
|
|
a667502836 | ||
|
|
254d545e58 | ||
|
|
cdde4b0cc9 | ||
|
|
0346497f45 | ||
|
|
af3527d6cf | ||
|
|
08186d98f5 | ||
|
|
9b8b01515c | ||
|
|
49e5b71235 | ||
|
|
f63980f122 | ||
|
|
9cee827f6b | ||
|
|
9c57976906 | ||
|
|
ef5b09b6fa | ||
|
|
469b4224dc | ||
|
|
afc410cfe6 | ||
|
|
b686bc1112 | ||
|
|
25bee76fff | ||
|
|
98a8b9944e | ||
|
|
66745d2ddf | ||
|
|
cf9e1fe54c | ||
|
|
9bf59bed2f | ||
|
|
48a9968d20 | ||
|
|
d23355b147 | ||
|
|
83ec5658c4 | ||
|
|
aed509155b | ||
|
|
0120762dbe | ||
|
|
85b67ecd0b | ||
|
|
7451383c24 | ||
|
|
88d735ed56 | ||
|
|
7a002e4b89 | ||
|
|
01ad0b4875 | ||
|
|
4defa5fa9c | ||
|
|
32a1dd64ab | ||
|
|
5ce8171f12 | ||
|
|
e3121cb043 | ||
|
|
99e52ab0b5 | ||
|
|
2b672dc4fc | ||
|
|
6db7adf900 | ||
|
|
65782285a3 | ||
|
|
64bd5a93ad | ||
|
|
93d7ef48eb | ||
|
|
a90b7abff7 | ||
|
|
a479b4b109 | ||
|
|
326e1118da | ||
|
|
90f1e324ce | ||
|
|
41e0228c03 | ||
|
|
e72691a164 | ||
|
|
7b1d2a0b38 | ||
|
|
470d76faab | ||
|
|
aec9a75bba | ||
|
|
fcbac22577 | ||
|
|
1153a5dd3c | ||
|
|
04fccad19c | ||
|
|
1bce756bd6 | ||
|
|
68f052efcb | ||
|
|
4a8baf79fb | ||
|
|
499ac0295e | ||
|
|
29c422501a | ||
|
|
8efe74f614 | ||
|
|
4e0f12f4b9 | ||
|
|
cbd3a61259 | ||
|
|
2406a7be49 | ||
|
|
87322a36ca | ||
|
|
bbe4d28a40 | ||
|
|
dd40b56047 | ||
|
|
f14a0d5ee3 | ||
|
|
2994419381 | ||
|
|
81f06026d0 | ||
|
|
2df9441c20 | ||
|
|
47190d9c02 | ||
|
|
e0383d6c59 | ||
|
|
a436d9c070 | ||
|
|
eeabcd94ed | ||
|
|
8a3e37041a | ||
|
|
a1e9aefeb2 | ||
|
|
670cb51352 | ||
|
|
a43dff88c5 | ||
|
|
fb3c87359f | ||
|
|
a49dec7e6d | ||
|
|
a7156235c3 | ||
|
|
3cb52ba3f1 | ||
|
|
024f1a7047 | ||
|
|
b77c7e922f | ||
|
|
9335c4706b | ||
|
|
e09a9dabd6 | ||
|
|
e4e2f50015 | ||
|
|
61865050c7 | ||
|
|
05d90c26ff | ||
|
|
43cdb29eb6 | ||
|
|
87ff1cb2b2 | ||
|
|
f73c9c9d02 | ||
|
|
d15e444cb7 | ||
|
|
2eff6c3dc4 | ||
|
|
41fe211aec | ||
|
|
2acfa6d88d | ||
|
|
348b0c728c | ||
|
|
ece2bda680 | ||
|
|
875e1573a4 | ||
|
|
926dc868ef | ||
|
|
4a69ff6428 | ||
|
|
75cf17e2ce | ||
|
|
af3f66a5fa | ||
|
|
61adf1f784 | ||
|
|
1d0311a194 | ||
|
|
bda9974eb8 | ||
|
|
0306296ae9 | ||
|
|
86ecb38ae2 | ||
|
|
f3ca58111c | ||
|
|
3124d3ca1c | ||
|
|
9012506209 | ||
|
|
adb874ca74 | ||
|
|
f006a8aab6 | ||
|
|
6aaf2f031b | ||
|
|
1669377938 | ||
|
|
da45abaafb | ||
|
|
2b942f03b2 | ||
|
|
985b5e6724 | ||
|
|
198c235765 | ||
|
|
e82ee97666 | ||
|
|
8be7dac209 | ||
|
|
d2e35d8b2c | ||
|
|
5938bc72b4 | ||
|
|
23860e5897 | ||
|
|
11adbed079 | ||
|
|
07eb45ad76 | ||
|
|
726e908b5a | ||
|
|
526c6d8852 | ||
|
|
6d2be2e0a1 | ||
|
|
a8a9423ab0 | ||
|
|
78a82be4a0 | ||
|
|
1acdb27996 | ||
|
|
66f2c55343 | ||
|
|
0f3fa86bed | ||
|
|
e5c2cfd243 | ||
|
|
1a7ce13ec3 | ||
|
|
b4c535c76a | ||
|
|
1c7592c707 | ||
|
|
e4f8f96b83 | ||
|
|
105baa0557 | ||
|
|
ec554dae2e | ||
|
|
da86f113b8 | ||
|
|
ef1c397f11 | ||
|
|
12e0cc3d7b | ||
|
|
ff6bb6ebb0 | ||
|
|
6b78215b2e | ||
|
|
29a25b708c | ||
|
|
376f22ce08 | ||
|
|
6f25a72fb7 | ||
|
|
ec50078f18 | ||
|
|
c4900f5a66 | ||
|
|
edb5dff064 | ||
|
|
3961e1844c | ||
|
|
d09ecac35d | ||
|
|
5d9a02657f | ||
|
|
792edd9146 | ||
|
|
fd045fcc39 | ||
|
|
7a2ab59346 | ||
|
|
dc7970ac80 | ||
|
|
d08d4fa488 | ||
|
|
0807e7fec1 | ||
|
|
1c4b5d1ca5 | ||
|
|
a3d9b2b9cb | ||
|
|
d0df08de2c | ||
|
|
14d670a9a2 | ||
|
|
67801506e0 | ||
|
|
e98291498b | ||
|
|
d82a86e01b | ||
|
|
760d053cd7 | ||
|
|
48eb6dbbe0 | ||
|
|
d520c6a816 | ||
|
|
a3894323db | ||
|
|
a4b902d5af | ||
|
|
5f9f0769eb | ||
|
|
49390574bf | ||
|
|
71fab09581 | ||
|
|
9225df85da | ||
|
|
81160ac1ea | ||
|
|
5dd02602b7 | ||
|
|
a92dfa3920 | ||
|
|
0c19a1aafe | ||
|
|
5429bb7d2b | ||
|
|
664799c01b | ||
|
|
d88c5b9db2 | ||
|
|
509acd1192 | ||
|
|
8db74a4514 | ||
|
|
0d6f98f50a | ||
|
|
0fe7a693f8 | ||
|
|
d368fbbf5b | ||
|
|
1e7c123145 | ||
|
|
9a2efd9686 | ||
|
|
069b0b0153 | ||
|
|
c12c64380d | ||
|
|
88961fbdb5 | ||
|
|
a11ceced09 | ||
|
|
9da94b38b3 | ||
|
|
ca35662ca2 | ||
|
|
e7c4bbe1e8 | ||
|
|
1bc56b5c9e | ||
|
|
25a0630bcb | ||
|
|
1f7d122bee | ||
|
|
d9cb32ca53 | ||
|
|
9cdfc61a30 | ||
|
|
760587ee2e | ||
|
|
d2fe8a2ddb | ||
|
|
d2dc76baf1 | ||
|
|
232de66683 | ||
|
|
3d61d1bca0 | ||
|
|
c2c9531c1b | ||
|
|
461df14cf7 | ||
|
|
81b0be0489 | ||
|
|
3074a211f8 | ||
|
|
0659b140f5 | ||
|
|
0b8160ae34 | ||
|
|
dbf2b7b4b6 | ||
|
|
1e8afc8ea4 | ||
|
|
70bd2e8a78 | ||
|
|
b1dfe6e714 | ||
|
|
46bc0fe8b4 | ||
|
|
8045544051 | ||
|
|
0cef4dc9b3 | ||
|
|
f1cfa4330a | ||
|
|
a50b370262 | ||
|
|
7cc3639758 | ||
|
|
24b5dd0c8c | ||
|
|
32afdfc257 | ||
|
|
10e61e28c6 | ||
|
|
d88be9aca4 | ||
|
|
064fd217ba | ||
|
|
dd2e2734ce | ||
|
|
390c230de9 | ||
|
|
b43f868eba | ||
|
|
119a18aa15 | ||
|
|
b79c35042a | ||
|
|
12f8e0fe71 | ||
|
|
0b065b16b1 | ||
|
|
b4d5451b11 | ||
|
|
2fb4c8d227 | ||
|
|
9d8f3db511 | ||
|
|
76813e9df4 | ||
|
|
35da9cfb54 | ||
|
|
3f28594376 | ||
|
|
64c142d21e | ||
|
|
36304e8356 | ||
|
|
4090930142 | ||
|
|
cd4d5df4db | ||
|
|
b921964c88 | ||
|
|
6dcef71ebc | ||
|
|
c69d4107d8 | ||
|
|
d6c34f2312 | ||
|
|
8666c491ce | ||
|
|
7f4cfc267e | ||
|
|
9d48eb6d74 | ||
|
|
7f80cad356 | ||
|
|
36b3278698 | ||
|
|
2633b4c876 | ||
|
|
fd26e9755d | ||
|
|
c5623a10c1 | ||
|
|
4049695425 | ||
|
|
25b0d12576 | ||
|
|
cb1c490a1c | ||
|
|
565a20a83e | ||
|
|
077965f083 | ||
|
|
eae4f569c2 | ||
|
|
3f999e525a | ||
|
|
509606dbda | ||
|
|
1b12a689a3 | ||
|
|
f91d09b2ae | ||
|
|
89c02483eb | ||
|
|
9725082b06 | ||
|
|
4c9471c415 | ||
|
|
2bee87916d | ||
|
|
7838b6dc0e | ||
|
|
6ae279c292 | ||
|
|
28aea45f95 | ||
|
|
38d0be992c | ||
|
|
73b0c8c68c | ||
|
|
b8002ce577 | ||
|
|
5eebcd01ef | ||
|
|
5a455e1558 | ||
|
|
c2d0eec9d2 | ||
|
|
97104d820e | ||
|
|
f334f804b6 | ||
|
|
38bcafbfe5 | ||
|
|
72196c705e | ||
|
|
eb4d800e40 | ||
|
|
ad508a30ea | ||
|
|
7068309b04 | ||
|
|
06ab054118 | ||
|
|
4f5c929a9b | ||
|
|
268a146775 | ||
|
|
7151c347a0 | ||
|
|
98d813c172 | ||
|
|
7b5a805eda | ||
|
|
d2b6429c8b | ||
|
|
450c9bb755 | ||
|
|
a45cd01e26 | ||
|
|
28f7a7315e | ||
|
|
d9e7e359f9 | ||
|
|
bee41e0e75 | ||
|
|
5e826a3392 | ||
|
|
635ff88a53 | ||
|
|
83156bf28e | ||
|
|
9ba081f241 | ||
|
|
179c3725ca | ||
|
|
645fedb1ed | ||
|
|
104ee3829f | ||
|
|
9f80eb2f74 | ||
|
|
44b3a643dd | ||
|
|
cf61a6bbe7 | ||
|
|
93b45fba84 | ||
|
|
0d1851a73b | ||
|
|
5d6377f71c | ||
|
|
28872f39c1 | ||
|
|
c0b8eab4b8 | ||
|
|
75ba00735d | ||
|
|
fdd7951d13 | ||
|
|
e0427ae200 | ||
|
|
ec269f7177 | ||
|
|
2226082b6b | ||
|
|
c69c188de9 | ||
|
|
8499655c94 | ||
|
|
4c0c13e792 | ||
|
|
9d2d693a63 | ||
|
|
e8d4db3f80 | ||
|
|
e7ebea535e | ||
|
|
c3a7e91a1d | ||
|
|
44be066b26 | ||
|
|
47f4efe60c | ||
|
|
a4d7aff651 | ||
|
|
d55b41963b | ||
|
|
6bfad8e2d0 | ||
|
|
e06ba65e6c | ||
|
|
3acd77a63d | ||
|
|
25b32a6444 | ||
|
|
62ae4fb265 | ||
|
|
57fe2a6cc2 | ||
|
|
a6ef8e0b40 | ||
|
|
467ceb89b1 | ||
|
|
873bc3f582 | ||
|
|
9ebb37c524 | ||
|
|
ccf4ba2269 | ||
|
|
e377a72f75 | ||
|
|
4ed806ea97 | ||
|
|
57ba991673 | ||
|
|
21a48ccab5 | ||
|
|
0f0c27ad09 | ||
|
|
40ed6450ff | ||
|
|
a0c0ea4c4c | ||
|
|
2dc413ca3a | ||
|
|
692b26622c | ||
|
|
72a56d33d0 | ||
|
|
ce4bfc55c1 | ||
|
|
faba53fa5f | ||
|
|
f0faec9def | ||
|
|
e6ef28050c | ||
|
|
547ec3cb3a | ||
|
|
5bfc67af4f | ||
|
|
c72d9b544e | ||
|
|
cd34619acd | ||
|
|
f091817d66 | ||
|
|
f2c65314b4 | ||
|
|
a9fcdd3341 | ||
|
|
36a5cc7446 | ||
|
|
fc0f278962 | ||
|
|
1f3db15892 | ||
|
|
e3e4c49427 | ||
|
|
1520b8bf73 | ||
|
|
c9e7f82905 | ||
|
|
14a1a665ef | ||
|
|
d2357fa779 | ||
|
|
703178ddf1 | ||
|
|
ec836e2e79 | ||
|
|
4e9c5de16c | ||
|
|
2a677aaf02 | ||
|
|
2a141cd9b3 | ||
|
|
3d1fcc35df | ||
|
|
e20d7afb72 | ||
|
|
5ade8b208e | ||
|
|
9c5e4f7a7c | ||
|
|
07e2bc3858 | ||
|
|
5c785ca1c6 | ||
|
|
b389b20ca3 | ||
|
|
6f1d496a9e | ||
|
|
fe12cb345e | ||
|
|
2607994c4c | ||
|
|
47a02afea6 | ||
|
|
a2e0a0c6f7 | ||
|
|
f3b11d6f72 | ||
|
|
edac8f764b | ||
|
|
4fa68e3bb0 | ||
|
|
69f310c02c | ||
|
|
09789e163c | ||
|
|
84c8851ff8 | ||
|
|
95dacdd6da | ||
|
|
3308f1146c | ||
|
|
37b9e46e96 | ||
|
|
8e8cf3df8d | ||
|
|
f4b188a9ac | ||
|
|
35c886a59c | ||
|
|
26fdd924ef | ||
|
|
e87a49796f | ||
|
|
7e0b1e479c | ||
|
|
1af2f7848e | ||
|
|
ea3494f6e7 | ||
|
|
0e7b93771e | ||
|
|
ea5a21e487 | ||
|
|
dc72b87479 | ||
|
|
2f20acfa34 | ||
|
|
4869058f46 | ||
|
|
fa006afd0d | ||
|
|
8e06255758 | ||
|
|
ba57b25cd4 | ||
|
|
4fa9d98171 | ||
|
|
6d19832d01 | ||
|
|
bdaa059fa3 | ||
|
|
f7bfc51735 | ||
|
|
998e156b21 | ||
|
|
491bf850e8 | ||
|
|
9bf53c6b25 | ||
|
|
e2fb49037a | ||
|
|
3291c24c8c | ||
|
|
f0bc375421 | ||
|
|
e3c223dc0a | ||
|
|
53c8b3b66d | ||
|
|
af5000b0f8 | ||
|
|
d5d4fdefc8 | ||
|
|
1caa0c6210 | ||
|
|
5b646617d1 | ||
|
|
9f028d9104 | ||
|
|
f40be696c7 | ||
|
|
95a503a390 | ||
|
|
88c51f4933 | ||
|
|
d63177f3c7 | ||
|
|
e9d41fd01b | ||
|
|
224d2987db | ||
|
|
8439d6d3aa | ||
|
|
13b38955e6 | ||
|
|
ae3fb9a2dd | ||
|
|
9d78d769c4 | ||
|
|
e436a31a18 | ||
|
|
929ade554c | ||
|
|
d6c7066bfa | ||
|
|
2387f183e9 | ||
|
|
e8d645467f | ||
|
|
a8e022cab4 | ||
|
|
579e8abda1 | ||
|
|
4d44440e90 | ||
|
|
709f914561 | ||
|
|
0afa8e092e | ||
|
|
e886619b22 | ||
|
|
fa5f423bbd | ||
|
|
bfbf5c70d5 | ||
|
|
2c19a442a7 | ||
|
|
984ca69e8c | ||
|
|
544d7a15d4 | ||
|
|
858f49d265 | ||
|
|
1b66d446f9 | ||
|
|
6e92fc0505 | ||
|
|
ea84403811 | ||
|
|
65a02795d6 | ||
|
|
c5549367eb | ||
|
|
6aa4a4d205 | ||
|
|
9e20f1dd33 | ||
|
|
16be19b5d3 | ||
|
|
80ac0259b8 | ||
|
|
9f7911923c | ||
|
|
686005071e | ||
|
|
e16d31d605 | ||
|
|
8b201d22cb | ||
|
|
0f6f8d43bd | ||
|
|
8f171cddd9 | ||
|
|
c77c323f73 | ||
|
|
9e358309e4 | ||
|
|
485438f38d | ||
|
|
fe26a60337 | ||
|
|
d2c2de4dd7 | ||
|
|
d49d58f7f8 | ||
|
|
c0c5579027 | ||
|
|
164d4fff8b | ||
|
|
6e7e4a129b | ||
|
|
7726406674 | ||
|
|
ed38b39fec | ||
|
|
9188d4316e | ||
|
|
cf374c6b8b | ||
|
|
82388dcbc3 | ||
|
|
7a6a99e2b6 | ||
|
|
c383736834 | ||
|
|
6e5e78df3b | ||
|
|
311bf1b641 | ||
|
|
5c9933791c | ||
|
|
039d4d11aa | ||
|
|
c0f2d2aa84 | ||
|
|
45099bfa07 | ||
|
|
695ae9d970 | ||
|
|
21eb0064b1 | ||
|
|
513fe402af | ||
|
|
b27e5754e8 | ||
|
|
fa7231d77b | ||
|
|
f5a30ecb33 | ||
|
|
7f22289889 | ||
|
|
f80c39077a | ||
|
|
75c60a1cc4 | ||
|
|
2cf38d6b7c | ||
|
|
482c9c1574 | ||
|
|
882e59a260 | ||
|
|
7a036956b7 | ||
|
|
7520b20cf9 | ||
|
|
d47ccd75d5 | ||
|
|
56ff81a0ed | ||
|
|
8db76f5324 | ||
|
|
a9442ea06e | ||
|
|
92bd0d3ea0 | ||
|
|
512d7322b2 | ||
|
|
45645c439f | ||
|
|
84ebb82cae | ||
|
|
576f6a3bd6 | ||
|
|
96df821eca | ||
|
|
8589778e92 | ||
|
|
a8a7de9ee6 | ||
|
|
1d99340425 | ||
|
|
a8cdfb56f3 | ||
|
|
0958cdaa2d | ||
|
|
ebfb3dd31e | ||
|
|
2293a14a90 | ||
|
|
3e664a7c2c | ||
|
|
30b37951b2 | ||
|
|
0d177d12fe | ||
|
|
f7c8a570f8 | ||
|
|
1814aa86b7 | ||
|
|
d0a5e658d1 | ||
|
|
2cbc1da286 | ||
|
|
75d21231ae | ||
|
|
f2d340a012 | ||
|
|
1b28111c6d | ||
|
|
4f4efcbc23 | ||
|
|
7006d18e93 | ||
|
|
049959b567 | ||
|
|
7cd8c0475e | ||
|
|
207accf21f | ||
|
|
bd1e62abc1 | ||
|
|
d2e33ee423 | ||
|
|
f2934f8453 | ||
|
|
20fb269828 | ||
|
|
cc13707fea | ||
|
|
a9db6a0473 | ||
|
|
282ddb85c7 | ||
|
|
3943b8753f | ||
|
|
9e26ea1866 | ||
|
|
8152a87514 | ||
|
|
b28775c2c6 | ||
|
|
9b27200793 | ||
|
|
0b7d7dac38 | ||
|
|
3eb96ef765 | ||
|
|
8805584cbe | ||
|
|
c2edf314c2 | ||
|
|
2da2d54013 | ||
|
|
f433b911a0 | ||
|
|
8b44815b70 | ||
|
|
788f597a3f | ||
|
|
4ee70acf12 | ||
|
|
be5c66bd93 | ||
|
|
5347e5a3aa | ||
|
|
9b22254b6c | ||
|
|
e5ccd27fd9 | ||
|
|
d34ad62c8a | ||
|
|
0d0bee674d | ||
|
|
279747d3a4 | ||
|
|
1e4bf38402 | ||
|
|
93d1163c5f | ||
|
|
a3e436e42d | ||
|
|
e824886e19 | ||
|
|
9c724b31de | ||
|
|
6a67e0ea8b | ||
|
|
7b118995ea | ||
|
|
35b4564644 | ||
|
|
30df947365 | ||
|
|
b1ec975612 | ||
|
|
a4851c8d81 | ||
|
|
469f48f473 | ||
|
|
c915ac4a74 | ||
|
|
9b74c470da | ||
|
|
1034e434c4 | ||
|
|
0a4935d193 | ||
|
|
5995f6fbef | ||
|
|
0ca15a6c65 | ||
|
|
72193833a9 | ||
|
|
e40ffabe4a | ||
|
|
f419bff545 | ||
|
|
69eec0135e | ||
|
|
a267e32e0e | ||
|
|
92a5249e45 | ||
|
|
fbfe664438 | ||
|
|
b52b5b4287 | ||
|
|
ba3513341a | ||
|
|
de06ce909e | ||
|
|
fa29b746e7 | ||
|
|
5527ebf085 | ||
|
|
cca2052b15 | ||
|
|
ec0338bb30 | ||
|
|
f40a1b6de8 | ||
|
|
7110337dcd | ||
|
|
cbfe850351 | ||
|
|
d6d768029b | ||
|
|
d003e086bb | ||
|
|
a3b66ec456 | ||
|
|
1c3d41c03b | ||
|
|
56b1751c3f | ||
|
|
93724063e2 | ||
|
|
72b8cd2ac8 | ||
|
|
e5b22255e9 | ||
|
|
a4639e295d | ||
|
|
8dc4246c98 | ||
|
|
a187832cdc | ||
|
|
d08a46a573 | ||
|
|
e86fcc9636 | ||
|
|
1f60405d43 | ||
|
|
8f568cc6ac | ||
|
|
4d61820a78 | ||
|
|
b6d49233fb | ||
|
|
beac6be7db | ||
|
|
b99931df95 | ||
|
|
00ba661456 | ||
|
|
2ffde30340 | ||
|
|
f97a84d2df | ||
|
|
c5bb10db4c | ||
|
|
acf4d2f740 | ||
|
|
1c2f6913bb | ||
|
|
31be8bee95 | ||
|
|
2a113efe5c | ||
|
|
801791b4df | ||
|
|
643a2ee739 | ||
|
|
cd9c97ffc0 | ||
|
|
c105319b08 | ||
|
|
d98fa381e8 | ||
|
|
1f39b43869 | ||
|
|
3aeb6a662a | ||
|
|
d7c176d4fd | ||
|
|
cac1df7a66 | ||
|
|
aafa383f56 | ||
|
|
af6e2abdb2 | ||
|
|
05430f7e47 | ||
|
|
2daf4cf46a | ||
|
|
52333beabe | ||
|
|
49d1e0622b | ||
|
|
eebd87c6b7 | ||
|
|
c1b6b30144 | ||
|
|
7703986c9e | ||
|
|
6c272d9336 | ||
|
|
73b0416dbe | ||
|
|
c7760b0ed9 | ||
|
|
c0db476f80 | ||
|
|
7999c29b51 | ||
|
|
1d111a252e | ||
|
|
93d085e23e | ||
|
|
67e0e34f40 | ||
|
|
098e61295c | ||
|
|
1d2666a343 | ||
|
|
b8c2c86c59 | ||
|
|
edf0342404 | ||
|
|
dc6815045c | ||
|
|
23ed1cf5e5 | ||
|
|
97715f260f | ||
|
|
87411ee952 | ||
|
|
d0bbf1e4ad | ||
|
|
3bbd088733 | ||
|
|
d96dd5fe82 | ||
|
|
6028e3f299 | ||
|
|
37bfce1905 | ||
|
|
5993b30ccf | ||
|
|
2fc6c4c0bc | ||
|
|
0195a6bab5 | ||
|
|
ccb35bdc5a | ||
|
|
bfadfaf261 | ||
|
|
d0180a6633 | ||
|
|
afbc580ae6 | ||
|
|
2b2e01f3d1 | ||
|
|
529f1ca835 | ||
|
|
ee7993b918 | ||
|
|
8239a40c72 | ||
|
|
2c9f9a36c5 | ||
|
|
307169fcc3 | ||
|
|
5ee69d24f7 | ||
|
|
077106b71b | ||
|
|
141e660d91 | ||
|
|
be73699013 | ||
|
|
65e3649999 | ||
|
|
994f1ae7ed | ||
|
|
548e633b72 | ||
|
|
87b98e7949 | ||
|
|
5692baf1f3 | ||
|
|
8a10a2aa18 | ||
|
|
797bbf8870 | ||
|
|
edb3f9e885 | ||
|
|
a0008e165b | ||
|
|
3d55b033d6 | ||
|
|
93fb0efc67 | ||
|
|
b7585ef02c | ||
|
|
fce07288e9 | ||
|
|
3ccfdb2e97 | ||
|
|
5840e2ba07 | ||
|
|
4daba88970 | ||
|
|
3180feb874 | ||
|
|
17a430f31f | ||
|
|
20d330f0f1 | ||
|
|
27d0467e08 | ||
|
|
5437967218 | ||
|
|
1228f0572d | ||
|
|
9cf44c3050 | ||
|
|
aa9b641787 | ||
|
|
2e3c4f33a2 | ||
|
|
39ef6ebdbf | ||
|
|
4d08c22204 | ||
|
|
4041dd3ad5 | ||
|
|
a38de8198f | ||
|
|
3369374e43 | ||
|
|
d74631bbdb | ||
|
|
be8c392562 | ||
|
|
f564efb4d6 | ||
|
|
dee9e3c326 | ||
|
|
4ff8d7d68e | ||
|
|
789e467573 | ||
|
|
745b85a3ac | ||
|
|
4f84c2cb01 | ||
|
|
83414acb1d | ||
|
|
356effc6a9 | ||
|
|
88ec186b98 | ||
|
|
530615f049 | ||
|
|
afec12822f | ||
|
|
f117620ead | ||
|
|
1c9f34ba1b | ||
|
|
c26cd9876a | ||
|
|
32f7d37768 | ||
|
|
3873e680e4 | ||
|
|
ddc8a9a286 | ||
|
|
399bde7588 | ||
|
|
5e51febee8 | ||
|
|
6e8200a380 | ||
|
|
fc9961b2de | ||
|
|
d750e3e996 | ||
|
|
1cd15c6f7c | ||
|
|
5c47acbcc3 | ||
|
|
1363c2893b | ||
|
|
cbc426014b | ||
|
|
17178e3ae3 | ||
|
|
b9299d90df | ||
|
|
aff5b46c5e | ||
|
|
2e83f81672 | ||
|
|
e352cc76cf | ||
|
|
cab2ee4fa4 | ||
|
|
bdfc839080 | ||
|
|
6beb21349b | ||
|
|
b2240e8f1a | ||
|
|
32f43d46b5 | ||
|
|
803d689bd3 | ||
|
|
66255bf443 | ||
|
|
338a486513 | ||
|
|
b543343045 | ||
|
|
28c60332e8 | ||
|
|
9ddc45721f | ||
|
|
2849baf857 | ||
|
|
768fdcd0e4 | ||
|
|
5280ef32cd | ||
|
|
59a7e4179b | ||
|
|
bd2054e5a4 | ||
|
|
69be19c02b | ||
|
|
fcffeb5734 | ||
|
|
11b67208f4 | ||
|
|
03e8342c90 | ||
|
|
fcd070066c | ||
|
|
9b38308ad1 | ||
|
|
5d79ad527e | ||
|
|
afcdf96e5c | ||
|
|
ffc8b5619e | ||
|
|
3e40b08525 | ||
|
|
9be49b3738 | ||
|
|
724488911e | ||
|
|
8ac0bf5865 | ||
|
|
57c1c38d52 | ||
|
|
237cf037be | ||
|
|
8b98181752 | ||
|
|
21993a4862 | ||
|
|
6e8e1ad74b | ||
|
|
03da5b3cf1 | ||
|
|
f348ef1f96 | ||
|
|
193cebed81 | ||
|
|
f2f6156bd0 | ||
|
|
0d7c3838f6 | ||
|
|
105e3360be | ||
|
|
23dd3b4f41 | ||
|
|
bc225f9656 | ||
|
|
dd9f76f73b | ||
|
|
47ae8b903e | ||
|
|
3dcfd3738d | ||
|
|
8993794a88 | ||
|
|
a530e7e70a | ||
|
|
4791b8e53c | ||
|
|
6ddd19ac54 | ||
|
|
6a871e73e0 | ||
|
|
7ba106d97b | ||
|
|
69c021cc54 | ||
|
|
7a63bb395f | ||
|
|
1931695b03 | ||
|
|
b953240966 | ||
|
|
e1c06af3b2 | ||
|
|
1cc7bfcb2d | ||
|
|
2445c74638 | ||
|
|
6a69ed48a9 | ||
|
|
714c7eb8d1 | ||
|
|
6790287470 | ||
|
|
217693937f | ||
|
|
94a8a5c753 | ||
|
|
22300577cf | ||
|
|
6a07f4e731 | ||
|
|
63ace60dcc | ||
|
|
601951582d | ||
|
|
ca4d22602f | ||
|
|
42774a6227 | ||
|
|
7f65bfeebb | ||
|
|
88178a6b6b | ||
|
|
3f9ca1454e | ||
|
|
9a3f1bd5cf | ||
|
|
0186254f74 | ||
|
|
6dc432e6a9 | ||
|
|
01db774e05 | ||
|
|
aaef3dc19c | ||
|
|
bb8009363d | ||
|
|
5fd403cf08 | ||
|
|
168c77eac5 | ||
|
|
bf865cbe5d | ||
|
|
3e3029461b | ||
|
|
c750e0a64e | ||
|
|
fc2662c402 | ||
|
|
29dad51ff7 | ||
|
|
9250dde5b0 | ||
|
|
29ca72d8ca | ||
|
|
87c89a0de5 | ||
|
|
73f72e39d3 | ||
|
|
e00ba62606 | ||
|
|
48d53cecce | ||
|
|
da44bba3fe | ||
|
|
b55e42ba78 | ||
|
|
233a9843d7 | ||
|
|
6184087456 | ||
|
|
237ad2fa3c | ||
|
|
b8037c04d0 | ||
|
|
cdb9c2eddb | ||
|
|
8a284f0767 | ||
|
|
83a57b08ab | ||
|
|
d1a251ff6c | ||
|
|
12f0c826c8 | ||
|
|
4aa5da8c0d | ||
|
|
e0fd81e938 | ||
|
|
58509bcf41 | ||
|
|
8aa0eb1d64 | ||
|
|
ece974c1be | ||
|
|
56dd3c32cb | ||
|
|
118e3a3bd3 | ||
|
|
8cd3c2a89f | ||
|
|
9c4672fd68 | ||
|
|
04f6f4f9cf | ||
|
|
7b851e7ac8 | ||
|
|
6c0b33c0dc | ||
|
|
4d951c9827 | ||
|
|
172232be48 | ||
|
|
d749a13611 | ||
|
|
3998be3f93 | ||
|
|
a381827890 | ||
|
|
eecfe45443 | ||
|
|
ad5eb7b594 | ||
|
|
9ce09eb406 | ||
|
|
9c23f3d1d9 | ||
|
|
3f779b7ceb | ||
|
|
3bc53bd7f8 | ||
|
|
27b61fe9a4 | ||
|
|
4d94c7ac7a | ||
|
|
4eb1125b7b | ||
|
|
496b481c31 | ||
|
|
77120cf156 | ||
|
|
80f11c0f70 | ||
|
|
bee8059cbe | ||
|
|
0f2e72172b | ||
|
|
25d1e0a74d | ||
|
|
cbd9d16e4c | ||
|
|
cb708b3217 | ||
|
|
4e5a22a7e8 | ||
|
|
3722db93c6 | ||
|
|
b43331dc27 | ||
|
|
80c6ce81e1 | ||
|
|
1a776359c4 | ||
|
|
113e4035e5 | ||
|
|
a03095ab8e | ||
|
|
d03f830622 | ||
|
|
9b42dc9f10 | ||
|
|
fd7adf3c64 | ||
|
|
d0b7e72f15 | ||
|
|
5a61c6b7df | ||
|
|
c897eae04e | ||
|
|
c33095cd0e | ||
|
|
05d8b7983a | ||
|
|
166d9f7133 | ||
|
|
2ce31f35cc | ||
|
|
ce5d0cefe3 | ||
|
|
6cc668fe83 | ||
|
|
ac0aa8daf4 | ||
|
|
16b094be44 | ||
|
|
b3e6fd7b96 | ||
|
|
893d5d92f3 | ||
|
|
77add0b39d | ||
|
|
b4f8ab0a49 | ||
|
|
1d46c44c21 | ||
|
|
12da35f875 | ||
|
|
8970a15d4e | ||
|
|
82217478d9 | ||
|
|
4c792308bb | ||
|
|
978d94a2cd | ||
|
|
b195d89b76 | ||
|
|
875888a341 | ||
|
|
6631a13d20 | ||
|
|
28728fe29f | ||
|
|
aa954cbea9 | ||
|
|
dae339f494 | ||
|
|
5bcb59f876 | ||
|
|
9132592fd7 | ||
|
|
ca592fac77 | ||
|
|
ea657824c2 | ||
|
|
99e7072e27 | ||
|
|
ad32f4a0a3 | ||
|
|
b9cdd0996d | ||
|
|
e92a76f95b | ||
|
|
10d152342f | ||
|
|
7e4b0635b2 | ||
|
|
eec17f10d5 | ||
|
|
ac9d5dfa95 | ||
|
|
4c2b3738c2 | ||
|
|
6f29183b45 | ||
|
|
dd65c9c588 | ||
|
|
cb8bb05627 | ||
|
|
256f6d8fdd | ||
|
|
a88fdddecb | ||
|
|
fd5e3e24df | ||
|
|
244d27427d | ||
|
|
55c42a3cca | ||
|
|
3c9cfbdf92 | ||
|
|
46dd58d26e | ||
|
|
051dd2e567 | ||
|
|
17ccf40082 | ||
|
|
0f2b61694d | ||
|
|
0aed66df47 | ||
|
|
94a6e9a886 | ||
|
|
355f48b6ba | ||
|
|
d1a6526c22 | ||
|
|
975a308647 | ||
|
|
5138eaeb68 | ||
|
|
45dfaa1b21 | ||
|
|
715f92f3d5 | ||
|
|
8d5a765040 | ||
|
|
34fa6b158b | ||
|
|
78c1f6b8e3 | ||
|
|
adccb91106 | ||
|
|
1e213dfff7 | ||
|
|
d469fa1d40 | ||
|
|
737db469ba | ||
|
|
a44a33d508 | ||
|
|
a518d41c78 | ||
|
|
d5360c6568 | ||
|
|
d468107311 | ||
|
|
3f65e1bfa0 | ||
|
|
a22758f5cd | ||
|
|
88b5b9d1e7 | ||
|
|
e38f7c880e | ||
|
|
6367b58994 | ||
|
|
5a54b5ee64 | ||
|
|
002e41f418 | ||
|
|
f7787c748a | ||
|
|
f9b18b45a4 | ||
|
|
8966f44272 | ||
|
|
3dbcbae61f | ||
|
|
24508abe7a | ||
|
|
27f8f2542e | ||
|
|
44ee3ceec8 | ||
|
|
b08112aec0 | ||
|
|
9d2bbda2b9 | ||
|
|
6eff685b18 | ||
|
|
2d08146de8 | ||
|
|
f131420a44 | ||
|
|
245ea5463e | ||
|
|
71bb90a769 | ||
|
|
e71a22fbb3 | ||
|
|
802c4c28f5 | ||
|
|
2cda6fc057 | ||
|
|
a0303c70f9 | ||
|
|
f5b9f58747 | ||
|
|
0d8dee0ed7 | ||
|
|
ace02263dd | ||
|
|
a2398bfb3a | ||
|
|
cd7ddb5ba1 | ||
|
|
ae37a4c85d | ||
|
|
32e1716061 | ||
|
|
d92616f39f | ||
|
|
0c13db46fd | ||
|
|
b6fc9a8ec1 | ||
|
|
a672141352 | ||
|
|
df354e483a | ||
|
|
89874545b1 | ||
|
|
b0fdd09f39 | ||
|
|
fbf620ae36 | ||
|
|
509f7da12e | ||
|
|
64a40e4ed0 | ||
|
|
ab253dbf28 | ||
|
|
feb19df20f | ||
|
|
d5d2241f1b | ||
|
|
5af1a0aa87 | ||
|
|
816621651d | ||
|
|
8f2aa08dbe | ||
|
|
d20e1a6e9c | ||
|
|
2a5a4c9ace | ||
|
|
2e7fd3fb60 | ||
|
|
56579100f1 | ||
|
|
1e5cd24acd | ||
|
|
7f152cef20 | ||
|
|
3958d2d597 | ||
|
|
84a3b31e8d | ||
|
|
cc15c12d19 | ||
|
|
50e7b89b15 | ||
|
|
0b507cb66a | ||
|
|
b1c697ea09 | ||
|
|
dbcf15e45b | ||
|
|
21d864ce7a | ||
|
|
dcf1f1af10 | ||
|
|
9c25a39b7b | ||
|
|
d79687db53 | ||
|
|
77428e0fe5 | ||
|
|
53df3b5cfa | ||
|
|
f2e1c9e959 | ||
|
|
a004b2f3e0 | ||
|
|
65b4398b0e | ||
|
|
0b83d2869d | ||
|
|
1a408b810c | ||
|
|
bab5879c3d | ||
|
|
6f79954989 | ||
|
|
8d4622dc31 | ||
|
|
fecdc48b09 | ||
|
|
0edb51a32a | ||
|
|
750bd2f61b | ||
|
|
f6fa9821f0 | ||
|
|
3ed06dafb0 | ||
|
|
4be6a5b5a9 | ||
|
|
a4c77ce33e | ||
|
|
f6babd01ca | ||
|
|
17ce9a0903 | ||
|
|
824b4681e4 | ||
|
|
7ba7e0b2d8 | ||
|
|
0391eabc79 | ||
|
|
e2ebf6b8fe | ||
|
|
58d3d678ca | ||
|
|
b52b68595b | ||
|
|
0a8d606686 | ||
|
|
d1ef9f3e99 | ||
|
|
5a830c17db | ||
|
|
10c4a4d665 | ||
|
|
e93e7f05c6 | ||
|
|
e2c6240798 | ||
|
|
24ad483214 | ||
|
|
bfa53224a6 | ||
|
|
00ec25d38c | ||
|
|
348fc156de | ||
|
|
1a9cb5335a | ||
|
|
0abfab96a4 | ||
|
|
bbfbbbf91e | ||
|
|
8db0150c4a | ||
|
|
3d7db6136f | ||
|
|
ace6c1167b | ||
|
|
4644dfbd7b | ||
|
|
c7b205dbde | ||
|
|
ffff2636ae | ||
|
|
c69e1bb091 | ||
|
|
49531285c9 | ||
|
|
b9824d0095 | ||
|
|
3dc04f9246 | ||
|
|
1bf6dc37d9 | ||
|
|
97a0e2413e | ||
|
|
c5f199bdf8 | ||
|
|
656e3ff022 | ||
|
|
94f1a80323 | ||
|
|
11256e6988 | ||
|
|
db6c32891a | ||
|
|
6d819206ea | ||
|
|
32240ee475 | ||
|
|
77a1c2cfb8 | ||
|
|
0f6d7ce2a4 | ||
|
|
e8738adc40 | ||
|
|
bca02edead | ||
|
|
abf81ac26b | ||
|
|
011d2f83f6 | ||
|
|
1a80c5273c | ||
|
|
cf8f31168e | ||
|
|
e25d7ca995 | ||
|
|
51fa8994c3 | ||
|
|
78852b7119 | ||
|
|
193bb0bf26 | ||
|
|
d862462bbf | ||
|
|
dcecd30e7c | ||
|
|
a01ef3bb08 | ||
|
|
60cd2c2b12 | ||
|
|
daad1cac5e | ||
|
|
c6b89425b1 | ||
|
|
70408ca8ee | ||
|
|
b3bf86d404 | ||
|
|
296c337eb6 | ||
|
|
a6f71911fe | ||
|
|
b91a781d27 | ||
|
|
6aa363830b | ||
|
|
fffc0f9eae | ||
|
|
1d2889f5b8 | ||
|
|
6ed7568cd9 | ||
|
|
22ca5b76b4 | ||
|
|
a03ce5bf7b | ||
|
|
2994806a35 | ||
|
|
be17960ce6 | ||
|
|
eeb2f0ad60 | ||
|
|
314e5bc364 | ||
|
|
a294bfde11 | ||
|
|
baa496fc07 | ||
|
|
4ca29d5d2e | ||
|
|
5e7074a297 | ||
|
|
fd6268ce8a | ||
|
|
806da552ce | ||
|
|
47561340e3 | ||
|
|
b374952141 | ||
|
|
e098970d82 | ||
|
|
6ca5f5e877 | ||
|
|
6b023c5fb6 | ||
|
|
bd30103758 | ||
|
|
e9ead72e79 | ||
|
|
513edc58ab | ||
|
|
fd7e7bd439 | ||
|
|
f510f20f57 | ||
|
|
a0a92b9b40 | ||
|
|
ba878c7587 | ||
|
|
f1f76a4910 | ||
|
|
3ea4bc29ba | ||
|
|
82848aa4cd | ||
|
|
5131604ba7 | ||
|
|
1be821b07a | ||
|
|
1ed475d469 | ||
|
|
e11413eab8 | ||
|
|
98db923ac7 | ||
|
|
7376ff1c9b | ||
|
|
d427e3e0ae | ||
|
|
550119a53a | ||
|
|
2df182c4c9 | ||
|
|
2b9b872ad4 | ||
|
|
94853714c7 | ||
|
|
01529a8028 | ||
|
|
71d348227e | ||
|
|
76f585a051 | ||
|
|
f1085716d9 | ||
|
|
93bb620099 | ||
|
|
ded0bd7d12 | ||
|
|
088f646d6f | ||
|
|
e6a00f7935 | ||
|
|
e5d625f294 | ||
|
|
6e3bfcdf04 | ||
|
|
10bd19e390 | ||
|
|
9a1cb822d1 | ||
|
|
8ad5f3426c | ||
|
|
2070a98a72 | ||
|
|
b97410dab7 | ||
|
|
d47bc021a5 | ||
|
|
0b2dfecf27 | ||
|
|
46ea97333e | ||
|
|
598a9f6a0f | ||
|
|
ef7d92d6bd | ||
|
|
da4fe41f34 | ||
|
|
91fe4050b2 | ||
|
|
23da6cf69e | ||
|
|
51883b450f | ||
|
|
cbdf02db55 | ||
|
|
196096cd65 | ||
|
|
476ac38883 | ||
|
|
90fea916fd | ||
|
|
6fccd203a4 | ||
|
|
f2f0ee0179 | ||
|
|
1f9218bd5a | ||
|
|
966f7b2d61 | ||
|
|
58c4b541b0 | ||
|
|
f6c490fc62 | ||
|
|
be59392814 | ||
|
|
d0e21d7d8a | ||
|
|
737373940e | ||
|
|
c639b89511 | ||
|
|
c530b3f8b4 | ||
|
|
1592a448f3 | ||
|
|
c5ab2b1373 | ||
|
|
f14f2cb5b7 | ||
|
|
9c2945d270 | ||
|
|
05357c24f6 | ||
|
|
75839f330c | ||
|
|
ba0a9bbe58 | ||
|
|
fb082471fe | ||
|
|
f8968f2eb1 | ||
|
|
990605948b | ||
|
|
21c96281a8 | ||
|
|
1ad7fce7a5 | ||
|
|
76162953e6 | ||
|
|
b934e29dc0 | ||
|
|
93c128438c | ||
|
|
c283ddbb6a | ||
|
|
e3085a7054 | ||
|
|
4aa9a6e7a3 | ||
|
|
76b0057deb | ||
|
|
5d964f7638 | ||
|
|
81610dee0e | ||
|
|
f64c0ae266 | ||
|
|
324992f6ff | ||
|
|
c35ce9ffe1 | ||
|
|
a13a6d3919 | ||
|
|
ac01c6fff2 | ||
|
|
53074c7b20 | ||
|
|
1d4ef9474f | ||
|
|
59e948fa06 | ||
|
|
55fe30b02c | ||
|
|
e2929f43a3 | ||
|
|
9d67f58490 | ||
|
|
a862240ed7 | ||
|
|
0f604f453d | ||
|
|
113e9eba79 | ||
|
|
9af610a45b | ||
|
|
e8db5d267e | ||
|
|
201fbb71c1 | ||
|
|
2f87e55ae6 | ||
|
|
34af797ad2 | ||
|
|
4ca640eee5 | ||
|
|
29d1bf7ce5 | ||
|
|
c2f9c687ce | ||
|
|
a8da64cc6a | ||
|
|
d522258e0a | ||
|
|
5f738f97ea | ||
|
|
db319825a1 | ||
|
|
cbb9ceb709 | ||
|
|
333ee232ae | ||
|
|
963b483697 | ||
|
|
49425a37ac | ||
|
|
0da975a9d3 | ||
|
|
1ea0522fcb | ||
|
|
aaaa0e6aea | ||
|
|
42368f05f8 | ||
|
|
4e51a5db73 | ||
|
|
4bd5a3675f | ||
|
|
a4d3850f13 | ||
|
|
864d370994 | ||
|
|
47f0550cea | ||
|
|
1bbc2b0165 | ||
|
|
fc8a1ec4fc | ||
|
|
4baabd7d07 | ||
|
|
92ba170cdf | ||
|
|
e842850695 | ||
|
|
41fcbb2989 | ||
|
|
d6a6cf6a59 | ||
|
|
113c8f6d4a | ||
|
|
8218acddca | ||
|
|
7cb65df19e | ||
|
|
91ba993279 | ||
|
|
505f3dd947 | ||
|
|
7eca66e2c4 | ||
|
|
3111c5437b | ||
|
|
d32a1adead | ||
|
|
9c5a2c0196 | ||
|
|
19a76008d7 | ||
|
|
2ffcccdc6f | ||
|
|
67c01046be | ||
|
|
c755d651cc | ||
|
|
0529729626 | ||
|
|
984d989f14 | ||
|
|
a204e34d53 | ||
|
|
3e47041820 | ||
|
|
c471f621b2 | ||
|
|
e2e010c418 | ||
|
|
913e0dd3e4 | ||
|
|
192a718d08 | ||
|
|
a881232eb1 | ||
|
|
cf73e827e0 | ||
|
|
bf97905fe9 | ||
|
|
f962b8a573 | ||
|
|
9e9786ecc7 | ||
|
|
59d22b536a | ||
|
|
e8d17fd733 | ||
|
|
42f4cb618b | ||
|
|
faa240ab97 | ||
|
|
a02e72d895 | ||
|
|
852b43b121 | ||
|
|
020823510d | ||
|
|
5c92128b17 | ||
|
|
7cee3c9050 | ||
|
|
f31cf9f839 | ||
|
|
960de69c20 | ||
|
|
6d8e4d14e6 | ||
|
|
fd7929134b | ||
|
|
40016f0d52 | ||
|
|
05c46653a1 | ||
|
|
a932129d52 | ||
|
|
426c07ce75 | ||
|
|
140723108e | ||
|
|
418f023780 | ||
|
|
85b6e09ea6 | ||
|
|
d6bd7e0886 | ||
|
|
2df93bea24 | ||
|
|
b474a67ef4 | ||
|
|
ddd94da47b | ||
|
|
48bd1854e4 | ||
|
|
6582ebcf57 | ||
|
|
41cd6f4290 | ||
|
|
5f40bab9c5 | ||
|
|
4b90b259a8 | ||
|
|
279682df11 | ||
|
|
64b6c5967d | ||
|
|
5826f055e3 | ||
|
|
e4ec71928d | ||
|
|
cb2ff4002f | ||
|
|
36d5c888a5 | ||
|
|
de7493bc00 | ||
|
|
6819c1d9ff | ||
|
|
021a3fe3bc | ||
|
|
0d70033e4c | ||
|
|
812cf21f98 | ||
|
|
f0da088836 | ||
|
|
d7501751e3 | ||
|
|
94648f072e | ||
|
|
a7d34b2c1b | ||
|
|
26403096e8 | ||
|
|
62190bde17 | ||
|
|
293b3d90b9 | ||
|
|
1928b904e5 | ||
|
|
a71cf6080f | ||
|
|
14d56c3e28 | ||
|
|
707e3bc08f | ||
|
|
0614aef362 | ||
|
|
2ff9a7ff22 | ||
|
|
3e4cfc16df | ||
|
|
fcd846bd6d | ||
|
|
05028c958e | ||
|
|
40455e199b | ||
|
|
e5c9ccbdcc | ||
|
|
be22ebd789 | ||
|
|
050d12a8ec | ||
|
|
5746d0264a | ||
|
|
0a4010d9a9 | ||
|
|
ab30dd2294 | ||
|
|
f53e77ecc9 | ||
|
|
91da8f1b5f | ||
|
|
1bf616579b | ||
|
|
da2d48b49a | ||
|
|
48b209155b | ||
|
|
7fe8749807 | ||
|
|
b73547ced9 | ||
|
|
9c8c22979f | ||
|
|
60b387ac56 | ||
|
|
20339c1452 | ||
|
|
7a15a8151c | ||
|
|
967d9b1036 | ||
|
|
faec28ac78 | ||
|
|
0832c8610b | ||
|
|
fa7ca994e9 | ||
|
|
288221918e | ||
|
|
5462e96090 | ||
|
|
a1b5d8bdc5 | ||
|
|
bd280ad2b6 | ||
|
|
0c460f7aab | ||
|
|
634c420799 | ||
|
|
0bdb57c44e | ||
|
|
2540777e18 | ||
|
|
eaced33ed5 | ||
|
|
0b97c47f4e | ||
|
|
584075a9b1 | ||
|
|
3febb2be5e | ||
|
|
c4a9841ba6 | ||
|
|
c613c3b4e1 | ||
|
|
814f07212d | ||
|
|
a63120b78f | ||
|
|
598a39fcc1 | ||
|
|
425fdb502c | ||
|
|
3016ef8545 | ||
|
|
87b4dd09e4 | ||
|
|
95f54b9330 | ||
|
|
1a8d4ea7fd | ||
|
|
e27424102b | ||
|
|
d35540e691 | ||
|
|
bda536cc62 | ||
|
|
cf3443ace3 | ||
|
|
b8e05fc7da | ||
|
|
ddfbb1d42e | ||
|
|
c4c255d560 | ||
|
|
b1fd47ff9d | ||
|
|
636848ed26 | ||
|
|
6e713ebd83 | ||
|
|
80a4d2af59 | ||
|
|
d0153da3d1 | ||
|
|
aa6f467942 | ||
|
|
34f8a123a5 | ||
|
|
63ae7d845c | ||
|
|
12d8097774 | ||
|
|
ae4ce70c48 | ||
|
|
cc43eab6ee | ||
|
|
ea5ec58ca3 | ||
|
|
775499a1ff | ||
|
|
46d04541f1 | ||
|
|
d80497011b | ||
|
|
02fea4ad5d | ||
|
|
effc6fc9dd | ||
|
|
300fb55ec5 | ||
|
|
8a1f2cbca8 | ||
|
|
dec411e866 | ||
|
|
88f40841d4 | ||
|
|
c73aaa5455 | ||
|
|
6bf493f9a1 | ||
|
|
b0be42815d | ||
|
|
79a423fc18 | ||
|
|
7047f2580f | ||
|
|
e8080aff58 | ||
|
|
d8ffed6e75 | ||
|
|
0a3f201cb7 | ||
|
|
00adac42b8 | ||
|
|
9a07ac075f | ||
|
|
44053f92c6 | ||
|
|
21475e0596 | ||
|
|
3ac09748db | ||
|
|
91ff0786cc | ||
|
|
45b207f399 | ||
|
|
d7d15a0ab3 | ||
|
|
bce8d2e4b8 | ||
|
|
d4e48e8b63 | ||
|
|
6de57ee0d4 | ||
|
|
c3c9bb33a2 | ||
|
|
ff4e6ab3ca | ||
|
|
b646e7ef70 | ||
|
|
981919335d | ||
|
|
42fcdd2267 | ||
|
|
2b6367a8a9 | ||
|
|
cbe0c1a550 | ||
|
|
759c072c11 | ||
|
|
d39e2a506f | ||
|
|
f035872592 | ||
|
|
0324225c38 | ||
|
|
a352516176 | ||
|
|
07fab69221 | ||
|
|
82804c1390 | ||
|
|
536d6f7c29 | ||
|
|
a4ec3291ca | ||
|
|
10420d9e7f | ||
|
|
522d139044 | ||
|
|
81a944a95c | ||
|
|
75b4ea175b | ||
|
|
62b1402b43 | ||
|
|
688dbd1ce9 | ||
|
|
941e3d5904 | ||
|
|
a938e098e5 | ||
|
|
1bda39bc7e | ||
|
|
6c5fedb631 | ||
|
|
55e48742a9 | ||
|
|
9a13273726 | ||
|
|
45e641067b | ||
|
|
6a7dedfe67 | ||
|
|
28fa043b32 | ||
|
|
d7c339ccea | ||
|
|
cdc6567628 | ||
|
|
fb315fd782 | ||
|
|
0907a19821 | ||
|
|
00b0552e5e | ||
|
|
9949907adc | ||
|
|
94ab1ddfbc | ||
|
|
c13ff71f9a | ||
|
|
e64ebf06f1 | ||
|
|
20f527ae94 | ||
|
|
1b0f9fcd88 | ||
|
|
05799767a0 | ||
|
|
86cb233cf6 | ||
|
|
5838ff045a | ||
|
|
95ddca0d7c | ||
|
|
a03e2783d4 | ||
|
|
f0638b0dd8 | ||
|
|
ab3e00f42c | ||
|
|
c67971035d | ||
|
|
3c55446e86 | ||
|
|
fd559b61b1 | ||
|
|
77ca139363 | ||
|
|
f0828d3870 | ||
|
|
0e4ffde6ca | ||
|
|
a50f96606b | ||
|
|
ecb77238a3 | ||
|
|
3fe5801366 | ||
|
|
9807231b72 | ||
|
|
eed85b3641 | ||
|
|
7d7d4e62a3 | ||
|
|
f0f9d2a6aa | ||
|
|
7b2a30dcbf | ||
|
|
b214efc029 | ||
|
|
e74884bcea | ||
|
|
4accd71744 | ||
|
|
fa7c170540 | ||
|
|
92360eb2ce | ||
|
|
b13382a6ee | ||
|
|
b9718edfd3 | ||
|
|
d3e2976ff9 | ||
|
|
5e84b7cffe | ||
|
|
764eb764ce | ||
|
|
a992b41e26 | ||
|
|
7d882c3f74 | ||
|
|
668e8de7df | ||
|
|
29ad420916 | ||
|
|
f743942e65 | ||
|
|
0a120e402e | ||
|
|
6bc0c79624 | ||
|
|
6860ddced3 | ||
|
|
ddf5e38396 | ||
|
|
2ff2e448be | ||
|
|
9882dda905 | ||
|
|
88d005caf6 | ||
|
|
eba5fc9caf | ||
|
|
3a2f35f697 | ||
|
|
2ba3e95379 | ||
|
|
023570298b | ||
|
|
cf7e4d1f52 | ||
|
|
a09ce702c1 | ||
|
|
4c6f5dd72d | ||
|
|
dabed1568c | ||
|
|
79dee21f9b | ||
|
|
6ccbe69c02 | ||
|
|
3ad8a14786 | ||
|
|
c79ee46551 | ||
|
|
b391940037 | ||
|
|
d5a54dd63d | ||
|
|
6799ac2b30 | ||
|
|
2f10e60dbf | ||
|
|
95c818d92e | ||
|
|
e6f846107a | ||
|
|
b757ab7424 | ||
|
|
d439a0df00 | ||
|
|
c3e14afe0a | ||
|
|
22f43d63ec | ||
|
|
07c364cf0b | ||
|
|
96485d9b9f | ||
|
|
4cdfeeecf2 | ||
|
|
00abd53b19 | ||
|
|
6666552b8a | ||
|
|
b65fdbdd78 | ||
|
|
7c7d791f31 | ||
|
|
d66f333bd5 | ||
|
|
5afb9c572e | ||
|
|
866aeab76b | ||
|
|
ae13b5f920 | ||
|
|
cfbcb502d8 | ||
|
|
5f8d274b94 | ||
|
|
092171982b | ||
|
|
30ccc0c76c | ||
|
|
bf23d78e41 | ||
|
|
08466f5179 | ||
|
|
4ca07d534b | ||
|
|
3237875aee | ||
|
|
c8db438cca | ||
|
|
5ea2304d5e | ||
|
|
197652f8eb | ||
|
|
80b16d8b57 | ||
|
|
b8d78c1733 | ||
|
|
8bf5004147 | ||
|
|
89538e7289 | ||
|
|
ff46d39a6a | ||
|
|
b843a55a25 | ||
|
|
54008af8bf | ||
|
|
d73f0d2401 | ||
|
|
86228e4270 | ||
|
|
5ab5688844 | ||
|
|
53cb4149da | ||
|
|
1056e20ec2 | ||
|
|
a589f337b7 | ||
|
|
73ee88ab08 | ||
|
|
1e68483deb | ||
|
|
9c168087af | ||
|
|
d988644b6a | ||
|
|
22c21222d3 | ||
|
|
73627a680c | ||
|
|
e70e8262e6 | ||
|
|
8a74809ea4 | ||
|
|
9cf3c23328 | ||
|
|
40347c09ba | ||
|
|
64ed15ffae | ||
|
|
617ec4cc3e | ||
|
|
bec154e538 | ||
|
|
6e565c0b31 | ||
|
|
c2b32de533 | ||
|
|
454f007e42 | ||
|
|
44a81cb7d8 | ||
|
|
4623853399 | ||
|
|
15c894845c | ||
|
|
10597aed2f | ||
|
|
2810fa7f80 | ||
|
|
a6dbc59ad1 | ||
|
|
1afe93be66 | ||
|
|
1bd6839b21 | ||
|
|
b5e3564724 | ||
|
|
8b143a2713 | ||
|
|
543f5e126f | ||
|
|
a5ac70cd3f | ||
|
|
07ed1b3f74 | ||
|
|
7218208355 | ||
|
|
d483c6a726 | ||
|
|
cb3fe686f3 | ||
|
|
69477cf3b4 | ||
|
|
c114c68f15 | ||
|
|
1858c0f000 | ||
|
|
5c203c8e30 | ||
|
|
005425efb1 | ||
|
|
0c87954755 | ||
|
|
3c11092af1 | ||
|
|
4b71540dc7 | ||
|
|
e22e3967f5 | ||
|
|
50809f45a3 | ||
|
|
82bbf9d39f | ||
|
|
4692b20a74 | ||
|
|
9a32aa3350 | ||
|
|
6d1fa4764d | ||
|
|
267af5d6db | ||
|
|
4bcb06c35b | ||
|
|
ff14c91fe1 | ||
|
|
a0f7241f85 | ||
|
|
66e7dfe6d5 | ||
|
|
1538628e16 | ||
|
|
1b9d18adc1 | ||
|
|
124ebaa970 | ||
|
|
b44e657279 | ||
|
|
de24dbbb7a | ||
|
|
60f79b4400 | ||
|
|
03c8f96a46 | ||
|
|
13d833ac5c | ||
|
|
71683992a0 | ||
|
|
2c785ade51 | ||
|
|
530819e788 | ||
|
|
c4c175e107 | ||
|
|
6280fdf973 | ||
|
|
269366264d | ||
|
|
8137b0831c | ||
|
|
396f63a3c9 | ||
|
|
cf87f2ee4d | ||
|
|
c98e672a73 | ||
|
|
21fe39542d | ||
|
|
8747da47a5 | ||
|
|
b3ff4de2ae | ||
|
|
bc52362123 | ||
|
|
dcd63f321c | ||
|
|
093f8c2714 | ||
|
|
94ee9a39b4 | ||
|
|
1c5ea9e3ff | ||
|
|
3c69644f21 | ||
|
|
a89a593f51 | ||
|
|
8f685faf9b | ||
|
|
020433d7ad | ||
|
|
80aa4fb852 | ||
|
|
a1a8bd9656 | ||
|
|
72623281c4 | ||
|
|
ccaa70c1a4 | ||
|
|
aa1ce22ada | ||
|
|
003793b082 | ||
|
|
15611cea43 | ||
|
|
7a366de0e3 | ||
|
|
3baaf8bda4 | ||
|
|
23dcb3e823 | ||
|
|
66e7790ee0 | ||
|
|
3065126ed1 | ||
|
|
98ae737fb8 | ||
|
|
52cfda1d8e | ||
|
|
f727c13e20 | ||
|
|
0c01479866 | ||
|
|
34c9ae7518 | ||
|
|
960334b638 | ||
|
|
32e7ee1917 | ||
|
|
6e221e753b | ||
|
|
501dffe5b2 | ||
|
|
90dc8274c5 | ||
|
|
0a5cb40f55 | ||
|
|
6d7d587a33 | ||
|
|
35b6e2bf35 | ||
|
|
d2ebb207ab | ||
|
|
c3a7f3c950 | ||
|
|
b44efbd998 | ||
|
|
8bdba217a6 | ||
|
|
81dd315dfe | ||
|
|
d0be7f16ba | ||
|
|
818ac03e84 | ||
|
|
41127e0e38 | ||
|
|
b4af59a873 | ||
|
|
08972ff234 | ||
|
|
6653f9b110 | ||
|
|
c6f2ebd92a | ||
|
|
b50c061c0a | ||
|
|
bb0e92c519 | ||
|
|
682dc36d34 | ||
|
|
3a173821d7 | ||
|
|
0df478d2aa | ||
|
|
8d3ba881e5 | ||
|
|
4555db8e97 | ||
|
|
bc2beb2c56 | ||
|
|
29bd6af2a2 | ||
|
|
1bbd20de3c | ||
|
|
d1f4164498 | ||
|
|
d1c238a812 | ||
|
|
675bbd602f | ||
|
|
ab1be61fda | ||
|
|
754caca613 | ||
|
|
8097ab146c | ||
|
|
c0c4b69c64 | ||
|
|
315d90391c | ||
|
|
869a5fd773 | ||
|
|
9940cfcf12 | ||
|
|
463b6cd791 | ||
|
|
b981516913 | ||
|
|
9ffdbee400 | ||
|
|
def55c9dfe | ||
|
|
69668c5e55 | ||
|
|
f41adec096 | ||
|
|
3cc56f9886 | ||
|
|
be8b302e20 | ||
|
|
6da05af387 | ||
|
|
2eb74afc20 | ||
|
|
c44bb1e27d | ||
|
|
12cd38a047 | ||
|
|
e5c896cb36 | ||
|
|
d89a2487e7 | ||
|
|
e59f91a976 | ||
|
|
9a80777fe9 | ||
|
|
69b1da50b8 | ||
|
|
04ada28ffc | ||
|
|
369a6c2f04 | ||
|
|
f438fb65f8 | ||
|
|
6590011ef1 | ||
|
|
b6eb3d2361 | ||
|
|
13b9b77f0d | ||
|
|
20419856c1 | ||
|
|
43100930cd | ||
|
|
aac7e4cc53 | ||
|
|
1c8f3e2328 | ||
|
|
a54f0a2e89 | ||
|
|
fdb3cecf8e | ||
|
|
8762c39dd5 | ||
|
|
fc56c56883 | ||
|
|
ae950ac075 | ||
|
|
8bbb9a70c6 | ||
|
|
e6532dc155 | ||
|
|
ee6af8c187 | ||
|
|
bc1a0725df | ||
|
|
37905f8249 | ||
|
|
8163e7273e | ||
|
|
58fdba1d89 | ||
|
|
203dcf714f | ||
|
|
649f864236 | ||
|
|
292f3b03cc | ||
|
|
ec8fe3c343 | ||
|
|
823b0518ae | ||
|
|
c48caf5bdc | ||
|
|
20bc6d079f | ||
|
|
dccd318f60 | ||
|
|
2b0f670fb7 | ||
|
|
b5c431dca8 | ||
|
|
57dd93f136 | ||
|
|
976e02effb | ||
|
|
396387340a | ||
|
|
d9bf021597 | ||
|
|
b4e26f513b | ||
|
|
2eef31f74d | ||
|
|
cc96e2b3eb | ||
|
|
4526a0b875 | ||
|
|
4568bcc0ae | ||
|
|
cf3af14c6a | ||
|
|
d320c84bc8 | ||
|
|
8eff262e8f | ||
|
|
8c7d90f0c4 | ||
|
|
0e189551dd | ||
|
|
981acd6510 | ||
|
|
404aae6bf3 | ||
|
|
57cc9b8de4 | ||
|
|
d2def0a34d | ||
|
|
f1a5e1c029 | ||
|
|
19ae192887 | ||
|
|
cc87227559 | ||
|
|
9ad0c74a56 | ||
|
|
55a8b743c8 | ||
|
|
7adb150d1c | ||
|
|
afdb392289 | ||
|
|
1c8e24a117 | ||
|
|
266e79a2c3 | ||
|
|
6c5d629a88 | ||
|
|
84ed778b67 | ||
|
|
c1d41847a2 | ||
|
|
73c50837d8 | ||
|
|
89075aa3e9 | ||
|
|
bffe4454ba | ||
|
|
69a8f50b58 | ||
|
|
8c6f6534b6 | ||
|
|
791a78154d | ||
|
|
f08ce0acd5 | ||
|
|
757b195d5c | ||
|
|
c6a39a9220 | ||
|
|
a2054b458b | ||
|
|
6ee12d447f | ||
|
|
f95e3fb719 | ||
|
|
aa9141505f | ||
|
|
b4f0d2f2ae | ||
|
|
5bc67ab796 | ||
|
|
4f86e0da62 | ||
|
|
12165ac9a6 | ||
|
|
dd783c2dc0 | ||
|
|
4b65086622 | ||
|
|
de2542c172 | ||
|
|
973de3507e | ||
|
|
1945d5ac6b | ||
|
|
cb3614d54c | ||
|
|
4375f2d5d1 | ||
|
|
92b6cf201e | ||
|
|
b2b53561ba | ||
|
|
73a1923db6 | ||
|
|
76e290f6b7 | ||
|
|
be02814021 | ||
|
|
d60c007ac6 | ||
|
|
e92c1eaa9d | ||
|
|
8d638602b9 | ||
|
|
48161aca47 | ||
|
|
11314972fa | ||
|
|
83ac202a6b | ||
|
|
02c601fd3a | ||
|
|
86f6f85142 | ||
|
|
ca4cb433a9 | ||
|
|
e5bed0afcb | ||
|
|
11cf85f771 | ||
|
|
18d7a9cfe9 | ||
|
|
b3bac32441 | ||
|
|
0b9fb06c08 | ||
|
|
c6219ff315 | ||
|
|
2b7668aa68 | ||
|
|
c8a684e10d | ||
|
|
5a5d675f3e | ||
|
|
a4acc60f1d | ||
|
|
b3bc04251b | ||
|
|
203111eb5a | ||
|
|
472168b9e4 | ||
|
|
328ebbe3f7 | ||
|
|
999cd19d81 | ||
|
|
d23f6a69e5 | ||
|
|
38c7fe9e0a | ||
|
|
dc02f51a15 | ||
|
|
dd7ea02c9f | ||
|
|
5e0bf0da6e | ||
|
|
f2f4b14f5e | ||
|
|
e27b4fa2f9 | ||
|
|
c71a57bd69 | ||
|
|
8c57b271d8 | ||
|
|
e167602a32 | ||
|
|
590f4ba2c6 | ||
|
|
b2c0dc235c | ||
|
|
f357a53e0e | ||
|
|
5f7d1f9f3f | ||
|
|
5ebd255a22 | ||
|
|
010c0a5061 | ||
|
|
6ec4bdd926 | ||
|
|
fe023b798d | ||
|
|
141c916b7b | ||
|
|
f160e456ae | ||
|
|
49c6219a84 | ||
|
|
0db444e78c | ||
|
|
57c2dc0a88 | ||
|
|
15ba2d3156 | ||
|
|
48e2ba11bf | ||
|
|
2a3fc01937 | ||
|
|
aa3e8344fb | ||
|
|
df5e619349 | ||
|
|
0c06983411 | ||
|
|
dda9c1f1af | ||
|
|
6779a02cf9 | ||
|
|
7671328245 | ||
|
|
ba7608602b | ||
|
|
92dcd8981d | ||
|
|
cbe18b70ca | ||
|
|
ab26b94808 | ||
|
|
0e176cee74 | ||
|
|
23eaba0d47 | ||
|
|
c6b079c9cb | ||
|
|
9d544fa7fe | ||
|
|
8aba1be3e6 | ||
|
|
72d28c5219 | ||
|
|
85dc45a479 | ||
|
|
283714f88c | ||
|
|
eb696b49fe | ||
|
|
063be0dbe2 | ||
|
|
1e4656769e | ||
|
|
3079cad8d6 | ||
|
|
d5c86b91c3 | ||
|
|
d5de0b8fa3 | ||
|
|
167c02f433 | ||
|
|
327e03c3b1 | ||
|
|
5304ecb71d | ||
|
|
64dfa2fa33 | ||
|
|
8f6431f657 | ||
|
|
5a59c8c179 | ||
|
|
2a7fa03df1 | ||
|
|
be009d55f4 | ||
|
|
d8789926a7 | ||
|
|
e7de6bd42b | ||
|
|
3f6b70e783 | ||
|
|
d1ab5cc40f | ||
|
|
a8376ebb96 | ||
|
|
f0456cce0e | ||
|
|
bc46f8c432 | ||
|
|
4de8a8e915 | ||
|
|
4f0d425711 | ||
|
|
7679c255f3 | ||
|
|
3027ba6dc7 | ||
|
|
9b556436bb | ||
|
|
1c84205a5e | ||
|
|
d39373a4f5 | ||
|
|
3dbfdf3b5b | ||
|
|
286cfc961e | ||
|
|
3148879bf7 | ||
|
|
70924b6823 | ||
|
|
2a63fe6a09 | ||
|
|
91c09ebd7e | ||
|
|
4957e62765 | ||
|
|
80ef32b8b5 | ||
|
|
39bf3e754d | ||
|
|
3d8c0ce181 | ||
|
|
07042d16b0 | ||
|
|
fce583a346 | ||
|
|
7ba5a3b8cd | ||
|
|
ae16c021da | ||
|
|
70ff34438f | ||
|
|
b105585f5a | ||
|
|
29c7859ea1 | ||
|
|
678194f4f7 | ||
|
|
60353be2c0 | ||
|
|
6410acbb48 | ||
|
|
731c2e22b8 | ||
|
|
cd950f39b4 | ||
|
|
8cbf56f7a5 | ||
|
|
17f986ea26 | ||
|
|
e5f9fce01e | ||
|
|
4c34a88a10 | ||
|
|
324d34aa3c | ||
|
|
3f984fb65e | ||
|
|
c108c60c30 | ||
|
|
cf1a84f4b2 | ||
|
|
350afcdb70 | ||
|
|
e5b319e518 | ||
|
|
a43785d1f0 | ||
|
|
b90981a17c | ||
|
|
47bbe20001 | ||
|
|
668b9dd903 | ||
|
|
6ca98149a7 | ||
|
|
af2de33809 | ||
|
|
737054873e | ||
|
|
1dd0961a48 | ||
|
|
3fcb6bcbd0 | ||
|
|
53660cc7dc | ||
|
|
996af9b268 | ||
|
|
512044617c | ||
|
|
a91f712735 | ||
|
|
fb7a0fcb50 | ||
|
|
749ed5432b | ||
|
|
53be4c259e | ||
|
|
e32630511d | ||
|
|
c9a6d69d6f | ||
|
|
5a78a71316 | ||
|
|
da9680d210 | ||
|
|
1ec37d657d | ||
|
|
99df3df42c | ||
|
|
1c83609971 | ||
|
|
32da8433bb | ||
|
|
485536dc90 | ||
|
|
0b605ddb70 | ||
|
|
755d7b0742 | ||
|
|
15030ab7cb | ||
|
|
a438d6c3c3 | ||
|
|
865a926047 | ||
|
|
a36ec166cf | ||
|
|
77e702da6c | ||
|
|
1560339377 | ||
|
|
f0aaab1299 | ||
|
|
4eced42981 | ||
|
|
1da2839cc3 | ||
|
|
0200281732 | ||
|
|
3d9f9ff4c2 | ||
|
|
60048b4450 | ||
|
|
4bd67c15c0 | ||
|
|
3237e18d2d | ||
|
|
fe17123707 | ||
|
|
a51df79925 | ||
|
|
efbe78a77e | ||
|
|
9f860a3f3e | ||
|
|
9dc5442743 | ||
|
|
e2d66235b5 | ||
|
|
cafad5599d | ||
|
|
6d8f375ae1 | ||
|
|
a055d7f4a8 | ||
|
|
09102325eb | ||
|
|
33c9774b21 | ||
|
|
d7f64fec4f | ||
|
|
eab5a42d93 | ||
|
|
5c7f120a7e | ||
|
|
d7d78d8053 | ||
|
|
cde7f114f9 | ||
|
|
69f4904b5a | ||
|
|
93d54a915d | ||
|
|
fe9aa59690 | ||
|
|
381a87ab50 | ||
|
|
ffea221568 | ||
|
|
aaf3316e65 | ||
|
|
41664d2ef4 | ||
|
|
717d4f0b9a | ||
|
|
24873ffa9b | ||
|
|
7f6e90758a | ||
|
|
5f4d565483 | ||
|
|
727e23ada9 | ||
|
|
497363bc3a | ||
|
|
6acf8b84ad | ||
|
|
daff0de0bd | ||
|
|
f6daa3b5dc | ||
|
|
2c87d36cbb | ||
|
|
3af3074ab9 | ||
|
|
c00342df6f | ||
|
|
9bbd95a6f2 | ||
|
|
f1fe5d215c | ||
|
|
36e1522a32 | ||
|
|
7c5f795bf4 | ||
|
|
90258636ed | ||
|
|
06ce840a8f | ||
|
|
268c5a92d8 | ||
|
|
7f11783d46 | ||
|
|
ae2d18e79c | ||
|
|
58b9755d0c | ||
|
|
11a79c2f1f | ||
|
|
32742a6f4f | ||
|
|
083e71370f | ||
|
|
0278390279 | ||
|
|
f344ef054f | ||
|
|
68e3953bcc | ||
|
|
7755a5cd9a | ||
|
|
05a7fec4c4 | ||
|
|
8f0e15db85 | ||
|
|
b7dc56fef5 | ||
|
|
da14fb56fa | ||
|
|
b15e892c60 | ||
|
|
eeeb13d094 | ||
|
|
03cb3cd161 | ||
|
|
f1b3558565 | ||
|
|
6a69725ca9 | ||
|
|
63fdabd902 | ||
|
|
d624f04cde | ||
|
|
ba08c7d589 | ||
|
|
35d072f550 | ||
|
|
4c28eebbdf | ||
|
|
3ca0e2fc58 | ||
|
|
7450b22130 | ||
|
|
e39faaa550 | ||
|
|
ccde45acc9 | ||
|
|
6b1c5b5b92 | ||
|
|
e6af5aaea3 | ||
|
|
a792c98630 | ||
|
|
46985ab39d | ||
|
|
28d882af7f | ||
|
|
9d6423e7d7 | ||
|
|
0a88ae6a52 | ||
|
|
395741a502 | ||
|
|
00dbbdf453 | ||
|
|
77cf6202fe | ||
|
|
7ed00bb42d | ||
|
|
b97fe50958 | ||
|
|
0501d73e7b | ||
|
|
8abe2bffb8 | ||
|
|
8477625472 | ||
|
|
08851a2b7a | ||
|
|
d4b9ccf1c2 | ||
|
|
7b177f1fd8 | ||
|
|
7d6e814745 | ||
|
|
3cfb6ecf6f | ||
|
|
11085a0037 | ||
|
|
a679bcf26b | ||
|
|
8ed1764fb3 | ||
|
|
b2696003f0 | ||
|
|
bc818704df | ||
|
|
d21f3c1bcf | ||
|
|
e6ae513474 | ||
|
|
4360f45ab8 | ||
|
|
74ef73ebf4 | ||
|
|
35b512de19 | ||
|
|
a5966592e1 | ||
|
|
8e2e1769c3 | ||
|
|
19da883e14 | ||
|
|
600d5f4475 | ||
|
|
0e0e3b28de | ||
|
|
2439ae0508 | ||
|
|
f9633cb860 | ||
|
|
2c43f35b0b | ||
|
|
a1beff754c | ||
|
|
647fa12cdc | ||
|
|
725235c250 | ||
|
|
25d438d691 | ||
|
|
37232b5302 | ||
|
|
2d250282ee | ||
|
|
18e1c112e0 | ||
|
|
32891e5155 | ||
|
|
ef7cbf097b | ||
|
|
41ab8033e7 | ||
|
|
4f392690eb | ||
|
|
d591e4ebc2 | ||
|
|
a315c19ebb | ||
|
|
764b956221 | ||
|
|
f0b0086ca5 | ||
|
|
8c43494c03 | ||
|
|
634df366bd | ||
|
|
86585feb56 | ||
|
|
f4335ff339 | ||
|
|
61100d167f | ||
|
|
77c7ba3194 | ||
|
|
669e3a762b | ||
|
|
71254ba6e2 | ||
|
|
8e7fe19585 | ||
|
|
95f605ea9d | ||
|
|
19d0e5d42f | ||
|
|
5433a69775 | ||
|
|
f2ac6dace6 | ||
|
|
028889f9ec | ||
|
|
f0c3395c00 | ||
|
|
ee180440e0 | ||
|
|
4eac00c0d9 | ||
|
|
8e15b38e03 | ||
|
|
61e44af487 | ||
|
|
605fecedea | ||
|
|
ac1a5e257e | ||
|
|
401ac0225f | ||
|
|
dbda032a4c | ||
|
|
b60b55dca2 | ||
|
|
e3229f4400 | ||
|
|
34435b3046 | ||
|
|
1077d8ef4b | ||
|
|
9527780d99 | ||
|
|
9878b39571 | ||
|
|
34f0b54284 | ||
|
|
49d8aa7352 | ||
|
|
3ad6246e68 | ||
|
|
66eccf0032 | ||
|
|
995daecaff | ||
|
|
1757c141fe | ||
|
|
45b3f3d56f | ||
|
|
b758b053d5 | ||
|
|
7a3088d553 | ||
|
|
15e297eef3 | ||
|
|
9476ba6578 | ||
|
|
a532120662 | ||
|
|
b33f1a988c | ||
|
|
24663a1944 | ||
|
|
983ce80703 | ||
|
|
4f3dbaa7ff | ||
|
|
0c93614423 | ||
|
|
2060b19e92 | ||
|
|
cc3fc47cc3 | ||
|
|
dd81a6ea91 | ||
|
|
95f59ffb1b | ||
|
|
eaf1eaaee3 | ||
|
|
2ebccbe372 | ||
|
|
adc49e61e7 | ||
|
|
58142e70af | ||
|
|
bae61f58af | ||
|
|
f7ac538f1d | ||
|
|
8196e61a2c | ||
|
|
403983ac6b | ||
|
|
f3e2f495d3 | ||
|
|
78f7ded7a8 | ||
|
|
053d59153e | ||
|
|
84d849da4c | ||
|
|
90eba686c7 | ||
|
|
5a4d53908d | ||
|
|
e76dd18962 | ||
|
|
071c4537ee | ||
|
|
e4e92c8b21 | ||
|
|
43a54cdc76 | ||
|
|
c88ad088c0 | ||
|
|
f462340ac8 | ||
|
|
b0cef15fa2 | ||
|
|
160b0101a9 | ||
|
|
63e0cd198c | ||
|
|
8a601b4d00 | ||
|
|
ff81202d8a | ||
|
|
eed8df7391 | ||
|
|
12df1caead | ||
|
|
15a7565cfb | ||
|
|
38f17b05c2 | ||
|
|
d4e81daee3 | ||
|
|
143724f146 | ||
|
|
a3223d2f01 | ||
|
|
9520fbe4a1 | ||
|
|
91bce23a5a | ||
|
|
b39b367ef2 | ||
|
|
97736b19cd | ||
|
|
a5c6fc9bed | ||
|
|
a68bbc7950 | ||
|
|
40941a3b22 | ||
|
|
7ea6902b87 | ||
|
|
7c74d447bc | ||
|
|
a937d5c4f7 | ||
|
|
2f90496a6e | ||
|
|
36fa99cef0 | ||
|
|
eadbb1672f | ||
|
|
eb7fad1054 | ||
|
|
b4b7dc667f | ||
|
|
8fe56722a5 | ||
|
|
7dfc0643d5 | ||
|
|
b3c2fa1770 | ||
|
|
4303c452e1 | ||
|
|
6b4f2d3e18 | ||
|
|
f8dfc3c652 | ||
|
|
21014f2e0e | ||
|
|
5835e5f72c | ||
|
|
7350e94662 | ||
|
|
d5d2d5bf82 | ||
|
|
14d1f6cde2 | ||
|
|
9f17b917f7 | ||
|
|
c046b48ee9 | ||
|
|
cb6cf7c01f | ||
|
|
cd9b07ca0a | ||
|
|
eb435bc6b0 | ||
|
|
c9ca613348 | ||
|
|
771855fd07 | ||
|
|
e6967bbc07 | ||
|
|
095d8ca719 | ||
|
|
9c089bed37 | ||
|
|
7e94c6f1c9 | ||
|
|
df44296ee0 | ||
|
|
da42b6f3b2 | ||
|
|
264756d986 | ||
|
|
49d9887d03 | ||
|
|
39f22dec4c | ||
|
|
69befbc97b | ||
|
|
820ed1c457 | ||
|
|
c0c6a6dc4b | ||
|
|
a410709f92 | ||
|
|
3b20e85ff0 | ||
|
|
5d8e7a9fa8 | ||
|
|
63ad0760cd | ||
|
|
2ea29ef8cb | ||
|
|
f34baa389c | ||
|
|
41db2f7fe7 | ||
|
|
2db04225a7 | ||
|
|
b6004117e6 | ||
|
|
fd73b28061 | ||
|
|
da39c03a6f | ||
|
|
ba721c9db6 | ||
|
|
9b707cf93d | ||
|
|
a73b42409f | ||
|
|
e743b2c699 | ||
|
|
107c44df88 | ||
|
|
5e19c420e7 | ||
|
|
2f55324708 | ||
|
|
6cc6c34c4b | ||
|
|
3d64fbef49 | ||
|
|
539a0198f3 | ||
|
|
9beebac7fc | ||
|
|
50567fd967 | ||
|
|
3ee004ce4e | ||
|
|
a58fd7559c | ||
|
|
73d738887a | ||
|
|
e96199dc37 | ||
|
|
f5cde10d62 | ||
|
|
1d5df08e78 | ||
|
|
869c2726bb | ||
|
|
2e663df42a | ||
|
|
1c33494547 | ||
|
|
4acaefe9c3 | ||
|
|
8c3f4c06df | ||
|
|
ed589f4b51 | ||
|
|
0a82828d2e | ||
|
|
13c1d049fc | ||
|
|
8c61e95a5b | ||
|
|
a6fa6e19d0 | ||
|
|
8273bdf70f | ||
|
|
5267de8b87 | ||
|
|
62feba1691 | ||
|
|
6036a792e5 | ||
|
|
3cb8784996 | ||
|
|
81d150f80a | ||
|
|
9ebce266ec | ||
|
|
42bcf8db31 | ||
|
|
ff2bbcf650 | ||
|
|
1341db0812 | ||
|
|
c16a4134c7 | ||
|
|
771047ddd7 | ||
|
|
718d67f20c | ||
|
|
d18a510310 | ||
|
|
3a3da1c6f1 | ||
|
|
ba55958327 | ||
|
|
2a67f493f6 | ||
|
|
00647e4963 | ||
|
|
06892deedf | ||
|
|
d12ea40845 | ||
|
|
3f21151331 | ||
|
|
c91f5e5cba | ||
|
|
9e90d17d80 | ||
|
|
2e67bbf6a1 | ||
|
|
ceec9749b9 | ||
|
|
f674b5bfeb | ||
|
|
b3e541c627 | ||
|
|
3389a152be | ||
|
|
662fcfa318 | ||
|
|
06baec9c55 | ||
|
|
270699c26b | ||
|
|
bc699a04ec | ||
|
|
3639e75f5b | ||
|
|
eef14ebc29 | ||
|
|
2568d2b750 | ||
|
|
58a57d7a7d | ||
|
|
8ddb71758e | ||
|
|
54f19eaeb6 | ||
|
|
960096273b | ||
|
|
b360902bd9 | ||
|
|
8006bb49ca | ||
|
|
ac65468233 | ||
|
|
8992cb29da | ||
|
|
b5f5f43b4c | ||
|
|
8a814d9016 | ||
|
|
4ff4a365e1 | ||
|
|
905b6bb92a | ||
|
|
88d06c8ef2 | ||
|
|
102987dac7 | ||
|
|
54cf76444e | ||
|
|
f595c1d446 | ||
|
|
9cf06c44e8 | ||
|
|
5d63ec6d2a | ||
|
|
0544b61138 | ||
|
|
ceb6f70b4d | ||
|
|
f3075f4c51 | ||
|
|
7b850892ae | ||
|
|
6a3ca9c9de | ||
|
|
d69d948963 | ||
|
|
aa6061d7b6 | ||
|
|
ba667475bf | ||
|
|
5737d78f78 | ||
|
|
079fe000bb | ||
|
|
29865c69ab | ||
|
|
f2e9cce248 | ||
|
|
6a16656f03 | ||
|
|
7f4d3605c0 | ||
|
|
d97ad31cc3 | ||
|
|
a49ebf17bf | ||
|
|
903a9dd5cc | ||
|
|
5d8db1ade6 | ||
|
|
423a89fdaa | ||
|
|
85d78fd4ae | ||
|
|
725269e914 | ||
|
|
9d3beaffbb | ||
|
|
7f36b7926b | ||
|
|
f4bb268e27 | ||
|
|
e1329348d1 | ||
|
|
4f06a48d16 | ||
|
|
1dea64d2eb | ||
|
|
375e737f02 | ||
|
|
1032801f12 | ||
|
|
1002b8d32f | ||
|
|
36a72da71f | ||
|
|
a2b3a815e7 | ||
|
|
7820707e46 | ||
|
|
c3f960cfe8 | ||
|
|
965f43a4c3 | ||
|
|
317175bb03 | ||
|
|
1608d48495 | ||
|
|
08ddee1bda | ||
|
|
72756a2bb8 | ||
|
|
38011a3546 | ||
|
|
d72dbdace0 | ||
|
|
5c887b648f | ||
|
|
4de7167352 | ||
|
|
54825b353f | ||
|
|
b23fb58977 | ||
|
|
7b831c6ab8 | ||
|
|
167344bd14 | ||
|
|
14f31ba461 | ||
|
|
13a82799b2 | ||
|
|
66fe33683e | ||
|
|
8030c9a63d | ||
|
|
60630a5cab | ||
|
|
d9ba8f81e2 | ||
|
|
7fe56402fd | ||
|
|
634bce25cd | ||
|
|
437ff003b0 | ||
|
|
9f09798da5 | ||
|
|
5da85b6a88 | ||
|
|
bb42a31486 | ||
|
|
7e5e1e6342 | ||
|
|
6f43bbf96e | ||
|
|
8ea514643d | ||
|
|
f7e12c6e92 | ||
|
|
30f2cc9e28 | ||
|
|
45b9dddb4b | ||
|
|
650dc487db | ||
|
|
5bc443707f | ||
|
|
4510219300 | ||
|
|
cd8601c7ff | ||
|
|
73c27069ee | ||
|
|
7dcad234f5 | ||
|
|
66281639b4 | ||
|
|
1af6fde986 | ||
|
|
83ec9e50b8 | ||
|
|
6d21c85d98 | ||
|
|
0ff00e59ba | ||
|
|
850a342e38 | ||
|
|
1caba06aca | ||
|
|
a115196cee | ||
|
|
5f451de94e | ||
|
|
a4921fc564 | ||
|
|
7d1d03e8cd | ||
|
|
92c18a45ba | ||
|
|
a61fb5c6d6 | ||
|
|
e1deaf73ea | ||
|
|
7d6d602477 | ||
|
|
b0439adee4 | ||
|
|
0a7c88a853 | ||
|
|
b735e6d3e4 | ||
|
|
960ecba12a | ||
|
|
3988820db9 | ||
|
|
22ea7055c9 | ||
|
|
edba3fbea0 | ||
|
|
51e4bc7eae | ||
|
|
3e680235ee | ||
|
|
d2459de700 | ||
|
|
f9f265b409 | ||
|
|
c218f0362e | ||
|
|
a3c9c667b4 | ||
|
|
73f71050a0 | ||
|
|
94d901ec4c | ||
|
|
9e67f36615 | ||
|
|
bf6f166d8f | ||
|
|
1de5ab43d6 | ||
|
|
39dd75dbde | ||
|
|
b509f75c17 | ||
|
|
877649b80a | ||
|
|
b5846f2286 | ||
|
|
80dd98e7fb | ||
|
|
80f35cea71 |
278
.gitignore
vendored
278
.gitignore
vendored
@@ -1,16 +1,13 @@
|
||||
Release/
|
||||
mRemoteV1/bin/
|
||||
mRemoteV1/obj/
|
||||
mRemoteV1/publish/
|
||||
**/bin/
|
||||
**/obj/
|
||||
**/[Rr]elease [Pp]ortable/
|
||||
**/[Dd]ebug [Pp]ortable/
|
||||
|
||||
*.pfx
|
||||
*.suo
|
||||
*.vbproj.user
|
||||
Thumbs.db
|
||||
[Dd]ebug/
|
||||
_Re[Ss]harper.*
|
||||
*.resharper
|
||||
*.resharper.user
|
||||
*.suo
|
||||
*.cache
|
||||
*~
|
||||
*.swp
|
||||
@@ -24,3 +21,268 @@ UpgradeLog.XML
|
||||
*.sdf
|
||||
*.opensdf
|
||||
*.ipch
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# DNX
|
||||
project.lock.json
|
||||
artifacts/
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignoreable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
*.msi
|
||||
Installer/Resources/License.rtf
|
||||
Installer/Fragments/FilesFragment.wxs
|
||||
Installer Projects/Installer/Resources/License.rtf
|
||||
Installer Projects/Installer/Fragments/FilesFragment.wxs
|
||||
Installer Projects/Installer/Fragments/HelpFilesFragment.wxs
|
||||
InstallerProjects/Installer/Fragments/FilesFragment.wxs
|
||||
InstallerProjects/Installer/Resources/License.rtf
|
||||
|
||||
# gh-pages info
|
||||
runlocal.bat
|
||||
/_site
|
||||
|
||||
14
.readthedocs.yaml
Normal file
14
.readthedocs.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
# .readthedocs.yaml
|
||||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Build documentation in the docs/ directory with Sphinx
|
||||
sphinx:
|
||||
configuration: mRemoteNGDocumentation/conf.py
|
||||
|
||||
# Optionally build your docs in additional formats such as PDF
|
||||
formats:
|
||||
- pdf
|
||||
82
BUILD.CMD
82
BUILD.CMD
@@ -1,82 +0,0 @@
|
||||
@echo off
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
set VERSIONTAG=
|
||||
|
||||
set VCVARSALL="%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
|
||||
set DEVENV="devenv.exe"
|
||||
set MAKENSIS="%ProgramFiles(x86)%\NSIS\Unicode\makensis.exe"
|
||||
set RAR="%ProgramFiles%\WinRAR\WinRAR.exe"
|
||||
set SIGNCMD=signtool.exe sign /n "Next Generation Software" /sha1 "c4ece717747eb7d0cac824f6c7431e5237138b02" /t http://timestamp.verisign.com/scripts/timstamp.dll
|
||||
|
||||
rem Windows Sysinternals Sigcheck from http://technet.microsoft.com/en-us/sysinternals/bb897441
|
||||
set SIGCHECK="%ProgramFiles(x86)%\Sigcheck\sigcheck.exe"
|
||||
|
||||
call %VCVARSALL% x86
|
||||
|
||||
rmdir /s /q "%~dp0\mRemoteV1\bin" > nul 2>&1
|
||||
rmdir /s /q "%~dp0\mRemoteV1\obj" > nul 2>&1
|
||||
|
||||
echo Building release version...
|
||||
%DEVENV% "%~dp0\mRemoteV1.sln" /build "Release"
|
||||
|
||||
echo Building portable version...
|
||||
%DEVENV% "%~dp0\mRemoteV1.sln" /build "Release Portable"
|
||||
|
||||
echo Signing binaries...
|
||||
%SIGNCMD% "%~dp0\mRemoteV1\bin\Release\de\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release\en-US\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release\fr\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release\AxInterop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release\AxInterop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release\Interop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release\Interop.ShDocVw.dll" "%~dp0\mRemoteV1\bin\Release\Interop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release\mRemoteNG.exe" "%~dp0\mRemoteV1\bin\Release Portable\de\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release Portable\en-US\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release Portable\fr\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release Portable\AxInterop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release Portable\AxInterop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.ShDocVw.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release Portable\mRemoteNG.exe"
|
||||
|
||||
mkdir "%~dp0\Release" > nul 2>&1
|
||||
|
||||
echo Getting product version...
|
||||
set VERSIONNSH="%~dp0\Release\Version.nsh"
|
||||
set SIGCHECK=!SIGCHECK:"=^"!
|
||||
set SIGCHECK=!SIGCHECK: =^^ !
|
||||
set SIGCHECK=!SIGCHECK:(=^^(!
|
||||
set SIGCHECK=!SIGCHECK:)=^^)!
|
||||
for /F "usebackq delims=. tokens=1-4" %%i in (`!SIGCHECK! /accepteula -q -n "%~dp0\mRemoteV1\bin\Release\mRemoteNG.exe"`) do (
|
||||
set PRODUCT_VERSION_SHORT=%%i.%%j
|
||||
echo ^^!define PRODUCT_VERSION "%%i.%%j.%%k.%%l" > %VERSIONNSH%
|
||||
echo ^^!define PRODUCT_VERSION_SHORT "%%i.%%j" >> %VERSIONNSH%
|
||||
echo ^^!define PRODUCT_VERSION_MAJOR "%%i" >> %VERSIONNSH%
|
||||
echo ^^!define PRODUCT_VERSION_MINOR "%%j" >> %VERSIONNSH%
|
||||
)
|
||||
echo Version is %PRODUCT_VERSION_SHORT%
|
||||
|
||||
echo Creating installer package...
|
||||
if defined VERSIONTAG (
|
||||
%MAKENSIS% /DPRODUCT_VERSION_TAG=%VERSIONTAG% "%~dp0\Installer\mRemote.nsi"
|
||||
|
||||
set INSTALLEREXE="%~dp0\Release\mRemoteNG-Installer-%PRODUCT_VERSION_SHORT%-%VERSIONTAG%.exe"
|
||||
set BINARYZIP="%~dp0\Release\mRemoteNG-%PRODUCT_VERSION_SHORT%-%VERSIONTAG%.zip"
|
||||
set PORTABLEZIP="%~dp0\Release\mRemoteNG-Portable-%PRODUCT_VERSION_SHORT%-%VERSIONTAG%.zip"
|
||||
) else (
|
||||
%MAKENSIS% "%~dp0\Installer\mRemote.nsi"
|
||||
|
||||
set INSTALLEREXE="%~dp0\Release\mRemoteNG-Installer-%PRODUCT_VERSION_SHORT%.exe"
|
||||
set BINARYZIP="%~dp0\Release\mRemoteNG-%PRODUCT_VERSION_SHORT%.zip"
|
||||
set PORTABLEZIP="%~dp0\Release\mRemoteNG-Portable-%PRODUCT_VERSION_SHORT%.zip"
|
||||
)
|
||||
|
||||
del %VERSIONNSH%
|
||||
|
||||
echo Signing installer package...
|
||||
%SIGNCMD% %INSTALLEREXE%
|
||||
|
||||
echo Creating release ZIP file...
|
||||
del /f /q %BINARYZIP% > nul 2>&1
|
||||
%RAR% a -m5 -r -ep1 -afzip -inul %BINARYZIP% "%~dp0\mRemoteV1\bin\Release\*.*"
|
||||
%RAR% a -m5 -r -ep1 -afzip -inul %BINARYZIP% "%~dp0\Installer\Dependencies\*.*"
|
||||
%RAR% a -m5 -ep -afzip -inul %BINARYZIP% "%~dp0\*.TXT"
|
||||
|
||||
echo Creating portable ZIP file...
|
||||
del /f /q %PORTABLEZIP% > nul 2>&1
|
||||
%RAR% a -m5 -r -ep1 -afzip -inul %PORTABLEZIP% "%~dp0\mRemoteV1\bin\Release Portable\*.*"
|
||||
%RAR% a -m5 -r -ep1 -afzip -inul %PORTABLEZIP% "%~dp0\Installer\Dependencies\*.*"
|
||||
%RAR% a -m5 -ep -afzip -inul %PORTABLEZIP% "%~dp0\*.TXT"
|
||||
|
||||
echo.
|
||||
echo Build process complete.
|
||||
echo.
|
||||
pause
|
||||
692
CHANGELOG.TXT
692
CHANGELOG.TXT
@@ -1,692 +0,0 @@
|
||||
1.70 (2013-02-25):
|
||||
Fixed issue MR-332 - Can't select different tab with one click after disconnecting existing tab
|
||||
Fixed issue MR-338 - PuTTYNG crashing on fresh install of mRemoteNG
|
||||
Re-enabled PuTTYNG integration enhancements on Windows 8
|
||||
|
||||
1.70 Release Candidate 1 (2013-02-22):
|
||||
Fixed issue MR-183 - Error trying to save connections when using SQL - Invalid column name _parentConstantId
|
||||
Fixed issue MR-225 - Tabs do not open in a panel until multiple panels are displayed.
|
||||
Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP
|
||||
Fixed issue MR-264 - Windows 8 support
|
||||
Fixed issue MR-317 - Difficulty right-clicking on Tab
|
||||
Fixed issue MR-318 - Wrong tab gets selected when tab names overflow on the tab bar
|
||||
Fixed issue MR-321 - New connection panel doesn't get panel header if its the only one or is moved
|
||||
Fixed issue MR-322 - Connection Button not listing servers
|
||||
Added option to always show panel tabs.
|
||||
Fixed "Decryption failed. Padding is invalid and cannot be removed." notification.
|
||||
Fixed KiTTY opening in a separate window when using a saved session.
|
||||
|
||||
1.70 Beta 2 (2013-02-18):
|
||||
Fixed issue MR-47 - Silent Installation Prompts for Language
|
||||
Fixed issue MR-54 - Error When disconnecting from SSL channel RDP
|
||||
Fixed issue MR-58 - Bug when duplicating connection in connection view
|
||||
Fixed issue MR-68 - Config Window Loses Options
|
||||
Fixed issue MR-71 - Minimizing mRemoteNG causes temporary re-size of Putty sessions (windows)
|
||||
Fixed issue MR-80 - Reconnect previous sessions
|
||||
Fixed issue MR-81 - Problem Duplicating Folder w/ Sub-Folders
|
||||
Fixed issue MR-85 - Microsoft .NET Framework warning
|
||||
Fixed issue MR-86 - Citrix GDI+ Error when screen is locked
|
||||
Fixed issue MR-96 - When pressing SHIFT+F4 to create a new connection inside a folder, the new connections doesn't inherit any properties from its parent
|
||||
Fixed issue MR-101 - Collapse all folders causes a NullReferenceException
|
||||
Fixed issue MR-165 - Can't close About window if it is the last tab
|
||||
Fixed issue MR-166 - Inheritance button is disabled on some connections
|
||||
Fixed issue MR-167 - Name and description of properties not show in inheritance list
|
||||
Fixed issue MR-171 - Inherit configuration not showing friendly names for each inherit component
|
||||
Fixed issue MR-172 - RDGatewayPassword is unencrypted in confCons.xml file
|
||||
Fixed issue MR-174 - Trailing Space on a Hostname/IP will cause the connection not to happen.
|
||||
Fixed issue MR-175 - Problem with focus when 2 or more PuTTY sessions opened
|
||||
Fixed issue MR-176 - Del key while editing connection name triggers 'Delete Connection'
|
||||
Fixed issue MR-178 - 3 different panels crashes all connections
|
||||
Fixed issue MR-181 - Sessions on startup
|
||||
Fixed issue MR-190 - Can't click on tab/session
|
||||
Fixed issue MR-196 - Cannot export list without usernames and passwords
|
||||
Fixed issue MR-199 - when using screen inside putty, screen becomes dead when reduce mremoteNG
|
||||
Fixed issue MR-202 - The Connection "Tab" show Ampersands as underscores.
|
||||
Fixed issue MR-214 - Hostname/IP reset
|
||||
Fixed issue MR-224 - Session tabs become un-clickable after duplicating a tab or opening a new one in the same panel
|
||||
Fixed issue MR-233 - Backslash at end of password prevents success of putty invocation and corresponding auto-logon
|
||||
Fixed issue MR-235 - Config file gets corrupted when leaving the password entry box with ESC
|
||||
Fixed issue MR-264 - Windows 8 support
|
||||
Fixed issue MR-277 - Inheritance configuration button not appear in configuration tab
|
||||
Fixed issue MR-284 - SSH: Text not showing properly
|
||||
Fixed issue MR-299 - mRemoteNG crashes while using remotely (Windows XP remote desktop)
|
||||
Fixed issue MR-306 - Fatal .NET exception on program start
|
||||
Fixed issue MR-313 - PuTTY window not maximized when loading from saved session
|
||||
mRemoteNG now requires .NET Framework 3.0 instead of 2.0.
|
||||
Updated translations.
|
||||
Added translations for Spanish (Argentina), Italian, Polish, Portuguese, Chinese (Simplified).
|
||||
Improved the use of Tab and Shift-Tab to cycle through entries in the Config grid.
|
||||
Improved loading of XML files from older versions of mRemote/mRemoteNG.
|
||||
|
||||
1.70 Beta 1 (2012-02-27):
|
||||
Fixed issue MR-77 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
|
||||
Fixed issue MR-78 - Renaming Connections
|
||||
Fixed issue MR-79 - MoveUp/Down item doesn't work + Sort button broken
|
||||
Fixed issue MR-93 - Regional settings problem when using SQL connection in mRemoteNG
|
||||
Fixed issue MR-97 - Integrate Dutch translation
|
||||
Fixed issue MR-98 - Integrate Russian and Ukranian translations
|
||||
Fixed issue MR-99 - Integrate Spanish translation
|
||||
Fixed issue MR-131 - RD Gateway does not respect setting for use different credentials
|
||||
Added compatibility check for "Use FIPS compliant algorithms" security setting.
|
||||
Improved reporting of errors when encrypting and decrypting connection files.
|
||||
Added partial Polish translation.
|
||||
The panel tabs are now hidden if only one panel is open.
|
||||
Fix focus issue with RDP connections when changing tabs.
|
||||
Show changes live as connection tabs are being dragged around to change their order.
|
||||
Updated PuTTY to version 0.62.
|
||||
Improved error handling when loading connection files.
|
||||
Fixed bugs with creating a new connection file.
|
||||
A backup of the connection file is saved when it is loaded. The most recent ten backup copies are kept.
|
||||
Added the option to use a smart card for RD Gateway credentials.
|
||||
Made the use of CredSSP for RDP connections optional.
|
||||
Updated VncSharpNG to version 1.2.4440.36644.
|
||||
Added debugging symbols for VncSharpNG.
|
||||
|
||||
1.69 (2011-12-09):
|
||||
Fixed issue #66 - Fresh Install Fails to Create Config
|
||||
Fixed issue #69 - Connection file gets erased
|
||||
Fixed issue #72 - scrollbars added to RDP window after minimize/restore of mRemoteNG
|
||||
Disabled automatic updates in the portable edition
|
||||
Fixed file name in window title changing when exporting an XML file.
|
||||
Fixed Use only Notifications panel checkbox.
|
||||
Updated PuTTY to version 0.61
|
||||
Binaries are now digitally signed
|
||||
Added Credits, License, and Version History items to the Start Menu and made Start Menu item names localizable.
|
||||
|
||||
1.68 (2011-07-07):
|
||||
Fixed issue #48 - VerifyDatabaseVersion fails with new (empty) database tables.
|
||||
Fixed issue #60 - Can't save connections file
|
||||
Fixed issue #62 - Connection file error upon launch.
|
||||
|
||||
1.67 (2011-06-05):
|
||||
Fixed migration of external tools configuration and panel layout from Local to Roaming folder.
|
||||
Disable ICA Hotkeys for Citrix connections. Fixes issue with international users.
|
||||
Added a language selection option so users can override the language if they don't want it automatically detected.
|
||||
Added partial French translation to the application.
|
||||
Addded Thai translation to the installer.
|
||||
Updated graphics in the installer to mRemoteNG logo.
|
||||
Fixed RD Gateway default properties and RDP reconnection count setting not being saved.
|
||||
Fixed bug 33 - IPv6 doesn't work in quick Connect box.
|
||||
Moved the items under Tools in the Connections panel context menu up to the top level.
|
||||
Added buttons for Add Connection, Add Folder, and Sort Ascending (A-Z) to the Connections panel toolbar.
|
||||
Fixed rename edit control staying open when collapsing all folders.
|
||||
Changed sorting to sort all subfolders below the selected folder.
|
||||
Allow sorting of connections if a connection entry is selected.
|
||||
Fixed adding a connection entry if nothing is selected in the tree.
|
||||
Added 15-bit Color RDP setting.
|
||||
Fixed loading of RDP Colors setting from SQL.
|
||||
Added Font Smoothing and Desktop Composition RDP settings.
|
||||
Improved error handling when loading XML connection files.
|
||||
Added the mRemoteNG icon to the list of selectable icons for connection entries.
|
||||
Added confirmation before closing connection tabs.
|
||||
Fixed bug 42 - Maximized location not remembered with multiple monitors.
|
||||
Improved loading and saving of window location.
|
||||
Removed flickering on start up.
|
||||
Changed the Options page into a normal dialog.
|
||||
Improved Reset Layout function.
|
||||
Changed to use full four part version numbers with major, minor, build, and revision.
|
||||
Changed hard coded SQL database name into a user configurable setting.
|
||||
Fixed tab order of controls in Options dialog.
|
||||
Fixed bug 45 - Changing some settings in the config file may not save.
|
||||
|
||||
1.66 (2011-05-02):
|
||||
Fixed connections not working
|
||||
|
||||
1.65 (2011-05-02):
|
||||
Fixed Ctrl-Tab and Ctrl-Shift-Tab not working in any other applications while mRemoteNG is running
|
||||
Ctrl-Tab and Ctrl-Shift-Tab no longer work to switch tabs within mRemoteNG
|
||||
Fixed bug 36 - Install creates shortcuts only for the installing user
|
||||
Fixed bug 38 - Application uses the wrong Application Data settings folder (in Local Settings)
|
||||
Added code to the installer to check that the user is in the 'Power Users' or 'Administrators' group
|
||||
|
||||
1.64 (2011-04-27):
|
||||
Fixed bug 6 - VNC CTRL+key & keyboard combo mappings are broken
|
||||
Fixed bug 12 - Tab switch is not working in config panel
|
||||
Fixed bug 14 - RDP Connection authentication problem
|
||||
Fixed bug 22 - External App parameter macro expansion doesn't work with "try to integrate"
|
||||
Fixed bug 25 - Unhandled exception when mRemoteNG opens
|
||||
Added multilanguage support and German translation to the application
|
||||
Added Czech, Dutch, French, German, Polish, and Spanish translations to the installer
|
||||
Added Ctrl-Tab hotkey to switch to the next tab and Ctrl-Shift-Tab to switch to the previous tab
|
||||
Added Tab key to cycle through entries in the Config grid and Shift-Tab to cycle in reverse
|
||||
Added ability to configure external tools to run before or after a connection is established
|
||||
Fixed missing parameters in macro expansion for external tools
|
||||
Fixed RD Gateway and other inheritance bugs
|
||||
Changed how new connection files are created
|
||||
Changed the internal namespace of the application to mRemoteNG instead of mRemote
|
||||
Added credit for the DockPanel Suite to the About page
|
||||
Updated DockPanel Suite to version 2.5 RC1
|
||||
Updated VNCSharpNG to correct Ctrl and Alt key pass-through behavior
|
||||
|
||||
1.63 (2010-02-02):
|
||||
New icon and logo
|
||||
Fixed problems moving or resizing the main window while PuTTY (SSH/telnet/rlogin/raw) connections are open
|
||||
Fixed PuTTY processes not closing on Vista and 7 with UAC enabled
|
||||
Updated DockPanel Suite from 2.2.0 to 2.3.1
|
||||
Fixed error if the mouse is clicked outside of the remote screen area of a VNC connection
|
||||
Fixed flashing and red lines at bottom of the window on first run
|
||||
Added View->Reset Layout menu item
|
||||
Added F11 shortcut key to View->Full Screen
|
||||
Improved RDP error reporting
|
||||
Added support for Credential Security Support Provider (CredSSP) which is required for Network Level Authentication (NLA)
|
||||
Added support for connecting through Remote Desktop Gateway servers
|
||||
Popups can now be allowed in Internet Explorer by holding Ctrl+Alt when clicking a link
|
||||
Added PuTTY Settings item to tab context menu
|
||||
|
||||
1.62 (2010-01-19):
|
||||
Switched to VncSharp, an open source VNC component
|
||||
VNC is supported again except for the following features:
|
||||
Windows authentication
|
||||
Setting the compression, encoding and color settings
|
||||
Connecting through a proxy server
|
||||
Free SmartSize mode (it does the same thing as Aspect SmartSize mode now)
|
||||
Rearranged the Options page and added an Updates tab
|
||||
Added option to change how often updates are checked
|
||||
Open Updates options tab before connecting for the first time
|
||||
No longer show About page on first run
|
||||
Renamed Quicky toolbar to Quick Connect toolbar
|
||||
Changed back to allowing toolbars to dock to the left or right of the menu bar and added gripper to move it around
|
||||
Added RDP, VNC and ICA version numbers to Components Check page
|
||||
Fixed a bug with the inheritance buttons on the Config panel disappearing after awhile
|
||||
|
||||
1.61 (2010-01-14):
|
||||
Removed unlicensed SmartCode Solutions ViewerX VNC Viewer ActiveX
|
||||
This version of mRemoteNG does not support VNC
|
||||
|
||||
1.60 (2010-01-09):
|
||||
Changed name to mRemoteNG
|
||||
Fixed menu bar not staying docked to left side
|
||||
Removed snakes game Easter egg
|
||||
Removed references to visionapp Remote Desktop
|
||||
Changed filename delimiter in title bar from pipe to dash
|
||||
Changed default format for saving screenshot images to PNG
|
||||
Changed website addresses
|
||||
Added Report a Bug and Support Forum links to the Help menu
|
||||
Moved Check for Updates to the Help menu
|
||||
Changed website links in Help menu and About page to load within mRemoteNG instead of launching an external browser
|
||||
|
||||
1.50:
|
||||
Added the following formats to the "Save Connections As" function:
|
||||
mRemote CSV (standard CSV file with all properties)
|
||||
vRD 2008 CSV (standard CSV file with properties relevant for importing connections in vRD 2008)
|
||||
Fixed bug in inheritance code (SmartSize Mode and View Only properies were always shown when using VNC)
|
||||
|
||||
1.49:
|
||||
mRemote and visionapp Remote Desktop 2008 merge!
|
||||
Read more here: http://www.mremote.org/wiki/visionappMerge.ashx
|
||||
or in the Announcement panel.
|
||||
Added features to the update function
|
||||
Added Announcement feature
|
||||
Changed copyright notice in about screen and text when connecting via VNC
|
||||
Fixed some SQL-related problems
|
||||
|
||||
V1.48:
|
||||
ATTENTION! There is a bug in the automatic update code in 1.45 so you will have to download the new version manually from http://www.mremote.org/wiki/Downloads.ashx
|
||||
|
||||
Added startup components check with directions to fix component installation (also available in Tools - Components Check)
|
||||
Added "Try to integrate" option to Ext. Apps. If enabled mRemote will try to integrate the app into a tab container like any other connection protocol.
|
||||
Added Ext. App as protocol. Any Ext. App can be launched just like a normal connection.
|
||||
Example (DameWare Mini Remote Control):
|
||||
Create a new Ext. App with the following properties:
|
||||
Display Name: DameWare
|
||||
Filename: c:\PathToYourDameWareInstallDir\DWRCC.exe
|
||||
Arguments: -c: -h: -m:%hostname% -u:%username% -p:"%password%" -d:%domain%
|
||||
Options: Try to integrate
|
||||
Create a new connection and select Ext. App as protocol
|
||||
Then choose DameWare in the Ext. App field
|
||||
If you have problems with a particular app that takes a long time to start up consider setting a higher PuTTY/Ext. Apps wait time in Tools - Options - Advanced
|
||||
Added option to completely encrypt connection files (tools - options - advancecd)
|
||||
Added Rendering Engine option for HTTP/S protocols
|
||||
You can now use the Gecko (Firefox) rendering engine
|
||||
For this to work you need to download xulrunner (get it here: ftp://ftp.mozilla.org/pub/xulrunner/releases/1.8.1.3/contrib/win32/)
|
||||
It must be the 1.8.1.3 release, 1.9.0.0 does NOT work!
|
||||
Extract the contents to a path of your choice and set the correct path in Tools - Options - Advanced - XULrunner path
|
||||
The interface is tab enabled and usage is generally very firefox-like. So you can open new tabs with Ctrl+T, jump to the location bar with Ctrl+L and so on...
|
||||
Added "MAC Address", "User Field" fields and %MacAddress%, %UserField% variables to use in Ext. Apps
|
||||
Added descriptions for all fields in the config editor
|
||||
Fixed bug in connections loading code when using SQL storage
|
||||
Fixed bug in reconnect code
|
||||
Fixed VNC sessions not refreshing screen automatically when switching between tabs or panels
|
||||
|
||||
WARNING! There have been changes to the connections file/SQL tables
|
||||
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
|
||||
To get SQL working with the new version please update your tables like in the provided script (Info - Help - SQL Configuration)
|
||||
These are the added lines:
|
||||
[RenderingEngine] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
|
||||
[MacAddress] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
|
||||
[UserField] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
|
||||
[ExtApp] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
|
||||
[InheritRenderingEngine] [bit] NOT NULL ,
|
||||
[InheritMacAddress] [bit] NOT NULL ,
|
||||
[InheritUserField] [bit] NOT NULL ,
|
||||
[InheritExtApp] [bit] NOT NULL ,
|
||||
|
||||
V1.45:
|
||||
New german language build available
|
||||
Added support for RDP 6.1 (XP SP3/Vista SP1) features (Server Authentication, Console Session, TS Gateway not yet...)
|
||||
Added basic support for UltraVNC SingleClick (Tools - UltraVNC SingleClick); the listening port is configurable in the options
|
||||
Fixed VNC connections not working on x64
|
||||
Fixed screenshots save all feature overwriting files with the same name (not actually a bug, but rather a new feature ;)
|
||||
Fixed ICA Encryption Strength not inheriting properly
|
||||
|
||||
WARNING! There have been changes to the connections file/SQL tables
|
||||
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
|
||||
To get SQL working with the new version please update your tables like in the provided script (Info - Help - SQL Configuration)
|
||||
These are the added lines:
|
||||
[RDPAuthenticationLevel] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
|
||||
[InheritRDPAuthenticationLevel] [bit] NOT NULL ,
|
||||
|
||||
V1.43:
|
||||
Added function to send either the main form or a connection panel to another screen
|
||||
To send the form to another screen, right click the titlebar or the taskbar button and select "Send to..."
|
||||
If you want to send a panel to another screen, right click the panel's tab and do the same
|
||||
Fixed PuTTY connections not supporting credentials with spaces
|
||||
Fixed form not opening on last position when using multiple screens
|
||||
Fixed kiosk mode not working on secondary screen
|
||||
|
||||
V1.42:
|
||||
IMPORTANT NEWS: Please read the page that opens when you first start this release or go to:
|
||||
http://www.mRemote.org/wiki/MainPage.ashx#Commercial
|
||||
Added minimize to tray option
|
||||
Added option to enable switching to open connections with a single click on the corresponding connection in the tree
|
||||
Added button to test proxy settings
|
||||
Fixed: If the active connection tab is a PuTTY connection, Alt+Tab to mRemote now focuses the PuTTY window
|
||||
Fixed encoding problem with PuTTY sessions that included spaces
|
||||
Fixed problem that made mRemote inaccesible when closing it on a second monitor and then disabling this monitor
|
||||
Fixed: Inheritance defaults of some new VNC properties were not saved in the portable package
|
||||
|
||||
V1.41:
|
||||
Added complete support for SmartCode's ViewerX and removed VncSharp
|
||||
Many thx to everyone who donated to make this happen!!! I didn't think that it wouldn't even take a week! =)
|
||||
I hope everyone will be satisfied by the functions and possibilities this new control provides
|
||||
If you use one of the non-setup packages you must register the control yourself
|
||||
Open a cmd and change to the directory you installed mRemote to
|
||||
Type regsvr32 scvncctrl.dll and click ok
|
||||
Changed shortcuts and added buttons for them to the view menu under "Jump To" because they were causing several problems
|
||||
|
||||
WARNING! There have been changes to the connections file/SQL tables and the Ext. Apps XML file
|
||||
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
|
||||
To get SQL working with the new version please update your tables like in the provided script (Info - Help - SQL Configuration)
|
||||
|
||||
V1.40:
|
||||
Added (limited) support for the trial version of SmartCode's VNC ActiveX
|
||||
To enable it go to Options - Advanced and check "Try SmartCode VNC ActiveX"
|
||||
When connecting a pop up will open, wait about 10 seconds, then click on "Trial" to continue
|
||||
I will integrate this control fully into mRemote if I get enough Donations to buy the single developer license ($375,-)
|
||||
So if you want to see better VNC support (All UltraVNC, TightVNC and RealVNC functions) in mRemote, please help me and donate some bucks
|
||||
For donations either go to the mRemote Wiki (Info - Website) or click on Info - Donate to directly go to PayPal
|
||||
I will announce the current donation amount every day (or as often as I can) on the Wiki main page
|
||||
If you want to know more about the control go here: http://www.s-code.com/products/viewerx/
|
||||
Added feature to choose the panel a connection will open in when...
|
||||
a. no panel name was assigned in the properties
|
||||
b. you opened a connection with the option to choose the panel before connecting
|
||||
c. you checked "Always show panel selection dialog when opening connectins" in Options - Tabs & Panels
|
||||
Added Shortcuts to focus the standard panels
|
||||
Alt+C: Switch between Connections & Config panel
|
||||
Alt+S: Switch between Sessions & Screenshots panel
|
||||
Alt+E: Switch to Errors & Infos panel
|
||||
Added some new icons
|
||||
|
||||
V1.39:
|
||||
Added MagicLibrary.dll to the release again (forgot it in the 1.38 packages, sorry)
|
||||
Added auto-reconnect for ICA
|
||||
Added feature that automatically clears whitespaces in the Quicky Textfield
|
||||
Added special feature: Go to the set password dialog and type "ijustwannaplay" (without the quotes) in the password field... ;)
|
||||
|
||||
V1.38:
|
||||
Added automatic reconnect feature for RDP (Options - Advanced)
|
||||
Added connections drop-down to the quicky toolbar (same as the tray icon menu)
|
||||
Added setting in the options to enable/disable that double clicking on a connection tab closes it
|
||||
Added option to automatically set the hostname like the display name when creating new connections
|
||||
Fixed bug that caused the properties of a folder to be filled with "Object reference not set to an instance of an object." when adding a folder to the root with Default Inheritance enabled
|
||||
Fixed bug that made the properties of a newly added Connection to the root unavailable when Default Inheritance was enabled
|
||||
Fixed bug that the default settings for Pre/Post Ext. App, and their inheritance settings were not being saved
|
||||
Fixed bug in settings loading methods that caused the application to hang when an error occured
|
||||
Fixed bug in Ext. Apps panel that copied the properties of the previously selected Ext. App when "Wait for exit" was checked
|
||||
Fixed bug in the SQL Query that creates the tables needed by mRemote
|
||||
Attempt to fix the "Drop-Down on Screenshot" bug on some machines
|
||||
|
||||
V1.35:
|
||||
Added single instance mode (look in Options - Startup/Exit) - No cmd arguments supported yet!
|
||||
Added possibilty to start a Ext. App before connecting and on disconnect (e.g. for VPN/RAS)
|
||||
Added option to the Ext. Apps to tell mRemote to wait for the exit of the Ext. App
|
||||
Added encryption setting for ICA
|
||||
|
||||
WARNING! There have been changes to the connections file/SQL tables and the Ext. Apps XML file
|
||||
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
|
||||
Here's a list of new columns that need to be created before saving connections to an SQL server:
|
||||
Name: ICAEncryptionStrength, Data-Type: varchar, Length: 64, Allow Nulls: No
|
||||
Name: InheritICAEncryptionStrength, Data-Type: bit, Length: 1, Allow Nulls: No
|
||||
Name: PreExtApp, Date-Type: varchar, Length: 512, Allow Nulls: Yes
|
||||
Name: PostExtApp, Date-Type: varchar, Length: 512, Allow Nulls: Yes
|
||||
Name: InheritPreExtApp, Date-Type: bit, Length: 1, Allow Nulls: No
|
||||
Name: InheritPostExtApp, Date-Type: bit, Length: 1, Allow Nulls: No
|
||||
|
||||
V1.33:
|
||||
Fixed problem that caused RDP connections not to initialize properly when using XP SP3
|
||||
Fixed bug in Port Scan that prevented hosts with no hostname from being imported
|
||||
|
||||
V1.32:
|
||||
Added: Inheritance defaults can now be customized (look in the root properties of your connections tree)
|
||||
Fixed bug that made password-secured connection files not load properly because the return value from the password screen was always null
|
||||
Fixed a lot of outdated code in the import functions (Import from XML, Import from AD, Import from RDP files)
|
||||
Fixed bug that caused properties with a ' character not to be saved properly when using SQL Server
|
||||
Changed Target CPU to AnyCPU again as I think the x86 setting caused problems on x64 machines (although it shouldn't)
|
||||
|
||||
V1.31:
|
||||
Small speed improvement to the port scanner
|
||||
Fixed bug that caused SQL live-update to not work when not using AD Authentication
|
||||
Fixed bug that caused Save As not to work
|
||||
|
||||
V1.30:
|
||||
Added experimental SQL Server with live-update (multi-user) support (see Help - Getting started - SQL Configuration)
|
||||
Added bunch of new icons to the UI, most of them by famfamfam.com
|
||||
Added dropdown button to Quicky Toolbar to choose protocol
|
||||
Many smaller changes and additions
|
||||
Fixed: Wrong default PuTTY session name
|
||||
Fixed bug in Port Scanner that caused an error when no DNS name could be resolved
|
||||
|
||||
V1.25:
|
||||
Added inheritance for folders
|
||||
Added port scan feature and possibility to import from a scan
|
||||
Added toolbar for Ext. Apps (see View - External Applications Toolbar)
|
||||
Added quick connect as toolbar
|
||||
Added code that creates a backup of the current connections file every time it is loaded (It's named YourConsFile.xml_BAK)
|
||||
Added description variable to Ext. Apps
|
||||
Fixed bug that allowed inheriting from root node
|
||||
Fixed bug that caused Ext. Apps launched from a connection tab to use the selected tree node instead of the current tab
|
||||
Fixed bug that caused mRemote not to save panel layout and Ext. Apps on exit
|
||||
|
||||
V1.24:
|
||||
Fixed a bug in connections loading mechanism that caused a corrupted connections file when upgrading from a previous version
|
||||
|
||||
V1.23:
|
||||
Added feature to remember which connections were opened on last runtime and reconnect to them on the next start (see Tools - Options - Startup/Exit)
|
||||
A command line switch is also available to cancel reconnecting (/noreconnect or /norc)
|
||||
Added Auto Save feature (Tools - Options - Connections - Auto Save every...)
|
||||
Added Ext. Apps to connection tab context menu
|
||||
Added better error handling for RDP connection creation
|
||||
Fixed problem with Sessions feature on 64bit systems
|
||||
Fixed Sessions feature not working when using global credentials
|
||||
Fixed several problems with the Active Directory OU picker control
|
||||
Fixed bug in Connection duplicate code that caused duplicated connection to still have previous tree node assigned
|
||||
|
||||
V1.20:
|
||||
Added External Applications feature (check the help section for more info)
|
||||
Added duplicate feature to Connections tree
|
||||
Fixed: MagicLibrary.dll was not included in the setup package
|
||||
|
||||
V1.16:
|
||||
New Domain: www.mRemote.org
|
||||
Fixed PuTTY connections appearing in a new window
|
||||
There's a new setting in the options to fine tune the time to wait until the window has been created
|
||||
Fixed export not working
|
||||
Added reconnect feature in tab menu
|
||||
|
||||
V1.15:
|
||||
Added: New portable package
|
||||
Added: Defaults for new connections can now be customized
|
||||
Click the root item and then the new Properties-like button with a small yellow star to get to the settings
|
||||
Fixed Import from Active Directory not working
|
||||
Fixed problem with single click connect not focusing correctly
|
||||
Fixed root node not being renamed after changing name in property grid
|
||||
|
||||
V1.10:
|
||||
Added support for setting a password to protect the connections file with (look in the root of your connections tree)
|
||||
Added RDP file import feature
|
||||
Added new command-line switch to reset panel's positions
|
||||
Added HTTPS as protocol
|
||||
Added HTTP/S basic authentication
|
||||
Added support for setting a Proxy server for automatic updates
|
||||
Some changes in help section
|
||||
Fixed the bug that passwords stored in the options weren't decrypted when a connection was opened
|
||||
Fixed "bug" that prevented "Connect to console session" from working in RDC6.1 (Vista SP1 RC1/XP SP3 RC1)
|
||||
|
||||
V1.00:
|
||||
Merry Christmas! =)
|
||||
|
||||
V1.00 is a (almost) complete rewrite of the whole application
|
||||
The code base is now much cleaner and more (easily) extendable
|
||||
New features include (but are not limited to):
|
||||
Every part of the application is now integrated into panels which can be moved, docked and undocked, hidden, moved to another monitor, etc.
|
||||
This makes many new and exciting ways to manage connection and application windows possible
|
||||
You can for example open up 4 PuTTY sessions in 4 different panels and align them in the main application so you can use all 4 side by side - 2 on the upper side and 2 on the bottom for example
|
||||
This can be done for EVERY part of the application, it's completely modular and customizable
|
||||
Connection and folder (previously called containers) properties have moved to a new property grid control
|
||||
Every setting (with the exclusion of the hostname, which wouldn't make any sense) can now be inherited from the parent folder
|
||||
Connection file saving/loading is now handled a bit different (more in the help section)
|
||||
Application restart is no longer nececary after changing options, they are active with a click of the OK button
|
||||
Smart size can now be activated also if a connection is already open (in the right click menu of the active tab)
|
||||
A panel name can be stored with every connection (or folder, if inherting) to always open the connection in the specified panel
|
||||
And last but not least, many bugs have been fixed, though there are probably many new bugs aswell - Did I already mention this is a rewrite? ;)
|
||||
I hope you like my work and if you do please consider donating on the mRemote website to support me a little. Any amount will do! Thx!
|
||||
|
||||
V0.50:
|
||||
Removed old Terminal (SSH, Telnet) control and embedded PuTTY instead
|
||||
This decision brings mostly good but also some bad news
|
||||
The good news is that now everything that works in putty also works in mRemote
|
||||
This means X11 forwarding, SSH port forwarding, session logging, appearance customization, etc. should be working fine now
|
||||
It also brings some new protocols (Rlogin, RAW)
|
||||
The bad news is that I cannot fully integrate Putty into mRemote because it is a standalone application and thus has it's own window handle
|
||||
This means that you won't be able to use Ctrl+Tab to switch between tabs, catching errors or infos through the new Errors and Infos tab isn't possible, etc.
|
||||
Added possibility to change resolution or display mode (Fit to window, Fullscreen, Smart size)
|
||||
Added new setting in options to show logon info on tab titles
|
||||
Added new feature that catches popup dialogs and puts them in a managed interface. This is another step to make mRemote a single window application.
|
||||
Pressing escape switches back to the connection list
|
||||
There is a context menu that allows you to copy selected errors/warnings/infos to the clipboard (text only) or to delete them
|
||||
There also are settings in the option to change when to switch to the tab and to switch back to the normal behaviour of displaying message popups
|
||||
Added QuickConnect history and auto-complete functions
|
||||
Added a few new Icons (Linux, Windows, ESX, Log, Finance)
|
||||
Improved options tab
|
||||
Connections file version is now 1.2
|
||||
Fixed some form drawing bugs
|
||||
|
||||
V0.35:
|
||||
Added tab switching/closing hotkeys
|
||||
Switch to next tab: Ctrl+Tab
|
||||
Switch to previous tab: Ctrl+Shift+Tab
|
||||
Close active tab: Ctrl+W
|
||||
This does not and will probably never work with RDP connections!
|
||||
Fixed bug in updating code that still displayed the current version in the old format (x.x.x.x instead of x.xx)
|
||||
Fixed bug where the colors setting was not correctly read after saving and reloading a connections file (only with 256 colors setting)
|
||||
Fixed bug that made connect to console session and fullscreen options not work
|
||||
Fixed bug that when opening options, update or about tab caused weird paddings next to the tab or other strange behaviour
|
||||
Changed shortcuts to menu items in main menu as they interfered with some terminal key bindings
|
||||
|
||||
V0.30:
|
||||
Added HTTP as protocol to allow for basic web-based administration
|
||||
Added new connections menu to the toolbar
|
||||
Left click on a connection connects
|
||||
Right click on a container or connection opens the config tab for the selected item
|
||||
Added two new connection context menu entries for quickly connecting to console session or connecting in fullscreen
|
||||
Improved tray icon menu (just like the main connections menu)
|
||||
The connections tree can now be hidden
|
||||
To hide it right click on the splitter (the divider between the connections tree and the tabbing interface)
|
||||
Removed overlay (RDP locking) feature in favor of simply grabbing input when clicking inside the control area
|
||||
I hope nobody is too sad that the nice looking overlay feature had to go, but..., well, it had to! ;-)
|
||||
Changed "Redirect Key combinations (like in fullscreen)" to be disabled when in kiosk mode as it has no effect then anyway
|
||||
Several small bugfixes and code improvements
|
||||
|
||||
V0.20:
|
||||
Added Drag and Drop support for tabs
|
||||
Added tab context menu
|
||||
Switch to/from fullscreen
|
||||
Take a screenshot
|
||||
Transfer files via SCP/SFTP (SSH)
|
||||
Send special keys (VNC)
|
||||
Rename tabs
|
||||
Duplicate tabs (Create another instance of the connection)
|
||||
Show config
|
||||
Close tab (disconnect)
|
||||
Removed Fullscreen and Send special keys buttons from the main toolbar as they are now in the tab context menu
|
||||
Added middle click support for tabs (close/disconnect)
|
||||
Added SSH file transfer (SCP/SFTP) support
|
||||
Added Tools menu to the tree context menu
|
||||
Transfer files via SCP/SFTP (SSH)
|
||||
Import/Export features
|
||||
Sorting
|
||||
Changed version format
|
||||
Fixed the problem that caused mRemote to crash when dragging a parent node of the connections tree onto one of it's child nodes
|
||||
Fixed problem in importing mechanism that allowed importing connections including the root which resulted in multiple root items that couldn't be deleted
|
||||
Fixed problem with quick connect
|
||||
|
||||
V0.0.9.0:
|
||||
Added support for redirecting key combinations (Alt+Tab, Winkey, ...)
|
||||
Added Import/Export features
|
||||
Added Quick Connect Port support, just type the host you want to connect to followed by a ":" and then the port
|
||||
Added Connect/Disconnect buttons to connections context menu
|
||||
Added two new icons (Test Server | TST; Build Server | BS)
|
||||
Many changes to the connections loading/saving mechanisms
|
||||
confCons version is now 1.0
|
||||
Some code cleanup
|
||||
Fixed auto session info to only try to get session information when a RDP connection is selected
|
||||
Fixed AD Import feature (didn't care if imported items were computers, groups, users, ... ;)
|
||||
Fixed settings and connections not saving when installing updates from the auto-updater
|
||||
Fixed form size and location not saving properly when closing the application in minimized state or in maximized state on a secondary monitor
|
||||
|
||||
V0.0.8.2:
|
||||
Added SSH1 to Quick Connect GUI
|
||||
Changed buffer size of terminal control, it's now 500 lines
|
||||
Fixed terminal connections not getting focus when changing tabs
|
||||
Fixed bug in terminal code that caused hitting "home" to show "~" instead of jumping to the start of the line
|
||||
Fixed bug that caused that hitting enter in mRemote wouldn't do anything when options was opened before
|
||||
|
||||
V0.0.8.0:
|
||||
Added code to check if the msrdp com control is registered
|
||||
Many Improvements to the terminal control (ssh1(!), ssh2, telnet)
|
||||
Fixed bug that caused mRemote to crash when moving connection into root node (only with inheritance enabled)
|
||||
Fixed bug: Pressing delete when editing a node's name caused delete messagebox to show
|
||||
|
||||
V0.0.7.5:
|
||||
Added inheritance feature to inherit connection settings from parent container
|
||||
Expanded/Collapsed state of tree nodes will now be saved
|
||||
Reduced auto session info delay to 700ms
|
||||
Some code maintainance
|
||||
Some corrections to connections tree and quick search behaviour
|
||||
Fixed bug in TerminalControl that caused the error message "error loading string"
|
||||
Fixed: Settings saving on exit was broken in V0.0.7.0, this is fixed now
|
||||
Changed connections file version to 0.9
|
||||
Fixed connections context menu bug that made import from ad option inaccessible
|
||||
Fixed session info filling up with infos about hosts previously selected
|
||||
|
||||
V0.0.7.0:
|
||||
Massive GUI redesign and changes, hope you like it! =)
|
||||
Fixed bug that made session info to query immediately after selecting a connection (when enabled), there is now a one second delay to prevent collecting session info for more than one host
|
||||
|
||||
V0.0.6.8:
|
||||
Added connection import feature for Active Directory
|
||||
Tidied up project references
|
||||
Multiple changes to setup routine
|
||||
Improved error handling for auto-update
|
||||
Improved download handling for auto-update
|
||||
Fixed bug that made download finished/failed message box appear multiple times when update was canceled and re-downloaded
|
||||
Fixed bug where double-clicking a container opened all connections inside this container
|
||||
|
||||
V0.0.6.6:
|
||||
Changed port textbox control to only allow digits
|
||||
Small changes to connection code for SSH
|
||||
Fixed port setting not saving (or always displaying default port for selected protocol)
|
||||
|
||||
V0.0.6.5:
|
||||
Added auto update feature
|
||||
Changed: Multiple UI Changes (added shortcuts, rearranged menu items, ...)
|
||||
Fixed the problem where the connections file version was saved either with a dot or a comma, depending on system language
|
||||
Fixed not being able to connect to SSH2 hosts without specifying username and password
|
||||
Fixed several problems with Quick Connect
|
||||
Improved saving of config changes
|
||||
Fixed connections tab not closing when using SSH
|
||||
|
||||
V0.0.6.0:
|
||||
Added new protocols: SSH2 and Telnet
|
||||
Added first command line switch/parameter "/consfile"
|
||||
Ex.: mRemote.exe /consfile "%PathToYourConnectionsFile%"
|
||||
Added button to screenshots to delete a screenshot
|
||||
Added Host Status (Ping) feature
|
||||
Many code rewrites and changes in almost every area
|
||||
Changed the way connections get loaded
|
||||
The default path for the connection file is no longer in the application directory but in the local application data folder.
|
||||
Ex.: c:\Documents and Settings\felix\Local Settings\Application Data\Felix_Deimel\mRemote\
|
||||
If opening a connection file from a custom location (click on open link) saving will also occur in this file and not like in previous versions to the default connections file
|
||||
To import your old connection file please use the following procedure: start mRemote, click on "Open" and find your old connection file. Then click on "Save As" and save it with the default file name to the default location
|
||||
Changed the font and style of context menus
|
||||
Changed Quick Connect UI
|
||||
Fixed connection settings in config tab not saving when clicking another connection before jumping to another config field
|
||||
Fixed a bug where renaming a container caused the first connection in the same container to be renamed too
|
||||
|
||||
V0.0.5.0 R2:
|
||||
Fixed a bug that prevented connections from opening when icon files were assigned in a previous version of mRemote
|
||||
|
||||
V0.0.5.0:
|
||||
Added (Global) fullscreen / kiosk feature
|
||||
Added redirection settings for disk drives, printers, ports, smart cards and sound
|
||||
Added option to write a log file
|
||||
Added option to open new tabs on the right side of the currently selected tab
|
||||
Added possibility to connect to all nodes in a container
|
||||
Changed session functions to work in background
|
||||
Changed icon choosing mechanism and added a bunch of default icons
|
||||
Changed: Containers with connection can now be deleted just like empty containers
|
||||
Changed screenshot functions to now collect all screenshots in one tab
|
||||
Changed: More settings can now be changed on container basis
|
||||
Changed config file version to 0.6
|
||||
Changed: Small internal changes to the connection saving/creating and opening mechanisms
|
||||
Fixed "Display Wallpapers" and "Display Themes" settings, they are working now
|
||||
|
||||
V0.0.3.6:
|
||||
Added Feature to display an overlay when RDP connection tab has lost the focus, clicking on this gives the focus back to the control
|
||||
Added standard handlers for F2 (rename) and DEL (delete) keys in the treeview
|
||||
Added icon preview for connections in config tab
|
||||
Changed the way new connections and containers are being created in the treeview. The pop up window will not be displayed any longer, instead everything is handled inplace by the treeview.
|
||||
Changed some minor UI related stuff
|
||||
Fixed bug in tab closing mechanism that caused icons (play/pause) to not be set on the correct tree nodes
|
||||
|
||||
V0.0.3.5:
|
||||
Added Feature to query and log off sessions on a remote machine and option to do this automatically
|
||||
Added Option to show icon in system tray with connection menu
|
||||
Changed controls to flat style as I think this fits the whole application more than the old 3D look
|
||||
Multiple UI changes to eliminate annoying behaviour
|
||||
|
||||
V0.0.3.3:
|
||||
Added Feature to specify which login information to use when no info is provided in the config of a remote machine
|
||||
Fixed bug in Quick Find where trying to open a connection when no node was found caused an error
|
||||
Fixed bug where the main form was not rendered correctly when hiding top bar and using XP Themes
|
||||
Fixed bug in drag-drop routine that caused application to hang when trying to drop a node on one of it's child nodes
|
||||
Fixed bug where taskbar buttons for fullscreen rdp windows did not disappear after disconnecting
|
||||
|
||||
V0.0.3.2:
|
||||
Added new Save As Dialog with feature to only save specific connection settings
|
||||
Added Option to display Tooltips when hovering over host entries in the connection tree
|
||||
Added Option to ask at exit when there are open connections
|
||||
Fixed bug where saving connections file with spaces in the root node caused an error -> updated Connection File Version to 0.5
|
||||
Fixed bug in options tab where the browse button for a custom connection file didn't do anything
|
||||
|
||||
V0.0.3.0:
|
||||
Added Options Tab
|
||||
Load connections file from different location
|
||||
Save/Don't Save connections file on exit
|
||||
Show current tab name in window title
|
||||
Added drag and drop functionality to the connections tree
|
||||
Added feature to hide top bar
|
||||
Added feature to send special keys (VNC)
|
||||
Updated VncSharp Library to V0.88 (still pretty buggy)
|
||||
|
||||
V0.0.2.7:
|
||||
Added feature to save connection settings to all connections in the selected container
|
||||
Icon choosing bug fixed
|
||||
Taskbar button had no text when in fullscreen - fixed
|
||||
Fixed bug in Quick Connect GUI
|
||||
Disabled "Display Wallpaper" and "Display Themes" checkboxes as these features are not implemented
|
||||
|
||||
V0.0.2.5:
|
||||
Quick connect button bug fixed
|
||||
Search field resize bug fixed
|
||||
Splitter position is now saved on exit
|
||||
Added new connections toolstrip (same functions as context menu)
|
||||
|
||||
V0.0.2.4:
|
||||
Changed default color depth to 16bit
|
||||
Added Keep Alive Interval (1 Minute)
|
||||
Added Options to choose between RDP & VNC
|
||||
Added Port Setting for RDP
|
||||
Added Option to connect to console
|
||||
Added Menu Entries to move Connections & Containers up & down
|
||||
Some small code improvements
|
||||
1653
CHANGELOG.md
Normal file
1653
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
59
COPYING.TXT
59
COPYING.TXT
@@ -278,62 +278,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
113
CREDITS.TXT
113
CREDITS.TXT
@@ -1,113 +0,0 @@
|
||||
Contributors
|
||||
============
|
||||
|
||||
Jason Barbier
|
||||
Wiktor Beryt
|
||||
Lionel Caignec
|
||||
Felix Deimel
|
||||
Holger Henke
|
||||
Tom Hiller
|
||||
Riley McArdle
|
||||
Apisitt Rattana
|
||||
Andreas Rehm
|
||||
David Vidmar
|
||||
|
||||
|
||||
Included Source Code
|
||||
====================
|
||||
|
||||
Command Line Arguments Parser 1.0
|
||||
Copyright <20> 2002 Richard Lopes
|
||||
MIT License
|
||||
http://www.codeproject.com/KB/recipes/command_line.aspx
|
||||
|
||||
DotNetVer
|
||||
Copyright <20> 2010 David Grinberg
|
||||
Copyright <20> 2010-2011 Brandon Hansen
|
||||
http://nsis.sourceforge.net/DotNetVer
|
||||
|
||||
|
||||
Included Components
|
||||
===================
|
||||
|
||||
ADTree 1.0
|
||||
Copyright <20> 2004 Marc Merritt
|
||||
Copyright <20> 2008 Felix Deimel
|
||||
http://www.codeproject.com/KB/selection/ADPickerCtrl.aspx
|
||||
|
||||
DiffieHellman 1.0
|
||||
Copyright <20> 2003 The Mentalis.org Team
|
||||
Modified New BSD License
|
||||
http://www.mentalis.org/
|
||||
|
||||
DockPanel Suite 2.3.1
|
||||
Copyright <20> 2007 Weifen Luo
|
||||
MIT License
|
||||
http://sourceforge.net/projects/dockpanelsuite/
|
||||
|
||||
Emergent OnLine WTSCOM 2.0.6.0
|
||||
Copyright <20> 2001-2003 Emergent OnLine
|
||||
http://www.go-eol.com/
|
||||
|
||||
FilteredPropertyGrid 1.0.0.0
|
||||
Copyright <20> 2006 Azuria
|
||||
http://www.codeproject.com/KB/cs/FilteredPropertyGrid.aspx
|
||||
|
||||
GeckoFX 1.8.1.4
|
||||
Copyright <20> 2008 Skybound Software
|
||||
Mozilla Public License 1.1
|
||||
http://www.geckofx.org/
|
||||
|
||||
IPTextBox 1.1
|
||||
Copyright <20> 2006 Matthew Kleinwaks
|
||||
Copyright <20> 2008 Felix Deimel
|
||||
http://www.vbforums.com/showthread.php?t=430169
|
||||
|
||||
log4net 1.2.10.0
|
||||
Copyright <20> 2001-2006 The Apache Software Foundation
|
||||
Apache License Version 2.0
|
||||
http://logging.apache.org/log4net/
|
||||
|
||||
Magic Library 1.7.4
|
||||
Copyright <20> 2002-2003 Crownwood Consulting, Ltd.
|
||||
Freely redistributable with attribution
|
||||
http://www.dotnetmagic.com/magic_download.html
|
||||
|
||||
Mentalis.org Security Library 1.0.13.715
|
||||
Copyright <20> 2002-2005 The Mentalis.org Team
|
||||
Modified New BSD License
|
||||
http://www.mentalis.org/
|
||||
|
||||
MiniGeckoBrowser 1.0
|
||||
Copyright <20> 2008 Felix Deimel
|
||||
http://www.appjuice.org/
|
||||
|
||||
MiniTabControl 1.0
|
||||
Copyright <20> 2008 Felix Deimel
|
||||
http://www.appjuice.org/
|
||||
|
||||
PuTTY 0.62
|
||||
Copyright <20> 1997-2011 Simon Tatham
|
||||
MIT License
|
||||
http://www.chiark.greenend.org.uk/~sgtatham/putty/
|
||||
|
||||
SharpSSH 1.1.1.13
|
||||
Copyright <20> 2002-2008 Atsuhiko Yamanaka, JCraft, Inc.
|
||||
Copyright <20> 2007 Tamir Gal
|
||||
BSD Style License
|
||||
http://www.tamirgal.com/blog/page/SharpSSH.aspx
|
||||
|
||||
Silk Icon Set
|
||||
Copyright <20> 2005-2008 FAMFAMFAM
|
||||
Creative Commons Attribution 2.5 License
|
||||
http://www.famfamfam.com/
|
||||
|
||||
Vista TaskDialog Wrapper and Emulator 1.0
|
||||
Copyright <20> 2007-2009 Hedley Muscroft
|
||||
Code Project Open License (CPOL)
|
||||
http://www.codeproject.com/KB/vista/Vista_TaskDialog_Wrapper.aspx
|
||||
|
||||
VncSharp 1.0
|
||||
Copyright <20> 2004-2009 David Humphrey
|
||||
GNU General Public License (GPL) Version 2
|
||||
http://cdot.senecac.on.ca/projects/vncsharp/
|
||||
180
ExternalConnectors/AWS/AWSConnectionForm.Designer.cs
generated
Normal file
180
ExternalConnectors/AWS/AWSConnectionForm.Designer.cs
generated
Normal file
@@ -0,0 +1,180 @@
|
||||
namespace ExternalConnectors.AWS
|
||||
{
|
||||
partial class AWSConnectionForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.tbAccesKeyID = new System.Windows.Forms.TextBox();
|
||||
this.tbAccesKey = new System.Windows.Forms.TextBox();
|
||||
this.btnOK = new System.Windows.Forms.Button();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.tableLayoutPanel1.SuspendLayout();
|
||||
this.tableLayoutPanel2.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tbAccesKeyID
|
||||
//
|
||||
this.tbAccesKeyID.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tbAccesKeyID.Location = new System.Drawing.Point(152, 4);
|
||||
this.tbAccesKeyID.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.tbAccesKeyID.Name = "tbAccesKeyID";
|
||||
this.tbAccesKeyID.Size = new System.Drawing.Size(490, 23);
|
||||
this.tbAccesKeyID.TabIndex = 0;
|
||||
//
|
||||
// tbAccesKey
|
||||
//
|
||||
this.tbAccesKey.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tbAccesKey.Location = new System.Drawing.Point(152, 43);
|
||||
this.tbAccesKey.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.tbAccesKey.Name = "tbAccesKey";
|
||||
this.tbAccesKey.Size = new System.Drawing.Size(490, 23);
|
||||
this.tbAccesKey.TabIndex = 2;
|
||||
//
|
||||
// btnOK
|
||||
//
|
||||
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
|
||||
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnOK.Location = new System.Drawing.Point(219, 12);
|
||||
this.btnOK.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.btnOK.Name = "btnOK";
|
||||
this.btnOK.Size = new System.Drawing.Size(88, 26);
|
||||
this.btnOK.TabIndex = 10;
|
||||
this.btnOK.Text = "OK";
|
||||
this.btnOK.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btnCancel.Location = new System.Drawing.Point(338, 12);
|
||||
this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(88, 26);
|
||||
this.btnCancel.TabIndex = 11;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// tableLayoutPanel1
|
||||
//
|
||||
this.tableLayoutPanel1.ColumnCount = 2;
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 22.92994F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 77.07006F));
|
||||
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.tbAccesKeyID, 1, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.tbAccesKey, 1, 1);
|
||||
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||
this.tableLayoutPanel1.RowCount = 3;
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(646, 102);
|
||||
this.tableLayoutPanel1.TabIndex = 12;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label1.Location = new System.Drawing.Point(4, 0);
|
||||
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(140, 39);
|
||||
this.label1.TabIndex = 2;
|
||||
this.label1.Text = "Access Key ID";
|
||||
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label2.Location = new System.Drawing.Point(4, 39);
|
||||
this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(140, 39);
|
||||
this.label2.TabIndex = 4;
|
||||
this.label2.Text = "Access Key";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// tableLayoutPanel2
|
||||
//
|
||||
this.tableLayoutPanel2.ColumnCount = 5;
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
|
||||
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
|
||||
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
|
||||
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 112);
|
||||
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
|
||||
this.tableLayoutPanel2.RowCount = 1;
|
||||
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||
this.tableLayoutPanel2.Size = new System.Drawing.Size(646, 50);
|
||||
this.tableLayoutPanel2.TabIndex = 13;
|
||||
//
|
||||
// AWSConnectionForm
|
||||
//
|
||||
this.AcceptButton = this.btnOK;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(646, 162);
|
||||
this.Controls.Add(this.tableLayoutPanel2);
|
||||
this.Controls.Add(this.tableLayoutPanel1);
|
||||
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.Name = "AWSConnectionForm";
|
||||
this.Text = "AWS EC2 API Login Data";
|
||||
this.Activated += new System.EventHandler(this.AWSConnectionForm_Activated);
|
||||
this.tableLayoutPanel1.ResumeLayout(false);
|
||||
this.tableLayoutPanel1.PerformLayout();
|
||||
this.tableLayoutPanel2.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public System.Windows.Forms.TextBox tbAccesKeyID;
|
||||
public System.Windows.Forms.TextBox tbAccesKey;
|
||||
private System.Windows.Forms.Button btnOK;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
|
||||
}
|
||||
}
|
||||
16
ExternalConnectors/AWS/AWSConnectionForm.cs
Normal file
16
ExternalConnectors/AWS/AWSConnectionForm.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
namespace ExternalConnectors.AWS
|
||||
{
|
||||
public partial class AWSConnectionForm : Form
|
||||
{
|
||||
public AWSConnectionForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
}
|
||||
|
||||
private void AWSConnectionForm_Activated(object sender, EventArgs e)
|
||||
{
|
||||
tbAccesKeyID.Focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
60
ExternalConnectors/AWS/AWSConnectionForm.resx
Normal file
60
ExternalConnectors/AWS/AWSConnectionForm.resx
Normal file
@@ -0,0 +1,60 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
119
ExternalConnectors/AWS/EC2FetchDataService.cs
Normal file
119
ExternalConnectors/AWS/EC2FetchDataService.cs
Normal file
@@ -0,0 +1,119 @@
|
||||
using Amazon;
|
||||
using Amazon.EC2;
|
||||
using Amazon.EC2.Model;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace ExternalConnectors.AWS
|
||||
{
|
||||
public class EC2FetchDataService
|
||||
{
|
||||
private static DateTime lastFetch;
|
||||
private static List<InstanceInfo>? lastData;
|
||||
|
||||
// input must be in format "AWSAPI:instanceid" where instanceid is the ec2 instance id, e.g. i-066f750a76c97583d
|
||||
public static async Task<string> GetEC2InstanceDataAsync(string input, string region)
|
||||
{
|
||||
// get secret id
|
||||
if (!input.StartsWith("AWSAPI:"))
|
||||
throw new Exception("calling this function requires AWSAPI: input");
|
||||
string InstanceID = input[7..];
|
||||
|
||||
// init connection credentials, display popup if necessary
|
||||
AWSConnectionData.Init();
|
||||
var alldata = await GetEC2IPDataAsync(region);
|
||||
var found = alldata.Where(x => x.InstanceId == InstanceID).SingleOrDefault();
|
||||
return (found == null) ? "" : found.PublicIP;
|
||||
}
|
||||
|
||||
private static async Task<List<InstanceInfo>> GetEC2IPDataAsync(string region)
|
||||
{
|
||||
// caching
|
||||
TimeSpan timeSpan = DateTime.Now - lastFetch;
|
||||
if (timeSpan.TotalMinutes < 1 && lastData != null)
|
||||
return lastData;
|
||||
|
||||
//AWSConfigs.AWSRegion = AWSConnectionData.region;
|
||||
AWSConfigs.AWSRegion = region;
|
||||
string awsAccessKeyId = AWSConnectionData.awsKeyID;
|
||||
string awsSecretAccessKey = AWSConnectionData.awsKey;
|
||||
|
||||
var _client = new AmazonEC2Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.EUCentral1);
|
||||
bool done = false;
|
||||
|
||||
List<InstanceInfo> instanceList = new();
|
||||
var request = new DescribeInstancesRequest();
|
||||
while (!done)
|
||||
{
|
||||
DescribeInstancesResponse response = await _client.DescribeInstancesAsync(request);
|
||||
|
||||
foreach (var reservation in response.Reservations)
|
||||
{
|
||||
foreach (var instance in reservation.Instances)
|
||||
{
|
||||
string vmname = "";
|
||||
foreach (var tag in instance.Tags)
|
||||
{
|
||||
if (tag.Key == "Name")
|
||||
{
|
||||
vmname = tag.Value;
|
||||
}
|
||||
}
|
||||
InstanceInfo inf = new(instance, vmname);
|
||||
instanceList.Add(inf);
|
||||
}
|
||||
}
|
||||
|
||||
request.NextToken = response.NextToken;
|
||||
|
||||
if (response.NextToken == null)
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
|
||||
lastData = instanceList.OrderBy(x => x.Name).ToList();
|
||||
lastFetch = DateTime.Now;
|
||||
return lastData;
|
||||
}
|
||||
|
||||
|
||||
public static class AWSConnectionData
|
||||
{
|
||||
private static readonly RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteAWSInterface");
|
||||
|
||||
public static string awsKeyID = "";
|
||||
public static string awsKey = "";
|
||||
//public static string _region = "eu-central-1";
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
if (awsKey != "")
|
||||
return;
|
||||
// display gui and ask for data
|
||||
AWSConnectionForm f = new();
|
||||
f.tbAccesKeyID.Text = "" + key.GetValue("KeyID");
|
||||
f.tbAccesKey.Text = "" + key.GetValue("Key");
|
||||
//f.tbRegion.Text = "" + key.GetValue("Region");
|
||||
//if (f.tbRegion.Text == null || f.tbRegion.Text.Length < 2)
|
||||
// f.tbRegion.Text = region;
|
||||
_ = f.ShowDialog();
|
||||
|
||||
if (f.DialogResult != DialogResult.OK)
|
||||
return;
|
||||
|
||||
// store values to memory
|
||||
awsKeyID = f.tbAccesKeyID.Text;
|
||||
awsKey = f.tbAccesKey.Text;
|
||||
//region = f.tbRegion.Text;
|
||||
|
||||
|
||||
// write values to registry
|
||||
key.SetValue("KeyID", awsKeyID);
|
||||
key.SetValue("Key", awsKey);
|
||||
//key.SetValue("Region", region);
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
34
ExternalConnectors/AWS/InstanceInfo.cs
Normal file
34
ExternalConnectors/AWS/InstanceInfo.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using Amazon.EC2.Model;
|
||||
using System;
|
||||
|
||||
namespace ExternalConnectors.AWS
|
||||
{
|
||||
public class InstanceInfo
|
||||
{
|
||||
public string InstanceId { get; }
|
||||
public string Name { get; }
|
||||
public string Status { get; }
|
||||
public string PublicIP { get; }
|
||||
public string PrivateIP { get; }
|
||||
public InstanceInfo(Instance instance, string name)
|
||||
{
|
||||
InstanceId = instance.InstanceId;
|
||||
Name = name;
|
||||
|
||||
switch(instance.State.Code)
|
||||
{
|
||||
case 0: Status = "Pending"; break;
|
||||
case 16: Status = "Running"; break;
|
||||
case 32: Status = "Shutdown"; break;
|
||||
case 48: Status = "Terminated"; break;
|
||||
case 64: Status = "Stopping"; break;
|
||||
case 80: Status = "Stopped"; break;
|
||||
default: Status = "Unknown"; break;
|
||||
};
|
||||
|
||||
PublicIP = instance.PublicIpAddress ?? "";
|
||||
PrivateIP = instance.PrivateIpAddress ?? "";
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
28
ExternalConnectors/ExternalConnectors.csproj
Normal file
28
ExternalConnectors/ExternalConnectors.csproj
Normal file
@@ -0,0 +1,28 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>Library</OutputType>
|
||||
<UseWindowsForms>True</UseWindowsForms>
|
||||
<Platforms>x64</Platforms>
|
||||
<Configurations>Debug;Release;Debug Portable;Release Portable</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AWSSDK.Core" Version="3.7.5.9" />
|
||||
<PackageReference Include="AWSSDK.EC2" Version="3.7.50.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="AWS\AWSConnectionForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Update="TSS\SSConnectionForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
256
ExternalConnectors/TSS/SSConnectionForm.Designer.cs
generated
Normal file
256
ExternalConnectors/TSS/SSConnectionForm.Designer.cs
generated
Normal file
@@ -0,0 +1,256 @@
|
||||
namespace ExternalConnectors.TSS
|
||||
{
|
||||
partial class SSConnectionForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.tbSSURL = new System.Windows.Forms.TextBox();
|
||||
this.tbUsername = new System.Windows.Forms.TextBox();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.tbPassword = new System.Windows.Forms.TextBox();
|
||||
this.btnOK = new System.Windows.Forms.Button();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.cbUseSSO = new System.Windows.Forms.CheckBox();
|
||||
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.tableLayoutPanel1.SuspendLayout();
|
||||
this.tableLayoutPanel2.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tbSSURL
|
||||
//
|
||||
this.tbSSURL.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tbSSURL.Location = new System.Drawing.Point(260, 4);
|
||||
this.tbSSURL.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tbSSURL.Name = "tbSSURL";
|
||||
this.tbSSURL.Size = new System.Drawing.Size(536, 23);
|
||||
this.tbSSURL.TabIndex = 0;
|
||||
//
|
||||
// tbUsername
|
||||
//
|
||||
this.tbUsername.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tbUsername.Location = new System.Drawing.Point(260, 35);
|
||||
this.tbUsername.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tbUsername.Name = "tbUsername";
|
||||
this.tbUsername.Size = new System.Drawing.Size(536, 23);
|
||||
this.tbUsername.TabIndex = 2;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label3.Location = new System.Drawing.Point(4, 62);
|
||||
this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(248, 23);
|
||||
this.label3.TabIndex = 5;
|
||||
this.label3.Text = "Password";
|
||||
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// tbPassword
|
||||
//
|
||||
this.tbPassword.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tbPassword.Location = new System.Drawing.Point(260, 66);
|
||||
this.tbPassword.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tbPassword.Name = "tbPassword";
|
||||
this.tbPassword.Size = new System.Drawing.Size(536, 23);
|
||||
this.tbPassword.TabIndex = 4;
|
||||
this.tbPassword.UseSystemPasswordChar = true;
|
||||
//
|
||||
// btnOK
|
||||
//
|
||||
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
|
||||
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnOK.Location = new System.Drawing.Point(296, 12);
|
||||
this.btnOK.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.btnOK.Name = "btnOK";
|
||||
this.btnOK.Size = new System.Drawing.Size(88, 26);
|
||||
this.btnOK.TabIndex = 10;
|
||||
this.btnOK.Text = "OK";
|
||||
this.btnOK.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btnCancel.Location = new System.Drawing.Point(415, 12);
|
||||
this.btnCancel.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(88, 26);
|
||||
this.btnCancel.TabIndex = 11;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// tableLayoutPanel1
|
||||
//
|
||||
this.tableLayoutPanel1.ColumnCount = 2;
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32.06997F));
|
||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67.93003F));
|
||||
this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3);
|
||||
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.tbSSURL, 1, 0);
|
||||
this.tableLayoutPanel1.Controls.Add(this.tbUsername, 1, 1);
|
||||
this.tableLayoutPanel1.Controls.Add(this.tbPassword, 1, 2);
|
||||
this.tableLayoutPanel1.Controls.Add(this.cbUseSSO, 0, 3);
|
||||
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||
this.tableLayoutPanel1.RowCount = 4;
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(800, 108);
|
||||
this.tableLayoutPanel1.TabIndex = 12;
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label5.Location = new System.Drawing.Point(260, 85);
|
||||
this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(536, 23);
|
||||
this.label5.TabIndex = 15;
|
||||
this.label5.Text = "For SSO to work, additional IIS configuration is required!";
|
||||
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label1.Location = new System.Drawing.Point(4, 0);
|
||||
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(248, 31);
|
||||
this.label1.TabIndex = 2;
|
||||
this.label1.Text = "Secret Server URL";
|
||||
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label2.Location = new System.Drawing.Point(4, 31);
|
||||
this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(248, 31);
|
||||
this.label2.TabIndex = 4;
|
||||
this.label2.Text = "DOMAIN\\Username";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// cbUseSSO
|
||||
//
|
||||
this.cbUseSSO.AutoSize = true;
|
||||
this.cbUseSSO.Location = new System.Drawing.Point(4, 89);
|
||||
this.cbUseSSO.Margin = new System.Windows.Forms.Padding(4, 4, 4, 0);
|
||||
this.cbUseSSO.Name = "cbUseSSO";
|
||||
this.cbUseSSO.Size = new System.Drawing.Size(69, 19);
|
||||
this.cbUseSSO.TabIndex = 14;
|
||||
this.cbUseSSO.Text = "Use SSO";
|
||||
this.cbUseSSO.UseVisualStyleBackColor = true;
|
||||
this.cbUseSSO.CheckedChanged += new System.EventHandler(this.cbUseSSO_CheckedChanged);
|
||||
//
|
||||
// tableLayoutPanel2
|
||||
//
|
||||
this.tableLayoutPanel2.ColumnCount = 5;
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 23F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
|
||||
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
|
||||
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
|
||||
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 148);
|
||||
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
|
||||
this.tableLayoutPanel2.RowCount = 1;
|
||||
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||
this.tableLayoutPanel2.Size = new System.Drawing.Size(800, 50);
|
||||
this.tableLayoutPanel2.TabIndex = 13;
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.label4.Location = new System.Drawing.Point(0, 108);
|
||||
this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(341, 15);
|
||||
this.label4.TabIndex = 14;
|
||||
this.label4.Text = "URL is the base URL, like https://cred.domain.local/SecretServer";
|
||||
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// SSConnectionForm
|
||||
//
|
||||
this.AcceptButton = this.btnOK;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(800, 198);
|
||||
this.Controls.Add(this.label4);
|
||||
this.Controls.Add(this.tableLayoutPanel2);
|
||||
this.Controls.Add(this.tableLayoutPanel1);
|
||||
this.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.Name = "SSConnectionForm";
|
||||
this.Text = "Secret Server API Login Data";
|
||||
this.Activated += new System.EventHandler(this.SSConnectionForm_Activated);
|
||||
this.tableLayoutPanel1.ResumeLayout(false);
|
||||
this.tableLayoutPanel1.PerformLayout();
|
||||
this.tableLayoutPanel2.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private System.Windows.Forms.Label label3;
|
||||
|
||||
public System.Windows.Forms.TextBox tbSSURL;
|
||||
public System.Windows.Forms.TextBox tbUsername;
|
||||
public System.Windows.Forms.TextBox tbPassword;
|
||||
private System.Windows.Forms.Button btnOK;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
|
||||
public System.Windows.Forms.CheckBox cbUseSSO;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private Label label5;
|
||||
}
|
||||
}
|
||||
30
ExternalConnectors/TSS/SSConnectionForm.cs
Normal file
30
ExternalConnectors/TSS/SSConnectionForm.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
namespace ExternalConnectors.TSS
|
||||
{
|
||||
public partial class SSConnectionForm : Form
|
||||
{
|
||||
public SSConnectionForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void SSConnectionForm_Activated(object sender, EventArgs e)
|
||||
{
|
||||
SetVisibility();
|
||||
if (cbUseSSO.Checked)
|
||||
btnOK.Focus();
|
||||
else
|
||||
tbPassword.Focus();
|
||||
}
|
||||
|
||||
private void cbUseSSO_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
SetVisibility();
|
||||
}
|
||||
private void SetVisibility()
|
||||
{
|
||||
bool ch = cbUseSSO.Checked;
|
||||
tbPassword.Enabled = !ch;
|
||||
tbUsername.Enabled = !ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
60
ExternalConnectors/TSS/SSConnectionForm.resx
Normal file
60
ExternalConnectors/TSS/SSConnectionForm.resx
Normal file
@@ -0,0 +1,60 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
364
ExternalConnectors/TSS/SecretServerAuthentication.cs
Normal file
364
ExternalConnectors/TSS/SecretServerAuthentication.cs
Normal file
@@ -0,0 +1,364 @@
|
||||
//----------------------
|
||||
// <auto-generated>
|
||||
// Generated using the NSwag toolchain v13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org)
|
||||
// </auto-generated>
|
||||
//----------------------
|
||||
|
||||
#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
|
||||
#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
|
||||
#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
|
||||
#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
|
||||
#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
|
||||
#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'"
|
||||
#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant"
|
||||
|
||||
namespace SecretServerAuthentication.TSS
|
||||
{
|
||||
using System = global::System;
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
|
||||
public partial class OAuth2ServiceClient
|
||||
{
|
||||
private string _baseUrl = "";
|
||||
private System.Net.Http.HttpClient _httpClient;
|
||||
private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;
|
||||
|
||||
public OAuth2ServiceClient(string baseUrl, System.Net.Http.HttpClient httpClient)
|
||||
{
|
||||
BaseUrl = baseUrl;
|
||||
_httpClient = httpClient;
|
||||
_settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings);
|
||||
}
|
||||
|
||||
private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings()
|
||||
{
|
||||
var settings = new Newtonsoft.Json.JsonSerializerSettings();
|
||||
UpdateJsonSerializerSettings(settings);
|
||||
return settings;
|
||||
}
|
||||
|
||||
public string BaseUrl
|
||||
{
|
||||
get { return _baseUrl; }
|
||||
set { _baseUrl = value; }
|
||||
}
|
||||
|
||||
protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } }
|
||||
|
||||
partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings);
|
||||
|
||||
|
||||
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url);
|
||||
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder);
|
||||
partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response);
|
||||
/// <summary>Retrieve or Refresh Access Token</summary>
|
||||
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
|
||||
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
|
||||
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
|
||||
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
|
||||
/// <returns>Successful retrieval of an access token</returns>
|
||||
/// <exception cref="ApiException">A server side error occurred.</exception>
|
||||
public System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token)
|
||||
{
|
||||
return AuthorizeAsync(grant_type, username, password, refresh_token, System.Threading.CancellationToken.None);
|
||||
}
|
||||
|
||||
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
|
||||
/// <summary>Retrieve or Refresh Access Token</summary>
|
||||
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
|
||||
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
|
||||
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
|
||||
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
|
||||
/// <returns>Successful retrieval of an access token</returns>
|
||||
/// <exception cref="ApiException">A server side error occurred.</exception>
|
||||
public async System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token, System.Threading.CancellationToken cancellationToken)
|
||||
{
|
||||
var urlBuilder_ = new System.Text.StringBuilder();
|
||||
urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/oauth2/token");
|
||||
|
||||
var client_ = _httpClient;
|
||||
var disposeClient_ = false;
|
||||
try
|
||||
{
|
||||
using (var request_ = new System.Net.Http.HttpRequestMessage())
|
||||
{
|
||||
var keyValues_ = new System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>();
|
||||
if (grant_type == null)
|
||||
throw new System.ArgumentNullException("grant_type");
|
||||
else
|
||||
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("grant_type", ConvertToString(grant_type, System.Globalization.CultureInfo.InvariantCulture)));
|
||||
if (username != null)
|
||||
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("username", ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture)));
|
||||
if (password != null)
|
||||
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("password", ConvertToString(password, System.Globalization.CultureInfo.InvariantCulture)));
|
||||
if (refresh_token != null)
|
||||
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("refresh_token", ConvertToString(refresh_token, System.Globalization.CultureInfo.InvariantCulture)));
|
||||
request_.Content = new System.Net.Http.FormUrlEncodedContent(keyValues_);
|
||||
request_.Method = new System.Net.Http.HttpMethod("POST");
|
||||
request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
|
||||
|
||||
PrepareRequest(client_, request_, urlBuilder_);
|
||||
|
||||
var url_ = urlBuilder_.ToString();
|
||||
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
|
||||
|
||||
PrepareRequest(client_, request_, url_);
|
||||
|
||||
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
|
||||
var disposeResponse_ = true;
|
||||
try
|
||||
{
|
||||
var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
|
||||
if (response_.Content != null && response_.Content.Headers != null)
|
||||
{
|
||||
foreach (var item_ in response_.Content.Headers)
|
||||
headers_[item_.Key] = item_.Value;
|
||||
}
|
||||
|
||||
ProcessResponse(client_, response_);
|
||||
|
||||
var status_ = (int)response_.StatusCode;
|
||||
if (status_ == 200)
|
||||
{
|
||||
var objectResponse_ = await ReadObjectResponseAsync<TokenResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
|
||||
if (objectResponse_.Object == null)
|
||||
{
|
||||
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
|
||||
}
|
||||
return objectResponse_.Object;
|
||||
}
|
||||
else
|
||||
if (status_ == 400)
|
||||
{
|
||||
var objectResponse_ = await ReadObjectResponseAsync<TokenErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
|
||||
if (objectResponse_.Object == null)
|
||||
{
|
||||
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
|
||||
}
|
||||
throw new ApiException<TokenErrorResponse>("An error occurred", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (disposeResponse_)
|
||||
response_.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (disposeClient_)
|
||||
client_.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
protected struct ObjectResponseResult<T>
|
||||
{
|
||||
public ObjectResponseResult(T responseObject, string responseText)
|
||||
{
|
||||
this.Object = responseObject;
|
||||
this.Text = responseText;
|
||||
}
|
||||
|
||||
public T Object { get; }
|
||||
|
||||
public string Text { get; }
|
||||
}
|
||||
|
||||
public bool ReadResponseAsString { get; set; }
|
||||
|
||||
protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Threading.CancellationToken cancellationToken)
|
||||
{
|
||||
if (response == null || response.Content == null)
|
||||
{
|
||||
return new ObjectResponseResult<T>(default(T), string.Empty);
|
||||
}
|
||||
|
||||
if (ReadResponseAsString)
|
||||
{
|
||||
var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings);
|
||||
return new ObjectResponseResult<T>(typedBody, responseText);
|
||||
}
|
||||
catch (Newtonsoft.Json.JsonException exception)
|
||||
{
|
||||
var message = "Could not deserialize the response body string as " + typeof(T).FullName + ".";
|
||||
throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
|
||||
using (var streamReader = new System.IO.StreamReader(responseStream))
|
||||
using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader))
|
||||
{
|
||||
var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings);
|
||||
var typedBody = serializer.Deserialize<T>(jsonTextReader);
|
||||
return new ObjectResponseResult<T>(typedBody, string.Empty);
|
||||
}
|
||||
}
|
||||
catch (Newtonsoft.Json.JsonException exception)
|
||||
{
|
||||
var message = "Could not deserialize the response body stream as " + typeof(T).FullName + ".";
|
||||
throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
if (value is System.Enum)
|
||||
{
|
||||
var name = System.Enum.GetName(value.GetType(), value);
|
||||
if (name != null)
|
||||
{
|
||||
var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name);
|
||||
if (field != null)
|
||||
{
|
||||
var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute))
|
||||
as System.Runtime.Serialization.EnumMemberAttribute;
|
||||
if (attribute != null)
|
||||
{
|
||||
return attribute.Value != null ? attribute.Value : name;
|
||||
}
|
||||
}
|
||||
|
||||
var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo));
|
||||
return converted == null ? string.Empty : converted;
|
||||
}
|
||||
}
|
||||
else if (value is bool)
|
||||
{
|
||||
return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant();
|
||||
}
|
||||
else if (value is byte[])
|
||||
{
|
||||
return System.Convert.ToBase64String((byte[])value);
|
||||
}
|
||||
else if (value.GetType().IsArray)
|
||||
{
|
||||
var array = System.Linq.Enumerable.OfType<object>((System.Array)value);
|
||||
return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo)));
|
||||
}
|
||||
|
||||
var result = System.Convert.ToString(value, cultureInfo);
|
||||
return result == null ? "" : result;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>API access token response</summary>
|
||||
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
|
||||
public partial class TokenResponse
|
||||
{
|
||||
/// <summary>Authentication token</summary>
|
||||
[Newtonsoft.Json.JsonProperty("access_token", Required = Newtonsoft.Json.Required.Always)]
|
||||
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
|
||||
public string Access_token { get; set; }
|
||||
|
||||
/// <summary>Authentication token type</summary>
|
||||
[Newtonsoft.Json.JsonProperty("token_type", Required = Newtonsoft.Json.Required.Always)]
|
||||
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
|
||||
public TokenResponseToken_type Token_type { get; set; }
|
||||
|
||||
/// <summary>Authentication token expiration time, in seconds</summary>
|
||||
[Newtonsoft.Json.JsonProperty("expires_in", Required = Newtonsoft.Json.Required.Always)]
|
||||
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
|
||||
public string Expires_in { get; set; }
|
||||
|
||||
/// <summary>Refresh token. This is only provided when the server is set to allow refresh tokens for web services and when the session timeout duration is not set to Unlimited.</summary>
|
||||
[Newtonsoft.Json.JsonProperty("refresh_token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
|
||||
public string Refresh_token { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>API access token error response</summary>
|
||||
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
|
||||
public partial class TokenErrorResponse
|
||||
{
|
||||
/// <summary>Authentication token</summary>
|
||||
[Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)]
|
||||
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
|
||||
public string Message { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</summary>
|
||||
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
|
||||
public enum Grant_type
|
||||
{
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"password")]
|
||||
Password = 0,
|
||||
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"refresh_token")]
|
||||
Refresh_token = 1,
|
||||
|
||||
}
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
|
||||
public enum TokenResponseToken_type
|
||||
{
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"bearer")]
|
||||
Bearer = 0,
|
||||
|
||||
}
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
|
||||
public partial class ApiException : System.Exception
|
||||
{
|
||||
public int StatusCode { get; private set; }
|
||||
|
||||
public string Response { get; private set; }
|
||||
|
||||
public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; }
|
||||
|
||||
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException)
|
||||
: base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException)
|
||||
{
|
||||
StatusCode = statusCode;
|
||||
Response = response;
|
||||
Headers = headers;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
|
||||
public partial class ApiException<TResult> : ApiException
|
||||
{
|
||||
public TResult Result { get; private set; }
|
||||
|
||||
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException)
|
||||
: base(message, statusCode, response, headers, innerException)
|
||||
{
|
||||
Result = result;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma warning restore 1591
|
||||
#pragma warning restore 1573
|
||||
#pragma warning restore 472
|
||||
#pragma warning restore 114
|
||||
#pragma warning restore 108
|
||||
#pragma warning restore 3016
|
||||
184
ExternalConnectors/TSS/SecretServerInterface.cs
Normal file
184
ExternalConnectors/TSS/SecretServerInterface.cs
Normal file
@@ -0,0 +1,184 @@
|
||||
using Microsoft.Win32;
|
||||
using SecretServerAuthentication.TSS;
|
||||
using SecretServerRestClient.TSS;
|
||||
|
||||
namespace ExternalConnectors.TSS
|
||||
{
|
||||
public class SecretServerInterface
|
||||
{
|
||||
private static class SSConnectionData
|
||||
{
|
||||
public static string ssUsername = "";
|
||||
public static string ssPassword = "";
|
||||
public static string ssUrl = "";
|
||||
public static bool ssSSO = false;
|
||||
|
||||
public static bool initdone = false;
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
if (ssPassword != "" || initdone == true)
|
||||
return;
|
||||
|
||||
RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteSSInterface");
|
||||
try
|
||||
{
|
||||
// display gui and ask for data
|
||||
SSConnectionForm f = new SSConnectionForm();
|
||||
string? un = key.GetValue("Username") as string;
|
||||
f.tbUsername.Text = un ?? "";
|
||||
|
||||
string? url = key.GetValue("URL") as string;
|
||||
if (url == null || !url.Contains("://"))
|
||||
url = "https://cred.domain.local/SecretServer";
|
||||
f.tbSSURL.Text = url;
|
||||
|
||||
var b = key.GetValue("SSO");
|
||||
if (b == null || (string)b != "True")
|
||||
ssSSO = false;
|
||||
else
|
||||
{
|
||||
ssSSO = true;
|
||||
initdone = true;
|
||||
}
|
||||
f.cbUseSSO.Checked = ssSSO;
|
||||
|
||||
// show dialog
|
||||
while(true)
|
||||
{
|
||||
_ = f.ShowDialog();
|
||||
|
||||
if (f.DialogResult != DialogResult.OK)
|
||||
return;
|
||||
|
||||
// store values to memory
|
||||
ssUsername = f.tbUsername.Text;
|
||||
ssPassword = f.tbPassword.Text;
|
||||
ssUrl = f.tbSSURL.Text;
|
||||
ssSSO = f.cbUseSSO.Checked;
|
||||
|
||||
// check connection first
|
||||
try
|
||||
{
|
||||
if (TestCredentials() == true)
|
||||
break;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
MessageBox.Show("TestCredentials failed - please check your credentials");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// write values to registry
|
||||
key.SetValue("Username", ssUsername);
|
||||
key.SetValue("URL", ssUrl);
|
||||
key.SetValue("SSO", ssSSO);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static bool TestCredentials()
|
||||
{
|
||||
string authUsername = SSConnectionData.ssUsername;
|
||||
string authPassword = SSConnectionData.ssPassword;
|
||||
string baseURL = SSConnectionData.ssUrl;
|
||||
|
||||
if (SSConnectionData.ssSSO)
|
||||
{
|
||||
// checking creds doesn't really make sense here, as we can't modify them anyway if something is wrong
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
// Authenticate:
|
||||
var tokenClient = new OAuth2ServiceClient(baseURL, httpClient);
|
||||
// call below will throw an exception if the creds are invalid
|
||||
var token = tokenClient.AuthorizeAsync(Grant_type.Password, authUsername, authPassword, null).Result;
|
||||
// here we can be sure the creds are ok - return success state
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void FetchSecret(int secretID, out string secretUsername, out string secretPassword, out string secretDomain)
|
||||
{
|
||||
string authUsername = SSConnectionData.ssUsername;
|
||||
string authPassword = SSConnectionData.ssPassword;
|
||||
string baseURL = SSConnectionData.ssUrl;
|
||||
|
||||
SecretModel secret;
|
||||
if (SSConnectionData.ssSSO)
|
||||
{
|
||||
// REQUIRES IIS CONFIG! https://docs.thycotic.com/ss/11.0.0/api-scripting/webservice-iwa-powershell
|
||||
var handler = new HttpClientHandler() { UseDefaultCredentials = true };
|
||||
using (var httpClient = new HttpClient(handler))
|
||||
{
|
||||
// Call REST API:
|
||||
var client = new SecretsServiceClient($"{baseURL}/winauthwebservices/api", httpClient);
|
||||
secret = client.GetSecretAsync(false, true, secretID, null).Result;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
// Authenticate:
|
||||
var tokenClient = new OAuth2ServiceClient(baseURL, httpClient);
|
||||
var token = tokenClient.AuthorizeAsync(Grant_type.Password, authUsername, authPassword, null).Result;
|
||||
var tokenResult = token.Access_token;
|
||||
|
||||
// Set credentials (token):
|
||||
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenResult);
|
||||
|
||||
// Call REST API:
|
||||
var client = new SecretsServiceClient($"{baseURL}/api", httpClient);
|
||||
secret = client.GetSecretAsync(false, true, secretID, null).Result;
|
||||
}
|
||||
}
|
||||
|
||||
// clear return variables
|
||||
secretDomain = "";
|
||||
secretUsername = "";
|
||||
secretPassword = "";
|
||||
|
||||
// parse data and extract what we need
|
||||
foreach (var item in secret.Items)
|
||||
{
|
||||
if (item.FieldName.ToLower().Equals("domain"))
|
||||
secretDomain = item.ItemValue;
|
||||
else if (item.FieldName.ToLower().Equals("username"))
|
||||
secretUsername = item.ItemValue;
|
||||
else if (item.FieldName.ToLower().Equals("password"))
|
||||
secretPassword = item.ItemValue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// input must be in form "SSAPI:xxxx" where xxx is the secret id to fetch
|
||||
public static void FetchSecretFromServer(string input, out string username, out string password, out string domain)
|
||||
{
|
||||
// get secret id
|
||||
if (!input.StartsWith("SSAPI:"))
|
||||
throw new Exception("calling this function requires SSAPI: input");
|
||||
int secretID = Int32.Parse(input.Substring(6));
|
||||
|
||||
// init connection credentials, display popup if necessary
|
||||
SSConnectionData.Init();
|
||||
|
||||
// get the secret
|
||||
FetchSecret(secretID, out username, out password, out domain);
|
||||
}
|
||||
}
|
||||
}
|
||||
130342
ExternalConnectors/TSS/SecretServerRestClient.cs
Normal file
130342
ExternalConnectors/TSS/SecretServerRestClient.cs
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,296 +0,0 @@
|
||||
; ---------------------
|
||||
; DotNetVer.nsh
|
||||
; Written by: David Grinberg
|
||||
; Homepage: http://ontheperiphery.veraida.com/
|
||||
; Updated By: Brandon Hansen (http://www.remotehams.com/)
|
||||
; ---------------------
|
||||
;
|
||||
; LogicLib extensions for checking Microsoft .NET Framework versions and service packs.
|
||||
;
|
||||
; Latests Updates by Brandon Hansen, KG6YPI (RemoteHams.com)
|
||||
; Dec 26, 2011 - .NET Framework 4.0 detection fixes - client profile not being found
|
||||
; Dec 07, 2010 - .NET Framework 4.0 detection added by Brandon Hansen (KG6YPI)
|
||||
;
|
||||
; Usage examples:
|
||||
;
|
||||
; ${If} ${HasDotNet4.0}
|
||||
; DetailPrint "Microsoft .NET Framework 4.0 installed."
|
||||
; ${If} ${DOTNETVER_4_0} AtLeastDotNetServicePack 1
|
||||
; DetailPrint "Microsoft .NET Framework 4.0 is at least SP1."
|
||||
; ${Else}
|
||||
; DetailPrint "Microsoft .NET Framework 4.0 SP1 not installed."
|
||||
; ${EndIf}
|
||||
; ${If} ${DOTNETVER_4_0} HasDotNetClientProfile 1
|
||||
; DetailPrint "Microsoft .NET Framework 4.0 (Client Profile) available."
|
||||
; ${EndIf}
|
||||
; ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 1
|
||||
; DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) available."
|
||||
; ${EndIf}
|
||||
; ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 0
|
||||
; DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) not available."
|
||||
; ${EndIf}
|
||||
; ${EndIf}
|
||||
|
||||
|
||||
!verbose push
|
||||
!verbose 3
|
||||
|
||||
!ifndef ___DOTNETVER__NSH___
|
||||
!define ___DOTNETVER__NSH___
|
||||
|
||||
!include LogicLib.nsh
|
||||
!include Util.nsh
|
||||
|
||||
# constants
|
||||
|
||||
!define DOTNETVER_1_0 "1.0"
|
||||
!define DOTNETVER_1_1 "1.1"
|
||||
!define DOTNETVER_2_0 "2.0"
|
||||
!define DOTNETVER_3_0 "3.0"
|
||||
!define DOTNETVER_3_5 "3.5"
|
||||
!define DOTNETVER_4_0 "4.0"
|
||||
|
||||
# variable declaration
|
||||
|
||||
Var /GLOBAL __DONTNET_FOUNDVER
|
||||
|
||||
!macro __DotNetVer_DeclareVars
|
||||
!ifndef __DOTNETVER_VARS_DECLARED
|
||||
!define __DOTNETVER_VARS_DECLARED
|
||||
Var /GLOBAL __DOTNET_1.0
|
||||
Var /GLOBAL __DOTNET_1.1
|
||||
Var /GLOBAL __DOTNET_2.0
|
||||
Var /GLOBAL __DOTNET_3.0
|
||||
Var /GLOBAL __DOTNET_3.5
|
||||
Var /GLOBAL __DOTNET_4.0
|
||||
|
||||
Var /GLOBAL __DOTNETVER_1.0_SP
|
||||
Var /GLOBAL __DOTNETVER_1.1_SP
|
||||
Var /GLOBAL __DOTNETVER_2.0_SP
|
||||
Var /GLOBAL __DOTNETVER_3.0_SP
|
||||
Var /GLOBAL __DOTNETVER_3.5_SP
|
||||
Var /GLOBAL __DOTNETVER_4.0_SP
|
||||
|
||||
Var /GLOBAL __DOTNET_1.0_CLIENT
|
||||
Var /GLOBAL __DOTNET_1.1_CLIENT
|
||||
Var /GLOBAL __DOTNET_2.0_CLIENT
|
||||
Var /GLOBAL __DOTNET_3.0_CLIENT
|
||||
Var /GLOBAL __DOTNET_3.5_CLIENT
|
||||
Var /GLOBAL __DOTNET_4.0_CLIENT
|
||||
|
||||
Var /GLOBAL __DOTNET_1.0_FULL
|
||||
Var /GLOBAL __DOTNET_1.1_FULL
|
||||
Var /GLOBAL __DOTNET_2.0_FULL
|
||||
Var /GLOBAL __DOTNET_3.0_FULL
|
||||
Var /GLOBAL __DOTNET_3.5_FULL
|
||||
Var /GLOBAL __DOTNET_4.0_FULL
|
||||
|
||||
StrCpy $__DOTNET_1.0 0
|
||||
StrCpy $__DOTNET_1.1 0
|
||||
StrCpy $__DOTNET_2.0 0
|
||||
StrCpy $__DOTNET_3.0 0
|
||||
StrCpy $__DOTNET_3.5 0
|
||||
StrCpy $__DOTNET_4.0 0
|
||||
|
||||
StrCpy $__DOTNETVER_1.0_SP 0
|
||||
StrCpy $__DOTNETVER_1.1_SP 0
|
||||
StrCpy $__DOTNETVER_2.0_SP 0
|
||||
StrCpy $__DOTNETVER_3.0_SP 0
|
||||
StrCpy $__DOTNETVER_3.5_SP 0
|
||||
StrCpy $__DOTNETVER_4.0_SP 0
|
||||
|
||||
StrCpy $__DOTNET_1.0_CLIENT 0
|
||||
StrCpy $__DOTNET_1.1_CLIENT 0
|
||||
StrCpy $__DOTNET_2.0_CLIENT 0
|
||||
StrCpy $__DOTNET_3.0_CLIENT 0
|
||||
StrCpy $__DOTNET_3.5_CLIENT 0
|
||||
StrCpy $__DOTNET_4.0_CLIENT 0
|
||||
|
||||
StrCpy $__DOTNET_1.0_FULL 0
|
||||
StrCpy $__DOTNET_1.1_FULL 0
|
||||
StrCpy $__DOTNET_2.0_FULL 0
|
||||
StrCpy $__DOTNET_3.0_FULL 0
|
||||
StrCpy $__DOTNET_3.5_FULL 0
|
||||
StrCpy $__DOTNET_4.0_FULL 0
|
||||
|
||||
!endif
|
||||
!macroend
|
||||
|
||||
|
||||
# lazy initialization macro
|
||||
|
||||
!macro __DotNetVer_InitVars
|
||||
# only calculate version once
|
||||
StrCmp $__DONTNET_FOUNDVER "" dotnetver.noveryet
|
||||
Return
|
||||
|
||||
dotnetver.noveryet:
|
||||
!insertmacro __DotNetVer_DeclareVars
|
||||
|
||||
Push $0 ;registry count
|
||||
Push $1 ;registry key
|
||||
Push $2 ;version number
|
||||
Push $3 ;installed
|
||||
Push $4 ;service pack number
|
||||
Push $8 ;strLen helper var
|
||||
|
||||
StrCpy $0 0
|
||||
|
||||
dotnetver.startenum:
|
||||
|
||||
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0
|
||||
StrCmp $1 "" dotnetver.done
|
||||
|
||||
IntOp $0 $0 + 1
|
||||
|
||||
StrCpy $2 $1 1 0
|
||||
StrCmp $2 "v" +1 dotnetver.startenum
|
||||
StrCpy $2 $1 3 1
|
||||
|
||||
; Check for .NET 1.0 to 3.5
|
||||
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\$1" "Install"
|
||||
ReadRegDWORD $4 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\$1" "SP"
|
||||
IntCmp $3 1 dotnetcheck.skipalt
|
||||
; Alternate check for versions that don't set the Install key
|
||||
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\$1\Setup" "InstallSuccess"
|
||||
dotnetcheck.skipalt:
|
||||
; This is a sanity check that works on .NET 1.0 to 3.5
|
||||
; if it fails check for dotnet 4
|
||||
IntCmp $3 0 dotnetcheck.40
|
||||
StrCmp $2 ${DOTNETVER_1_0} dotnetver.10
|
||||
StrCmp $2 ${DOTNETVER_1_1} dotnetver.11
|
||||
StrCmp $2 ${DOTNETVER_2_0} dotnetver.20
|
||||
StrCmp $2 ${DOTNETVER_3_0} dotnetver.30
|
||||
StrCmp $2 ${DOTNETVER_3_5} dotnetver.35
|
||||
dotnetcheck.40:
|
||||
StrCmp $2 ${DOTNETVER_4_0} dotnetver.40
|
||||
StrCmp $2 "4" dotnetver.40
|
||||
|
||||
Goto dotnetver.startenum
|
||||
|
||||
dotnetver.10:
|
||||
StrCpy $__DOTNET_1.0 1
|
||||
StrCpy $__DOTNETVER_1.0_SP $4
|
||||
StrCpy $__DOTNET_1.0_FULL 1
|
||||
Goto dotnetver.startenum
|
||||
dotnetver.11:
|
||||
StrCpy $__DOTNET_1.1 1
|
||||
StrCpy $__DOTNETVER_1.1_SP $4
|
||||
StrCpy $__DOTNET_1.1_FULL 1
|
||||
Goto dotnetver.startenum
|
||||
dotnetver.20:
|
||||
StrCpy $__DOTNET_2.0 1
|
||||
StrCpy $__DOTNETVER_2.0_SP $4
|
||||
StrCpy $__DOTNET_2.0_FULL 1
|
||||
Goto dotnetver.startenum
|
||||
dotnetver.30:
|
||||
StrCpy $__DOTNET_3.0 1
|
||||
StrCpy $__DOTNETVER_3.0_SP $4
|
||||
StrCpy $__DOTNET_3.0_FULL 1
|
||||
Goto dotnetver.startenum
|
||||
dotnetver.35:
|
||||
StrCpy $__DOTNET_3.5 1
|
||||
StrCpy $__DOTNETVER_3.5_SP $4
|
||||
StrCpy $__DOTNET_3.5_FULL 1
|
||||
Goto dotnetver.startenum
|
||||
dotnetver.40:
|
||||
; Check for .NET 4.0 (Full Profile)
|
||||
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
|
||||
ReadRegDWORD $4 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "SP"
|
||||
StrLen $8 $3
|
||||
IntCmp $8 0 dotnetcheck.40c
|
||||
IntCmp $3 0 dotnetcheck.40c
|
||||
StrCmp $2 ${DOTNETVER_4_0} dotnetver.40_Full
|
||||
StrCmp $2 "4" dotnetver.40_Full
|
||||
dotnetcheck.40c:
|
||||
; Check for .NET 4.0 (Client Profile)
|
||||
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Install"
|
||||
ReadRegDWORD $4 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "SP"
|
||||
StrLen $8 $3
|
||||
IntCmp $8 0 dotnetver.startenum
|
||||
IntCmp $3 0 dotnetver.startenum
|
||||
StrCmp $2 ${DOTNETVER_4_0} dotnetver.40_Client
|
||||
StrCmp $2 "4" dotnetver.40_Client
|
||||
Goto dotnetver.startenum
|
||||
dotnetver.40_Full:
|
||||
StrCpy $__DOTNET_4.0 1
|
||||
StrCpy $__DOTNETVER_4.0_SP $4
|
||||
StrCpy $__DOTNET_4.0_FULL 1
|
||||
Goto dotnetcheck.40c ; continue looking for other profiles
|
||||
dotnetver.40_Client:
|
||||
StrCpy $__DOTNET_4.0 1
|
||||
StrCpy $__DOTNETVER_4.0_SP $4
|
||||
StrCpy $__DOTNET_4.0_CLIENT 1
|
||||
Goto dotnetver.startenum
|
||||
|
||||
dotnetver.done:
|
||||
|
||||
StrCpy $__DONTNET_FOUNDVER "1"
|
||||
|
||||
Pop $8
|
||||
Pop $4
|
||||
Pop $3
|
||||
Pop $2
|
||||
Pop $1
|
||||
Pop $0
|
||||
!macroend
|
||||
|
||||
!macro _HasDotNet _a _b _t _f
|
||||
${CallArtificialFunction} __DotNetVer_InitVars
|
||||
|
||||
!insertmacro _= `$__DOTNET_${_b}` `1` `${_t}` `${_f}`
|
||||
!macroend
|
||||
|
||||
!macro __DotNetVer_DefineTest Ver
|
||||
!define HasDotNet${Ver} `"" HasDotNet ${Ver}`
|
||||
!macroend
|
||||
|
||||
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_1_0}
|
||||
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_1_1}
|
||||
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_2_0}
|
||||
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_3_0}
|
||||
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_3_5}
|
||||
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_4_0}
|
||||
|
||||
!macro _AtLeastDotNetServicePack _a _b _t _f
|
||||
${CallArtificialFunction} __DotNetVer_InitVars
|
||||
|
||||
!insertmacro _>= `$__DOTNETVER_${_a}_SP` `${_b}` `${_t}` `${_f}`
|
||||
!macroend
|
||||
!define AtLeastDotNetServicePack `AtLeastDotNetServicePack`
|
||||
|
||||
|
||||
!macro _AtMostDotNetServicePack _a _b _t _f
|
||||
${CallArtificialFunction} __DotNetVer_InitVars
|
||||
|
||||
!insertmacro _<= `$__DOTNETVER_${_a}_SP` `${_b}` `${_t}` `${_f}`
|
||||
!macroend
|
||||
!define AtMostDotNetServicePack `AtMostDotNetServicePack`
|
||||
|
||||
|
||||
!macro _IsDotNetServicePack _a _b _t _f
|
||||
${CallArtificialFunction} __DotNetVer_InitVars
|
||||
|
||||
!insertmacro _= `$__DOTNETVER_${_a}_SP` `${_b}` `${_t}` `${_f}`
|
||||
!macroend
|
||||
!define IsDotNetServicePack `IsDotNetServicePack`
|
||||
|
||||
!macro _HasDotNetClientProfile _a _b _t _f
|
||||
${CallArtificialFunction} __DotNetVer_InitVars
|
||||
|
||||
!insertmacro _= `$__DOTNET_${_a}_CLIENT` `${_b}` `${_t}` `${_f}`
|
||||
!macroend
|
||||
!define HasDotNetClientProfile `HasDotNetClientProfile`
|
||||
|
||||
!macro _HasDotNetFullProfile _a _b _t _f
|
||||
${CallArtificialFunction} __DotNetVer_InitVars
|
||||
|
||||
!insertmacro _= `$__DOTNET_${_a}_FULL` `${_b}` `${_t}` `${_f}`
|
||||
!macroend
|
||||
!define HasDotNetFullProfile `HasDotNetFullProfile`
|
||||
|
||||
# done
|
||||
|
||||
!endif # !___DOTNETVER__NSH___
|
||||
|
||||
!verbose pop
|
||||
@@ -1,22 +0,0 @@
|
||||
; Czech installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_CZECH} "mRemoteNG run CZECH message"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_CZECH} "Installer Language"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_CZECH} "Please select the language of the installer"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_CZECH} "mRemoteNG requires Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_CZECH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_CZECH} "Credits"
|
||||
LangString CopyingLinkName ${LANG_CZECH} "License"
|
||||
LangString UninstallLinkName ${LANG_CZECH} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_CZECH} "Version History"
|
||||
@@ -1,22 +0,0 @@
|
||||
; Dutch installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_DUTCH} "mRemoteNG run DUTCH message"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_DUTCH} "Installer Language"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_DUTCH} "Please select the language of the installer"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_DUTCH} "mRemoteNG requires Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_DUTCH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_DUTCH} "Credits"
|
||||
LangString CopyingLinkName ${LANG_DUTCH} "License"
|
||||
LangString UninstallLinkName ${LANG_DUTCH} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_DUTCH} "Version History"
|
||||
@@ -1,22 +0,0 @@
|
||||
; English installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_ENGLISH} "Launch mRemoteNG Now"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_ENGLISH} "Installer Language"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_ENGLISH} "Please select the language of the installer"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_ENGLISH} "mRemoteNG requires Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_ENGLISH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_ENGLISH} "Credits"
|
||||
LangString CopyingLinkName ${LANG_ENGLISH} "License"
|
||||
LangString UninstallLinkName ${LANG_ENGLISH} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_ENGLISH} "Version History"
|
||||
@@ -1,22 +0,0 @@
|
||||
; French installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_FRENCH} "mRemoteNG run FRENCH message"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_FRENCH} "Installer Language"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_FRENCH} "Please select the language of the installer"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_FRENCH} "mRemoteNG requires Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_FRENCH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_FRENCH} "Credits"
|
||||
LangString CopyingLinkName ${LANG_FRENCH} "License"
|
||||
LangString UninstallLinkName ${LANG_FRENCH} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_FRENCH} "Version History"
|
||||
@@ -1,22 +0,0 @@
|
||||
; German installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_GERMAN} "mRemoteNG jetzt Starten"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_GERMAN} "Installationsprogamm Sprache"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_GERMAN} "Bitte w<>hlen Sie die Sprache f<>r das Installationsprogramm"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_GERMAN} "mRemoteNG ben<65>tigt das Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_GERMAN} "Sie m<>ssen Mitglied der Grupper 'Power Users' or 'Administratoren' sein, damit Sie mRemoteNG installieren k<>nnen."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_GERMAN} "Credits"
|
||||
LangString CopyingLinkName ${LANG_GERMAN} "License"
|
||||
LangString UninstallLinkName ${LANG_GERMAN} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_GERMAN} "Version History"
|
||||
@@ -1,31 +0,0 @@
|
||||
!define LanguageNameEnglish "English"
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
!include "Language\english.nsi"
|
||||
|
||||
!define LanguageNameCzech "Čeština"
|
||||
!insertmacro MUI_LANGUAGE "Czech"
|
||||
!include "Language\czech.nsi"
|
||||
|
||||
!define LanguageNameGerman "Deutsch"
|
||||
!insertmacro MUI_LANGUAGE "German"
|
||||
!include "Language\german.nsi"
|
||||
|
||||
!define LanguageNameSpanish "Español"
|
||||
!insertmacro MUI_LANGUAGE "Spanish"
|
||||
!include "Language\spanish.nsi"
|
||||
|
||||
!define LanguageNameFrench "Français"
|
||||
!insertmacro MUI_LANGUAGE "French"
|
||||
!include "Language\french.nsi"
|
||||
|
||||
!define LanguageNameDutch "Nederlands"
|
||||
!insertmacro MUI_LANGUAGE "Dutch"
|
||||
!include "Language\dutch.nsi"
|
||||
|
||||
!define LanguageNamePolish "Polski"
|
||||
!insertmacro MUI_LANGUAGE "Polish"
|
||||
!include "Language\polish.nsi"
|
||||
|
||||
!define LanguageNameThai "ภาษาไทย"
|
||||
!insertmacro MUI_LANGUAGE "Thai"
|
||||
!include "Language\thai.nsi"
|
||||
@@ -1,22 +0,0 @@
|
||||
; Polish installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_POLISH} "mRemoteNG run POLISH message"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_POLISH} "Installer Language"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_POLISH} "Please select the language of the installer"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_POLISH} "mRemoteNG requires Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_POLISH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_POLISH} "Credits"
|
||||
LangString CopyingLinkName ${LANG_POLISH} "License"
|
||||
LangString UninstallLinkName ${LANG_POLISH} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_POLISH} "Version History"
|
||||
@@ -1,22 +0,0 @@
|
||||
; Spanish installer translation
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_SPANISH} "mRemoteNG run SPANISH message"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_SPANISH} "Installer Language"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_SPANISH} "Please select the language of the installer"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_SPANISH} "mRemoteNG requires Microsoft .NET Framework 3.0."
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_SPANISH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_SPANISH} "Credits"
|
||||
LangString CopyingLinkName ${LANG_SPANISH} "License"
|
||||
LangString UninstallLinkName ${LANG_SPANISH} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_SPANISH} "Version History"
|
||||
@@ -1,23 +0,0 @@
|
||||
; Thai installer translation
|
||||
; Contributed by Apisitt Rattana
|
||||
|
||||
; Start mRemoteNG after installation
|
||||
LangString LaunchMremoteNow ${LANG_THAI} "ขณะนี้กำลังติดตั้ง mRemoteNG"
|
||||
|
||||
; Installer Language
|
||||
LangString InstallerLanguage ${LANG_THAI} "ภาษาสำหรับการติดตั้ง"
|
||||
|
||||
; Select installer Language
|
||||
LangString SelectInstallerLanguage ${LANG_THAI} "กรุณาเลือกภาษาสำหรับการติดตั้ง"
|
||||
|
||||
; Requires .NET Framework
|
||||
LangString RequiresNetFramework ${LANG_THAI} "mRemoteNG มีความต้องการ Microsoft .NET Framework 3.0. เป็นพื้นฐาน"
|
||||
|
||||
; User needs to be Admin
|
||||
LangString RequiresAdminUser ${LANG_THAI} "คุณต้องเป็นสมาชิกในกลุ่มของ 'Power Users' หรือ 'Administrators' เพื่อการติดตั้ง mRemoteNG"
|
||||
|
||||
; Start Menu items
|
||||
LangString CreditsLinkName ${LANG_THAI} "Credits"
|
||||
LangString CopyingLinkName ${LANG_THAI} "License"
|
||||
LangString UninstallLinkName ${LANG_THAI} "Uninstall"
|
||||
LangString ChangeLogLinkName ${LANG_THAI} "Version History"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 78 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 79 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 83 KiB |
@@ -1,197 +0,0 @@
|
||||
!include "MUI.nsh"
|
||||
!include "WordFunc.nsh"
|
||||
!insertmacro VersionCompare
|
||||
|
||||
!include "DotNetVer.nsh"
|
||||
!include "..\Release\Version.nsh"
|
||||
|
||||
; This will be passed in using the /D switch by BUILD.CMD
|
||||
!ifdef PRODUCT_VERSION_TAG
|
||||
!define PRODUCT_VERSION_FRIENDLY "${PRODUCT_VERSION_SHORT}"
|
||||
!define PRODUCT_VERSION_TAGGED "${PRODUCT_VERSION_SHORT}-${PRODUCT_VERSION_TAG}"
|
||||
!else
|
||||
!define PRODUCT_VERSION_FRIENDLY "${PRODUCT_VERSION_SHORT}"
|
||||
!define PRODUCT_VERSION_TAGGED "${PRODUCT_VERSION_SHORT}"
|
||||
!endif
|
||||
|
||||
; Basic Config
|
||||
Name "mRemoteNG ${PRODUCT_VERSION_FRIENDLY}"
|
||||
OutFile "..\Release\mRemoteNG-Installer-${PRODUCT_VERSION_TAGGED}.exe"
|
||||
SetCompressor /SOLID lzma
|
||||
InstallDir "$PROGRAMFILES\mRemoteNG"
|
||||
InstallDirRegKey HKLM "Software\mRemoteNG" "InstallPath"
|
||||
RequestExecutionLevel admin
|
||||
|
||||
; Version Information
|
||||
VIProductVersion ${PRODUCT_VERSION}
|
||||
VIAddVersionKey "CompanyName" "Next Generation Software"
|
||||
VIAddVersionKey "ProductName" "mRemoteNG"
|
||||
VIAddVersionKey "ProductVersion" ${PRODUCT_VERSION}
|
||||
VIAddVersionKey "LegalCopyright" "Copyright © 2007-2009 Felix Deimel, 2010-2013 Riley McArdle"
|
||||
VIAddVersionKey "FileDescription" "mRemoteNG ${PRODUCT_VERSION_FRIENDLY} Installer"
|
||||
VIAddVersionKey "FileVersion" ${PRODUCT_VERSION}
|
||||
|
||||
; Design
|
||||
!define MUI_ICON "Setup_Install.ico"
|
||||
!define MUI_UNICON "RecycleBin.ico"
|
||||
!define MUI_HEADERIMAGE
|
||||
!define MUI_HEADERIMAGE_BITMAP "header.bmp" ; optional
|
||||
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
|
||||
!define MUI_HEADERIMAGE_UNBITMAP "header.bmp" ; optional
|
||||
!define MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
|
||||
!define MUI_HEADER_TRANSPARENT_TEXT
|
||||
!define MUI_WELCOMEFINISHPAGE_BITMAP "welcomefinish.bmp"
|
||||
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
|
||||
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "welcomefinish.bmp"
|
||||
!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
|
||||
|
||||
; Install Pages
|
||||
!insertmacro MUI_PAGE_LICENSE "..\COPYING.TXT"
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
||||
|
||||
; Finish Page
|
||||
!define MUI_FINISHPAGE_RUN_NOTCHECKED
|
||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\mRemoteNG.exe"
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
; Uninstall Pages
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
; Get Languages
|
||||
!include "Language\languages.nsi"
|
||||
|
||||
; Set finish page text
|
||||
!define MUI_FINISHPAGE_RUN_Text "$(LaunchMremoteNow)"
|
||||
|
||||
Function .onInit
|
||||
ClearErrors
|
||||
UserInfo::GetName
|
||||
IfErrors Win9x
|
||||
Pop $0
|
||||
UserInfo::GetAccountType
|
||||
Pop $1
|
||||
# GetOriginalAccountType will check the tokens of the original user of the
|
||||
# current thread/process. If the user tokens were elevated or limited for
|
||||
# this process, GetOriginalAccountType will return the non-restricted
|
||||
# account type.
|
||||
# On Vista with UAC, for example, this is not the same value when running
|
||||
# with `RequestExecutionLevel user`. GetOriginalAccountType will return
|
||||
# "admin" while GetAccountType will return "user".
|
||||
StrCmp $1 "Admin" 0 +3
|
||||
Goto doit
|
||||
StrCmp $1 "Power" 0 +3
|
||||
Goto doit
|
||||
StrCmp $1 "User" 0 +3
|
||||
Goto noop
|
||||
StrCmp $1 "Guest" 0 +3
|
||||
Goto noop
|
||||
MessageBox MB_OK "Unknown error"
|
||||
Goto doit
|
||||
|
||||
Win9x:
|
||||
doit:
|
||||
# We can install
|
||||
IfSilent +2
|
||||
Call SelectLanguage
|
||||
Goto end
|
||||
noop:
|
||||
MessageBox MB_OK "$(RequiresAdminUser)"
|
||||
Quit
|
||||
end:
|
||||
FunctionEnd
|
||||
|
||||
Function SelectLanguage
|
||||
;Language selection dialog
|
||||
Push ""
|
||||
Push ${LANG_ENGLISH}
|
||||
Push ${LanguageNameEnglish}
|
||||
Push ${LANG_GERMAN}
|
||||
Push ${LanguageNameGerman}
|
||||
Push ${LANG_DUTCH}
|
||||
Push ${LanguageNameDutch}
|
||||
Push ${LANG_FRENCH}
|
||||
Push ${LanguageNameFrench}
|
||||
Push ${LANG_POLISH}
|
||||
Push ${LanguageNamePolish}
|
||||
Push ${LANG_SPANISH}
|
||||
Push ${LanguageNameSpanish}
|
||||
Push ${LANG_CZECH}
|
||||
Push ${LanguageNameCzech}
|
||||
Push ${LANG_THAI}
|
||||
Push ${LanguageNameThai}
|
||||
Push A ; A means auto count languages
|
||||
; for the auto count to work the first empty push (Push "") must remain
|
||||
LangDLL::LangDialog "$(InstallerLanguage)" "$(SelectInstallerLanguage)"
|
||||
|
||||
Pop $LANGUAGE
|
||||
StrCmp $LANGUAGE "cancel" 0 +2
|
||||
Abort
|
||||
|
||||
; Check .NET version
|
||||
${IfNot} ${HasDotNet3.0}
|
||||
MessageBox MB_OK|MB_ICONEXCLAMATION "$(RequiresNetFramework)"
|
||||
Quit
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Section "" ; Install
|
||||
SetOutPath $INSTDIR
|
||||
SetShellVarContext all
|
||||
|
||||
; AddFiles
|
||||
File /r /x "mRemoteNG.vshost.*" "..\mRemoteV1\bin\Release\*.*"
|
||||
File /r "Dependencies\*.*"
|
||||
File "..\*.txt"
|
||||
|
||||
; Uninstaller
|
||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||
|
||||
; Register ActiveX components
|
||||
RegDLL "$INSTDIR\eolwtscom.dll"
|
||||
|
||||
; Start Menu
|
||||
CreateDirectory "$SMPROGRAMS\mRemoteNG"
|
||||
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(CreditsLinkName).lnk" "$INSTDIR\CREDITS.TXT"
|
||||
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(CopyingLinkName).lnk" "$INSTDIR\COPYING.TXT"
|
||||
CreateShortCut "$SMPROGRAMS\mRemoteNG\mRemoteNG.lnk" "$INSTDIR\mRemoteNG.exe"
|
||||
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(UninstallLinkName).lnk" "$INSTDIR\Uninstall.exe"
|
||||
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(ChangeLogLinkName).lnk" "$INSTDIR\CHANGELOG.TXT"
|
||||
|
||||
; Registry
|
||||
WriteRegStr HKLM "Software\mRemoteNG" "InstallPath" $INSTDIR
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "DisplayName" "mRemoteNG"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "Publisher" "Next Generation Software"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "DisplayIcon" "$INSTDIR\mRemoteNG.exe"
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "EstimatedSize" 7080
|
||||
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "DisplayVersion" ${PRODUCT_VERSION}
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "VersionMajor" ${PRODUCT_VERSION_MAJOR}
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "VersionMinor" ${PRODUCT_VERSION_MINOR}
|
||||
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "UninstallString" '"$INSTDIR\Uninstall.exe"'
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "NoModify" 1
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "NoRepair" 1
|
||||
SectionEnd
|
||||
|
||||
Section "un.Uninstall"
|
||||
; Unregister ActiveX components
|
||||
UnregDLL "$INSTDIR\eolwtscom.dll"
|
||||
|
||||
; Delete Files
|
||||
RMDIR /r $INSTDIR
|
||||
|
||||
; Start Menu
|
||||
SetShellVarContext all
|
||||
RMDir /r "$SMPROGRAMS\mRemoteNG"
|
||||
SetShellVarContext current
|
||||
RMDir /r "$SMPROGRAMS\mRemoteNG"
|
||||
|
||||
; Registry
|
||||
DeleteRegValue HKLM "Software\mRemoteNG" "InstallPath"
|
||||
DeleteRegKey /ifempty HKLM "Software\mRemoteNG"
|
||||
DeleteRegKey /ifempty HKCU "Software\mRemoteNG"
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG"
|
||||
SectionEnd
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 151 KiB |
143
README.MD
Normal file
143
README.MD
Normal file
@@ -0,0 +1,143 @@
|
||||
**NOTICE: This project currently transited to a new maintainer. Development help would be greatly appreciated.**
|
||||
|
||||
<br/><br/>
|
||||
<p align="center">
|
||||
<img width="450" src="https://github.com/mRemoteNG/mRemoteNG/blob/develop/mRemoteNGProjectFiles/Header_dark.png">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
An open source, multi-protocol, tabbed remote connections manager allowing you to view all of your connections in a simple yet powerful interface
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/mremoteng/mremoteng/total?label=Overall%20Downloads&style=for-the-badge">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.reddit.com/r/mRemoteNG/">
|
||||
<img alt="Subreddit subscribers" src="https://img.shields.io/reddit/subreddit-subscribers/mremoteng?label=Reddit&logo=Reddit&style=flat-square">
|
||||
</a>
|
||||
<a href="https://twitter.com/mremoteng">
|
||||
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/mremoteng?color=%231DA1F2&label=Twitter&logo=Twitter&style=flat-square">
|
||||
</a>
|
||||
<a href="https://gitter.im/mRemoteNG/PublicChat">
|
||||
<img alt="Gitter" src="https://img.shields.io/gitter/room/mRemoteNG/PublicChat?label=Join%20the%20Chat&logo=Gitter&style=flat-square">
|
||||
</a>
|
||||
<a href="https://www.paypal.me/DavidSparer">
|
||||
<img alt="PayPal" src="https://img.shields.io/badge/%24-PayPal-blue.svg?label=Donate&logo=PayPal&style=flat-square">
|
||||
</a>
|
||||
<a href="bitcoin:16fUnHUM3k7W9Fvpc6dug7TAdfeGEcLbSg">
|
||||
<img alt="Bitcoin" src="https://img.shields.io/badge/%24-Bitcoin.svg?label=Donate&logo=bitcoin&style=flat-square">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/mRemoteNG/mRemoteNG/blob/develop/COPYING.TXT">
|
||||
<img alt="License" src="https://img.shields.io/github/license/mremoteng/mremoteng?label=License&style=flat">
|
||||
</a>
|
||||
<a href="https://bestpractices.coreinfrastructure.org/projects/529">
|
||||
<img alt="CII Best Practices" src="https://bestpractices.coreinfrastructure.org/projects/529/badge?style=flat">
|
||||
</a>
|
||||
<a href='https://mremoteng.readthedocs.io/en/latest/?badge=latest'>
|
||||
<img src='https://readthedocs.org/projects/mremoteng/badge/?version=latest' alt='Documentation Status' />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
| Channel | Build Status | Downloads |
|
||||
| ---------------|--------------|-----------|
|
||||
| Stable |  | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.20) |
|
||||
| Preview |  | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.1) |
|
||||
| Nightly |  | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.2-nb) |
|
||||
|
||||
## Features
|
||||
|
||||
The following protocols are supported:
|
||||
|
||||
* RDP (Remote Desktop Protocol)
|
||||
* VNC (Virtual Network Computing)
|
||||
* SSH (Secure Shell)
|
||||
* Telnet (TELecommunication NETwork)
|
||||
* HTTP/HTTPS (Hypertext Transfer Protocol)
|
||||
* rlogin (Remote Login)
|
||||
* Raw Socket Connections
|
||||
* Powershell remoting
|
||||
|
||||
For a detailed feature list and general usage support, refer to the [Documentation](https://mremoteng.readthedocs.io/en/latest/).
|
||||
|
||||
## Installation
|
||||
|
||||
### Supported Operating Systems
|
||||
|
||||
- [Windows 11](https://en.wikipedia.org/wiki/Windows_11)
|
||||
- [Windows 10](https://en.wikipedia.org/wiki/Windows_10)
|
||||
- [Windows 8.1](https://en.wikipedia.org/wiki/Windows_8.1)
|
||||
- [Windows Server 2022](https://en.wikipedia.org/wiki/Windows_Server_2022)
|
||||
- [Windows Server 2019](https://en.wikipedia.org/wiki/Windows_Server_2019)
|
||||
- [Windows Server 2016](https://en.wikipedia.org/wiki/Windows_Server_2016)
|
||||
- [Windows Server 2012 R2](https://en.wikipedia.org/wiki/Windows_Server_2012_R2)
|
||||
|
||||
#### Source package
|
||||
|
||||
This contains the source code from which mRemoteNG is build.
|
||||
You will need to compile it yourself using Visual Studio.
|
||||
|
||||
### Minimum Requirements
|
||||
|
||||
* [Microsoft Visual C++ Redistributable for Visual Studio 2015 - 2022](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
|
||||
* [Microsoft .NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0)
|
||||
* Microsoft Terminal Service Client 6.0 or later
|
||||
* Needed if you use RDP. mstscax.dll and/or msrdp.ocx be registered.
|
||||
|
||||
### Download
|
||||
|
||||
mRemoteNG is available as a redistributable MSI package or as a portable ZIP package and can be downloaded from the following locations:
|
||||
* [GitHub](https://github.com/mRemoteNG/mRemoteNG/releases)
|
||||
* [Project Website](https://mremoteng.org/download)
|
||||
|
||||
### Command line install
|
||||
|
||||
The MSI package of mRemoteNG can be installed using the command line:
|
||||
|
||||
`msiexec /i [/qn] C:\Path\To\mRemoteNG-Installer.exe [INSTALLDIR=value] [IGNOREPREREQUISITES=value] [/lv* <log path>]`
|
||||
|
||||
| Argument/Property | Value | Description |
|
||||
|-|-|-|
|
||||
| /qn | `Silent Installation` | Will run the installer silently in the background. |
|
||||
| /lv* | `Silent Installation` | Will write a logfile to the specified location. (For paths that contain spaces, enclose the path in double quotes) |
|
||||
| INSTALLDIR | `folder path` | Allows you to set the installation directory from the command line. (For paths that contain spaces, enclose the path in double quotes) |
|
||||
| IGNOREPREREQUISITES | `0` or `1` | When set to `1`, the installer will not be halted if any prerequisite check is not met. You must still run the installer as administrator. |
|
||||
|
||||
## Manual Uninstall
|
||||
|
||||
_If you are using the Portable version, simply deleting the folder that contains mRemoteNG should be sufficient. These uninstall instructions are only necessary for the normal binary .MSI installed version of mRemoteNG_
|
||||
|
||||
* Delete the folder where mRemoteNG was installed. By default, this is:
|
||||
`%PROGRAMFILES%\mRemoteNG`
|
||||
|
||||
* Delete the mRemoteNG install entry from one of the following locations. Search for "mRemoteNG" in the DisplayName field:
|
||||
* x86: ``HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\``
|
||||
* x64: ``HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\``
|
||||
|
||||
* (Optional) If you would also like to delete user data remove `%LOCALAPPDATA%\mRemoteNG`
|
||||
|
||||
## Featured Projects
|
||||
|
||||
* [PSmRemoteNG](https://github.com/realslacker/PSmRemoteNG) A module to create mRemoteNG connection files from PowerShell.
|
||||
* [mRemoteNGOpenVPN](https://github.com/T3los/mRemoteNGOpenVPN) A script that can be embedded as an external tool to control OpenVPN.
|
||||
|
||||
## Contribute
|
||||
|
||||
If you find mRemoteNG useful and would like to contribute, it would be greatly appreciated. When you contribute, you make it possible for the team to cover the costs of producing mRemoteNG.
|
||||
|
||||
### Submit Code
|
||||
Check out the [Wiki page](https://github.com/mRemoteNG/mRemoteNG/wiki) on how to configure your development environment and submit a pull request.
|
||||
|
||||
### Translate
|
||||
Check out the [Wiki page](https://github.com/mRemoteNG/mRemoteNG/wiki) on how to help make mRemoteNG a polyglot.
|
||||
|
||||
</br>
|
||||
<p align="center">
|
||||
<img alt="Developed with ReSharper" src="https://github.com/mRemoteNG/mRemoteNG/blob/develop/mRemoteNGProjectFiles/icon_ReSharper.png">
|
||||
</p>
|
||||
14
README.txt
14
README.txt
@@ -1,14 +0,0 @@
|
||||
mRemoteNG is the next generation of mRemote, a full-featured, multi-tab remote connections manager.
|
||||
|
||||
It allows you to store all your remote connections in a simple yet powerful interface.
|
||||
|
||||
Currently these protocols are supported:
|
||||
|
||||
* RDP (Remote Desktop)
|
||||
* VNC (Virtual Network Computing)
|
||||
* ICA (Independent Computing Architecture)
|
||||
* SSH (Secure Shell)
|
||||
* Telnet (TELecommunication NETwork)
|
||||
* HTTP/S (Hypertext Transfer Protocol)
|
||||
* Rlogin (Rlogin)
|
||||
* RAW
|
||||
294
Tools/CreateBulkConnections_ConfCons2_6.ps1
Normal file
294
Tools/CreateBulkConnections_ConfCons2_6.ps1
Normal file
@@ -0,0 +1,294 @@
|
||||
#####################################
|
||||
# Authors: David Sparer & Jack Denton
|
||||
# Summary:
|
||||
# This is intended to be a template for creating connections in bulk. This uses the serializers directly from the mRemoteNG binaries.
|
||||
# You will still need to create the connection info objects, but the library will handle serialization. It is expected that you
|
||||
# are familiar with PowerShell. If this is not the case, reach out to the mRemoteNG community for help.
|
||||
# Usage:
|
||||
# Replace or modify the examples that are shown toward the end of the script to create your own connection info objects.
|
||||
#####################################
|
||||
|
||||
foreach ($Path in 'HKLM:\SOFTWARE\WOW6432Node\mRemoteNG', 'HKLM:\SOFTWARE\mRemoteNG') {
|
||||
Try {
|
||||
$mRNGPath = (Get-ItemProperty -Path $Path -Name InstallDir -ErrorAction Stop).InstallDir
|
||||
break
|
||||
}
|
||||
Catch {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if (!$mRNGPath) {
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
$FolderBrowser = [System.Windows.Forms.FolderBrowserDialog]@{
|
||||
Description = 'Please select the folder which contains mRemoteNG.exe'
|
||||
ShowNewFolderButton = $false
|
||||
}
|
||||
|
||||
$Response = $FolderBrowser.ShowDialog()
|
||||
|
||||
if ($Response.value__ -eq 1) {
|
||||
$mRNGPath = $FolderBrowser.SelectedPath
|
||||
}
|
||||
elseif ($Response.value__ -eq 2) {
|
||||
Write-Warning 'A folder containing mRemoteNG.exe has not been selected'
|
||||
return
|
||||
}
|
||||
}
|
||||
$null = [System.Reflection.Assembly]::LoadFile((Join-Path -Path $mRNGPath -ChildPath "mRemoteNG.exe"))
|
||||
Add-Type -Path (Join-Path -Path $mRNGPath -ChildPath "BouncyCastle.Crypto.dll")
|
||||
|
||||
|
||||
|
||||
function ConvertTo-mRNGSerializedXml {
|
||||
[CmdletBinding()]
|
||||
Param (
|
||||
[Parameter(Mandatory)]
|
||||
[mRemoteNG.Connection.ConnectionInfo[]]
|
||||
$Xml
|
||||
)
|
||||
|
||||
function Get-ChildNodes {
|
||||
Param ($Xml)
|
||||
|
||||
$Xml
|
||||
|
||||
if ($Xml -is [mRemoteNG.Container.ContainerInfo] -and $Xml.HasChildren()) {
|
||||
foreach ($Node in $Xml.Children) {
|
||||
Get-ChildNodes -Xml $Node
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$AllNodes = Get-ChildNodes -Xml $Xml
|
||||
if (
|
||||
$AllNodes.Password -or
|
||||
$AllNodes.RDGatewayPassword -or
|
||||
$AllNodes.VNCProxyPassword
|
||||
) {
|
||||
$Password = Read-Host -Message 'If you have password protected your ConfCons.xml please enter the password here otherwise just press enter' -AsSecureString
|
||||
}
|
||||
else {
|
||||
$Password = [securestring]::new()
|
||||
}
|
||||
$CryptoProvider = [mRemoteNG.Security.SymmetricEncryption.AeadCryptographyProvider]::new()
|
||||
$SaveFilter = [mRemoteNG.Security.SaveFilter]::new()
|
||||
$ConnectionNodeSerializer = [mRemoteNG.Config.Serializers.Xml.XmlConnectionNodeSerializer26]::new($CryptoProvider, $Password, $SaveFilter)
|
||||
$XmlSerializer = [mRemoteNG.Config.Serializers.Xml.XmlConnectionsSerializer]::new($CryptoProvider, $ConnectionNodeSerializer)
|
||||
|
||||
$RootNode = [mRemoteNG.Tree.Root.RootNodeInfo]::new('Connection')
|
||||
foreach ($Node in $Xml) {
|
||||
$RootNode.AddChild($Node)
|
||||
}
|
||||
$XmlSerializer.Serialize($RootNode)
|
||||
}
|
||||
|
||||
function New-mRNGConnection {
|
||||
[CmdletBinding(DefaultParameterSetName = 'Credential')]
|
||||
Param (
|
||||
[Parameter(Mandatory)]
|
||||
[string]
|
||||
$Name,
|
||||
|
||||
[Parameter(Mandatory)]
|
||||
[string]
|
||||
$Hostname,
|
||||
|
||||
[Parameter(Mandatory)]
|
||||
[mRemoteNG.Connection.Protocol.ProtocolType]
|
||||
$Protocol,
|
||||
|
||||
[Parameter(ParameterSetName = 'Credential')]
|
||||
[pscredential]
|
||||
$Credential,
|
||||
|
||||
[Parameter(ParameterSetName = 'InheritCredential')]
|
||||
[switch]
|
||||
$InheritCredential,
|
||||
|
||||
[Parameter()]
|
||||
[mRemoteNG.Container.ContainerInfo]
|
||||
$ParentContainer,
|
||||
|
||||
[Parameter()]
|
||||
[switch]
|
||||
$PassThru
|
||||
)
|
||||
|
||||
$Connection = [mRemoteNG.Connection.ConnectionInfo]@{
|
||||
Name = $Name
|
||||
Hostname = $Hostname
|
||||
Protocol = $Protocol
|
||||
}
|
||||
|
||||
if ($Credential) {
|
||||
$Connection.Username = $Credential.GetNetworkCredential().UserName
|
||||
$Connection.Domain = $Credential.GetNetworkCredential().Domain
|
||||
$Connection.Password = $Credential.GetNetworkCredential().Password
|
||||
}
|
||||
|
||||
if ($InheritCredential) {
|
||||
$Connection.Inheritance.Username = $true
|
||||
$Connection.Inheritance.Domain = $true
|
||||
$Connection.Inheritance.Password = $true
|
||||
}
|
||||
|
||||
if ($ParentContainer) {
|
||||
$ParentContainer.AddChild($Connection)
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('PassThru')) {
|
||||
$Connection
|
||||
}
|
||||
}
|
||||
else {
|
||||
$Connection
|
||||
}
|
||||
}
|
||||
|
||||
function New-mRNGContainer {
|
||||
[CmdletBinding(DefaultParameterSetName = 'Credential')]
|
||||
Param (
|
||||
[Parameter(Mandatory)]
|
||||
[string]
|
||||
$Name,
|
||||
|
||||
[Parameter(ParameterSetName = 'Credential')]
|
||||
[pscredential]
|
||||
$Credential,
|
||||
|
||||
[Parameter(ParameterSetName = 'InheritCredential')]
|
||||
[switch]
|
||||
$InheritCredential,
|
||||
|
||||
[Parameter()]
|
||||
[mRemoteNG.Container.ContainerInfo]
|
||||
$ParentContainer
|
||||
)
|
||||
|
||||
$Container = [mRemoteNG.Container.ContainerInfo]@{
|
||||
Name = $Name
|
||||
}
|
||||
|
||||
if ($Credential) {
|
||||
$Container.Username = $Credential.GetNetworkCredential().UserName
|
||||
$Container.Domain = $Credential.GetNetworkCredential().Domain
|
||||
$Container.Password = $Credential.GetNetworkCredential().Password
|
||||
}
|
||||
|
||||
if ($InheritCredential) {
|
||||
$Container.Inheritance.Username = $true
|
||||
$Container.Inheritance.Domain = $true
|
||||
$Container.Inheritance.Password = $true
|
||||
}
|
||||
|
||||
if ($ParentContainer) {
|
||||
$ParentContainer.AddChild($Container)
|
||||
}
|
||||
|
||||
$Container
|
||||
}
|
||||
|
||||
function Export-mRNGXml {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter()]
|
||||
[string]
|
||||
$Path,
|
||||
|
||||
[Parameter()]
|
||||
[string]
|
||||
$SerializedXml
|
||||
)
|
||||
|
||||
$FilePathProvider = [mRemoteNG.Config.DataProviders.FileDataProvider]::new($Path)
|
||||
$filePathProvider.Save($SerializedXml)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#----------------------------------------------------------------
|
||||
# Example 1: serialize many connections, no containers
|
||||
# Here you can define the number of connection info objects to create
|
||||
# You can also provide a list of desired hostnames and iterate over those
|
||||
|
||||
$Connections = foreach ($i in 1..5) {
|
||||
# Create new connection
|
||||
$Splat = @{
|
||||
Name = 'Server-{0:D2}' -f $i
|
||||
Hostname = 'Server-{0:D2}' -f $i
|
||||
Protocol = 'RDP'
|
||||
InheritCredential = $true
|
||||
}
|
||||
New-mRNGConnection @Splat
|
||||
}
|
||||
|
||||
# Serialize the connections
|
||||
$SerializedXml = ConvertTo-mRNGSerializedXml -Xml $Connections
|
||||
|
||||
# Write the XML to a file ready to import into mRemoteNG
|
||||
Export-mRNGXml -Path "$ENV:APPDATA\mRemoteNG\PowerShellGenerated.xml" -SerializedXml $SerializedXml
|
||||
|
||||
# Now open up mRemoteNG and press Ctrl+O and open up the exported XML file
|
||||
|
||||
|
||||
|
||||
|
||||
#----------------------------------------------------------------
|
||||
# Example 2: serialize a container which has connections
|
||||
# You can also create containers and add connections and containers to them, which will be nested correctly when serialized
|
||||
# If you specify the ParentContainer parameter for new connections then there will be no output unless the PassThru parameter is also used
|
||||
|
||||
$ProdServerCreds = Get-Credential
|
||||
$ProdServers = New-mRNGContainer -Name 'ProdServers' -Credential $ProdServerCreds
|
||||
|
||||
foreach ($i in 1..3) {
|
||||
# Create new connection
|
||||
$Splat = @{
|
||||
Name = 'Server-{0:D2}' -f $i
|
||||
Hostname = 'Server-{0:D2}' -f $i
|
||||
Protocol = 'RDP'
|
||||
InheritCredential = $true
|
||||
ParentContainer = $ProdServers
|
||||
}
|
||||
New-mRNGConnection @Splat
|
||||
}
|
||||
|
||||
$ProdWebServers = New-mRNGContainer -Name 'WebServers' -ParentContainer $ProdServers -InheritCredential
|
||||
|
||||
foreach ($i in 1..3) {
|
||||
# Create new connection
|
||||
$Splat = @{
|
||||
Name = 'WebServer-{0:D2}' -f $i
|
||||
Hostname = 'WebServer-{0:D2}' -f $i
|
||||
Protocol = 'SSH1'
|
||||
InheritCredential = $true
|
||||
ParentContainer = $ProdWebServers
|
||||
}
|
||||
New-mRNGConnection @Splat
|
||||
}
|
||||
|
||||
$DevServers = New-mRNGContainer -Name 'DevServers'
|
||||
|
||||
foreach ($i in 1..3) {
|
||||
# Create new connection
|
||||
$Splat = @{
|
||||
Name = 'DevServer-{0:D2}' -f $i
|
||||
Hostname = 'DevServer-{0:D2}' -f $i
|
||||
Protocol = 'RDP'
|
||||
InheritCredential = $true
|
||||
ParentContainer = $DevServers
|
||||
PassThru = $true
|
||||
}
|
||||
|
||||
# Specified the PassThru parameter in order to catch the connection and change a property
|
||||
$Connection = New-mRNGConnection @Splat
|
||||
$Connection.Resolution = 'FullScreen'
|
||||
}
|
||||
|
||||
# Serialize the container
|
||||
$SerializedXml = ConvertTo-mRNGSerializedXml -Xml $ProdServers, $DevServers
|
||||
|
||||
# Write the XML to a file ready to import into mRemoteNG
|
||||
Export-mRNGXml -Path "$ENV:APPDATA\mRemoteNG\PowerShellGenerated.xml" -SerializedXml $SerializedXml
|
||||
|
||||
# Now open up mRemoteNG and press Ctrl+O and open up the exported XML file
|
||||
Binary file not shown.
BIN
Tools/cert/CodeSigning_Cert_mRemoteNG_DigiCert.p12.enc
Normal file
BIN
Tools/cert/CodeSigning_Cert_mRemoteNG_DigiCert.p12.enc
Normal file
Binary file not shown.
109
Tools/create_upg_chk_files.ps1
Normal file
109
Tools/create_upg_chk_files.ps1
Normal file
@@ -0,0 +1,109 @@
|
||||
#Requires -Version 4.0
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TagName,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
[ValidateSet("Stable","Beta","Development")]
|
||||
$UpdateChannel
|
||||
)
|
||||
|
||||
|
||||
|
||||
function New-MsiUpdateFileContent {
|
||||
param (
|
||||
[System.IO.FileInfo]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$MsiFile,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TagName
|
||||
)
|
||||
|
||||
$version = $MsiFile.BaseName -replace "[a-zA-Z-]*"
|
||||
$certThumbprint = (Get-AuthenticodeSignature -FilePath $MsiFile).SignerCertificate.Thumbprint
|
||||
$hash = Get-FileHash -Algorithm SHA512 $MsiFile | % { $_.Hash }
|
||||
|
||||
$fileContents = `
|
||||
"Version: $version
|
||||
dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/$TagName/$($MsiFile.Name)
|
||||
clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/$TagName/CHANGELOG.md
|
||||
CertificateThumbprint: $certThumbprint
|
||||
Checksum: $hash"
|
||||
Write-Output $fileContents
|
||||
}
|
||||
|
||||
|
||||
function New-ZipUpdateFileContent {
|
||||
param (
|
||||
[System.IO.FileInfo]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ZipFile,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TagName
|
||||
)
|
||||
|
||||
$version = $ZipFile.BaseName -replace "[a-zA-Z-]*"
|
||||
$hash = Get-FileHash -Algorithm SHA512 $ZipFile | % { $_.Hash }
|
||||
|
||||
$fileContents = `
|
||||
"Version: $version
|
||||
dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/$TagName/$($ZipFile.Name)
|
||||
clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/$TagName/CHANGELOG.TXT
|
||||
Checksum: $hash"
|
||||
Write-Output $fileContents
|
||||
}
|
||||
|
||||
|
||||
function Resolve-UpdateCheckFileName {
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
[ValidateSet("Stable","Beta","Development")]
|
||||
$UpdateChannel,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
[ValidateSet("Normal","Portable")]
|
||||
$Type
|
||||
)
|
||||
|
||||
$fileName = ""
|
||||
|
||||
if ($UpdateChannel -eq "Beta") { $fileName += "beta-" }
|
||||
elseif ($UpdateChannel -eq "Development") { $fileName += "dev-" }
|
||||
|
||||
$fileName += "update"
|
||||
|
||||
if ($Type -eq "Portable") { $fileName += "-portable" }
|
||||
|
||||
$fileName += ".txt"
|
||||
|
||||
Write-Output $fileName
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$releaseFolder = Join-Path -Path $PSScriptRoot -ChildPath "..\Release" -Resolve
|
||||
|
||||
# build msi update file
|
||||
$msiFile = Get-ChildItem -Path "$releaseFolder\*.msi" | sort LastWriteTime | select -last 1
|
||||
$msiUpdateContents = New-MsiUpdateFileContent -MsiFile $msiFile -TagName $TagName
|
||||
$msiUpdateFileName = Resolve-UpdateCheckFileName -UpdateChannel $UpdateChannel -Type Normal
|
||||
Write-Output "`n`nMSI Update Check File Contents ($msiUpdateFileName)`n------------------------------"
|
||||
Tee-Object -InputObject $msiUpdateContents -FilePath "$releaseFolder\$msiUpdateFileName"
|
||||
|
||||
|
||||
# build zip update file
|
||||
$zipFile = Get-ChildItem -Path "$releaseFolder\*.zip" | sort LastWriteTime | select -last 1
|
||||
$zipUpdateContents = New-ZipUpdateFileContent -ZipFile $zipFile -TagName $TagName
|
||||
$zipUpdateFileName = Resolve-UpdateCheckFileName -UpdateChannel $UpdateChannel -Type Portable
|
||||
Write-Output "`n`nZip Update Check File Contents ($zipUpdateFileName)`n------------------------------"
|
||||
Tee-Object -InputObject $zipUpdateContents -FilePath "$releaseFolder\$zipUpdateFileName"
|
||||
BIN
Tools/exes/dumpbin.exe
Normal file
BIN
Tools/exes/dumpbin.exe
Normal file
Binary file not shown.
BIN
Tools/exes/editbin.exe
Normal file
BIN
Tools/exes/editbin.exe
Normal file
Binary file not shown.
BIN
Tools/exes/link.exe
Normal file
BIN
Tools/exes/link.exe
Normal file
Binary file not shown.
BIN
Tools/exes/mspdbcore.dll
Normal file
BIN
Tools/exes/mspdbcore.dll
Normal file
Binary file not shown.
BIN
Tools/exes/sigcheck.exe
Normal file
BIN
Tools/exes/sigcheck.exe
Normal file
Binary file not shown.
61
Tools/find_vstool.ps1
Normal file
61
Tools/find_vstool.ps1
Normal file
@@ -0,0 +1,61 @@
|
||||
[CmdletBinding()]
|
||||
|
||||
param (
|
||||
[string]
|
||||
# Name of the file to find
|
||||
$FileName
|
||||
)
|
||||
|
||||
|
||||
|
||||
function EditBinCertificateIsValid() {
|
||||
param (
|
||||
[string]
|
||||
$Path
|
||||
)
|
||||
|
||||
# Verify file certificate
|
||||
$valid_microsoft_cert_thumbprints = @(
|
||||
"3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC",
|
||||
"98ED99A67886D020C564923B7DF25E9AC019DF26",
|
||||
"108E2BA23632620C427C570B6D9DB51AC31387FE",
|
||||
"5EAD300DC7E4D637948ECB0ED829A072BD152E17"
|
||||
)
|
||||
$file_signature = Get-AuthenticodeSignature -FilePath $Path
|
||||
if (($file_signature.Status -ne "Valid") -or ($valid_microsoft_cert_thumbprints -notcontains $file_signature.SignerCertificate.Thumbprint)) {
|
||||
Write-Warning "Could not validate the signature of $Path"
|
||||
return $false
|
||||
} else {
|
||||
return $true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function ToolCanBeExecuted {
|
||||
param (
|
||||
[string]
|
||||
$Path
|
||||
)
|
||||
$null = & $Path
|
||||
Write-Output ($LASTEXITCODE -gt 0)
|
||||
}
|
||||
|
||||
$rootSearchPaths = @(
|
||||
[System.IO.Directory]::EnumerateFileSystemEntries("C:\Program Files", "*Visual Studio*", [System.IO.SearchOption]::TopDirectoryOnly),
|
||||
[System.IO.Directory]::EnumerateFileSystemEntries("C:\Program Files (x86)", "*Visual Studio*", [System.IO.SearchOption]::TopDirectoryOnly)
|
||||
)
|
||||
|
||||
# Returns the first full path to the $FileName that our search can find
|
||||
foreach ($searchPath in $rootSearchPaths) {
|
||||
foreach ($visualStudioFolder in $searchPath) {
|
||||
Write-Verbose "Searching in folder '$visualStudioFolder'"
|
||||
$matchingExes = [System.IO.Directory]::EnumerateFileSystemEntries($visualStudioFolder, $FileName, [System.IO.SearchOption]::AllDirectories)
|
||||
foreach ($matchingExe in $matchingExes) {
|
||||
if ((EditBinCertificateIsValid -Path $matchingExe) -and (ToolCanBeExecuted -Path $matchingExe)) {
|
||||
return $matchingExe
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Error "Could not find any valid file by the name $FileName." -ErrorAction Stop
|
||||
235
Tools/github_functions.ps1
Normal file
235
Tools/github_functions.ps1
Normal file
@@ -0,0 +1,235 @@
|
||||
$githubUrl = 'https://api.github.com'
|
||||
# GitHub doesn't support the default powershell protocol (TLS 1.0)
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
function Publish-GitHubRelease {
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Owner,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Repository,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$ReleaseTitle,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$TagName,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# Either the SHA of the commit to target or the branch name.
|
||||
$TargetCommitish,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Description,
|
||||
|
||||
[bool]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$IsDraft,
|
||||
|
||||
[bool]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$IsPrerelease,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# The OAuth2 token to use for authentication.
|
||||
$AuthToken
|
||||
)
|
||||
|
||||
$body = New-GitHubReleaseRequestBody -TagName $TagName -TargetCommitish $TargetCommitish -ReleaseTitle $ReleaseTitle -Description $Description -IsDraft $IsDraft -IsPrerelease $IsPrerelease
|
||||
$req_publishRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases" -Method Post -Headers @{"Authorization"="token $AuthToken"} -Body $body -ErrorAction Stop
|
||||
$response_publishRelease = ConvertFrom-Json -InputObject $req_publishRelease.Content
|
||||
|
||||
Write-Output $response_publishRelease
|
||||
}
|
||||
|
||||
|
||||
function Edit-GitHubRelease {
|
||||
param (
|
||||
[string]
|
||||
#[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Owner,
|
||||
|
||||
[string]
|
||||
#[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Repository,
|
||||
|
||||
[string]
|
||||
#[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$ReleaseId,
|
||||
|
||||
[string]
|
||||
#
|
||||
$ReleaseTitle,
|
||||
|
||||
[string]
|
||||
#
|
||||
$TagName,
|
||||
|
||||
[string]
|
||||
# Either the SHA of the commit to target or the branch name.
|
||||
$TargetCommitish,
|
||||
|
||||
[string]
|
||||
#
|
||||
$Description,
|
||||
|
||||
[bool]
|
||||
#
|
||||
$IsDraft,
|
||||
|
||||
[bool]
|
||||
#
|
||||
$IsPrerelease,
|
||||
|
||||
[string]
|
||||
#[Parameter(Mandatory=$true)]
|
||||
# The OAuth2 token to use for authentication.
|
||||
$AuthToken
|
||||
)
|
||||
|
||||
$body_params = @{
|
||||
"TagName" = $TagName
|
||||
"TargetCommitish" = $TargetCommitish
|
||||
"ReleaseTitle" = $ReleaseTitle
|
||||
"Description" = $Description
|
||||
}
|
||||
if ($PSBoundParameters.ContainsKey("IsDraft")) { $body_params.Add("IsDraft", $IsDraft) }
|
||||
if ($PSBoundParameters.ContainsKey("IsPrerelease")) { $body_params.Add("IsPrerelease", $IsPrerelease) }
|
||||
|
||||
$body = New-GitHubReleaseRequestBody @body_params
|
||||
$req_editRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases/$ReleaseId" -Method Post -Headers @{"Authorization"="token $AuthToken"} -Body $body -ErrorAction Stop
|
||||
$response_editRelease = ConvertFrom-Json -InputObject $req_editRelease.Content
|
||||
|
||||
Write-Output $response_editRelease
|
||||
}
|
||||
|
||||
|
||||
function Get-GitHubRelease {
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Owner,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Repository,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$ReleaseId,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# The OAuth2 token to use for authentication.
|
||||
$AuthToken
|
||||
)
|
||||
|
||||
$req_getRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases/$ReleaseId" -Method Get -Headers @{"Authorization"="token $AuthToken"} -ErrorAction Stop
|
||||
$response_getRelease = ConvertFrom-Json -InputObject $req_getRelease.Content
|
||||
|
||||
Write-Output $response_getRelease
|
||||
}
|
||||
|
||||
|
||||
function Upload-GitHubReleaseAsset {
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$UploadUri,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# Path to the file to upload with the release
|
||||
$FilePath,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# Content type of the file
|
||||
$ContentType,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# The OAuth2 token to use for authentication.
|
||||
$AuthToken,
|
||||
|
||||
[string]
|
||||
# A short description label for the asset
|
||||
$Label = ""
|
||||
)
|
||||
|
||||
$UploadUri = $UploadUri -replace "(\{[\w,\?]*\})$"
|
||||
$files = Get-Item -Path $FilePath
|
||||
|
||||
$labelParam = ""
|
||||
if ($Label -ne "") {
|
||||
$labelParam = "&label=$Label"
|
||||
}
|
||||
|
||||
# Get-Item could produce an array of files if a wildcard is provided. (C:\*.txt)
|
||||
# Upload each matching item individually
|
||||
foreach ($file in $files) {
|
||||
Write-Output "Uploading asset to GitHub release: '$($file.FullName)'"
|
||||
$req_uploadZipAsset = Invoke-WebRequest -Uri "$($UploadUri)?name=$($file.Name)$labelParam" -Method Post -Headers @{"Authorization"="token $AuthToken"} -ContentType $ContentType -InFile $file.FullName -ErrorAction Stop
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function New-GitHubReleaseRequestBody {
|
||||
param (
|
||||
[string]
|
||||
#
|
||||
$TagName,
|
||||
|
||||
[string]
|
||||
# Either the SHA of the commit to target or the branch name.
|
||||
$TargetCommitish,
|
||||
|
||||
[string]
|
||||
# Title of the release
|
||||
$ReleaseTitle,
|
||||
|
||||
[string]
|
||||
# Description of the release
|
||||
$Description,
|
||||
|
||||
[bool]
|
||||
# Is this a draft?
|
||||
$IsDraft,
|
||||
|
||||
[bool]
|
||||
# Is this a pre-release?
|
||||
$IsPrerelease
|
||||
)
|
||||
|
||||
$body_params = [ordered]@{}
|
||||
if ($TagName -ne "") { $body_params.Add("tag_name", $TagName) }
|
||||
if ($TargetCommitish -ne "") { $body_params.Add("target_commitish", $TargetCommitish) }
|
||||
if ($ReleaseTitle -ne "") { $body_params.Add("name", $ReleaseTitle) }
|
||||
if ($Description -ne "") { $body_params.Add("body", $Description) }
|
||||
if ($PSBoundParameters.ContainsKey("IsDraft")) { $body_params.Add("draft", $IsDraft) }
|
||||
if ($PSBoundParameters.ContainsKey("IsPrerelease")) { $body_params.Add("prerelease", $IsPrerelease) }
|
||||
|
||||
$json_body = ConvertTo-Json -InputObject $body_params -Compress
|
||||
Write-Output $json_body
|
||||
}
|
||||
43
Tools/postbuild_installer.ps1
Normal file
43
Tools/postbuild_installer.ps1
Normal file
@@ -0,0 +1,43 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$SolutionDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetFileName,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ConfigurationName,
|
||||
|
||||
[string]
|
||||
$CertificatePath,
|
||||
|
||||
[string]
|
||||
$CertificatePassword,
|
||||
|
||||
[string[]]
|
||||
$ExcludeFromSigning
|
||||
)
|
||||
|
||||
Write-Output "+===========================================================================================+"
|
||||
Write-Output "| Beginning mRemoteNG Installer Post Build |"
|
||||
Write-Output "+===========================================================================================+"
|
||||
Format-Table -AutoSize -Wrap -InputObject @{
|
||||
"SolutionDir" = $SolutionDir
|
||||
"TargetDir" = $TargetDir
|
||||
"TargetFileName" = $TargetFileName
|
||||
"ConfigurationName" = $ConfigurationName
|
||||
"CertificatePath" = $CertificatePath
|
||||
"ExcludeFromSigning" = $ExcludeFromSigning
|
||||
}
|
||||
|
||||
|
||||
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
|
||||
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
|
||||
& "$PSScriptRoot\rename_and_copy_installer.ps1" -SolutionDir $SolutionDir
|
||||
61
Tools/postbuild_mremoteng.ps1
Normal file
61
Tools/postbuild_mremoteng.ps1
Normal file
@@ -0,0 +1,61 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$SolutionDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetFileName,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ConfigurationName,
|
||||
|
||||
[string]
|
||||
$CertificatePath,
|
||||
|
||||
[string]
|
||||
$CertificatePassword,
|
||||
|
||||
[string[]]
|
||||
$ExcludeFromSigning
|
||||
)
|
||||
|
||||
Write-Output "+===========================================================================================+"
|
||||
Write-Output "| Beginning mRemoteNG Post Build |"
|
||||
Write-Output "+===========================================================================================+"
|
||||
Format-Table -AutoSize -Wrap -InputObject @{
|
||||
"SolutionDir" = $SolutionDir
|
||||
"TargetDir" = $TargetDir
|
||||
"TargetFileName" = $TargetFileName
|
||||
"ConfigurationName" = $ConfigurationName
|
||||
"CertificatePath" = $CertificatePath
|
||||
"ExcludeFromSigning" = $ExcludeFromSigning
|
||||
}
|
||||
|
||||
# Move dlls resurses into folder
|
||||
#Remove-Item -Path "$TargetDir\libs" -Recurse -ErrorAction Ignore
|
||||
#New-Item -ItemType "directory" -Force -Path $TargetDir -Name "libs"
|
||||
#Move-Item -Path "$TargetDir\*.dll" -Destination "$TargetDir\libs" -force
|
||||
|
||||
|
||||
###
|
||||
|
||||
# Move lang resurses into folder
|
||||
#Remove-Item -Path "$TargetDir\languages" -Recurse -ErrorAction Ignore
|
||||
#New-Item -ItemType "directory" -Force -Path $TargetDir -Name "languages"
|
||||
#"cs-CZ,de,el,en-US,es-AR,es,fr,hu,it,lt,ja-JP,ko-KR,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW,fi-FI".Split(",") | ForEach {
|
||||
# Move-Item -Path "$TargetDir\$_" -Destination "$TargetDir\languages" -force
|
||||
# }
|
||||
###
|
||||
|
||||
& "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
|
||||
& "$PSScriptRoot\verify_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
|
||||
& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName
|
||||
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
|
||||
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
|
||||
& "$PSScriptRoot\zip_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName
|
||||
25
Tools/publish_draft_github_release.ps1
Normal file
25
Tools/publish_draft_github_release.ps1
Normal file
@@ -0,0 +1,25 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Owner,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Repository,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$ReleaseId,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# The OAuth2 token to use for authentication.
|
||||
$AuthToken
|
||||
)
|
||||
|
||||
. "$PSScriptRoot\github_functions.ps1"
|
||||
|
||||
Edit-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseId $ReleaseId -AuthToken $AuthToken -IsDraft $false
|
||||
81
Tools/publish_to_github.ps1
Normal file
81
Tools/publish_to_github.ps1
Normal file
@@ -0,0 +1,81 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Owner,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Repository,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$ReleaseTitle,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$TagName,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# Either the SHA of the commit to target or the branch name.
|
||||
$TargetCommitish,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
#
|
||||
$Description,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
[ValidateSet("true","false")]
|
||||
# true/false
|
||||
$IsDraft,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
[ValidateSet("true","false")]
|
||||
# true/false
|
||||
$IsPrerelease,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# Path to the folder which contains release assets to upload
|
||||
$ReleaseFolderPath,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# The OAuth2 token to use for authentication.
|
||||
$AuthToken,
|
||||
|
||||
[switch]
|
||||
# Enable this switch to treat $Description as a Base64 encoded string. It will be decoded before being used elsewhere in the script.
|
||||
$DescriptionIsBase64Encoded
|
||||
)
|
||||
|
||||
|
||||
if ($DescriptionIsBase64Encoded) {
|
||||
$Description = ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Description)))
|
||||
}
|
||||
|
||||
|
||||
. "$PSScriptRoot\github_functions.ps1"
|
||||
|
||||
|
||||
$releaseFolderItems = Get-ChildItem -Path $ReleaseFolderPath
|
||||
$mrngPortablePath = ($releaseFolderItems | ?{$_.Name -match "portable-[\d\.]+\.zip"}).FullName
|
||||
$mrngNormalPath = ($releaseFolderItems | ?{$_.Name -match "installer-[\d\.]+\.msi"}).FullName
|
||||
$mrngPortableSymbolsPath = ($releaseFolderItems | ?{$_.Name -match "mremoteng-portable-symbols-[\d\.]+\.zip"}).FullName
|
||||
$mrngNormalSymbolsPath = ($releaseFolderItems | ?{$_.Name -match "mremoteng-symbols-[\d\.]+\.zip"}).FullName
|
||||
|
||||
|
||||
$release = Publish-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft ([bool]::Parse($IsDraft)) -IsPrerelease ([bool]::Parse($IsPrerelease)) -AuthToken $AuthToken
|
||||
$zipUpload = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngPortablePath -ContentType "application/zip" -AuthToken $AuthToken -Label "Portable Edition (zip)"
|
||||
$msiUpload = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngNormalPath -ContentType "application/octet-stream" -AuthToken $AuthToken -Label "Normal Edition (msi)"
|
||||
|
||||
$portableEditionSymbols = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngPortableSymbolsPath -ContentType "application/zip" -AuthToken $AuthToken -Label "Portable Edition Debug Symbols"
|
||||
$normalEditionSymbols = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngNormalSymbolsPath -ContentType "application/zip" -AuthToken $AuthToken -Label "Normal Edition Debug Symbols"
|
||||
Write-Output (Get-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseId $release.id -AuthToken $AuthToken)
|
||||
13
Tools/rename_and_copy_installer.ps1
Normal file
13
Tools/rename_and_copy_installer.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
param (
|
||||
[string]
|
||||
$SolutionDir
|
||||
)
|
||||
|
||||
|
||||
$targetVersionedFile = "$SolutionDir\mRemoteNG\bin\x64\Release\mRemoteNG.exe"
|
||||
$version = &"$SolutionDir\Tools\exes\sigcheck.exe" /accepteula -q -n $targetVersionedFile
|
||||
$src = $SolutionDir + "mRemoteNGInstaller\Installer\bin\Release\en-US\mRemoteNG-Installer.msi"
|
||||
$dst = $SolutionDir + "Release\mRemoteNG-Installer-" + $version + ".msi"
|
||||
|
||||
# Copy file
|
||||
Copy-Item $src -Destination $dst -Force
|
||||
22
Tools/set_LargeAddressAware.ps1
Normal file
22
Tools/set_LargeAddressAware.ps1
Normal file
@@ -0,0 +1,22 @@
|
||||
[CmdletBinding()]
|
||||
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetFileName
|
||||
)
|
||||
|
||||
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
|
||||
|
||||
$path_editBin = Join-Path -Path $PSScriptRoot -ChildPath "exes\editbin.exe"
|
||||
$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName
|
||||
|
||||
# Set LargeAddressAware
|
||||
Write-Output "Setting LargeAddressAware on binary file:`n`"$path_outputExe`" `nwith:`n`"$path_editBin`""
|
||||
& "$path_editBin" /largeaddressaware "$path_outputExe"
|
||||
|
||||
Write-Output ""
|
||||
88
Tools/sign_binaries.ps1
Normal file
88
Tools/sign_binaries.ps1
Normal file
@@ -0,0 +1,88 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ConfigurationName,
|
||||
|
||||
[string[]]
|
||||
# File names to exclude from signing
|
||||
$Exclude,
|
||||
|
||||
[string]
|
||||
[AllowEmptyString()]
|
||||
# The code signing certificate to use when signing the files.
|
||||
$CertificatePath,
|
||||
|
||||
[string]
|
||||
# Password to unlock the code signing certificate.
|
||||
$CertificatePassword,
|
||||
|
||||
[string]
|
||||
$SolutionDir
|
||||
)
|
||||
|
||||
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
|
||||
|
||||
|
||||
$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll"
|
||||
|
||||
|
||||
# validate release versions and if the certificate value was passed
|
||||
if ($ConfigurationName -match "Release" -And ($CertificatePath)) {
|
||||
|
||||
if(-Not ([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) ) {
|
||||
$CertificatePath = Join-Path -Path $SolutionDir -ChildPath $CertificatePath
|
||||
}
|
||||
|
||||
# make sure the cert is actually available
|
||||
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf))
|
||||
{
|
||||
Write-Output "Certificate is not present - we won't sign files."
|
||||
return
|
||||
}
|
||||
|
||||
if ($CertificatePassword -eq "") {
|
||||
Write-Output "No certificate password was provided - we won't sign files."
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
$certKeyStore = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet
|
||||
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword, $certKeyStore) -ErrorAction Stop
|
||||
} catch {
|
||||
Write-Output "Error loading certificate file - we won't sign files."
|
||||
Write-Output $Error[0]
|
||||
return
|
||||
}
|
||||
|
||||
# Sign MSI if we are building a release version and the certificate is available
|
||||
Write-Output "Signing Binaries"
|
||||
Write-Output "Getting files from path: $TargetDir"
|
||||
$signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name}
|
||||
|
||||
$excluded_files = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -contains $_.Name}
|
||||
$excluded_files | ForEach-Object `
|
||||
-Begin { Write-Output "The following files were excluded from signing due to being on the exclusion list:" } `
|
||||
-Process { Write-Output "-- $($_.FullName)" }
|
||||
|
||||
Write-Output "Signable files count: $($signableFiles.Count)"
|
||||
|
||||
|
||||
foreach ($file in $signableFiles) {
|
||||
Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName
|
||||
}
|
||||
|
||||
|
||||
# Release certificate
|
||||
if ($cert -ne $null) {
|
||||
$cert.Dispose()
|
||||
}
|
||||
} else {
|
||||
Write-Output "This is not a release build or CertificatePath wasn't provided - we won't sign files."
|
||||
Write-Output "Config: $($ConfigurationName)`tCertPath: $($CertificatePath)"
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
31
Tools/signfiles.ps1
Normal file
31
Tools/signfiles.ps1
Normal file
@@ -0,0 +1,31 @@
|
||||
param(
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
# Folder path that contains the files you would like to sign. Recursive.
|
||||
$PathToSignableFiles,
|
||||
|
||||
[string]
|
||||
# The code signing certificate to use when signing the files.
|
||||
$CertificatePath = "C:\mRemoteNG_code_signing_cert.pfx",
|
||||
|
||||
[SecureString]
|
||||
# Password to unlock the code signing certificate.
|
||||
$CertificatePassword = (Get-Credential -Message "Enter password for the mRemoteNG code signing certificate" -UserName "USERNAME NOT NEEDED").Password,
|
||||
|
||||
[string[]]
|
||||
# File names to exclude from signing
|
||||
$Exclude
|
||||
)
|
||||
|
||||
|
||||
$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll"
|
||||
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword)
|
||||
|
||||
|
||||
Write-Output "Getting files from path: $PathToSignableFiles"
|
||||
$signableFiles = Get-ChildItem -Path $PathToSignableFiles -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name}
|
||||
Write-Output "Signable files count: $($signableFiles.Count)"
|
||||
|
||||
foreach ($file in $signableFiles) {
|
||||
Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName
|
||||
}
|
||||
47
Tools/tidy_files_for_release.ps1
Normal file
47
Tools/tidy_files_for_release.ps1
Normal file
@@ -0,0 +1,47 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ConfigurationName
|
||||
)
|
||||
Write-Output ""
|
||||
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
|
||||
|
||||
# Remove unnecessary files from Release versions
|
||||
if ($ConfigurationName -match "Release")
|
||||
{
|
||||
$test = Join-Path -Path $TargetDir -ChildPath "app.publish"
|
||||
if (Test-Path $test -PathType Container)
|
||||
{
|
||||
Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force
|
||||
}
|
||||
|
||||
$filesToDelete = Get-ChildItem -Path $TargetDir -Recurse -Include @(
|
||||
"*.publish",
|
||||
"*.xml",
|
||||
"*.backup",
|
||||
"*.log",
|
||||
"*vshost*",
|
||||
"*.tmp"
|
||||
) -Exclude @(
|
||||
"mRemoteNG.VisualElementsManifest.xml"
|
||||
)
|
||||
if ($filesToDelete)
|
||||
{
|
||||
Write-Output "Unnecessary files are detected and will be removed"
|
||||
Remove-Item -Path $filesToDelete.FullName
|
||||
Write-Output $filesToDelete.FullName
|
||||
} else
|
||||
{
|
||||
Write-Output " No unnecessary files are detected"
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Output "We will not remove anything - this is not a release build."
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
17
Tools/validate_microsoft_tool.ps1
Normal file
17
Tools/validate_microsoft_tool.ps1
Normal file
@@ -0,0 +1,17 @@
|
||||
# $FullPath Full path to the Microsoft executable to validate
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$FullPath
|
||||
)
|
||||
|
||||
$validMSCertThumbprints = @("3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC", "108E2BA23632620C427C570B6D9DB51AC31387FE", "98ED99A67886D020C564923B7DF25E9AC019DF26", "5EAD300DC7E4D637948ECB0ED829A072BD152E17")
|
||||
$exeSignature = Get-AuthenticodeSignature -FilePath $FullPath
|
||||
$baseErrorMsg = "Could not validate the certificate of $FullPath. "
|
||||
|
||||
if ($exeSignature.Status -ne "Valid") {
|
||||
Write-Error -Message ($baseErrorMsg+"The signature was invalid.") -ErrorAction Stop
|
||||
}
|
||||
elseif ($validMSCertThumbprints -notcontains $exeSignature.SignerCertificate.Thumbprint) {
|
||||
Write-Error -Message ($baseErrorMsg+"The certificate thumbprint ($($exeSignature.SignerCertificate.Thumbprint)) is not trusted.") -ErrorAction Stop
|
||||
}
|
||||
30
Tools/verify_LargeAddressAware.ps1
Normal file
30
Tools/verify_LargeAddressAware.ps1
Normal file
@@ -0,0 +1,30 @@
|
||||
[CmdletBinding()]
|
||||
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetFileName
|
||||
)
|
||||
|
||||
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
|
||||
|
||||
$path_dumpBin = Join-Path -Path $PSScriptRoot -ChildPath "exes\dumpbin.exe"
|
||||
$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName
|
||||
|
||||
# Dump exe header
|
||||
$output = & "$path_dumpBin" /NOLOGO /HEADERS "$path_outputExe" | Select-String large
|
||||
|
||||
if ($output -eq $null)
|
||||
{
|
||||
Write-Warning "Could not validate LargeAddressAware"
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Output $output.ToString().TrimStart(" ")
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
60
Tools/verify_binary_signatures.ps1
Normal file
60
Tools/verify_binary_signatures.ps1
Normal file
@@ -0,0 +1,60 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ConfigurationName,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
[AllowEmptyString()]
|
||||
# The code signing certificate to use when signing the files.
|
||||
$CertificatePath,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$SolutionDir
|
||||
)
|
||||
|
||||
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
|
||||
|
||||
|
||||
# validate release versions and if the certificate value was passed
|
||||
if ($ConfigurationName -match "Release" -And ($CertificatePath)) {
|
||||
|
||||
if(-Not ([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) ) {
|
||||
$CertificatePath = Join-Path -Path $SolutionDir -ChildPath $CertificatePath
|
||||
}
|
||||
|
||||
# make sure the cert is actually available
|
||||
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf))
|
||||
{
|
||||
Write-Output "Certificate is not present - files likely not signed - we won't verify file signatures."
|
||||
return
|
||||
}
|
||||
|
||||
Write-Output "Verifying signature of binaries"
|
||||
Write-Output "Getting files from path: $TargetDir"
|
||||
$signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"}
|
||||
Write-Output "Signable files count: $($signableFiles.Count)"
|
||||
$badSignatureFound = $false
|
||||
foreach ($file in $signableFiles) {
|
||||
$signature = Get-AuthenticodeSignature -FilePath $file.FullName
|
||||
if ($signature.Status -ne "Valid") {
|
||||
Write-Warning "File $($file.FullName) does not have a valid signature."
|
||||
$badSignatureFound = $true
|
||||
}
|
||||
}
|
||||
if ($badSignatureFound) {
|
||||
Write-Output "One or more files were improperly signed."
|
||||
} else {
|
||||
Write-Output "All files have valid signatures."
|
||||
}
|
||||
} else {
|
||||
Write-Output "This is not a release build or CertificatePath wasn't provided - we won't verify file signatures."
|
||||
Write-Output "Config: $($ConfigurationName)`tCertPath: $($CertificatePath)"
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
83
Tools/zip_files.ps1
Normal file
83
Tools/zip_files.ps1
Normal file
@@ -0,0 +1,83 @@
|
||||
param (
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$SolutionDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$TargetDir,
|
||||
|
||||
[string]
|
||||
[Parameter(Mandatory=$true)]
|
||||
$ConfigurationName
|
||||
)
|
||||
|
||||
Write-Output ""
|
||||
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
|
||||
|
||||
$ConfigurationName = $ConfigurationName.Trim()
|
||||
Write-Output "Config Name (trimmed): '$($ConfigurationName)'"
|
||||
$exe = Join-Path -Path $TargetDir -ChildPath $TargetFileName
|
||||
$Version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($exe).FileVersion
|
||||
Write-Output "Version is $($version)"
|
||||
|
||||
# Fix for AppVeyor
|
||||
if(!([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER))) {
|
||||
if(!(test-path "Release")) {
|
||||
New-Item -ItemType Directory -Force -Path "Release" | Out-Null
|
||||
}
|
||||
}
|
||||
|
||||
# Package debug symbols zip file
|
||||
if ($ConfigurationName -match "Release") {
|
||||
Write-Output "Packaging debug symbols"
|
||||
|
||||
if ($ConfigurationName -match "Portable") {
|
||||
$zipFilePrefix = "mRemoteNG-Portable-symbols"
|
||||
} else {
|
||||
$zipFilePrefix = "mRemoteNG-symbols"
|
||||
}
|
||||
|
||||
$debugFile = Join-Path -Path $TargetDir -ChildPath "mRemoteNG.pdb"
|
||||
|
||||
# AppVeyor build
|
||||
if(!([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER))) {
|
||||
$outputZipPath = Join-Path -Path $SolutionDir -ChildPath "Release\$zipFilePrefix-$($version).zip"
|
||||
7z a $outputZipPath $debugFile
|
||||
}
|
||||
# Local build
|
||||
else {
|
||||
if (!(Test-Path -Path $debugFile -PathType Leaf))
|
||||
{
|
||||
$outputZipPath = "$($SolutionDir)Release\$zipFilePrefix-$($version).zip"
|
||||
Compress-Archive $debugFile $outputZipPath -Force
|
||||
} else {
|
||||
write-host "File do not exist:" $debugFile", nothing to compress"
|
||||
}
|
||||
}
|
||||
|
||||
Remove-Item $debugFile
|
||||
}
|
||||
|
||||
# Package portable release zip file
|
||||
if ($ConfigurationName -eq "Release Portable") {
|
||||
Write-Output "Packaging portable ZIP file"
|
||||
|
||||
# AppVeyor build
|
||||
if(!([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER))) {
|
||||
$outputZipPath = Join-Path -Path $SolutionDir -ChildPath "Release\mRemoteNG-Portable-$($version).zip"
|
||||
7z a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath $TargetDir\*
|
||||
}
|
||||
# Local build
|
||||
else {
|
||||
if ($Source)
|
||||
{
|
||||
$outputZipPath="$($SolutionDir)\Release\mRemoteNG-Portable-$($version).zip"
|
||||
Compress-Archive $Source $outputZipPath -Force
|
||||
} else {
|
||||
write-host "File do not exist:" $Source", nothing to compress"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
@@ -1,50 +0,0 @@
|
||||
@echo off
|
||||
|
||||
set ZIP_FILE="%~dp0\..\mremoteng.zip"
|
||||
set TEMP_FOLDER="%TEMP%\Translations.tmp"
|
||||
set SORTRESX="%~dp0\Tools\SortRESX.exe"
|
||||
set RAR="%ProgramFiles%\WinRAR\WinRAR.exe"
|
||||
|
||||
call :expand %ZIP_FILE%
|
||||
goto :skip
|
||||
:expand
|
||||
set ZIP_FILE="%~f1"
|
||||
exit /b
|
||||
:skip
|
||||
|
||||
echo.
|
||||
echo This script updates the language files with new translations from Crowdin
|
||||
echo.
|
||||
echo Download the latest translation file from Crowdin and place it here:
|
||||
echo.
|
||||
echo %ZIP_FILE%
|
||||
echo.
|
||||
|
||||
choice /m "Would you like to continue?"
|
||||
|
||||
echo.
|
||||
|
||||
mkdir %TEMP_FOLDER%
|
||||
%RAR% x -o+ %ZIP_FILE% *.* %TEMP_FOLDER%
|
||||
|
||||
%SORTRESX% %TEMP_FOLDER%\ar\Language.ar.resx "%~dp0\mRemoteV1\Language\Language.ar.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\de\Language.de.resx "%~dp0\mRemoteV1\Language\Language.de.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\en-US\Language.en.resx "%~dp0\mRemoteV1\Language\Language.en-US.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\es-AR\Language.es.resx "%~dp0\mRemoteV1\Language\Language.es-AR.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\es-ES\Language.es.resx "%~dp0\mRemoteV1\Language\Language.es.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\fr\Language.fr.resx "%~dp0\mRemoteV1\Language\Language.fr.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\hu\Language.hu.resx "%~dp0\mRemoteV1\Language\Language.hu.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\it\Language.it.resx "%~dp0\mRemoteV1\Language\Language.it.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\nl\Language.nl.resx "%~dp0\mRemoteV1\Language\Language.nl.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\pl\Language.pl.resx "%~dp0\mRemoteV1\Language\Language.pl.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\pt-BR\Language.pt.resx "%~dp0\mRemoteV1\Language\Language.pt-BR.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\pt-PT\Language.pt.resx "%~dp0\mRemoteV1\Language\Language.pt.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\ru\Language.ru.resx "%~dp0\mRemoteV1\Language\Language.ru.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\uk\Language.uk.resx "%~dp0\mRemoteV1\Language\Language.uk.resx"
|
||||
%SORTRESX% %TEMP_FOLDER%\zh-CN\Language.zh.resx "%~dp0\mRemoteV1\Language\Language.zh-CN.resx"
|
||||
|
||||
rmdir /s /q %TEMP_FOLDER%
|
||||
|
||||
echo Done.
|
||||
echo.
|
||||
pause
|
||||
87
mRemoteNG.sln
Normal file
87
mRemoteNG.sln
Normal file
@@ -0,0 +1,87 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31912.275
|
||||
MinimumVisualStudioVersion = 14.0.25420.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNG", "mRemoteNG\mRemoteNG.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNGTests", "mRemoteNGTests\mRemoteNGTests.csproj", "{1453B37F-8621-499E-B0B2-6091F76DC0BB}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mRemoteNGInstaller", "mRemoteNGInstaller", "{4FE795BE-646E-4F1B-BAD0-A68EA26394DD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomActions", "mRemoteNGInstaller\CustomActions\CustomActions.csproj", "{5423D985-CB48-4344-B47F-E8C6D60C8B04}"
|
||||
EndProject
|
||||
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "mRemoteNGInstaller\Installer\Installer.wixproj", "{F0168B9F-6815-40DF-BA53-46CEE7683B68}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04} = {5423D985-CB48-4344-B47F-E8C6D60C8B04}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNGSpecs", "mRemoteNGSpecs\mRemoteNGSpecs.csproj", "{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExternalConnectors", "ExternalConnectors\ExternalConnectors.csproj", "{A56A2029-79B8-492A-ABE5-D2BFE05801BD}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug Portable|x64 = Debug Portable|x64
|
||||
Debug|x64 = Debug|x64
|
||||
Release Installer|x64 = Release Installer|x64
|
||||
Release Portable|x64 = Release Portable|x64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x64.Build.0 = Debug Portable|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x64.Build.0 = Debug|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x64.ActiveCfg = Release|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x64.Build.0 = Release|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x64.ActiveCfg = Release Portable|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x64.Build.0 = Release Portable|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.ActiveCfg = Release|x64
|
||||
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.Build.0 = Release|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x64.ActiveCfg = Release|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x64.ActiveCfg = Release Portable|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x64.Build.0 = Release Portable|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x64.ActiveCfg = Release|x64
|
||||
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x64.Build.0 = Release|x64
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x64.ActiveCfg = Release|x64
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x64.Build.0 = Release|x64
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x64.ActiveCfg = Release Portable|x64
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x64.ActiveCfg = Release|x64
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x64.ActiveCfg = Release|x64
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x64.Build.0 = Release|x64
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|x64.ActiveCfg = Release Portable|x64
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|x64.ActiveCfg = Release|x64
|
||||
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
|
||||
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x64.ActiveCfg = Release|x64
|
||||
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x64.ActiveCfg = Release Portable|x64
|
||||
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x64.ActiveCfg = Release|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug Portable|x64.Build.0 = Debug Portable|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|x64.Build.0 = Debug|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer|x64.ActiveCfg = Release|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer|x64.Build.0 = Release|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Portable|x64.ActiveCfg = Release Portable|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Portable|x64.Build.0 = Release Portable|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.ActiveCfg = Release|x64
|
||||
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{5423D985-CB48-4344-B47F-E8C6D60C8B04} = {4FE795BE-646E-4F1B-BAD0-A68EA26394DD}
|
||||
{F0168B9F-6815-40DF-BA53-46CEE7683B68} = {4FE795BE-646E-4F1B-BAD0-A68EA26394DD}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {5D390A0C-2FC4-4908-B86E-7E4DEF5916EC}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
53
mRemoteNG/.editorconfig
Normal file
53
mRemoteNG/.editorconfig
Normal file
@@ -0,0 +1,53 @@
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = crlf
|
||||
indent_style = space
|
||||
|
||||
[*.xml]
|
||||
indent_size = 4
|
||||
|
||||
[*.cs]
|
||||
indent_size = 4
|
||||
trim_trailing_whitespace = true
|
||||
charset = utf-8-bom
|
||||
|
||||
# reStructuredText
|
||||
[*.rst]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
indent_size = 3
|
||||
max_line_length = 120
|
||||
|
||||
# Organize usings
|
||||
dotnet_sort_system_directives_first = true
|
||||
|
||||
# this. preferences
|
||||
dotnet_style_qualification_for_field = false:none
|
||||
dotnet_style_qualification_for_property = false:none
|
||||
dotnet_style_qualification_for_method = false:none
|
||||
dotnet_style_qualification_for_event = false:none
|
||||
|
||||
# New line preferences
|
||||
csharp_new_line_before_open_brace = all
|
||||
csharp_new_line_before_else = true
|
||||
csharp_new_line_before_catch = true
|
||||
csharp_new_line_before_finally = true
|
||||
csharp_new_line_before_members_in_object_initializers = true
|
||||
csharp_new_line_before_members_in_anonymous_types = true
|
||||
csharp_new_line_between_query_expression_clauses = true
|
||||
|
||||
# Space preferences
|
||||
csharp_space_after_cast = false
|
||||
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||
csharp_space_between_parentheses = false
|
||||
csharp_space_before_colon_in_inheritance_clause = true
|
||||
csharp_space_after_colon_in_inheritance_clause = true
|
||||
csharp_space_around_binary_operators = before_and_after
|
||||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||
111
mRemoteNG/App/CompatibilityChecker.cs
Normal file
111
mRemoteNG/App/CompatibilityChecker.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using Microsoft.Win32;
|
||||
using mRemoteNG.App.Info;
|
||||
using mRemoteNG.Messages;
|
||||
using mRemoteNG.Properties;
|
||||
using mRemoteNG.UI.Forms;
|
||||
using mRemoteNG.UI.TaskDialog;
|
||||
using mRemoteNG.Resources.Language;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class CompatibilityChecker
|
||||
{
|
||||
public static void CheckCompatibility(MessageCollector messageCollector)
|
||||
{
|
||||
CheckFipsPolicy(messageCollector);
|
||||
CheckLenovoAutoScrollUtility(messageCollector);
|
||||
}
|
||||
|
||||
private static void CheckFipsPolicy(MessageCollector messageCollector)
|
||||
{
|
||||
if (Settings.Default.OverrideFIPSCheck)
|
||||
{
|
||||
messageCollector.AddMessage(MessageClass.InformationMsg, "OverrideFIPSCheck is set. Will skip check", true);
|
||||
return;
|
||||
}
|
||||
|
||||
messageCollector.AddMessage(MessageClass.InformationMsg, "Checking FIPS policy...", true);
|
||||
messageCollector.AddMessage(MessageClass.InformationMsg, $"FIPS2003: {FipsPolicyEnabledForServer2003()}", true);
|
||||
messageCollector.AddMessage(MessageClass.InformationMsg, $"FIPS2008+: {FipsPolicyEnabledForServer2008AndNewer()}", true);
|
||||
|
||||
if (!FipsPolicyEnabledForServer2003() && !FipsPolicyEnabledForServer2008AndNewer()) return;
|
||||
|
||||
var errorText = string.Format(Language.ErrorFipsPolicyIncompatible, GeneralAppInfo.ProductName);
|
||||
messageCollector.AddMessage(MessageClass.ErrorMsg, errorText, true);
|
||||
|
||||
//About to pop up a message, let's not block it...
|
||||
FrmSplashScreen.getInstance().Close();
|
||||
|
||||
var ShouldIStayOrShouldIGo = CTaskDialog.MessageBox(Application.ProductName,
|
||||
Language.CompatibilityProblemDetected, errorText, "",
|
||||
"",
|
||||
Language.CheckboxDoNotShowThisMessageAgain,
|
||||
ETaskDialogButtons.OkCancel, ESysIcons.Warning,
|
||||
ESysIcons.Warning);
|
||||
if (CTaskDialog.VerificationChecked && ShouldIStayOrShouldIGo == DialogResult.OK)
|
||||
{
|
||||
messageCollector.AddMessage(MessageClass.ErrorMsg, "User requests that FIPS check be overridden", true);
|
||||
Settings.Default.OverrideFIPSCheck = true;
|
||||
Settings.Default.Save();
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldIStayOrShouldIGo == DialogResult.Cancel)
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
private static bool FipsPolicyEnabledForServer2003()
|
||||
{
|
||||
var regKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Lsa");
|
||||
if (!(regKey?.GetValue("FIPSAlgorithmPolicy") is int fipsPolicy))
|
||||
return false;
|
||||
return fipsPolicy != 0;
|
||||
}
|
||||
|
||||
private static bool FipsPolicyEnabledForServer2008AndNewer()
|
||||
{
|
||||
var regKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy");
|
||||
if (!(regKey?.GetValue("Enabled") is int fipsPolicy))
|
||||
return false;
|
||||
return fipsPolicy != 0;
|
||||
}
|
||||
|
||||
private static void CheckLenovoAutoScrollUtility(MessageCollector messageCollector)
|
||||
{
|
||||
messageCollector.AddMessage(MessageClass.InformationMsg, "Checking Lenovo AutoScroll Utility...", true);
|
||||
|
||||
if (!Settings.Default.CompatibilityWarnLenovoAutoScrollUtility)
|
||||
return;
|
||||
|
||||
var proccesses = new Process[] { };
|
||||
try
|
||||
{
|
||||
proccesses = Process.GetProcessesByName("virtscrl");
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
messageCollector.AddExceptionMessage("Error in CheckLenovoAutoScrollUtility", ex);
|
||||
}
|
||||
|
||||
if (proccesses.Length <= 0)
|
||||
{
|
||||
messageCollector.AddMessage(MessageClass.InformationMsg, "Lenovo AutoScroll Utility not found", true);
|
||||
return;
|
||||
}
|
||||
|
||||
messageCollector.AddMessage(MessageClass.WarningMsg, "Lenovo AutoScroll Utility found", true);
|
||||
|
||||
CTaskDialog.MessageBox(Application.ProductName, Language.CompatibilityProblemDetected,
|
||||
string.Format(Language.CompatibilityLenovoAutoScrollUtilityDetected,
|
||||
Application.ProductName), "",
|
||||
"", Language.CheckboxDoNotShowThisMessageAgain, ETaskDialogButtons.Ok,
|
||||
ESysIcons.Warning,
|
||||
ESysIcons.Warning);
|
||||
if (CTaskDialog.VerificationChecked)
|
||||
Settings.Default.CompatibilityWarnLenovoAutoScrollUtility = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
117
mRemoteNG/App/Export.cs
Normal file
117
mRemoteNG/App/Export.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Config.Connections;
|
||||
using mRemoteNG.Config.DataProviders;
|
||||
using mRemoteNG.Config.Serializers;
|
||||
using mRemoteNG.Config.Serializers.ConnectionSerializers.Csv;
|
||||
using mRemoteNG.Config.Serializers.ConnectionSerializers.Xml;
|
||||
using mRemoteNG.Connection;
|
||||
using mRemoteNG.Container;
|
||||
using mRemoteNG.Security;
|
||||
using mRemoteNG.Security.Factories;
|
||||
using mRemoteNG.Tree;
|
||||
using mRemoteNG.Tree.Root;
|
||||
using mRemoteNG.UI.Forms;
|
||||
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class Export
|
||||
{
|
||||
public static void ExportToFile(ConnectionInfo selectedNode, ConnectionTreeModel connectionTreeModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
var saveFilter = new SaveFilter();
|
||||
|
||||
using (var exportForm = new FrmExport())
|
||||
{
|
||||
if (selectedNode?.GetTreeNodeType() == TreeNodeType.Container)
|
||||
exportForm.SelectedFolder = selectedNode as ContainerInfo;
|
||||
else if (selectedNode?.GetTreeNodeType() == TreeNodeType.Connection)
|
||||
{
|
||||
if (selectedNode.Parent.GetTreeNodeType() == TreeNodeType.Container)
|
||||
exportForm.SelectedFolder = selectedNode.Parent;
|
||||
exportForm.SelectedConnection = selectedNode;
|
||||
}
|
||||
|
||||
if (exportForm.ShowDialog(FrmMain.Default) != DialogResult.OK)
|
||||
return;
|
||||
|
||||
ConnectionInfo exportTarget;
|
||||
switch (exportForm.Scope)
|
||||
{
|
||||
case FrmExport.ExportScope.SelectedFolder:
|
||||
exportTarget = exportForm.SelectedFolder;
|
||||
break;
|
||||
case FrmExport.ExportScope.SelectedConnection:
|
||||
exportTarget = exportForm.SelectedConnection;
|
||||
break;
|
||||
default:
|
||||
exportTarget = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo);
|
||||
break;
|
||||
}
|
||||
|
||||
saveFilter.SaveUsername = exportForm.IncludeUsername;
|
||||
saveFilter.SavePassword = exportForm.IncludePassword;
|
||||
saveFilter.SaveDomain = exportForm.IncludeDomain;
|
||||
saveFilter.SaveInheritance = exportForm.IncludeInheritance;
|
||||
saveFilter.SaveCredentialId = exportForm.IncludeAssignedCredential;
|
||||
|
||||
SaveExportFile(exportForm.FileName, exportForm.SaveFormat, saveFilter, exportTarget);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionMessage("App.Export.ExportToFile() failed.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SaveExportFile(string fileName,
|
||||
SaveFormat saveFormat,
|
||||
SaveFilter saveFilter,
|
||||
ConnectionInfo exportTarget)
|
||||
{
|
||||
try
|
||||
{
|
||||
ISerializer<ConnectionInfo, string> serializer;
|
||||
switch (saveFormat)
|
||||
{
|
||||
case SaveFormat.mRXML:
|
||||
var cryptographyProvider = new CryptoProviderFactoryFromSettings().Build();
|
||||
var rootNode = exportTarget.GetRootParent() as RootNodeInfo;
|
||||
var connectionNodeSerializer = new XmlConnectionNodeSerializer27(
|
||||
cryptographyProvider,
|
||||
rootNode?.PasswordString
|
||||
.ConvertToSecureString() ??
|
||||
new RootNodeInfo(RootNodeType
|
||||
.Connection)
|
||||
.PasswordString
|
||||
.ConvertToSecureString(),
|
||||
saveFilter);
|
||||
serializer = new XmlConnectionsSerializer(cryptographyProvider, connectionNodeSerializer);
|
||||
break;
|
||||
case SaveFormat.mRCSV:
|
||||
serializer =
|
||||
new CsvConnectionsSerializerMremotengFormat(saveFilter, Runtime.CredentialProviderCatalog);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(saveFormat), saveFormat, null);
|
||||
}
|
||||
|
||||
var serializedData = serializer.Serialize(exportTarget);
|
||||
var fileDataProvider = new FileDataProvider(fileName);
|
||||
fileDataProvider.Save(serializedData);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionStackTrace($"Export.SaveExportFile(\"{fileName}\") failed.", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Runtime.ConnectionsService.RemoteConnectionsSyncronizer?.Enable();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
134
mRemoteNG/App/Import.cs
Normal file
134
mRemoteNG/App/Import.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Config.Import;
|
||||
using mRemoteNG.Connection;
|
||||
using mRemoteNG.Connection.Protocol;
|
||||
using mRemoteNG.Container;
|
||||
using mRemoteNG.Tools;
|
||||
using mRemoteNG.Resources.Language;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class Import
|
||||
{
|
||||
public static void ImportFromFile(ContainerInfo importDestinationContainer)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var openFileDialog = new OpenFileDialog())
|
||||
{
|
||||
openFileDialog.CheckFileExists = true;
|
||||
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
|
||||
openFileDialog.Multiselect = true;
|
||||
|
||||
var fileTypes = new List<string>();
|
||||
fileTypes.AddRange(new[] {Language.FilterAllImportable, "*.xml;*.rdp;*.rdg;*.dat;*.csv"});
|
||||
fileTypes.AddRange(new[] {Language.FiltermRemoteXML, "*.xml"});
|
||||
fileTypes.AddRange(new[] {Language.FiltermRemoteCSV, "*.csv"});
|
||||
fileTypes.AddRange(new[] {Language.FilterRDP, "*.rdp"});
|
||||
fileTypes.AddRange(new[] {Language.FilterRdgFiles, "*.rdg"});
|
||||
fileTypes.AddRange(new[] {Language.FilterPuttyConnectionManager, "*.dat"});
|
||||
fileTypes.AddRange(new[] {Language.FilterAll, "*.*"});
|
||||
|
||||
openFileDialog.Filter = string.Join("|", fileTypes.ToArray());
|
||||
|
||||
if (openFileDialog.ShowDialog() != DialogResult.OK)
|
||||
return;
|
||||
|
||||
HeadlessFileImport(
|
||||
openFileDialog.FileNames,
|
||||
importDestinationContainer,
|
||||
Runtime.ConnectionsService,
|
||||
fileName => MessageBox.Show(string.Format(Language.ImportFileFailedContent, fileName), Language.AskUpdatesMainInstruction,
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionMessage("Unable to import file.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static void HeadlessFileImport(
|
||||
IEnumerable<string> filePaths,
|
||||
ContainerInfo importDestinationContainer,
|
||||
ConnectionsService connectionsService,
|
||||
Action<string> exceptionAction = null)
|
||||
{
|
||||
using (connectionsService.BatchedSavingContext())
|
||||
{
|
||||
foreach (var fileName in filePaths)
|
||||
{
|
||||
try
|
||||
{
|
||||
var importer = BuildConnectionImporterFromFileExtension(fileName);
|
||||
importer.Import(fileName, importDestinationContainer);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
exceptionAction?.Invoke(fileName);
|
||||
Runtime.MessageCollector.AddExceptionMessage($"Error occurred while importing file '{fileName}'.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ImportFromActiveDirectory(string ldapPath,
|
||||
ContainerInfo importDestinationContainer,
|
||||
bool importSubOu)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (Runtime.ConnectionsService.BatchedSavingContext())
|
||||
{
|
||||
ActiveDirectoryImporter.Import(ldapPath, importDestinationContainer, importSubOu);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static void ImportFromPortScan(IEnumerable<ScanHost> hosts,
|
||||
ProtocolType protocol,
|
||||
ContainerInfo importDestinationContainer)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (Runtime.ConnectionsService.BatchedSavingContext())
|
||||
{
|
||||
var importer = new PortScanImporter(protocol);
|
||||
importer.Import(hosts, importDestinationContainer);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromPortScan() failed.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static IConnectionImporter<string> BuildConnectionImporterFromFileExtension(string fileName)
|
||||
{
|
||||
// TODO: Use the file contents to determine the file type instead of trusting the extension
|
||||
var extension = Path.GetExtension(fileName) ?? "";
|
||||
switch (extension.ToLowerInvariant())
|
||||
{
|
||||
case ".xml":
|
||||
return new MRemoteNGXmlImporter();
|
||||
case ".csv":
|
||||
return new MRemoteNGCsvImporter();
|
||||
case ".rdp":
|
||||
return new RemoteDesktopConnectionImporter();
|
||||
case ".rdg":
|
||||
return new RemoteDesktopConnectionManagerImporter();
|
||||
case ".dat":
|
||||
return new PuttyConnectionManagerImporter();
|
||||
default:
|
||||
throw new FileFormatException("Unrecognized file format.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
12
mRemoteNG/App/Info/ConnectionsFileInfo.cs
Normal file
12
mRemoteNG/App/Info/ConnectionsFileInfo.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
|
||||
namespace mRemoteNG.App.Info
|
||||
{
|
||||
public static class ConnectionsFileInfo
|
||||
{
|
||||
public static readonly string DefaultConnectionsPath = SettingsFileInfo.SettingsPath;
|
||||
public static readonly string DefaultConnectionsFile = "confCons.xml";
|
||||
public static readonly string DefaultConnectionsFileNew = "confConsNew.xml";
|
||||
public static readonly Version ConnectionFileVersion = new Version(2, 9);
|
||||
}
|
||||
}
|
||||
10
mRemoteNG/App/Info/CredentialsFileInfo.cs
Normal file
10
mRemoteNG/App/Info/CredentialsFileInfo.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace mRemoteNG.App.Info
|
||||
{
|
||||
public class CredentialsFileInfo
|
||||
{
|
||||
public static readonly string CredentialsPath = SettingsFileInfo.SettingsPath;
|
||||
public static readonly string CredentialsFile = "confCreds.xml";
|
||||
public static readonly string CredentialsFileNew = "confCredsNew.xml";
|
||||
public static readonly double CredentialsFileVersion = 1.0;
|
||||
}
|
||||
}
|
||||
62
mRemoteNG/App/Info/GeneralAppInfo.cs
Normal file
62
mRemoteNG/App/Info/GeneralAppInfo.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using static System.Environment;
|
||||
|
||||
|
||||
namespace mRemoteNG.App.Info
|
||||
{
|
||||
public static class GeneralAppInfo
|
||||
{
|
||||
public const string UrlHome = "https://www.mremoteng.org";
|
||||
public const string UrlDonate = "https://mremoteng.org/contribute";
|
||||
public const string UrlForum = "https://www.reddit.com/r/mRemoteNG";
|
||||
public const string UrlBugs = "https://bugs.mremoteng.org";
|
||||
public const string UrlDocumentation = "https://mremoteng.readthedocs.io/en/latest/";
|
||||
public static string ApplicationVersion = Application.ProductVersion;
|
||||
public static readonly string ProductName = Application.ProductName;
|
||||
|
||||
public static readonly string Copyright =
|
||||
((AssemblyCopyrightAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),
|
||||
typeof(AssemblyCopyrightAttribute), false))
|
||||
.Copyright;
|
||||
|
||||
public static readonly string HomePath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location);
|
||||
|
||||
//public static string ReportingFilePath = "";
|
||||
public static readonly string PuttyPath = HomePath + "\\PuTTYNG.exe";
|
||||
|
||||
public static string UserAgent
|
||||
{
|
||||
get
|
||||
{
|
||||
var details = new List<string>
|
||||
{
|
||||
"compatible",
|
||||
OSVersion.Platform == PlatformID.Win32NT
|
||||
? $"Windows NT {OSVersion.Version.Major}.{OSVersion.Version.Minor}"
|
||||
: OSVersion.VersionString
|
||||
};
|
||||
if (Is64BitProcess)
|
||||
{
|
||||
details.Add("WOW64");
|
||||
}
|
||||
|
||||
details.Add(Thread.CurrentThread.CurrentUICulture.Name);
|
||||
details.Add($".NET CLR {Environment.Version}");
|
||||
var detailsString = string.Join("; ", details.ToArray());
|
||||
|
||||
return $"Mozilla/5.0 ({detailsString}) {ProductName}/{ApplicationVersion}";
|
||||
}
|
||||
}
|
||||
|
||||
public static Version GetApplicationVersion()
|
||||
{
|
||||
System.Version.TryParse(ApplicationVersion, out var v);
|
||||
return v;
|
||||
}
|
||||
}
|
||||
}
|
||||
29
mRemoteNG/App/Info/SettingsFileInfo.cs
Normal file
29
mRemoteNG/App/Info/SettingsFileInfo.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Connection;
|
||||
|
||||
namespace mRemoteNG.App.Info
|
||||
{
|
||||
public static class SettingsFileInfo
|
||||
{
|
||||
private static readonly string ExePath =
|
||||
Path.GetDirectoryName(Assembly.GetAssembly(typeof(ConnectionInfo))?.Location);
|
||||
|
||||
public static string SettingsPath =>
|
||||
Runtime.IsPortableEdition
|
||||
? ExePath
|
||||
: Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\" + Application.ProductName;
|
||||
|
||||
public static string LayoutFileName { get; } = "pnlLayout.xml";
|
||||
public static string ExtAppsFilesName { get; } = "extApps.xml";
|
||||
public static string ThemesFileName { get; } = "Themes.xml";
|
||||
|
||||
public static string ThemeFolder { get; } =
|
||||
SettingsPath != null ? Path.Combine(SettingsPath, "Themes") : String.Empty;
|
||||
|
||||
public static string InstalledThemeFolder { get; } =
|
||||
ExePath != null ? Path.Combine(ExePath, "Themes") : String.Empty;
|
||||
}
|
||||
}
|
||||
77
mRemoteNG/App/Info/UpdateChannelInfo.cs
Normal file
77
mRemoteNG/App/Info/UpdateChannelInfo.cs
Normal file
@@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using mRemoteNG.Properties;
|
||||
|
||||
// ReSharper disable InconsistentNaming
|
||||
|
||||
namespace mRemoteNG.App.Info
|
||||
{
|
||||
public static class UpdateChannelInfo
|
||||
{
|
||||
public const string STABLE = "Stable";
|
||||
public const string PREVIEW = "Preview";
|
||||
public const string NIGHTLY = "Nightly";
|
||||
|
||||
public const string STABLE_PORTABLE = "update-portable.txt";
|
||||
public const string PREVIEW_PORTABLE = "preview-update-portable.txt";
|
||||
public const string NIGHTLY_PORTABLE = "nightly-update-portable.txt";
|
||||
|
||||
public const string STABLE_MSI = "update.txt";
|
||||
public const string PREVIEW_MSI = "preview-update.txt";
|
||||
public const string NIGHTLY_MSI = "nightly-update.txt";
|
||||
|
||||
|
||||
public static Uri GetUpdateChannelInfo()
|
||||
{
|
||||
var channel = IsValidChannel(Settings.Default.UpdateChannel) ? Settings.Default.UpdateChannel : STABLE;
|
||||
return GetUpdateTxtUri(channel);
|
||||
}
|
||||
|
||||
private static string GetChannelFileName(string channel)
|
||||
{
|
||||
return Runtime.IsPortableEdition
|
||||
? GetChannelFileNamePortableEdition(channel)
|
||||
: GetChannelFileNameNormalEdition(channel);
|
||||
}
|
||||
|
||||
private static string GetChannelFileNameNormalEdition(string channel)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case STABLE:
|
||||
return STABLE_MSI;
|
||||
case PREVIEW:
|
||||
return PREVIEW_MSI;
|
||||
case NIGHTLY:
|
||||
return NIGHTLY_MSI;
|
||||
default:
|
||||
return STABLE_MSI;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetChannelFileNamePortableEdition(string channel)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case STABLE:
|
||||
return STABLE_PORTABLE;
|
||||
case PREVIEW:
|
||||
return PREVIEW_PORTABLE;
|
||||
case NIGHTLY:
|
||||
return NIGHTLY_PORTABLE;
|
||||
default:
|
||||
return STABLE_PORTABLE;
|
||||
}
|
||||
}
|
||||
|
||||
private static Uri GetUpdateTxtUri(string channel)
|
||||
{
|
||||
return new Uri(new Uri(Settings.Default.UpdateAddress),
|
||||
new Uri(GetChannelFileName(channel), UriKind.Relative));
|
||||
}
|
||||
|
||||
private static bool IsValidChannel(string s)
|
||||
{
|
||||
return s.Equals(STABLE) || s.Equals(PREVIEW) || s.Equals(NIGHTLY);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
mRemoteNG/App/Initialization/ConnectionIconLoader.cs
Normal file
33
mRemoteNG/App/Initialization/ConnectionIconLoader.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using mRemoteNG.Connection;
|
||||
|
||||
|
||||
namespace mRemoteNG.App.Initialization
|
||||
{
|
||||
public class ConnectionIconLoader
|
||||
{
|
||||
private readonly string _path;
|
||||
|
||||
public ConnectionIconLoader(string folderPath)
|
||||
{
|
||||
if (string.IsNullOrEmpty(folderPath))
|
||||
throw new ArgumentException($"{nameof(folderPath)} must be a valid folder path.");
|
||||
|
||||
_path = folderPath;
|
||||
}
|
||||
|
||||
public void GetConnectionIcons()
|
||||
{
|
||||
if (Directory.Exists(_path) == false)
|
||||
return;
|
||||
|
||||
foreach (var f in Directory.GetFiles(_path, "*.ico", SearchOption.AllDirectories))
|
||||
{
|
||||
var fInfo = new FileInfo(f);
|
||||
Array.Resize(ref ConnectionIcon.Icons, ConnectionIcon.Icons.Length + 1);
|
||||
ConnectionIcon.Icons.SetValue(fInfo.Name.Replace(".ico", ""), ConnectionIcon.Icons.Length - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
21
mRemoteNG/App/Initialization/CredsAndConsSetup.cs
Normal file
21
mRemoteNG/App/Initialization/CredsAndConsSetup.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System.IO;
|
||||
using mRemoteNG.Config.Connections;
|
||||
using mRemoteNG.Properties;
|
||||
|
||||
namespace mRemoteNG.App.Initialization
|
||||
{
|
||||
public class CredsAndConsSetup
|
||||
{
|
||||
public void LoadCredsAndCons()
|
||||
{
|
||||
new SaveConnectionsOnEdit(Runtime.ConnectionsService);
|
||||
|
||||
if (Settings.Default.FirstStart && !Settings.Default.LoadConsFromCustomLocation &&
|
||||
!File.Exists(Runtime.ConnectionsService.GetStartupConnectionFileName()))
|
||||
Runtime.ConnectionsService.NewConnectionsFile(Runtime.ConnectionsService
|
||||
.GetStartupConnectionFileName());
|
||||
|
||||
Runtime.LoadConnections();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
mRemoteNG/App/Initialization/MessageCollectorSetup.cs
Normal file
75
mRemoteNG/App/Initialization/MessageCollectorSetup.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using mRemoteNG.Messages;
|
||||
using mRemoteNG.Messages.MessageFilteringOptions;
|
||||
using mRemoteNG.Messages.MessageWriters;
|
||||
using mRemoteNG.Messages.WriterDecorators;
|
||||
|
||||
namespace mRemoteNG.App.Initialization
|
||||
{
|
||||
public class MessageCollectorSetup
|
||||
{
|
||||
public static void SetupMessageCollector(MessageCollector messageCollector,
|
||||
IList<IMessageWriter> messageWriterList)
|
||||
{
|
||||
messageCollector.CollectionChanged += (o, args) =>
|
||||
{
|
||||
var messages = args.NewItems.Cast<IMessage>().ToArray();
|
||||
foreach (var printer in messageWriterList)
|
||||
foreach (var message in messages)
|
||||
printer.Write(message);
|
||||
};
|
||||
}
|
||||
|
||||
public static void BuildMessageWritersFromSettings(IList<IMessageWriter> messageWriterList)
|
||||
{
|
||||
#if DEBUG
|
||||
messageWriterList.Add(BuildDebugConsoleWriter());
|
||||
#endif
|
||||
messageWriterList.Add(BuildTextLogMessageWriter());
|
||||
messageWriterList.Add(BuildNotificationPanelMessageWriter());
|
||||
messageWriterList.Add(BuildPopupMessageWriter());
|
||||
}
|
||||
|
||||
private static IMessageWriter BuildDebugConsoleWriter()
|
||||
{
|
||||
return new DebugConsoleMessageWriter();
|
||||
}
|
||||
|
||||
private static IMessageWriter BuildTextLogMessageWriter()
|
||||
{
|
||||
return new MessageTypeFilterDecorator(
|
||||
new LogMessageTypeFilteringOptions(),
|
||||
new TextLogMessageWriter(Logger.Instance)
|
||||
);
|
||||
}
|
||||
|
||||
private static IMessageWriter BuildNotificationPanelMessageWriter()
|
||||
{
|
||||
return new OnlyLogMessageFilter(
|
||||
new MessageTypeFilterDecorator(
|
||||
new
|
||||
NotificationPanelMessageFilteringOptions(),
|
||||
new MessageFocusDecorator(
|
||||
Windows.ErrorsForm,
|
||||
new
|
||||
NotificationPanelSwitchOnMessageFilteringOptions(),
|
||||
new
|
||||
NotificationPanelMessageWriter(Windows
|
||||
.ErrorsForm)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private static IMessageWriter BuildPopupMessageWriter()
|
||||
{
|
||||
return new OnlyLogMessageFilter(
|
||||
new MessageTypeFilterDecorator(
|
||||
new PopupMessageFilteringOptions(),
|
||||
new PopupMessageWriter()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
124
mRemoteNG/App/Initialization/StartupDataLogger.cs
Normal file
124
mRemoteNG/App/Initialization/StartupDataLogger.cs
Normal file
@@ -0,0 +1,124 @@
|
||||
using System;
|
||||
using System.Management;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Messages;
|
||||
using mRemoteNG.Resources.Language;
|
||||
|
||||
namespace mRemoteNG.App.Initialization
|
||||
{
|
||||
public class StartupDataLogger
|
||||
{
|
||||
private readonly MessageCollector _messageCollector;
|
||||
|
||||
public StartupDataLogger(MessageCollector messageCollector)
|
||||
{
|
||||
if (messageCollector == null)
|
||||
throw new ArgumentNullException(nameof(messageCollector));
|
||||
|
||||
_messageCollector = messageCollector;
|
||||
}
|
||||
|
||||
public void LogStartupData()
|
||||
{
|
||||
LogApplicationData();
|
||||
LogCmdLineArgs();
|
||||
LogSystemData();
|
||||
LogClrData();
|
||||
LogCultureData();
|
||||
}
|
||||
|
||||
private void LogSystemData()
|
||||
{
|
||||
var osData = GetOperatingSystemData();
|
||||
var architecture = GetArchitectureData();
|
||||
var nonEmptyData = Array.FindAll(new[] {osData, architecture}, s => !string.IsNullOrEmpty(s));
|
||||
var data = string.Join(" ", nonEmptyData);
|
||||
_messageCollector.AddMessage(MessageClass.InformationMsg, data, true);
|
||||
}
|
||||
|
||||
private string GetOperatingSystemData()
|
||||
{
|
||||
var osVersion = string.Empty;
|
||||
var servicePack = string.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
foreach (var o in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem WHERE Primary=True")
|
||||
.Get())
|
||||
{
|
||||
var managementObject = (ManagementObject)o;
|
||||
osVersion = Convert.ToString(managementObject.GetPropertyValue("Caption")).Trim();
|
||||
servicePack = GetOSServicePack(servicePack, managementObject);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_messageCollector.AddExceptionMessage("Error retrieving operating system information from WMI.", ex);
|
||||
}
|
||||
|
||||
var osData = string.Join(" ", osVersion, servicePack);
|
||||
return osData;
|
||||
}
|
||||
|
||||
private string GetOSServicePack(string servicePack, ManagementObject managementObject)
|
||||
{
|
||||
var servicePackNumber = Convert.ToInt32(managementObject.GetPropertyValue("ServicePackMajorVersion"));
|
||||
if (servicePackNumber != 0)
|
||||
{
|
||||
servicePack = $"Service Pack {servicePackNumber}";
|
||||
}
|
||||
|
||||
return servicePack;
|
||||
}
|
||||
|
||||
private string GetArchitectureData()
|
||||
{
|
||||
var architecture = string.Empty;
|
||||
try
|
||||
{
|
||||
foreach (var o in new ManagementObjectSearcher("SELECT AddressWidth FROM Win32_Processor WHERE DeviceID=\'CPU0\'")
|
||||
.Get())
|
||||
{
|
||||
var managementObject = (ManagementObject)o;
|
||||
var addressWidth = Convert.ToInt32(managementObject.GetPropertyValue("AddressWidth"));
|
||||
architecture = $"{addressWidth}-bit";
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_messageCollector.AddExceptionMessage("Error retrieving operating system address width from WMI.", ex);
|
||||
}
|
||||
|
||||
return architecture;
|
||||
}
|
||||
|
||||
private void LogApplicationData()
|
||||
{
|
||||
var data = $"{Application.ProductName} {Application.ProductVersion}";
|
||||
if (Runtime.IsPortableEdition)
|
||||
data += $" {Language.PortableEdition}";
|
||||
data += " starting.";
|
||||
_messageCollector.AddMessage(MessageClass.InformationMsg, data, true);
|
||||
}
|
||||
|
||||
private void LogCmdLineArgs()
|
||||
{
|
||||
var data = $"Command Line: {string.Join(" ", Environment.GetCommandLineArgs())}";
|
||||
_messageCollector.AddMessage(MessageClass.InformationMsg, data, true);
|
||||
}
|
||||
|
||||
private void LogClrData()
|
||||
{
|
||||
var data = $"Microsoft .NET CLR {Environment.Version}";
|
||||
_messageCollector.AddMessage(MessageClass.InformationMsg, data, true);
|
||||
}
|
||||
|
||||
private void LogCultureData()
|
||||
{
|
||||
var data =
|
||||
$"System Culture: {Thread.CurrentThread.CurrentUICulture.Name}/{Thread.CurrentThread.CurrentUICulture.NativeName}";
|
||||
_messageCollector.AddMessage(MessageClass.InformationMsg, data, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
73
mRemoteNG/App/Logger.cs
Normal file
73
mRemoteNG/App/Logger.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Windows.Forms;
|
||||
using log4net;
|
||||
using log4net.Appender;
|
||||
using log4net.Config;
|
||||
using mRemoteNG.Properties;
|
||||
|
||||
// ReSharper disable ArrangeAccessorOwnerBody
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public class Logger
|
||||
{
|
||||
public static readonly Logger Instance = new Logger();
|
||||
|
||||
public ILog Log { get; private set; }
|
||||
|
||||
public static string DefaultLogPath => BuildLogFilePath();
|
||||
|
||||
private Logger()
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
private void Initialize()
|
||||
{
|
||||
XmlConfigurator.Configure(LogManager.CreateRepository("mRemoteNG"));
|
||||
if (string.IsNullOrEmpty(Settings.Default.LogFilePath))
|
||||
Settings.Default.LogFilePath = BuildLogFilePath();
|
||||
|
||||
SetLogPath(Settings.Default.LogToApplicationDirectory ? DefaultLogPath : Settings.Default.LogFilePath);
|
||||
}
|
||||
|
||||
public void SetLogPath(string path)
|
||||
{
|
||||
var repository = LogManager.GetRepository("mRemoteNG");
|
||||
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
|
||||
var appenders = repository.GetAppenders();
|
||||
|
||||
foreach (var appender in appenders)
|
||||
{
|
||||
var fileAppender = (RollingFileAppender)appender;
|
||||
if (fileAppender == null || fileAppender.Name != "LogFileAppender") continue;
|
||||
fileAppender.File = path;
|
||||
fileAppender.ActivateOptions();
|
||||
}
|
||||
|
||||
Log = LogManager.GetLogger("mRemoteNG", "Logger");
|
||||
}
|
||||
|
||||
private static string BuildLogFilePath()
|
||||
{
|
||||
var logFilePath = Runtime.IsPortableEdition ? GetLogPathPortableEdition() : GetLogPathNormalEdition();
|
||||
var logFileName = Path.ChangeExtension(Application.ProductName, ".log");
|
||||
if (logFileName == null) return "mRemoteNG.log";
|
||||
var logFile = Path.Combine(logFilePath, logFileName);
|
||||
return logFile;
|
||||
}
|
||||
|
||||
private static string GetLogPathNormalEdition()
|
||||
{
|
||||
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||
Application.ProductName);
|
||||
}
|
||||
|
||||
private static string GetLogPathPortableEdition()
|
||||
{
|
||||
return Application.StartupPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
552
mRemoteNG/App/NativeMethods.cs
Normal file
552
mRemoteNG/App/NativeMethods.cs
Normal file
@@ -0,0 +1,552 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Runtime.ConstrainedExecution;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
#pragma warning disable 649
|
||||
#pragma warning disable 169
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class NativeMethods
|
||||
{
|
||||
#region Functions
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern bool AppendMenu(IntPtr hMenu, int uFlags, IntPtr uIDNewItem, string lpNewItem);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr CreatePopupMenu();
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr FindWindowEx(IntPtr parentHandle,
|
||||
IntPtr childAfter,
|
||||
string lclassName,
|
||||
string windowTitle);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr GetForegroundWindow();
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern bool InsertMenu(IntPtr hMenu,
|
||||
int uPosition,
|
||||
int uFlags,
|
||||
IntPtr uIDNewItem,
|
||||
string lpNewItem);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern int IsIconic(IntPtr hWnd);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern bool MoveWindow(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr SendMessage([In] IntPtr hWnd,
|
||||
[In] uint msg,
|
||||
[Out] StringBuilder wParam,
|
||||
[In] IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
|
||||
|
||||
[DllImport("User32.dll", CharSet = CharSet.Auto)]
|
||||
internal static extern bool ChangeClipboardChain(
|
||||
IntPtr hWndRemove, // handle to window to remove
|
||||
IntPtr hWndNewNext // handle to next window
|
||||
);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern bool SetMenuItemBitmaps(IntPtr hMenu,
|
||||
int uPosition,
|
||||
int uFlags,
|
||||
IntPtr hBitmapUnchecked,
|
||||
IntPtr hBitmapChecked);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern IntPtr WindowFromPoint(Point point);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
internal static extern int GetDlgCtrlID(IntPtr hwndCtl);
|
||||
|
||||
[DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
|
||||
internal static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
|
||||
|
||||
[DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
|
||||
internal static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
|
||||
|
||||
[DllImport("kernel32", SetLastError = true)]
|
||||
internal static extern bool CloseHandle(IntPtr handle);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Structures
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct WINDOWPOS
|
||||
{
|
||||
public IntPtr hwnd;
|
||||
public IntPtr hwndInsertAfter;
|
||||
public int x;
|
||||
public int y;
|
||||
public int cx;
|
||||
public int cy;
|
||||
public int flags;
|
||||
}
|
||||
|
||||
internal struct WINDOWPLACEMENT
|
||||
{
|
||||
public uint length;
|
||||
public uint flags;
|
||||
public uint showCmd;
|
||||
public POINT ptMinPosition;
|
||||
public POINT ptMaxPosition;
|
||||
public RECT rcNormalPosition;
|
||||
}
|
||||
|
||||
internal struct POINT
|
||||
{
|
||||
public long x;
|
||||
public long y;
|
||||
}
|
||||
|
||||
internal struct RECT
|
||||
{
|
||||
public long left;
|
||||
public long top;
|
||||
public long right;
|
||||
public long bottom;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Helpers
|
||||
|
||||
public static int MAKELONG(int wLow, int wHigh)
|
||||
{
|
||||
return wLow | wHigh << 16;
|
||||
}
|
||||
|
||||
public static int MAKELPARAM(ref int wLow, ref int wHigh)
|
||||
{
|
||||
return MAKELONG(wLow, wHigh);
|
||||
}
|
||||
|
||||
public static int LOWORD(int value)
|
||||
{
|
||||
return value & 0xFFFF;
|
||||
}
|
||||
|
||||
public static int LOWORD(IntPtr value)
|
||||
{
|
||||
return LOWORD(value.ToInt32());
|
||||
}
|
||||
|
||||
public static int HIWORD(int value)
|
||||
{
|
||||
return value >> 16;
|
||||
}
|
||||
|
||||
public static int HIWORD(IntPtr value)
|
||||
{
|
||||
return HIWORD(value.ToInt32());
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constants
|
||||
|
||||
public const int TRUE = 1;
|
||||
|
||||
#region GetWindowLong
|
||||
|
||||
public const int GWL_STYLE = (-16);
|
||||
|
||||
#endregion
|
||||
|
||||
#region AppendMenu / ModifyMenu / DeleteMenu / RemoveMenu
|
||||
|
||||
public const int MF_BYCOMMAND = 0x0;
|
||||
public const int MF_BYPOSITION = 0x400;
|
||||
public const int MF_STRING = 0x0;
|
||||
public const int MF_POPUP = 0x10;
|
||||
public const int MF_SEPARATOR = 0x800;
|
||||
|
||||
#endregion
|
||||
|
||||
#region WM_LBUTTONDOWN / WM_LBUTTONUP
|
||||
|
||||
public const int MK_LBUTTON = 0x1;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ShowWindow
|
||||
|
||||
public const uint SW_HIDE = 0;
|
||||
public const uint SW_SHOWNORMAL = 1;
|
||||
public const uint SW_SHOWMINIMIZED = 2;
|
||||
public const uint SW_SHOWMAXIMIZED = 3;
|
||||
public const uint SW_MAXIMIZE = 3;
|
||||
public const uint SW_SHOWNOACTIVATE = 4;
|
||||
public const uint SW_SHOW = 5;
|
||||
public const uint SW_MINIMIZE = 6;
|
||||
public const uint SW_SHOWMINNOACTIVE = 7;
|
||||
public const uint SW_SHOWNA = 8;
|
||||
public const uint SW_RESTORE = 9;
|
||||
|
||||
#endregion
|
||||
|
||||
#region SetWindowPos / WM_WINDOWPOSCHANGING / WM_WINDOWPOSCHANGED
|
||||
|
||||
/// <summary>
|
||||
/// Retains the current size (ignores the cx and cy parameters).
|
||||
/// </summary>
|
||||
public const int SWP_NOSIZE = 0x1;
|
||||
|
||||
/// <summary>
|
||||
/// Retains the current position (ignores the x and y parameters).
|
||||
/// </summary>
|
||||
public const int SWP_NOMOVE = 0x2;
|
||||
|
||||
/// <summary>
|
||||
/// Retains the current Z order (ignores the hWndInsertAfter parameter).
|
||||
/// </summary>
|
||||
public const int SWP_NOZORDER = 0x4;
|
||||
|
||||
/// <summary>
|
||||
/// Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of the window being moved. When this flag is set, the application must explicitly invalidate or redraw any parts of the window and parent window that need redrawing.
|
||||
/// </summary>
|
||||
public const int SWP_NOREDRAW = 0x8;
|
||||
|
||||
/// <summary>
|
||||
/// Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter parameter).
|
||||
/// </summary>
|
||||
public const int SWP_NOACTIVATE = 0x10;
|
||||
|
||||
/// <summary>
|
||||
/// Draws a frame (defined in the window's class description) around the window.
|
||||
/// </summary>
|
||||
public const int SWP_DRAWFRAME = 0x20;
|
||||
|
||||
/// <summary>
|
||||
/// Sends a WM_NCCALCSIZE message to the window, even if the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE is sent only when the window's size is being changed.
|
||||
/// </summary>
|
||||
public const int SWP_FRAMECHANGED = 0x20;
|
||||
|
||||
/// <summary>
|
||||
/// Displays the window.
|
||||
/// </summary>
|
||||
public const int SWP_SHOWWINDOW = 0x40;
|
||||
|
||||
/// <summary>
|
||||
/// Hides the window.
|
||||
/// </summary>
|
||||
public const int SWP_HIDEWINDOW = 0x80;
|
||||
|
||||
/// <summary>
|
||||
/// Discards the entire contents of the client area. If this flag is not specified, the valid contents of the client area are saved and copied back into the client area after the window is sized or repositioned.
|
||||
/// </summary>
|
||||
public const int SWP_NOCOPYBITS = 0x100;
|
||||
|
||||
/// <summary>
|
||||
/// Does not change the owner window's position in the Z order.
|
||||
/// </summary>
|
||||
public const int SWP_NOOWNERZORDER = 0x200;
|
||||
|
||||
/// <summary>
|
||||
/// Prevents the window from receiving the WM_WINDOWPOSCHANGING message.
|
||||
/// </summary>
|
||||
public const int SWP_NOSENDCHANGING = 0x400;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const int SWP_NOCLIENTSIZE = 0x800;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const int SWP_NOCLIENTMOVE = 0x1000;
|
||||
|
||||
/// <summary>
|
||||
/// Prevents generation of the WM_SYNCPAINT message.
|
||||
/// </summary>
|
||||
public const int SWP_DEFERERASE = 0x2000;
|
||||
|
||||
/// <summary>
|
||||
/// If the calling thread and the thread that owns the window are attached to different input queues, the system posts the request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads process the request.
|
||||
/// </summary>
|
||||
public const int SWP_ASYNCWINDOWPOS = 0x4000;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const int SWP_STATECHANGED = 0x8000;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Window Placement Flags (WPF)
|
||||
|
||||
public const uint WPF_SETMINPOSITION = 0x1;
|
||||
public const uint WPF_RESTORETOMAXIMIZED = 0x2;
|
||||
public const uint WPF_ASYNCWINDOWPLACEMENT = 0x4;
|
||||
|
||||
#endregion
|
||||
|
||||
#region WM_ACTIVATE
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const int WA_INACTIVE = 0x0;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const int WA_ACTIVE = 0x1;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to both the window being activated and the window being deactivated.
|
||||
/// If the windows use the same input queue, the message is sent synchronously, first to the window procedure of the
|
||||
/// top-level window being deactivated, then to the window procedure of the top-level window being activated. If the
|
||||
/// windows use different input queues, the message is sent asynchronously, so the window is activated immediately.
|
||||
/// </summary>
|
||||
public const int WA_CLICKACTIVE = 0x2;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Window Messages
|
||||
|
||||
/// <summary>
|
||||
/// Sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.) The window procedure of the new window receives this message after the window is created, but before the window becomes visible.
|
||||
/// </summary>
|
||||
public const int WM_CREATE = 0x1;
|
||||
|
||||
/// <summary>
|
||||
/// Sent when a window is being destroyed. It is sent to the window procedure of the window being destroyed after the window is removed from the screen. This message is sent first to the window being destroyed and then to the child windows(if any) as they are destroyed.During the processing of the message, it can be assumed that all child windows still exist.
|
||||
/// </summary>
|
||||
public const int WM_DESTROY = 0x2;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to both the window being activated and the window being deactivated. If the windows use the same input queue, the message is sent synchronously, first to the window procedure of the top-level window being deactivated, then to the window procedure of the top-level window being activated. If the windows use different input queues, the message is sent asynchronously, so the window is activated immediately.
|
||||
/// </summary>
|
||||
public const int WM_ACTIVATE = 0x6;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const int WM_SETTEXT = 0xC;
|
||||
|
||||
/// <summary>
|
||||
/// Copies the text that corresponds to a window into a buffer provided by the caller.
|
||||
/// </summary>
|
||||
public const int WM_GETTEXT = 0xD;
|
||||
|
||||
/// <summary>
|
||||
/// Sent as a signal that a window or an application should terminate.
|
||||
/// </summary>
|
||||
public const int WM_CLOSE = 0x10;
|
||||
|
||||
/// <summary>
|
||||
/// Sent when a window belonging to a different application than the active window is about to be activated. The message is sent to the application whose window is being activated and to the application whose window is being deactivated.
|
||||
/// </summary>
|
||||
public const int WM_ACTIVATEAPP = 0x1C;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to a window if the mouse causes the cursor to move within a window and mouse input is not captured.
|
||||
/// </summary>
|
||||
public const int WM_SETCURSOR = 0x20;
|
||||
|
||||
/// <summary>
|
||||
/// Sent when the cursor is in an inactive window and the user presses a mouse button. The parent window receives this message only if the child window passes it to the DefWindowProc function.
|
||||
/// </summary>
|
||||
public const int WM_MOUSEACTIVATE = 0x21;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to a window when the size or position of the window is about to change. An application can use this message to override the window's default maximized size and position, or its default minimum or maximum tracking size.
|
||||
/// </summary>
|
||||
public const int WM_GETMINMAXINFO = 0x24;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to a window whose size, position, or place in the Z order is about to change as a result of a call to the SetWindowPos function or another window-management function.
|
||||
/// </summary>
|
||||
public const int WM_WINDOWPOSCHANGING = 0x46;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to a window whose size, position, or place in the Z order has changed as a result of a call to the SetWindowPos function or another window-management function.
|
||||
/// </summary>
|
||||
public const int WM_WINDOWPOSCHANGED = 0x47;
|
||||
|
||||
/// <summary>
|
||||
/// Posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.
|
||||
/// </summary>
|
||||
public const int WM_KEYDOWN = 0x100;
|
||||
|
||||
/// <summary>
|
||||
/// Posted to the window with the keyboard focus when a nonsystem key is released. A nonsystem key is a key that is pressed when the ALT key is not pressed, or a keyboard key that is pressed when a window has the keyboard focus.
|
||||
/// </summary>
|
||||
public const int WM_KEYUP = 0x101;
|
||||
|
||||
/// <summary>
|
||||
/// Posted to the window with the keyboard focus when a WM_KEYDOWN message is translated by the TranslateMessage function. The WM_CHAR message contains the character code of the key that was pressed.
|
||||
/// </summary>
|
||||
public const int WM_CHAR = 0x102;
|
||||
|
||||
/// <summary>
|
||||
/// Sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
|
||||
/// </summary>
|
||||
public const int WM_COMMAND = 0x111;
|
||||
|
||||
/// <summary>
|
||||
/// A window receives this message when the user chooses a command from the Window menu (formerly known as the system or control menu) or when the user chooses the maximize button, minimize button, restore button, or close button.
|
||||
/// </summary>
|
||||
public const int WM_SYSCOMMAND = 0x112;
|
||||
|
||||
/// <summary>
|
||||
/// Posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_MOUSEMOVE = 0x200;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user presses the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_LBUTTONDOWN = 0x201;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user releases the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_LBUTTONUP = 0x202;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user presses the right mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_RBUTTONDOWN = 0x204;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user releases the right mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_RBUTTONUP = 0x205;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user presses the middle mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_MBUTTONDOWN = 0x207;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user releases the middle mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_MBUTTONUP = 0x208;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user presses the first or second X button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_XBUTTONDOWN = 0x20B;
|
||||
|
||||
/// <summary>
|
||||
/// Posted when the user releases the first or second X button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
|
||||
/// </summary>
|
||||
public const int WM_XBUTTONUP = 0x20C;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to a window when a significant action occurs on a descendant window. This message is now extended to include the WM_POINTERDOWN event. When the child window is being created, the system sends WM_PARENTNOTIFY just before the CreateWindow or CreateWindowEx function that creates the window returns. When the child window is being destroyed, the system sends the message before any processing to destroy the window takes place.
|
||||
/// </summary>
|
||||
public const int WM_PARENTNOTIFY = 0x210;
|
||||
|
||||
/// <summary>
|
||||
/// Sent one time to a window after it enters the moving or sizing modal loop. The window enters the moving or sizing modal loop when the user clicks the window's title bar or sizing border, or when the window passes the WM_SYSCOMMAND message to the DefWindowProc function and the wParam parameter of the message specifies the SC_MOVE or SC_SIZE value. The operation is complete when DefWindowProc returns.
|
||||
/// </summary>
|
||||
public const int WM_ENTERSIZEMOVE = 0x231;
|
||||
|
||||
/// <summary>
|
||||
/// Sent one time to a window, after it has exited the moving or sizing modal loop. The window enters the moving or sizing modal loop when the user clicks the window's title bar or sizing border, or when the window passes the WM_SYSCOMMAND message to the DefWindowProc function and the wParam parameter of the message specifies the SC_MOVE or SC_SIZE value. The operation is complete when DefWindowProc returns.
|
||||
/// </summary>
|
||||
public const int WM_EXITSIZEMOVE = 0x232;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the first window in the clipboard viewer chain when the content of the clipboard changes. This enables a clipboard viewer window to display the new content of the clipboard.
|
||||
/// </summary>
|
||||
public const int WM_DRAWCLIPBOARD = 0x308;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the first window in the clipboard viewer chain when a window is being removed from the chain.
|
||||
/// </summary>
|
||||
public const int WM_CHANGECBCHAIN = 0x30D;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Window Styles
|
||||
|
||||
public const int WS_MAXIMIZE = 0x1000000;
|
||||
public const int WS_VISIBLE = 0x10000000;
|
||||
public const int WS_CHILD = 0x40000000;
|
||||
public const int WS_EX_MDICHILD = 0x40;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Virtual Key Codes
|
||||
|
||||
public const int VK_CONTROL = 0x11;
|
||||
public const int VK_C = 0x67;
|
||||
|
||||
#endregion
|
||||
|
||||
#region EM
|
||||
|
||||
public const uint ECM_FIRST = 0x1500;
|
||||
public const uint EM_SETCUEBANNER = ECM_FIRST + 1;
|
||||
public const uint EM_GETCUEBANNER = ECM_FIRST + 2;
|
||||
|
||||
#endregion
|
||||
|
||||
#region LB
|
||||
|
||||
public const int LB_ERR = -1;
|
||||
public const int LB_SELECTSTRING = 0x18C;
|
||||
|
||||
#endregion
|
||||
|
||||
#region TCM
|
||||
|
||||
internal const int TCM_ADJUSTRECT = 0x1328;
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
107
mRemoteNG/App/ProgramRoot.cs
Normal file
107
mRemoteNG/App/ProgramRoot.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Properties;
|
||||
using mRemoteNG.UI.Forms;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class ProgramRoot
|
||||
{
|
||||
private static Mutex _mutex;
|
||||
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
if (Settings.Default.SingleInstance)
|
||||
StartApplicationAsSingleInstance();
|
||||
else
|
||||
StartApplication();
|
||||
}
|
||||
|
||||
private static void StartApplication()
|
||||
{
|
||||
CatchAllUnhandledExceptions();
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
var frmSplashScreen = FrmSplashScreen.getInstance();
|
||||
frmSplashScreen.Show();
|
||||
Application.Run(FrmMain.Default);
|
||||
}
|
||||
|
||||
public static void CloseSingletonInstanceMutex()
|
||||
{
|
||||
_mutex?.Close();
|
||||
}
|
||||
|
||||
private static void StartApplicationAsSingleInstance()
|
||||
{
|
||||
const string mutexID = "mRemoteNG_SingleInstanceMutex";
|
||||
_mutex = new Mutex(false, mutexID, out var newInstanceCreated);
|
||||
if (!newInstanceCreated)
|
||||
{
|
||||
SwitchToCurrentInstance();
|
||||
return;
|
||||
}
|
||||
|
||||
StartApplication();
|
||||
GC.KeepAlive(_mutex);
|
||||
}
|
||||
|
||||
private static void SwitchToCurrentInstance()
|
||||
{
|
||||
var singletonInstanceWindowHandle = GetRunningSingletonInstanceWindowHandle();
|
||||
if (singletonInstanceWindowHandle == IntPtr.Zero) return;
|
||||
if (NativeMethods.IsIconic(singletonInstanceWindowHandle) != 0)
|
||||
NativeMethods.ShowWindow(singletonInstanceWindowHandle, (int)NativeMethods.SW_RESTORE);
|
||||
NativeMethods.SetForegroundWindow(singletonInstanceWindowHandle);
|
||||
}
|
||||
|
||||
private static IntPtr GetRunningSingletonInstanceWindowHandle()
|
||||
{
|
||||
var windowHandle = IntPtr.Zero;
|
||||
var currentProcess = Process.GetCurrentProcess();
|
||||
foreach (var enumeratedProcess in Process.GetProcessesByName(currentProcess.ProcessName))
|
||||
{
|
||||
if (enumeratedProcess.Id != currentProcess.Id &&
|
||||
enumeratedProcess.MainModule.FileName == currentProcess.MainModule.FileName &&
|
||||
enumeratedProcess.MainWindowHandle != IntPtr.Zero)
|
||||
windowHandle = enumeratedProcess.MainWindowHandle;
|
||||
}
|
||||
|
||||
return windowHandle;
|
||||
}
|
||||
|
||||
private static void CatchAllUnhandledExceptions()
|
||||
{
|
||||
Application.ThreadException += ApplicationOnThreadException;
|
||||
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
|
||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
|
||||
}
|
||||
|
||||
private static void ApplicationOnThreadException(object sender, ThreadExceptionEventArgs e)
|
||||
{
|
||||
if (!FrmSplashScreen.getInstance().IsDisposed)
|
||||
FrmSplashScreen.getInstance().Close();
|
||||
|
||||
if (FrmMain.Default.IsDisposed) return;
|
||||
|
||||
var window = new FrmUnhandledException(e.Exception, false);
|
||||
window.ShowDialog(FrmMain.Default);
|
||||
|
||||
}
|
||||
|
||||
private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
if (!FrmSplashScreen.getInstance().IsDisposed)
|
||||
FrmSplashScreen.getInstance().Close();
|
||||
|
||||
var window = new FrmUnhandledException(e.ExceptionObject as Exception, e.IsTerminating);
|
||||
window.ShowDialog(FrmMain.Default);
|
||||
}
|
||||
}
|
||||
}
|
||||
229
mRemoteNG/App/Runtime.cs
Normal file
229
mRemoteNG/App/Runtime.cs
Normal file
@@ -0,0 +1,229 @@
|
||||
using mRemoteNG.App.Info;
|
||||
using mRemoteNG.Config.Putty;
|
||||
using mRemoteNG.Connection;
|
||||
using mRemoteNG.Credential;
|
||||
using mRemoteNG.Credential.Repositories;
|
||||
using mRemoteNG.Messages;
|
||||
using mRemoteNG.Security;
|
||||
using mRemoteNG.Tools;
|
||||
using mRemoteNG.Tree.Root;
|
||||
using mRemoteNG.UI;
|
||||
using mRemoteNG.UI.Forms;
|
||||
using mRemoteNG.UI.TaskDialog;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Properties;
|
||||
using mRemoteNG.Resources.Language;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class Runtime
|
||||
{
|
||||
public static bool IsPortableEdition
|
||||
{
|
||||
get
|
||||
{
|
||||
#if PORTABLE
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Feature flag to enable the credential manager feature
|
||||
/// </summary>
|
||||
public static bool UseCredentialManager => false;
|
||||
|
||||
public static WindowList WindowList { get; set; }
|
||||
public static MessageCollector MessageCollector { get; } = new MessageCollector();
|
||||
public static NotificationAreaIcon NotificationAreaIcon { get; set; }
|
||||
public static ExternalToolsService ExternalToolsService { get; } = new ExternalToolsService();
|
||||
|
||||
public static SecureString EncryptionKey { get; set; } =
|
||||
new RootNodeInfo(RootNodeType.Connection).PasswordString.ConvertToSecureString();
|
||||
|
||||
public static ICredentialRepositoryList CredentialProviderCatalog { get; } = new CredentialRepositoryList();
|
||||
|
||||
public static ConnectionsService ConnectionsService { get; } =
|
||||
new ConnectionsService(PuttySessionsManager.Instance);
|
||||
|
||||
#region Connections Loading/Saving
|
||||
|
||||
public static void LoadConnectionsAsync()
|
||||
{
|
||||
var t = new Thread(LoadConnectionsBGd);
|
||||
t.SetApartmentState(ApartmentState.STA);
|
||||
t.Start();
|
||||
}
|
||||
|
||||
private static void LoadConnectionsBGd()
|
||||
{
|
||||
LoadConnections();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="withDialog">
|
||||
/// Should we show the file selection dialog to allow the user to select
|
||||
/// a connection file
|
||||
/// </param>
|
||||
public static void LoadConnections(bool withDialog = false)
|
||||
{
|
||||
var connectionFileName = "";
|
||||
|
||||
try
|
||||
{
|
||||
// disable sql update checking while we are loading updates
|
||||
ConnectionsService.RemoteConnectionsSyncronizer?.Disable();
|
||||
|
||||
if (withDialog)
|
||||
{
|
||||
var loadDialog = DialogFactory.BuildLoadConnectionsDialog();
|
||||
if (loadDialog.ShowDialog() != DialogResult.OK)
|
||||
return;
|
||||
|
||||
connectionFileName = loadDialog.FileName;
|
||||
Settings.Default.UseSQLServer = false;
|
||||
Settings.Default.Save();
|
||||
}
|
||||
else if (!Settings.Default.UseSQLServer)
|
||||
{
|
||||
connectionFileName = ConnectionsService.GetStartupConnectionFileName();
|
||||
}
|
||||
|
||||
ConnectionsService.LoadConnections(Settings.Default.UseSQLServer, false, connectionFileName);
|
||||
|
||||
if (Settings.Default.UseSQLServer)
|
||||
{
|
||||
ConnectionsService.LastSqlUpdate = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
ConnectionsService.LastFileUpdate = System.IO.File.GetLastWriteTime(connectionFileName);
|
||||
}
|
||||
|
||||
// re-enable sql update checking after updates are loaded
|
||||
ConnectionsService.RemoteConnectionsSyncronizer?.Enable();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FrmSplashScreen.getInstance().Close();
|
||||
|
||||
if (Settings.Default.UseSQLServer)
|
||||
{
|
||||
MessageCollector.AddExceptionMessage(Language.LoadFromSqlFailed, ex);
|
||||
var commandButtons = string.Join("|", Language._TryAgain,
|
||||
Language.CommandOpenConnectionFile,
|
||||
string.Format(Language.CommandExitProgram,
|
||||
Application.ProductName));
|
||||
CTaskDialog.ShowCommandBox(Application.ProductName, Language.LoadFromSqlFailed,
|
||||
Language.LoadFromSqlFailedContent,
|
||||
MiscTools.GetExceptionMessageRecursive(ex), "", "",
|
||||
commandButtons, false, ESysIcons.Error, ESysIcons.Error);
|
||||
switch (CTaskDialog.CommandButtonResult)
|
||||
{
|
||||
case 0:
|
||||
LoadConnections(withDialog);
|
||||
return;
|
||||
case 1:
|
||||
Settings.Default.UseSQLServer = false;
|
||||
LoadConnections(true);
|
||||
return;
|
||||
default:
|
||||
Application.Exit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (ex is FileNotFoundException && !withDialog)
|
||||
{
|
||||
MessageCollector.AddExceptionMessage(
|
||||
string.Format(Language.ConnectionsFileCouldNotBeLoadedNew,
|
||||
connectionFileName), ex,
|
||||
MessageClass.InformationMsg);
|
||||
|
||||
string[] commandButtons =
|
||||
{
|
||||
Language.ConfigurationCreateNew,
|
||||
Language.ConfigurationCustomPath,
|
||||
Language.ConfigurationImportFile,
|
||||
Language.Exit
|
||||
};
|
||||
|
||||
var answered = false;
|
||||
while (!answered)
|
||||
{
|
||||
try
|
||||
{
|
||||
CTaskDialog.ShowTaskDialogBox(
|
||||
GeneralAppInfo.ProductName,
|
||||
Language.ConnectionFileNotFound,
|
||||
"", "", "", "", "",
|
||||
string.Join(" | ", commandButtons),
|
||||
ETaskDialogButtons.None,
|
||||
ESysIcons.Question,
|
||||
ESysIcons.Question);
|
||||
|
||||
switch (CTaskDialog.CommandButtonResult)
|
||||
{
|
||||
case 0:
|
||||
ConnectionsService.NewConnectionsFile(connectionFileName);
|
||||
answered = true;
|
||||
break;
|
||||
case 1:
|
||||
LoadConnections(true);
|
||||
answered = true;
|
||||
break;
|
||||
case 2:
|
||||
ConnectionsService.NewConnectionsFile(connectionFileName);
|
||||
Import.ImportFromFile(ConnectionsService.ConnectionTreeModel.RootNodes[0]);
|
||||
answered = true;
|
||||
break;
|
||||
case 3:
|
||||
Application.Exit();
|
||||
answered = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
MessageCollector.AddExceptionMessage(
|
||||
string
|
||||
.Format(Language.ConnectionsFileCouldNotBeLoadedNew,
|
||||
connectionFileName), exc,
|
||||
MessageClass.InformationMsg);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
MessageCollector.AddExceptionStackTrace(
|
||||
string.Format(Language.ConnectionsFileCouldNotBeLoaded,
|
||||
connectionFileName), ex);
|
||||
if (connectionFileName != ConnectionsService.GetStartupConnectionFileName())
|
||||
{
|
||||
LoadConnections(withDialog);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show(FrmMain.Default,
|
||||
string.Format(Language.ErrorStartupConnectionFileLoad, Environment.NewLine,
|
||||
Application.ProductName,
|
||||
ConnectionsService.GetStartupConnectionFileName(),
|
||||
MiscTools.GetExceptionMessageRecursive(ex)),
|
||||
@"Could not load startup file.", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
36
mRemoteNG/App/Screens.cs
Normal file
36
mRemoteNG/App/Screens.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.UI.Forms;
|
||||
using WeifenLuo.WinFormsUI.Docking;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class Screens
|
||||
{
|
||||
public static void SendFormToScreen(Screen screen)
|
||||
{
|
||||
var frmMain = FrmMain.Default;
|
||||
var wasMax = false;
|
||||
|
||||
if (frmMain.WindowState == FormWindowState.Maximized)
|
||||
{
|
||||
wasMax = true;
|
||||
frmMain.WindowState = FormWindowState.Normal;
|
||||
}
|
||||
|
||||
frmMain.Location = screen.Bounds.Location;
|
||||
|
||||
if (wasMax)
|
||||
{
|
||||
frmMain.WindowState = FormWindowState.Maximized;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SendPanelToScreen(DockContent panel, Screen screen)
|
||||
{
|
||||
panel.DockState = DockState.Float;
|
||||
if (panel.ParentForm == null) return;
|
||||
panel.ParentForm.Left = screen.Bounds.Location.X;
|
||||
panel.ParentForm.Top = screen.Bounds.Location.Y;
|
||||
}
|
||||
}
|
||||
}
|
||||
126
mRemoteNG/App/Shutdown.cs
Normal file
126
mRemoteNG/App/Shutdown.cs
Normal file
@@ -0,0 +1,126 @@
|
||||
using mRemoteNG.Tools;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using mRemoteNG.Config.Connections;
|
||||
using mRemoteNG.Config.Putty;
|
||||
using mRemoteNG.Properties;
|
||||
using mRemoteNG.UI.Controls;
|
||||
using mRemoteNG.UI.Forms;
|
||||
using mRemoteNG.Resources.Language;
|
||||
|
||||
// ReSharper disable ArrangeAccessorOwnerBody
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class Shutdown
|
||||
{
|
||||
private static string _updateFilePath;
|
||||
|
||||
private static bool UpdatePending
|
||||
{
|
||||
get { return !string.IsNullOrEmpty(_updateFilePath); }
|
||||
}
|
||||
|
||||
public static void Quit(string updateFilePath = null)
|
||||
{
|
||||
_updateFilePath = updateFilePath;
|
||||
FrmMain.Default.Close();
|
||||
ProgramRoot.CloseSingletonInstanceMutex();
|
||||
}
|
||||
|
||||
public static void Cleanup(Control quickConnectToolStrip,
|
||||
ExternalToolsToolStrip externalToolsToolStrip,
|
||||
MultiSshToolStrip multiSshToolStrip,
|
||||
FrmMain frmMain)
|
||||
{
|
||||
try
|
||||
{
|
||||
StopPuttySessionWatcher();
|
||||
DisposeNotificationAreaIcon();
|
||||
SaveConnections();
|
||||
SaveSettings(quickConnectToolStrip, externalToolsToolStrip, multiSshToolStrip, frmMain);
|
||||
UnregisterBrowsers();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionStackTrace(Language.SettingsCouldNotBeSavedOrTrayDispose, ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void StopPuttySessionWatcher()
|
||||
{
|
||||
PuttySessionsManager.Instance.StopWatcher();
|
||||
}
|
||||
|
||||
private static void DisposeNotificationAreaIcon()
|
||||
{
|
||||
if (Runtime.NotificationAreaIcon != null && Runtime.NotificationAreaIcon.Disposed == false)
|
||||
Runtime.NotificationAreaIcon.Dispose();
|
||||
}
|
||||
|
||||
private static void SaveConnections()
|
||||
{
|
||||
DateTime lastUpdate;
|
||||
DateTime updateDate;
|
||||
DateTime currentDate = DateTime.Now;
|
||||
|
||||
//OBSOLETE: Settings.Default.SaveConsOnExit is obsolete and should be removed in a future release
|
||||
if (Settings.Default.SaveConsOnExit || (Settings.Default.SaveConnectionsFrequency == (int)ConnectionsBackupFrequencyEnum.OnExit))
|
||||
{
|
||||
Runtime.ConnectionsService.SaveConnections();
|
||||
return;
|
||||
}
|
||||
lastUpdate = Runtime.ConnectionsService.UsingDatabase ? Runtime.ConnectionsService.LastSqlUpdate : Runtime.ConnectionsService.LastFileUpdate;
|
||||
|
||||
switch (Settings.Default.SaveConnectionsFrequency)
|
||||
{
|
||||
case (int)ConnectionsBackupFrequencyEnum.Daily:
|
||||
updateDate = lastUpdate.AddDays(1);
|
||||
break;
|
||||
case (int)ConnectionsBackupFrequencyEnum.Weekly:
|
||||
updateDate = lastUpdate.AddDays(7);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentDate >= updateDate)
|
||||
{
|
||||
Runtime.ConnectionsService.SaveConnections();
|
||||
}
|
||||
}
|
||||
|
||||
private static void SaveSettings(Control quickConnectToolStrip,
|
||||
ExternalToolsToolStrip externalToolsToolStrip,
|
||||
MultiSshToolStrip multiSshToolStrip,
|
||||
FrmMain frmMain)
|
||||
{
|
||||
Config.Settings.SettingsSaver.SaveSettings(quickConnectToolStrip, externalToolsToolStrip, multiSshToolStrip,
|
||||
frmMain);
|
||||
}
|
||||
|
||||
private static void UnregisterBrowsers()
|
||||
{
|
||||
IeBrowserEmulation.Unregister();
|
||||
}
|
||||
|
||||
public static void StartUpdate()
|
||||
{
|
||||
try
|
||||
{
|
||||
RunUpdateFile();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionStackTrace("The update could not be started.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RunUpdateFile()
|
||||
{
|
||||
if (UpdatePending)
|
||||
Process.Start(new ProcessStartInfo(_updateFilePath) { UseShellExecute = true });
|
||||
}
|
||||
}
|
||||
}
|
||||
105
mRemoteNG/App/Startup.cs
Normal file
105
mRemoteNG/App/Startup.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Threading.Tasks;
|
||||
using mRemoteNG.App.Info;
|
||||
using mRemoteNG.App.Initialization;
|
||||
using mRemoteNG.App.Update;
|
||||
using mRemoteNG.Config.Connections.Multiuser;
|
||||
using mRemoteNG.Connection;
|
||||
using mRemoteNG.Messages;
|
||||
using mRemoteNG.Properties;
|
||||
using mRemoteNG.Tools;
|
||||
using mRemoteNG.Tools.Cmdline;
|
||||
using mRemoteNG.UI;
|
||||
using mRemoteNG.UI.Forms;
|
||||
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public class Startup
|
||||
{
|
||||
private AppUpdater _appUpdate;
|
||||
private readonly ConnectionIconLoader _connectionIconLoader;
|
||||
private readonly FrmMain _frmMain = FrmMain.Default;
|
||||
|
||||
public static Startup Instance { get; } = new Startup();
|
||||
|
||||
private Startup()
|
||||
{
|
||||
_appUpdate = new AppUpdater();
|
||||
_connectionIconLoader = new ConnectionIconLoader(GeneralAppInfo.HomePath + "\\Icons\\");
|
||||
}
|
||||
|
||||
static Startup()
|
||||
{
|
||||
}
|
||||
|
||||
public void InitializeProgram(MessageCollector messageCollector)
|
||||
{
|
||||
Debug.Print("---------------------------" + Environment.NewLine + "[START] - " +
|
||||
Convert.ToString(DateTime.Now, CultureInfo.InvariantCulture));
|
||||
var startupLogger = new StartupDataLogger(messageCollector);
|
||||
startupLogger.LogStartupData();
|
||||
CompatibilityChecker.CheckCompatibility(messageCollector);
|
||||
ParseCommandLineArgs(messageCollector);
|
||||
IeBrowserEmulation.Register();
|
||||
_connectionIconLoader.GetConnectionIcons();
|
||||
DefaultConnectionInfo.Instance.LoadFrom(Settings.Default, a => "ConDefault" + a);
|
||||
DefaultConnectionInheritance.Instance.LoadFrom(Settings.Default, a => "InhDefault" + a);
|
||||
}
|
||||
|
||||
private static void ParseCommandLineArgs(MessageCollector messageCollector)
|
||||
{
|
||||
var interpreter = new StartupArgumentsInterpreter(messageCollector);
|
||||
interpreter.ParseArguments(Environment.GetCommandLineArgs());
|
||||
}
|
||||
|
||||
public void CreateConnectionsProvider(MessageCollector messageCollector)
|
||||
{
|
||||
messageCollector.AddMessage(MessageClass.DebugMsg, "Determining if we need a database syncronizer");
|
||||
if (!Settings.Default.UseSQLServer) return;
|
||||
messageCollector.AddMessage(MessageClass.DebugMsg, "Creating database syncronizer");
|
||||
Runtime.ConnectionsService.RemoteConnectionsSyncronizer =
|
||||
new RemoteConnectionsSyncronizer(new SqlConnectionsUpdateChecker());
|
||||
Runtime.ConnectionsService.RemoteConnectionsSyncronizer.Enable();
|
||||
}
|
||||
|
||||
public async Task CheckForUpdate()
|
||||
{
|
||||
if (_appUpdate == null)
|
||||
{
|
||||
_appUpdate = new AppUpdater();
|
||||
}
|
||||
else if (_appUpdate.IsGetUpdateInfoRunning)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var nextUpdateCheck =
|
||||
Convert.ToDateTime(Settings.Default.CheckForUpdatesLastCheck.Add(
|
||||
TimeSpan
|
||||
.FromDays(Convert.ToDouble(Settings
|
||||
.Default
|
||||
.CheckForUpdatesFrequencyDays))));
|
||||
if (!Settings.Default.UpdatePending && DateTime.UtcNow < nextUpdateCheck)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await _appUpdate.GetUpdateInfoAsync();
|
||||
if (_appUpdate.IsUpdateAvailable())
|
||||
{
|
||||
Windows.Show(WindowType.Update);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionMessage("CheckForUpdate() failed.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
94
mRemoteNG/App/SupportedCultures.cs
Normal file
94
mRemoteNG/App/SupportedCultures.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Runtime.Serialization;
|
||||
using mRemoteNG.Properties;
|
||||
|
||||
// ReSharper disable ArrangeAccessorOwnerBody
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class SupportedCultures : Dictionary<string, string>
|
||||
{
|
||||
private static SupportedCultures _Instance;
|
||||
|
||||
private static SupportedCultures SingletonInstance
|
||||
{
|
||||
get { return _Instance ?? (_Instance = new SupportedCultures()); }
|
||||
}
|
||||
|
||||
|
||||
private SupportedCultures()
|
||||
{
|
||||
foreach (var CultureName in Settings.Default.SupportedUICultures.Split(','))
|
||||
{
|
||||
try
|
||||
{
|
||||
var CultureInfo = new CultureInfo(CultureName.Trim());
|
||||
Add(CultureInfo.Name, CultureInfo.TextInfo.ToTitleCase(CultureInfo.NativeName));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Print(
|
||||
$"An exception occurred while adding the culture {CultureName} to the list of supported cultures. {ex.StackTrace}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fix CA2229 - https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2229-implement-serialization-constructors?view=vs-2017
|
||||
private SupportedCultures(SerializationInfo info, StreamingContext context)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public static bool IsNameSupported(string CultureName)
|
||||
{
|
||||
return SingletonInstance.ContainsKey(CultureName);
|
||||
}
|
||||
|
||||
public static bool IsNativeNameSupported(string CultureNativeName)
|
||||
{
|
||||
return SingletonInstance.ContainsValue(CultureNativeName);
|
||||
}
|
||||
|
||||
public static string get_CultureName(string CultureNativeName)
|
||||
{
|
||||
var Names = new string[SingletonInstance.Count + 1];
|
||||
var NativeNames = new string[SingletonInstance.Count + 1];
|
||||
|
||||
SingletonInstance.Keys.CopyTo(Names, 0);
|
||||
SingletonInstance.Values.CopyTo(NativeNames, 0);
|
||||
|
||||
for (var Index = 0; Index <= SingletonInstance.Count; Index++)
|
||||
{
|
||||
if (NativeNames[Index] == CultureNativeName)
|
||||
{
|
||||
return Names[Index];
|
||||
}
|
||||
}
|
||||
|
||||
throw (new KeyNotFoundException());
|
||||
}
|
||||
|
||||
public static string get_CultureNativeName(string CultureName)
|
||||
{
|
||||
return SingletonInstance[CultureName];
|
||||
}
|
||||
|
||||
public static List<string> CultureNativeNames
|
||||
{
|
||||
get
|
||||
{
|
||||
var ValueList = new List<string>();
|
||||
foreach (var Value in SingletonInstance.Values)
|
||||
{
|
||||
ValueList.Add(Value);
|
||||
}
|
||||
|
||||
return ValueList;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
269
mRemoteNG/App/Update/AppUpdater.cs
Normal file
269
mRemoteNG/App/Update/AppUpdater.cs
Normal file
@@ -0,0 +1,269 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using mRemoteNG.App.Info;
|
||||
using mRemoteNG.Security.SymmetricEncryption;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
using mRemoteNG.Properties;
|
||||
#if !PORTABLE
|
||||
using mRemoteNG.Tools;
|
||||
|
||||
#else
|
||||
using System.Windows.Forms;
|
||||
|
||||
#endif
|
||||
// ReSharper disable ArrangeAccessorOwnerBody
|
||||
|
||||
namespace mRemoteNG.App.Update
|
||||
{
|
||||
public class AppUpdater
|
||||
{
|
||||
private const int _bufferLength = 8192;
|
||||
private WebProxy _webProxy;
|
||||
private HttpClient _httpClient;
|
||||
private CancellationTokenSource _changeLogCancelToken;
|
||||
private CancellationTokenSource _getUpdateInfoCancelToken;
|
||||
|
||||
#region Public Properties
|
||||
|
||||
public UpdateInfo CurrentUpdateInfo { get; private set; }
|
||||
|
||||
public bool IsGetUpdateInfoRunning
|
||||
{
|
||||
get
|
||||
{
|
||||
return _getUpdateInfoCancelToken != null;
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsGetChangeLogRunning
|
||||
{
|
||||
get
|
||||
{
|
||||
return _changeLogCancelToken != null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public AppUpdater()
|
||||
{
|
||||
SetDefaultProxySettings();
|
||||
}
|
||||
|
||||
private void SetDefaultProxySettings()
|
||||
{
|
||||
var shouldWeUseProxy = Settings.Default.UpdateUseProxy;
|
||||
var proxyAddress = Settings.Default.UpdateProxyAddress;
|
||||
var port = Settings.Default.UpdateProxyPort;
|
||||
var useAuthentication = Settings.Default.UpdateProxyUseAuthentication;
|
||||
var username = Settings.Default.UpdateProxyAuthUser;
|
||||
var cryptographyProvider = new LegacyRijndaelCryptographyProvider();
|
||||
var password = cryptographyProvider.Decrypt(Settings.Default.UpdateProxyAuthPass, Runtime.EncryptionKey);
|
||||
|
||||
SetProxySettings(shouldWeUseProxy, proxyAddress, port, useAuthentication, username, password);
|
||||
}
|
||||
|
||||
public void SetProxySettings(bool useProxy,
|
||||
string address,
|
||||
int port,
|
||||
bool useAuthentication,
|
||||
string username,
|
||||
string password)
|
||||
{
|
||||
if (useProxy && !string.IsNullOrEmpty(address))
|
||||
{
|
||||
_webProxy = port != 0 ? new WebProxy(address, port) : new WebProxy(address);
|
||||
_webProxy.Credentials = useAuthentication ? new NetworkCredential(username, password) : null;
|
||||
}
|
||||
else
|
||||
{
|
||||
_webProxy = null;
|
||||
}
|
||||
|
||||
UpdateHttpClient();
|
||||
}
|
||||
|
||||
public bool IsUpdateAvailable()
|
||||
{
|
||||
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return CurrentUpdateInfo.Version > GeneralAppInfo.GetApplicationVersion();
|
||||
}
|
||||
|
||||
public async Task DownloadUpdateAsync(IProgress<int> progress)
|
||||
{
|
||||
if (IsGetUpdateInfoRunning)
|
||||
{
|
||||
_getUpdateInfoCancelToken.Cancel();
|
||||
_getUpdateInfoCancelToken.Dispose();
|
||||
_getUpdateInfoCancelToken = null;
|
||||
|
||||
throw new InvalidOperationException("A previous call to DownloadUpdateAsync() is still in progress.");
|
||||
}
|
||||
|
||||
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling DownloadUpdateAsync().");
|
||||
}
|
||||
#if !PORTABLE
|
||||
CurrentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "msi"));
|
||||
#else
|
||||
var sfd = new SaveFileDialog
|
||||
{
|
||||
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
|
||||
FileName = CurrentUpdateInfo.FileName,
|
||||
RestoreDirectory = true
|
||||
};
|
||||
if (sfd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
CurrentUpdateInfo.UpdateFilePath = sfd.FileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
try
|
||||
{
|
||||
_getUpdateInfoCancelToken = new CancellationTokenSource();
|
||||
using var response = await _httpClient.GetAsync(CurrentUpdateInfo.DownloadAddress, HttpCompletionOption.ResponseHeadersRead, _getUpdateInfoCancelToken.Token);
|
||||
var buffer = new byte[_bufferLength];
|
||||
var totalBytes = response.Content.Headers.ContentLength ?? 0;
|
||||
var readBytes = 0L;
|
||||
|
||||
await using (var httpStream = await response.Content.ReadAsStreamAsync(_getUpdateInfoCancelToken.Token))
|
||||
{
|
||||
await using var fileStream = new FileStream(CurrentUpdateInfo.UpdateFilePath, FileMode.Create,
|
||||
FileAccess.Write, FileShare.None, _bufferLength, true);
|
||||
|
||||
while (readBytes <= totalBytes || !_getUpdateInfoCancelToken.IsCancellationRequested)
|
||||
{
|
||||
var bytesRead =
|
||||
await httpStream.ReadAsync(buffer, 0, _bufferLength, _getUpdateInfoCancelToken.Token);
|
||||
if (bytesRead == 0)
|
||||
{
|
||||
progress.Report(100);
|
||||
break;
|
||||
}
|
||||
|
||||
await fileStream.WriteAsync(buffer, 0, bytesRead, _getUpdateInfoCancelToken.Token);
|
||||
|
||||
readBytes += bytesRead;
|
||||
|
||||
var percentComplete = (int)(readBytes * 100 / totalBytes);
|
||||
progress.Report(percentComplete);
|
||||
}
|
||||
}
|
||||
|
||||
#if !PORTABLE
|
||||
var updateAuthenticode = new Authenticode(CurrentUpdateInfo.UpdateFilePath)
|
||||
{
|
||||
RequireThumbprintMatch = true,
|
||||
ThumbprintToMatch = CurrentUpdateInfo.CertificateThumbprint
|
||||
};
|
||||
|
||||
if (updateAuthenticode.Verify() != Authenticode.StatusValue.Verified)
|
||||
{
|
||||
if (updateAuthenticode.Status == Authenticode.StatusValue.UnhandledException)
|
||||
{
|
||||
throw updateAuthenticode.Exception;
|
||||
}
|
||||
|
||||
throw new Exception(updateAuthenticode.GetStatusMessage());
|
||||
}
|
||||
#endif
|
||||
|
||||
using var checksum = SHA512.Create();
|
||||
await using var stream = File.OpenRead(CurrentUpdateInfo.UpdateFilePath);
|
||||
var hash = await checksum.ComputeHashAsync(stream);
|
||||
var hashString = BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
|
||||
if (!hashString.Equals(CurrentUpdateInfo.Checksum))
|
||||
throw new Exception("SHA512 Hashes didn't match!");
|
||||
} finally{
|
||||
_getUpdateInfoCancelToken?.Dispose();
|
||||
_getUpdateInfoCancelToken = null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private void UpdateHttpClient()
|
||||
{
|
||||
if (_httpClient != null)
|
||||
{
|
||||
_httpClient.Dispose();
|
||||
}
|
||||
|
||||
var httpClientHandler = new HttpClientHandler();
|
||||
if (_webProxy != null)
|
||||
{
|
||||
httpClientHandler.UseProxy = true;
|
||||
httpClientHandler.Proxy = _webProxy;
|
||||
}
|
||||
_httpClient = new HttpClient(httpClientHandler);
|
||||
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(GeneralAppInfo.UserAgent);
|
||||
}
|
||||
|
||||
public async Task GetUpdateInfoAsync()
|
||||
{
|
||||
if (IsGetUpdateInfoRunning)
|
||||
{
|
||||
_getUpdateInfoCancelToken.Cancel();
|
||||
_getUpdateInfoCancelToken.Dispose();
|
||||
_getUpdateInfoCancelToken = null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_getUpdateInfoCancelToken = new CancellationTokenSource();
|
||||
var updateInfo = await _httpClient.GetStringAsync(UpdateChannelInfo.GetUpdateChannelInfo(), _getUpdateInfoCancelToken.Token);
|
||||
CurrentUpdateInfo = UpdateInfo.FromString(updateInfo);
|
||||
Settings.Default.CheckForUpdatesLastCheck = DateTime.UtcNow;
|
||||
|
||||
if (!Settings.Default.UpdatePending)
|
||||
{
|
||||
Settings.Default.UpdatePending = IsUpdateAvailable();
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_getUpdateInfoCancelToken?.Dispose();
|
||||
_getUpdateInfoCancelToken = null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> GetChangeLogAsync()
|
||||
{
|
||||
if (IsGetChangeLogRunning)
|
||||
{
|
||||
_changeLogCancelToken.Cancel();
|
||||
_changeLogCancelToken.Dispose();
|
||||
_changeLogCancelToken = null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_changeLogCancelToken = new CancellationTokenSource();
|
||||
return await _httpClient.GetStringAsync(CurrentUpdateInfo.ChangeLogAddress, _changeLogCancelToken.Token);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_changeLogCancelToken?.Dispose();
|
||||
_changeLogCancelToken = null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
100
mRemoteNG/App/Update/UpdateFile.cs
Normal file
100
mRemoteNG/App/Update/UpdateFile.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace mRemoteNG.App.Update
|
||||
{
|
||||
public class UpdateFile
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
// ReSharper disable MemberCanBePrivate.Local
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public Dictionary<string, string> Items { get; } =
|
||||
new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public UpdateFile(string content)
|
||||
{
|
||||
FromString(content);
|
||||
}
|
||||
|
||||
// ReSharper disable MemberCanBePrivate.Local
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public void FromString(string content)
|
||||
{
|
||||
if (string.IsNullOrEmpty(content)) return;
|
||||
|
||||
char[] keyValueSeparators = {':', '='};
|
||||
char[] commentCharacters = {'#', ';', '\''};
|
||||
|
||||
// no separators means no valid update data...
|
||||
if (content.Trim().IndexOfAny(keyValueSeparators) == -1) return;
|
||||
|
||||
using (var sr = new StringReader(content))
|
||||
{
|
||||
string line;
|
||||
while ((line = sr.ReadLine()) != null)
|
||||
{
|
||||
var trimmedLine = line.Trim();
|
||||
if (trimmedLine.Length == 0)
|
||||
continue;
|
||||
|
||||
if (trimmedLine.Substring(0, 1).IndexOfAny(commentCharacters) != -1)
|
||||
continue;
|
||||
|
||||
var parts = trimmedLine.Split(keyValueSeparators, 2);
|
||||
if (parts.Length != 2)
|
||||
continue;
|
||||
|
||||
// make sure we have valid data in both parts before adding to the collection. If either part is empty, then it's not valid data.
|
||||
if (string.IsNullOrEmpty(parts[0].Trim()) || string.IsNullOrEmpty(parts[1].Trim()))
|
||||
continue;
|
||||
|
||||
Items.Add(parts[0].Trim(), parts[1].Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ReSharper disable MemberCanBePrivate.Local
|
||||
private string GetString(string key)
|
||||
{
|
||||
// ReSharper restore MemberCanBePrivate.Local
|
||||
return !Items.ContainsKey(key) ? string.Empty : Items[key];
|
||||
}
|
||||
|
||||
public Version GetVersion(string key = "Version")
|
||||
{
|
||||
var value = GetString(key);
|
||||
return string.IsNullOrEmpty(value) ? null : new Version(value);
|
||||
}
|
||||
|
||||
public Uri GetUri(string key)
|
||||
{
|
||||
var value = GetString(key);
|
||||
return string.IsNullOrEmpty(value) ? null : new Uri(value);
|
||||
}
|
||||
|
||||
public string GetThumbprint(string key = "CertificateThumbprint")
|
||||
{
|
||||
return GetString(key).Replace(" ", "").ToUpperInvariant();
|
||||
}
|
||||
|
||||
public string GetFileName()
|
||||
{
|
||||
var value = GetString("dURL");
|
||||
var sv = value.Split('/');
|
||||
return sv[sv.Length - 1];
|
||||
}
|
||||
|
||||
public string GetChecksum(string key = "Checksum")
|
||||
{
|
||||
return GetString(key).Replace(" ", "").ToUpperInvariant();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
78
mRemoteNG/App/Update/UpdateInfo.cs
Normal file
78
mRemoteNG/App/Update/UpdateInfo.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
|
||||
// ReSharper disable UnusedAutoPropertyAccessor.Local
|
||||
|
||||
namespace mRemoteNG.App.Update
|
||||
{
|
||||
public class UpdateInfo
|
||||
{
|
||||
public bool IsValid { get; private set; }
|
||||
public Version Version { get; private set; }
|
||||
public Uri DownloadAddress { get; private set; }
|
||||
public string UpdateFilePath { get; set; }
|
||||
public Uri ChangeLogAddress { get; private set; }
|
||||
public Uri ImageAddress { get; private set; }
|
||||
public Uri ImageLinkAddress { get; private set; }
|
||||
#if !PORTABLE
|
||||
public string CertificateThumbprint { get; private set; }
|
||||
#endif
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public string FileName { get; set; }
|
||||
public string Checksum { get; private set; }
|
||||
|
||||
public static UpdateInfo FromString(string input)
|
||||
{
|
||||
var newInfo = new UpdateInfo();
|
||||
if (string.IsNullOrEmpty(input))
|
||||
{
|
||||
newInfo.IsValid = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var updateFile = new UpdateFile(input);
|
||||
newInfo.Version = updateFile.GetVersion();
|
||||
newInfo.DownloadAddress = updateFile.GetUri("dURL");
|
||||
newInfo.ChangeLogAddress = updateFile.GetUri("clURL");
|
||||
#if false
|
||||
newInfo.ImageAddress = updateFile.GetUri("imgURL");
|
||||
newInfo.ImageLinkAddress = updateFile.GetUri("imgURLLink");
|
||||
#endif
|
||||
#if !PORTABLE
|
||||
newInfo.CertificateThumbprint = updateFile.GetThumbprint();
|
||||
#endif
|
||||
newInfo.FileName = updateFile.GetFileName();
|
||||
newInfo.Checksum = updateFile.GetChecksum();
|
||||
newInfo.IsValid = newInfo.CheckIfValid();
|
||||
}
|
||||
|
||||
return newInfo;
|
||||
}
|
||||
|
||||
public bool CheckIfValid()
|
||||
{
|
||||
if (string.IsNullOrEmpty(Version.ToString()))
|
||||
return false;
|
||||
if (string.IsNullOrEmpty(DownloadAddress.AbsoluteUri))
|
||||
return false;
|
||||
if (string.IsNullOrEmpty(ChangeLogAddress.AbsoluteUri))
|
||||
return false;
|
||||
#if false
|
||||
if (string.IsNullOrEmpty(ImageAddress.AbsoluteUri))
|
||||
return false;
|
||||
if (string.IsNullOrEmpty(ImageLinkAddress.AbsoluteUri))
|
||||
return false;
|
||||
#endif
|
||||
#if !PORTABLE
|
||||
if (string.IsNullOrEmpty(CertificateThumbprint))
|
||||
return false;
|
||||
#endif
|
||||
if (string.IsNullOrEmpty(FileName))
|
||||
return false;
|
||||
// ReSharper disable once ConvertIfStatementToReturnStatement
|
||||
if (string.IsNullOrEmpty(Checksum))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
80
mRemoteNG/App/Windows.cs
Normal file
80
mRemoteNG/App/Windows.cs
Normal file
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using mRemoteNG.UI;
|
||||
using mRemoteNG.UI.Forms;
|
||||
using mRemoteNG.UI.Window;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public static class Windows
|
||||
{
|
||||
private static ActiveDirectoryImportWindow _adimportForm;
|
||||
private static ExternalToolsWindow _externalappsForm;
|
||||
private static PortScanWindow _portscanForm;
|
||||
private static UltraVNCWindow _ultravncscForm;
|
||||
private static ConnectionTreeWindow _treeForm;
|
||||
|
||||
internal static ConnectionTreeWindow TreeForm
|
||||
{
|
||||
get => _treeForm ?? (_treeForm = new ConnectionTreeWindow());
|
||||
set => _treeForm = value;
|
||||
}
|
||||
|
||||
internal static ConfigWindow ConfigForm { get; set; } = new ConfigWindow();
|
||||
internal static ErrorAndInfoWindow ErrorsForm { get; set; } = new ErrorAndInfoWindow();
|
||||
private static UpdateWindow UpdateForm { get; set; } = new UpdateWindow();
|
||||
internal static SSHTransferWindow SshtransferForm { get; private set; } = new SSHTransferWindow();
|
||||
|
||||
|
||||
public static void Show(WindowType windowType)
|
||||
{
|
||||
try
|
||||
{
|
||||
var dockPanel = FrmMain.Default.pnlDock;
|
||||
// ReSharper disable once SwitchStatementMissingSomeCases
|
||||
switch (windowType)
|
||||
{
|
||||
case WindowType.ActiveDirectoryImport:
|
||||
if (_adimportForm == null || _adimportForm.IsDisposed)
|
||||
_adimportForm = new ActiveDirectoryImportWindow();
|
||||
_adimportForm.Show(dockPanel);
|
||||
break;
|
||||
case WindowType.Options:
|
||||
using (var optionsForm = new FrmOptions())
|
||||
{
|
||||
optionsForm.ShowDialog(dockPanel);
|
||||
}
|
||||
|
||||
break;
|
||||
case WindowType.SSHTransfer:
|
||||
if (SshtransferForm == null || SshtransferForm.IsDisposed)
|
||||
SshtransferForm = new SSHTransferWindow();
|
||||
SshtransferForm.Show(dockPanel);
|
||||
break;
|
||||
case WindowType.Update:
|
||||
if (UpdateForm == null || UpdateForm.IsDisposed)
|
||||
UpdateForm = new UpdateWindow();
|
||||
UpdateForm.Show(dockPanel);
|
||||
break;
|
||||
case WindowType.ExternalApps:
|
||||
if (_externalappsForm == null || _externalappsForm.IsDisposed)
|
||||
_externalappsForm = new ExternalToolsWindow();
|
||||
_externalappsForm.Show(dockPanel);
|
||||
break;
|
||||
case WindowType.PortScan:
|
||||
_portscanForm = new PortScanWindow();
|
||||
_portscanForm.Show(dockPanel);
|
||||
break;
|
||||
case WindowType.UltraVNCSC:
|
||||
if (_ultravncscForm == null || _ultravncscForm.IsDisposed)
|
||||
_ultravncscForm = new UltraVNCWindow();
|
||||
_ultravncscForm.Show(dockPanel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Runtime.MessageCollector.AddExceptionStackTrace("App.Runtime.Windows.Show() failed.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
mRemoteNG/Config/ConfirmCloseEnum.cs
Normal file
11
mRemoteNG/Config/ConfirmCloseEnum.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
namespace mRemoteNG.Config
|
||||
{
|
||||
public enum ConfirmCloseEnum
|
||||
{
|
||||
Unspecified = 0,
|
||||
Never = 1,
|
||||
Exit = 2,
|
||||
Multiple = 3,
|
||||
All = 4
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace mRemoteNG.Config.Connections
|
||||
{
|
||||
public enum ConnectionsBackupFrequencyEnum
|
||||
{
|
||||
Unassigned = 0,
|
||||
Never = 1,
|
||||
OnEdit = 2,
|
||||
OnExit = 3,
|
||||
Daily = 4,
|
||||
Weekly = 5,
|
||||
Custom = 6
|
||||
}
|
||||
}
|
||||
59
mRemoteNG/Config/Connections/ConnectionsLoadedEventArgs.cs
Normal file
59
mRemoteNG/Config/Connections/ConnectionsLoadedEventArgs.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using mRemoteNG.Tools;
|
||||
using mRemoteNG.Tree;
|
||||
|
||||
namespace mRemoteNG.Config.Connections
|
||||
{
|
||||
public class ConnectionsLoadedEventArgs : EventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The previous <see cref="ConnectionTreeModel"/> that is being
|
||||
/// unloaded.
|
||||
/// </summary>
|
||||
public Optional<ConnectionTreeModel> PreviousConnectionTreeModel { get; }
|
||||
|
||||
/// <summary>
|
||||
/// True if the previous <see cref="ConnectionTreeModel"/> was loaded from
|
||||
/// a database.
|
||||
/// </summary>
|
||||
public bool PreviousSourceWasDatabase { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The new <see cref="ConnectionTreeModel"/> that is being loaded.
|
||||
/// </summary>
|
||||
public ConnectionTreeModel NewConnectionTreeModel { get; }
|
||||
|
||||
/// <summary>
|
||||
/// True if the new <see cref="ConnectionTreeModel"/> was loaded from
|
||||
/// a database.
|
||||
/// </summary>
|
||||
public bool NewSourceIsDatabase { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The path to the new connections source.
|
||||
/// If <see cref="NewSourceIsDatabase"/> is True, this will be the server and database name.
|
||||
/// If False, it will be a file path to the connection file.
|
||||
/// </summary>
|
||||
public string NewSourcePath { get; }
|
||||
|
||||
public ConnectionsLoadedEventArgs(Optional<ConnectionTreeModel> previousTreeModelModel,
|
||||
ConnectionTreeModel newTreeModelModel,
|
||||
bool previousSourceWasDatabase,
|
||||
bool newSourceIsDatabase,
|
||||
string newSourcePath)
|
||||
{
|
||||
if (previousTreeModelModel == null)
|
||||
throw new ArgumentNullException(nameof(previousTreeModelModel));
|
||||
if (newTreeModelModel == null)
|
||||
throw new ArgumentNullException(nameof(newTreeModelModel));
|
||||
if (newSourcePath == null)
|
||||
throw new ArgumentNullException(nameof(newSourcePath));
|
||||
|
||||
PreviousConnectionTreeModel = previousTreeModelModel;
|
||||
PreviousSourceWasDatabase = previousSourceWasDatabase;
|
||||
NewConnectionTreeModel = newTreeModelModel;
|
||||
NewSourceIsDatabase = newSourceIsDatabase;
|
||||
NewSourcePath = newSourcePath;
|
||||
}
|
||||
}
|
||||
}
|
||||
27
mRemoteNG/Config/Connections/ConnectionsSavedEventArgs.cs
Normal file
27
mRemoteNG/Config/Connections/ConnectionsSavedEventArgs.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using mRemoteNG.Tree;
|
||||
|
||||
namespace mRemoteNG.Config.Connections
|
||||
{
|
||||
public class ConnectionsSavedEventArgs
|
||||
{
|
||||
public ConnectionTreeModel ModelThatWasSaved { get; }
|
||||
public bool PreviouslyUsingDatabase { get; }
|
||||
public bool UsingDatabase { get; }
|
||||
public string ConnectionFileName { get; }
|
||||
|
||||
public ConnectionsSavedEventArgs(ConnectionTreeModel modelThatWasSaved,
|
||||
bool previouslyUsingDatabase,
|
||||
bool usingDatabase,
|
||||
string connectionFileName)
|
||||
{
|
||||
if (modelThatWasSaved == null)
|
||||
throw new ArgumentNullException(nameof(modelThatWasSaved));
|
||||
|
||||
ModelThatWasSaved = modelThatWasSaved;
|
||||
PreviouslyUsingDatabase = previouslyUsingDatabase;
|
||||
UsingDatabase = usingDatabase;
|
||||
ConnectionFileName = connectionFileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
35
mRemoteNG/Config/Connections/CsvConnectionsSaver.cs
Normal file
35
mRemoteNG/Config/Connections/CsvConnectionsSaver.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using mRemoteNG.App;
|
||||
using mRemoteNG.Config.DataProviders;
|
||||
using mRemoteNG.Config.Serializers.ConnectionSerializers.Csv;
|
||||
using mRemoteNG.Security;
|
||||
using mRemoteNG.Tree;
|
||||
|
||||
namespace mRemoteNG.Config.Connections
|
||||
{
|
||||
public class CsvConnectionsSaver : ISaver<ConnectionTreeModel>
|
||||
{
|
||||
private readonly string _connectionFileName;
|
||||
private readonly SaveFilter _saveFilter;
|
||||
|
||||
public CsvConnectionsSaver(string connectionFileName, SaveFilter saveFilter)
|
||||
{
|
||||
if (string.IsNullOrEmpty(connectionFileName))
|
||||
throw new ArgumentException($"Argument '{nameof(connectionFileName)}' cannot be null or empty");
|
||||
if (saveFilter == null)
|
||||
throw new ArgumentNullException(nameof(saveFilter));
|
||||
|
||||
_connectionFileName = connectionFileName;
|
||||
_saveFilter = saveFilter;
|
||||
}
|
||||
|
||||
public void Save(ConnectionTreeModel connectionTreeModel, string propertyNameTrigger = "")
|
||||
{
|
||||
var csvConnectionsSerializer =
|
||||
new CsvConnectionsSerializerMremotengFormat(_saveFilter, Runtime.CredentialProviderCatalog);
|
||||
var dataProvider = new FileDataProvider(_connectionFileName);
|
||||
var csvContent = csvConnectionsSerializer.Serialize(connectionTreeModel);
|
||||
dataProvider.Save(csvContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
9
mRemoteNG/Config/Connections/IConnectionsLoader.cs
Normal file
9
mRemoteNG/Config/Connections/IConnectionsLoader.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using mRemoteNG.Tree;
|
||||
|
||||
namespace mRemoteNG.Config.Connections
|
||||
{
|
||||
public interface IConnectionsLoader
|
||||
{
|
||||
ConnectionTreeModel Load();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using mRemoteNG.Config.DatabaseConnectors;
|
||||
|
||||
namespace mRemoteNG.Config.Connections.Multiuser
|
||||
{
|
||||
public delegate void
|
||||
ConnectionsUpdateAvailableEventHandler(object sender, ConnectionsUpdateAvailableEventArgs args);
|
||||
|
||||
public class ConnectionsUpdateAvailableEventArgs : EventArgs
|
||||
{
|
||||
public IDatabaseConnector DatabaseConnector { get; private set; }
|
||||
public DateTime UpdateTime { get; private set; }
|
||||
public bool Handled { get; set; }
|
||||
|
||||
public ConnectionsUpdateAvailableEventArgs(IDatabaseConnector databaseConnector, DateTime updateTime)
|
||||
{
|
||||
if (databaseConnector == null)
|
||||
throw new ArgumentNullException(nameof(databaseConnector));
|
||||
DatabaseConnector = databaseConnector;
|
||||
UpdateTime = updateTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using System;
|
||||
|
||||
namespace mRemoteNG.Config.Connections.Multiuser
|
||||
{
|
||||
public delegate void UpdateCheckFinishedEventHandler(object sender, ConnectionsUpdateCheckFinishedEventArgs args);
|
||||
|
||||
public class ConnectionsUpdateCheckFinishedEventArgs : EventArgs
|
||||
{
|
||||
public bool UpdateAvailable { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
|
||||
namespace mRemoteNG.Config.Connections.Multiuser
|
||||
{
|
||||
public interface IConnectionsUpdateChecker : IDisposable
|
||||
{
|
||||
bool IsUpdateAvailable();
|
||||
|
||||
void IsUpdateAvailableAsync();
|
||||
|
||||
event EventHandler UpdateCheckStarted;
|
||||
event UpdateCheckFinishedEventHandler UpdateCheckFinished;
|
||||
event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
using mRemoteNG.App;
|
||||
using System;
|
||||
using System.Timers;
|
||||
|
||||
// ReSharper disable ArrangeAccessorOwnerBody
|
||||
|
||||
namespace mRemoteNG.Config.Connections.Multiuser
|
||||
{
|
||||
public class RemoteConnectionsSyncronizer : IConnectionsUpdateChecker
|
||||
{
|
||||
private readonly System.Timers.Timer _updateTimer;
|
||||
private readonly IConnectionsUpdateChecker _updateChecker;
|
||||
|
||||
public double TimerIntervalInMilliseconds
|
||||
{
|
||||
get { return _updateTimer.Interval; }
|
||||
}
|
||||
|
||||
public RemoteConnectionsSyncronizer(IConnectionsUpdateChecker updateChecker)
|
||||
{
|
||||
_updateChecker = updateChecker;
|
||||
_updateTimer = new System.Timers.Timer(3000);
|
||||
SetEventListeners();
|
||||
}
|
||||
|
||||
private void SetEventListeners()
|
||||
{
|
||||
_updateChecker.UpdateCheckStarted += OnUpdateCheckStarted;
|
||||
_updateChecker.UpdateCheckFinished += OnUpdateCheckFinished;
|
||||
_updateChecker.ConnectionsUpdateAvailable +=
|
||||
(sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args);
|
||||
_updateTimer.Elapsed += (sender, args) => _updateChecker.IsUpdateAvailableAsync();
|
||||
ConnectionsUpdateAvailable += Load;
|
||||
}
|
||||
|
||||
private void Load(object sender, ConnectionsUpdateAvailableEventArgs args)
|
||||
{
|
||||
Runtime.ConnectionsService.LoadConnections(true, false, "");
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
public void Enable()
|
||||
{
|
||||
_updateTimer.Start();
|
||||
}
|
||||
|
||||
public void Disable()
|
||||
{
|
||||
_updateTimer.Stop();
|
||||
}
|
||||
|
||||
public bool IsUpdateAvailable()
|
||||
{
|
||||
return _updateChecker.IsUpdateAvailable();
|
||||
}
|
||||
|
||||
public void IsUpdateAvailableAsync()
|
||||
{
|
||||
_updateChecker.IsUpdateAvailableAsync();
|
||||
}
|
||||
|
||||
|
||||
private void OnUpdateCheckStarted(object sender, EventArgs eventArgs)
|
||||
{
|
||||
_updateTimer.Stop();
|
||||
UpdateCheckStarted?.Invoke(sender, eventArgs);
|
||||
}
|
||||
|
||||
private void OnUpdateCheckFinished(object sender, ConnectionsUpdateCheckFinishedEventArgs eventArgs)
|
||||
{
|
||||
_updateTimer.Start();
|
||||
UpdateCheckFinished?.Invoke(sender, eventArgs);
|
||||
}
|
||||
|
||||
public event EventHandler UpdateCheckStarted;
|
||||
public event UpdateCheckFinishedEventHandler UpdateCheckFinished;
|
||||
public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable;
|
||||
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
private void Dispose(bool itIsSafeToAlsoFreeManagedObjects)
|
||||
{
|
||||
if (!itIsSafeToAlsoFreeManagedObjects) return;
|
||||
_updateTimer.Dispose();
|
||||
_updateChecker.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user