Compare commits
1195 Commits
Author | SHA1 | Date | |
---|---|---|---|
5bb162322c | |||
90404f225a | |||
cc589e846d | |||
d265428c6c | |||
e1f46ae830 | |||
1feb411bd6 | |||
4d4c0007ae | |||
58bd748595 | |||
53b5bb581c | |||
972dd24c2b | |||
9d97db2025 | |||
09f48b47a1 | |||
aa2bb12335 | |||
412607fd12 | |||
029067b632 | |||
fc44237b3e | |||
1828e58b8a | |||
a14a75265c | |||
b9e7548f78 | |||
e147898521 | |||
d4e50a358b | |||
1a69e04d8c | |||
7ea72da491 | |||
8b0f5408f6 | |||
0b784ff93f | |||
fac10baaee | |||
a0a5b1335c | |||
b977776afc | |||
b456c997da | |||
4b0e7aa33a | |||
3dcccb72e1 | |||
e9cc30e5a4 | |||
7382caa63d | |||
831650987c | |||
2405477555 | |||
730ec0b5a1 | |||
4e89184f21 | |||
70d7478d1c | |||
c327e6b0fa | |||
350130acbe | |||
920f271ee4 | |||
f0fcaaed24 | |||
536ba9e6b3 | |||
3cb8178a0d | |||
bf788db964 | |||
53618152e6 | |||
058449948f | |||
85ddf36fa8 | |||
161029471a | |||
3d602957d3 | |||
8045256d37 | |||
e3044d09b3 | |||
f2a4ec38f7 | |||
4cd4980ccc | |||
da907aa4c1 | |||
8a3c90d37c | |||
74363530ec | |||
450abe5d92 | |||
226f152a46 | |||
959a2b6d90 | |||
1a5a22eb88 | |||
4fef129951 | |||
14cd9a5153 | |||
177ddeef58 | |||
a0e3d27388 | |||
8d8a27cf41 | |||
de0f4289ba | |||
875d9b0af8 | |||
0c28b5b59f | |||
caa26cd1ea | |||
9174356265 | |||
ea7b0e82a5 | |||
f2f843e540 | |||
781c964c4c | |||
445e41a25f | |||
3e65438e3d | |||
372ae4ddcd | |||
52ccbd7663 | |||
e675be840b | |||
ea694b98a5 | |||
25fc749e27 | |||
1da455529b | |||
587850b61c | |||
2f680f0579 | |||
f7f2ca64d0 | |||
f0cf124dea | |||
17c59eba23 | |||
ef3907c5ce | |||
4be3e6b4fd | |||
718a1cfa00 | |||
0896073b9b | |||
1ee86700cd | |||
b859a236a8 | |||
c266f2ea45 | |||
f0b0103007 | |||
a5f6484843 | |||
203739dd43 | |||
17a602fdd1 | |||
fd6d94e5a6 | |||
83d5419e8e | |||
90d1057492 | |||
7fa3ef2a43 | |||
858d7d6353 | |||
c4e4d7b489 | |||
ceafd68894 | |||
189deae1cf | |||
db66198dee | |||
493d9f307a | |||
69a8c3605c | |||
1e376f52bb | |||
6e0bc5481f | |||
6ab48520ec | |||
ad8ccfe9cb | |||
d27ef05ea5 | |||
b36a87019a | |||
e490264725 | |||
43972172ff | |||
ed06978230 | |||
f35cdeb3a0 | |||
4dc7b9f6ad | |||
bf3ea2dbf4 | |||
3af1c8d5b8 | |||
6c24844935 | |||
3621d23a37 | |||
8905dde7fb | |||
36c0bf53f5 | |||
746e82f5a5 | |||
513f9a59f2 | |||
54fe0e3356 | |||
bee5ef35a5 | |||
7ff7010c34 | |||
67b6055196 | |||
b176d1efb4 | |||
cf24d39b9a | |||
40cdd0ddb9 | |||
e9395cca4d | |||
6669676bae | |||
2f2f2f3c1b | |||
8cf28c910b | |||
08a010599e | |||
8248ad2840 | |||
0ee85db921 | |||
b8829df18a | |||
f215034928 | |||
1d226d54d1 | |||
abe5fb0d0e | |||
64e7fd9765 | |||
3ecf6fa6bf | |||
fb1e4bf37a | |||
f9db90f031 | |||
d62e0859e4 | |||
f307fd50bc | |||
f6062d5c68 | |||
e524c1e199 | |||
ffba3b04cd | |||
eca23ede6e | |||
ed86e30fe2 | |||
72e9b51b8f | |||
f6c459d134 | |||
ed02dd066f | |||
d9802557a6 | |||
f2f1c4e458 | |||
410f3a6890 | |||
b667703092 | |||
4dacbbf332 | |||
201d3a4710 | |||
02f4051ef3 | |||
4f9ddb5634 | |||
32832519a1 | |||
290e26cb63 | |||
02955f0f43 | |||
c7ee370f4e | |||
d4cce046eb | |||
21a0fa9e1b | |||
2823d81758 | |||
6c3484e67f | |||
99d02b27b3 | |||
7cc52cd8e4 | |||
461f0f3e19 | |||
65135d36a3 | |||
2745ede24a | |||
033a36c4bf | |||
91ba9b4248 | |||
e881e4a002 | |||
f1c8e01b44 | |||
61d8069b76 | |||
512ee523d7 | |||
63316a7b8a | |||
aab22b89e1 | |||
094e5d2bd3 | |||
66735e0c59 | |||
adbaa6a7d9 | |||
189922a500 | |||
2a610015d6 | |||
ff448fb1ad | |||
7fb319ed75 | |||
b9f8b78cc4 | |||
6c54104977 | |||
75d4dfc18e | |||
102b5643cf | |||
dce66940fc | |||
ea44b3fa47 | |||
671b5b08e3 | |||
38805aaf65 | |||
f802210bd4 | |||
1165ee3b67 | |||
57b4a9cef1 | |||
c586ee2001 | |||
c38ea4bb68 | |||
eb5cebf360 | |||
0c56893b05 | |||
f42785d9b2 | |||
56ecbddbda | |||
d74eed052d | |||
5894116a74 | |||
fca583c683 | |||
fcf23af78d | |||
3ec8ab5db5 | |||
83a79e0693 | |||
5e4da8f2ca | |||
32210df8a5 | |||
beef878da9 | |||
bc4c34c1b4 | |||
309977c6cb | |||
c97400d7ce | |||
bd1b8bebac | |||
89596fe643 | |||
f8f0603df9 | |||
f6265108b2 | |||
bb1c3a1b59 | |||
b40c1e518a | |||
81b05fe550 | |||
80c0d01b81 | |||
8c93ea1629 | |||
7b6dde0460 | |||
5ce876afb2 | |||
a62297c82d | |||
41cf7bf2ff | |||
fcf186fe46 | |||
8cb6cf52d5 | |||
dbf6f31e98 | |||
71ae7f061c | |||
d1316a89bc | |||
cd3a446a54 | |||
a920baaa83 | |||
7c44bbb263 | |||
303118ad92 | |||
ed08db7c24 | |||
cc2773c2d2 | |||
5d5ecbe8a9 | |||
d7f21964b5 | |||
ee80807b5e | |||
6112a16718 | |||
bfa2fc4009 | |||
daa5299450 | |||
91d3a550fb | |||
8a2a3def51 | |||
a604fa9a8c | |||
b0a538459d | |||
a6976d1a56 | |||
adcfbd2e30 | |||
6ccdb2d1b5 | |||
d7031e7a21 | |||
3a19961640 | |||
3e19711ae0 | |||
b3d8f9bc36 | |||
42a7df1f5a | |||
3853cbd9e2 | |||
cd18ee6701 | |||
73bf61ccb1 | |||
eaa8085914 | |||
b99c86075c | |||
f6b3fd69c2 | |||
0eea52779f | |||
77c75931b8 | |||
2f7b0e058e | |||
1f730f59e7 | |||
d3ab19a83b | |||
11023c3cda | |||
491116531f | |||
afd3e5d566 | |||
44c025dc29 | |||
6b3d3ba169 | |||
ce9197822e | |||
608a859573 | |||
abeeee18a6 | |||
1460b0021e | |||
94e0aa6066 | |||
ce70a68884 | |||
06515408b2 | |||
016da48242 | |||
47e5d97de2 | |||
6f9d9185b0 | |||
b5033238f6 | |||
910674455f | |||
f54750dfea | |||
9233c87f1f | |||
252b063a1d | |||
792e1db128 | |||
150d360876 | |||
3f98e44f9c | |||
d1af92ab22 | |||
352a3ef234 | |||
efd11f28fb | |||
dc56f6b737 | |||
ae0e6f85db | |||
7eb03c4340 | |||
1dabd10883 | |||
03aaa13aca | |||
6e950c506b | |||
c2b9b431a0 | |||
a99d81acaf | |||
1be46fb794 | |||
0e1af27684 | |||
17303a5909 | |||
41b454fa0e | |||
e747bcc2d9 | |||
0b6b01b9ed | |||
cc79e17b93 | |||
b6f75980d2 | |||
042e6f4226 | |||
7e836f5615 | |||
e014326bc1 | |||
5bbd7b86f9 | |||
fa15d9f286 | |||
c09c7118a0 | |||
61e1f2f64e | |||
f951089db7 | |||
1471396934 | |||
82b3167779 | |||
793c238d97 | |||
0b47ec6447 | |||
279d449704 | |||
aec3f0d675 | |||
29198b0d5a | |||
8776048502 | |||
3bc800cbf5 | |||
be9843edd3 | |||
85f97b1c3a | |||
2c49d4d527 | |||
a7e5250ac0 | |||
530fcc216b | |||
61d88d74e7 | |||
8238963319 | |||
e10cad84c4 | |||
d1b9d1303a | |||
e1931d98ad | |||
fbe181e23b | |||
040d3f83b8 | |||
f056fbe0e1 | |||
cab2ea1004 | |||
ce7789b9e7 | |||
1c0b8f302c | |||
b503dd4ad8 | |||
39b2536a09 | |||
6c80d9e478 | |||
d91ae7cc04 | |||
4d51c91b22 | |||
c7b94a02f8 | |||
911395f8c7 | |||
7d405ad1d0 | |||
eff39f1243 | |||
5f89a419b1 | |||
2bfc07c58d | |||
298ad1adf0 | |||
abe6d97c54 | |||
974ae06b27 | |||
5104877c14 | |||
c5d6a3eabe | |||
d22d91057a | |||
bbe082c014 | |||
4bc40c1280 | |||
ab361bbca6 | |||
a59d46b286 | |||
c9e04bc690 | |||
a9eba5ac83 | |||
45e5f3fd4b | |||
551ca72065 | |||
168de14d6b | |||
c11f7eae2a | |||
c732eb299a | |||
b0a8460fb7 | |||
8b8b15b885 | |||
1db2e57e23 | |||
06a254cfdd | |||
e6fa1a7aef | |||
52ec156577 | |||
5aa38adce7 | |||
dcebd777af | |||
cee6509dfa | |||
339d10e94c | |||
03f28612a8 | |||
e51f00f7bc | |||
4eeff3100a | |||
9463cc91e4 | |||
4e38e01c0e | |||
dddccbc46d | |||
f5e399cb50 | |||
e06d9ada34 | |||
2a05f2dca9 | |||
f6edabc3cc | |||
93e8922c4c | |||
c8b0448d4b | |||
8734ccea00 | |||
f852f7f68c | |||
3b187f6cd4 | |||
f2c80e8e56 | |||
eb3b1e3606 | |||
e3aec9fbea | |||
364e3fcf65 | |||
6f4044fb72 | |||
8a052b52b3 | |||
5995640f1c | |||
cdf1d910a9 | |||
9508d3f2b7 | |||
c11f8d32ec | |||
575321ac10 | |||
49c2d31ccb | |||
06497b6c99 | |||
f73293c138 | |||
a4a555bcef | |||
0fb945fcde | |||
6fce47d9b6 | |||
ba31880a1f | |||
8c8edfe44e | |||
61d926bd68 | |||
d23f5dd3e6 | |||
c299218795 | |||
5a1b0f09b8 | |||
5eab10985e | |||
909ce7bf96 | |||
599b97c6f3 | |||
99284792a8 | |||
bcb5483bc6 | |||
538f189285 | |||
f1161d2744 | |||
1cd166b67b | |||
cd1daacebf | |||
8cd60d567f | |||
cfd1173178 | |||
dff6b47d25 | |||
98ddfa2401 | |||
242274b1b6 | |||
399b8e2638 | |||
22e13fe753 | |||
c30158ab1c | |||
04425ecd04 | |||
53954c3917 | |||
2c71f243e2 | |||
aaffec4006 | |||
07c362cb15 | |||
6713e2f654 | |||
fc9459f814 | |||
ad5b477cce | |||
2c51652c8b | |||
daca6e01fc | |||
2b4c6eda84 | |||
7fd4143c71 | |||
e7590171f3 | |||
ce7cc612ac | |||
f33bf7da19 | |||
36528fab7a | |||
e4d3eafb49 | |||
47372684a1 | |||
78f54a5dc2 | |||
1ee91a710c | |||
384ecc9ed4 | |||
2b9a3e7885 | |||
e2b9419499 | |||
156aa6ed6b | |||
38ca5cfa61 | |||
c3840a10de | |||
1584001aaf | |||
af00d15975 | |||
f986054aee | |||
61757a9ffe | |||
6d094abaae | |||
4b5e30dfc9 | |||
944b14662d | |||
b70dd192c3 | |||
29987d84ce | |||
92de2eb40e | |||
815d9488ff | |||
c446db7ebb | |||
5cf9234791 | |||
065f528a1f | |||
539cd7e521 | |||
8377fa6961 | |||
85927fec44 | |||
8675e50ba4 | |||
fb2f088402 | |||
9fb4ea7b13 | |||
a142488ccc | |||
d4ff2f3ed9 | |||
1de809b3bc | |||
a029d3baac | |||
ed624a586f | |||
1f6990a2fc | |||
853d0996dd | |||
140a20c13e | |||
66eebcf21c | |||
60227262ac | |||
50cc0d6207 | |||
ca4a0d7a37 | |||
f0a2e731c0 | |||
1d703439f2 | |||
fe33636194 | |||
cb3d85d11a | |||
b8dcb87e08 | |||
953ecdfa53 | |||
961d5f5ec2 | |||
732ae3901a | |||
ff5f097d77 | |||
7337955af3 | |||
349e2f19ae | |||
bf91280b50 | |||
2e7a18f10f | |||
cc8cf1b992 | |||
bb6fe3418d | |||
7ff38c9d1a | |||
7eddd7eccb | |||
941a2eacfc | |||
8b45ca2660 | |||
5ec1a640e8 | |||
9b27de8c45 | |||
2eae693cb1 | |||
08ccf30f8e | |||
65ba89198f | |||
3790b69a3e | |||
c58ad19dcc | |||
2db6118cbe | |||
05773071cb | |||
5d9f453a48 | |||
5e63ef5cda | |||
58cd93a93a | |||
b6ddcf38e7 | |||
a653aef496 | |||
5fcdfc0f03 | |||
8d2271109a | |||
f4f84f5f68 | |||
08a409324d | |||
a2b6bcdfa7 | |||
b3ae89c9fa | |||
406c4a958b | |||
33d72b07cb | |||
f882241bce | |||
e8c798235c | |||
be6d49897c | |||
eb4fbac464 | |||
f6d3f9a4ab | |||
76cc72d459 | |||
c508af96b3 | |||
ec310c1749 | |||
a4f5634b52 | |||
be72e12590 | |||
9c8afadab5 | |||
7632204dc1 | |||
fb68c2e7e1 | |||
0c1c203427 | |||
c1e0f92b91 | |||
d05d35c55e | |||
e3b6ceccc9 | |||
c7b17838c6 | |||
941e6569c5 | |||
d49894dd4f | |||
46c9d3d836 | |||
19aa62f289 | |||
03662ada43 | |||
3ae2693b99 | |||
d373691a25 | |||
7b71a3cccb | |||
8abc0be61b | |||
50d08956ec | |||
0b6bb751c3 | |||
c58c37f476 | |||
c73419b220 | |||
efaf4fc876 | |||
2751260700 | |||
ce9a66d60e | |||
ef7dd30233 | |||
cc606cf278 | |||
50d086de36 | |||
2731a3589f | |||
7cdc02e817 | |||
105dceae08 | |||
73f56ccc7d | |||
737afe81a3 | |||
b277db4493 | |||
f407444918 | |||
ef90fa3045 | |||
1ebba738d8 | |||
5b1a82f4b6 | |||
54bde739e6 | |||
105073e0ec | |||
36ce21f0b9 | |||
8198038055 | |||
60ca514d5a | |||
52e9012a14 | |||
b650be47fd | |||
fde620cecc | |||
0d1925f168 | |||
e9b0a21300 | |||
cdeaba3a6b | |||
d89d57eddd | |||
3fd7591968 | |||
d5318a298f | |||
a02efcd1dc | |||
0ecfe27a92 | |||
986801889e | |||
bbcc751464 | |||
0a8f5eec28 | |||
a4e8152d4c | |||
b8af7b66e7 | |||
d746bf15c6 | |||
05dee1b4b9 | |||
19164cf0cc | |||
ccdc8de9d3 | |||
f7e445991f | |||
1eb0b17ae7 | |||
ab018b8a70 | |||
74188463c3 | |||
5a2deb4142 | |||
4d4518457d | |||
d30e7b01ae | |||
ec582bc69c | |||
9b4341ae1e | |||
bc328dd978 | |||
1e59f624f0 | |||
c0d3d872b1 | |||
1ae319b6c1 | |||
a7140a1f0f | |||
a855a7dc0e | |||
f1ee9dfc54 | |||
2f4d02de1d | |||
a0f8c5aa79 | |||
6fa780dbcc | |||
7f8d897a0b | |||
b83382ceee | |||
e9a74c07d7 | |||
773c98b9a7 | |||
fb5a711b2e | |||
c655bb450e | |||
629ef90722 | |||
0ed4a5f425 | |||
25e40067fb | |||
bb09665916 | |||
d3e9af255b | |||
9cd61c21a9 | |||
8fa2039379 | |||
29794f103c | |||
60726530f3 | |||
997131e327 | |||
f1d50b8a51 | |||
bc5a359434 | |||
584dcbfa0a | |||
5dad30418f | |||
95be079e1c | |||
e7d34e597e | |||
c885d9e08b | |||
eadb4be415 | |||
f36b518758 | |||
6a6388fbd9 | |||
4ab4573230 | |||
b94d647e98 | |||
7c46532d7a | |||
91a8fd0c72 | |||
1d9e9553ae | |||
dd9aba4e01 | |||
1e3ea67b2b | |||
d0be44facc | |||
fb62d9f165 | |||
658e2b6a5e | |||
16b2bf2186 | |||
cb62eef752 | |||
2894386112 | |||
7e1a709b17 | |||
c58e382ad0 | |||
30bcee3e4a | |||
c413b84ce7 | |||
cefbd93e1f | |||
271d5a533c | |||
b0e46845ab | |||
a932e44eab | |||
7a1c66eba5 | |||
b5767cfad8 | |||
e60f487117 | |||
099f65e210 | |||
332d073b11 | |||
bc59c3bad7 | |||
b2041e776a | |||
fdbba15fbd | |||
5a80fad2c7 | |||
f63cfd3a4b | |||
06010e34b3 | |||
b4b6a62ee7 | |||
e46b0195c2 | |||
1ed4722894 | |||
31759a0ef8 | |||
b3a30ef34d | |||
efff663955 | |||
a2d25ee30d | |||
f3f696aa5e | |||
8eadbc8cb3 | |||
cd1ae416f8 | |||
9cb1bd6638 | |||
96874a7cae | |||
ecf6c9bca4 | |||
f440a95d92 | |||
0c1e2ee8f8 | |||
e7e0afd088 | |||
dc9673c6b4 | |||
09da36cf36 | |||
4512a7fdfc | |||
1bfedfb09b | |||
337a6fbf82 | |||
feb2a7d594 | |||
2ebf144992 | |||
040f4cba23 | |||
ebddf89ae3 | |||
51b17a3059 | |||
9c0e6d28e6 | |||
2aadb4cf0e | |||
588301c29f | |||
ffb635d499 | |||
ba21f4e5cf | |||
96eef131e1 | |||
9a52bd5071 | |||
9faebbc970 | |||
7275126cea | |||
e79e80646c | |||
5d28ffbddc | |||
3e64be4198 | |||
72ef267f2e | |||
6736697bcd | |||
f5d311fc36 | |||
813df6af57 | |||
fc901df6b7 | |||
f9f5587cfa | |||
7d86475948 | |||
2af7d7d745 | |||
45c3413d7b | |||
8ba364bd4d | |||
e51e06a9b4 | |||
0ea368e92e | |||
9ae6ab79e9 | |||
ef49d3e940 | |||
f0d7b5af80 | |||
57f0937590 | |||
4ee2a1128d | |||
5c3a5c8608 | |||
ab9e0ad798 | |||
6d5e8beada | |||
0bc123b387 | |||
2b78e5cb38 | |||
1925a391b8 | |||
923eb1e3cc | |||
fd9a18aa02 | |||
cfc9e185d6 | |||
2d820429c9 | |||
66c025d767 | |||
2e1d5fed16 | |||
f9ffa3b60d | |||
4e21f29e83 | |||
e96b77617d | |||
548d5f643e | |||
c7b89a5ace | |||
36d7628865 | |||
2cea5d54fa | |||
230600c87d | |||
c150666394 | |||
75e3402971 | |||
df9030cded | |||
d6b3b63264 | |||
190de76e2e | |||
6407555750 | |||
92f25e09dd | |||
d69e416f0e | |||
0c516f1dff | |||
b355e43cb6 | |||
284dd0b3c5 | |||
378f4e29f3 | |||
fa2a1743d6 | |||
f84f194709 | |||
61876c7566 | |||
1134d3f7a4 | |||
3d94dd8296 | |||
ffed154e4c | |||
3f8645b78d | |||
3389c937cf | |||
7889e7bc00 | |||
d9aa5e8ae0 | |||
d9de95451f | |||
7a8719ea6f | |||
2e99c53a76 | |||
07e75bdfd9 | |||
4095dadd6a | |||
a220b4e541 | |||
6d485d9ee4 | |||
955b36f659 | |||
d4c78899d8 | |||
0f8f7473bb | |||
f4ad3a9ac8 | |||
f6ab7eb6bf | |||
a94e79b73e | |||
536fddd3e0 | |||
288f2c72d6 | |||
3e2c6d2fec | |||
0fbfe80580 | |||
6772ae887a | |||
7c64dcb9fd | |||
9cde4d1bd5 | |||
380a21985d | |||
4d640a77f7 | |||
ca9895ea75 | |||
632964211c | |||
3857dc0a6c | |||
174b32991d | |||
5e808fe1bc | |||
1ea5036324 | |||
39a71862b6 | |||
2915c9177d | |||
691a716483 | |||
6ab6e8b331 | |||
c63f43661f | |||
3f4467ca31 | |||
1632599a36 | |||
53226a3013 | |||
dfba529646 | |||
6602d2f52a | |||
8b99d3d803 | |||
33b9d96802 | |||
1c40f1ad46 | |||
92987bf4bc | |||
5ccabbc147 | |||
25f679f062 | |||
a26e285980 | |||
bf1e509c45 | |||
97ba5ba1b9 | |||
0dae261a6d | |||
2616e81714 | |||
ad840ce526 | |||
459838c4e8 | |||
bededbbdb1 | |||
8c54ba8eeb | |||
50739c3d26 | |||
87088b7d5e | |||
ecf355abb7 | |||
871203fdbd | |||
ca1e9e18cb | |||
686ce773f4 | |||
ecfbebb645 | |||
bbbc208893 | |||
14644f9962 | |||
fcc1e1c4a0 | |||
10f5136871 | |||
7cddb46720 | |||
6d34d7a164 | |||
76a19fbc3e | |||
a76ddc8a09 | |||
793b846a43 | |||
bcec63fb8e | |||
4819a19eac | |||
c85de7f257 | |||
2559c9097a | |||
f80331e289 | |||
5e381377cc | |||
8d844f8496 | |||
2445f8662a | |||
671aa580ba | |||
44575179eb | |||
fcc97f0ac8 | |||
641c1a8c32 | |||
de87e84775 | |||
eb83665028 | |||
b2722ec8fd | |||
6171db84cb | |||
91aa1af46b | |||
6998361a48 | |||
7f58103713 | |||
cbbc76fad2 | |||
ceca4bda79 | |||
be8ecf2d5e | |||
82e0f704aa | |||
2493cfee10 | |||
c5b499718a | |||
c471e1bef2 | |||
0561ce9f33 | |||
e7accfa96a | |||
61049a17e1 | |||
d6ef1aede2 | |||
02ddd9bc1e | |||
d0f4dca65f | |||
bd0055740a | |||
c2c421c14e | |||
65cc6952a5 | |||
9419429423 | |||
9f4bf105ae | |||
f3ce63c3f5 | |||
fc3794ce91 | |||
3c57983fcd | |||
89ae1eaf41 | |||
676da49d98 | |||
57b2ba5975 | |||
4239ee918e | |||
53efc63100 | |||
1b97225cd1 | |||
c96e33350e | |||
8aafb8de01 | |||
d96d349d89 | |||
85a6808efc | |||
89ac75a60f | |||
968f7db690 | |||
871644854c | |||
ca32f7c101 | |||
0ab27c35bc | |||
81e66754f4 | |||
1b1bdbb150 | |||
26e88b4858 | |||
04b9f61451 | |||
3819217e72 | |||
e187c7dbe1 | |||
a7e6c9677e | |||
04c102d36f | |||
a1fa930972 | |||
8e9672d635 | |||
531343afc4 | |||
5c9d505728 | |||
4626549730 | |||
ef0fb08157 | |||
75963a89e7 | |||
53ac08b647 | |||
beff73d2de | |||
710f71a73e | |||
80f9d7b5d3 | |||
376409bca5 | |||
eb2a8263d7 | |||
bc96b08755 | |||
d0c9c5d38f | |||
b624bbd80a | |||
6036344873 | |||
7b705f80c5 | |||
fd3c19cfda | |||
ca116cb935 | |||
895e547acd | |||
c922ef2b80 | |||
cab583fd1c | |||
2e73954e1b | |||
28877bbdbe | |||
3438a0d16e | |||
2769bab7aa | |||
e7e773ec54 | |||
456e304ebc | |||
6bfa4e9c63 | |||
3b920ba0e5 | |||
bbdbe6464d | |||
fe4adb7b0c | |||
dfa190a9df | |||
08d6246fba | |||
2a1f67b8e9 | |||
b8b9ff9e95 | |||
cd47174b30 | |||
5b596ef21a | |||
27693cca9e | |||
3a5138a3f2 | |||
8160577d6e | |||
6387d685e7 | |||
8bb946ace2 | |||
58e53462e0 | |||
076035da0f | |||
5abc5b2a4c | |||
03c1200941 | |||
8827bfe8e0 | |||
8d7c46f342 | |||
2c5c337fa0 | |||
c1b83de1fb | |||
4926f59e79 | |||
79784245d8 | |||
13d7d49279 | |||
3acbddba3b | |||
5310662ed1 | |||
82bd8b7458 | |||
e7019f22e4 | |||
51b76839c3 | |||
70ac4d9f8c | |||
4b6c118e63 | |||
5bdeabe3ab | |||
2b26a1a817 | |||
01470a41c4 | |||
fba64d4079 | |||
2b5ae71d10 | |||
4b930ab68a | |||
f279467c66 | |||
56ff3b6258 | |||
54bb47deee | |||
60aee15a76 | |||
ef6339c7c6 | |||
4d9b86d173 | |||
b09723757e | |||
d9d6109067 | |||
ac29a7b625 | |||
a3e41edd57 | |||
df236810ad | |||
f1b4e2dd95 | |||
12a51ce2ab | |||
e8d5653b7d | |||
660761a2b8 | |||
d693f575ed | |||
d862d76cbb | |||
7d9c3c0841 | |||
613761a505 | |||
847edab82e | |||
162fedd2ef | |||
78af1b5db0 | |||
43462e4d9a | |||
bebfdce0a6 | |||
cee5168076 | |||
3554c55b0c | |||
c1ff4db42a | |||
4f72befc28 | |||
025f22d7f1 | |||
e974610602 | |||
99431bd990 | |||
86be63f7df | |||
4016fe37d3 | |||
3d0fc91063 | |||
1119384439 | |||
0f5381fc14 | |||
006e13cb13 | |||
354ed9348c | |||
d7c9604b59 | |||
d19a34395f | |||
299216033c | |||
cfb58f3b29 | |||
ca411afe8b | |||
5c0dc3cafc | |||
2bf0f8b17b | |||
da1f8f2f09 | |||
490d17d269 | |||
1c922bc4b9 | |||
49520296be | |||
25895fb771 | |||
a2c20bed27 | |||
6486e87dc0 | |||
26e7a2f5c2 | |||
c6f4cf55ec | |||
6a20739eb6 | |||
e031244899 | |||
a8b8633126 | |||
27f03431aa | |||
bf68cf0a3a | |||
0ceaabdfc6 | |||
8200581ff3 | |||
a8066b68fd | |||
7371db7184 | |||
a57e3e1e16 | |||
2cf1cfdac4 | |||
732fe3828a | |||
0f2be651a5 | |||
253bf5eea1 | |||
260d314b34 | |||
3c6f993dfc | |||
83e0bb5b2d | |||
278ac693cc | |||
826e9512cb | |||
a9a4ff0eba | |||
5d4f451107 | |||
add895b839 | |||
215beed570 | |||
2263dff0cf | |||
50f0b77bde | |||
f56976c116 | |||
c60c160f0e | |||
7b9c4607f6 | |||
3c5e7adba2 | |||
3815b0e2cf | |||
28a5d9d7bf | |||
e39f1b7b36 | |||
d357ec257a | |||
fc30285fd0 | |||
6295c19cbd | |||
4deace135a | |||
c5c8deaa40 | |||
ea4527b915 | |||
f64f6a6f92 | |||
30444145a9 | |||
f7a68c25dd | |||
dc8268d802 | |||
afac9da61c | |||
ae0c30cc42 | |||
78107d0230 | |||
8cd1bacf09 | |||
c035a31847 | |||
8fc09353d3 | |||
cb6c6238ee | |||
ba320a6ab9 | |||
d5eeb04554 | |||
26773028cf | |||
31d2f675cf | |||
da29e3b2c1 | |||
fec76384ec | |||
1d0af01552 | |||
0e7bd43eb9 | |||
9b6001691d | |||
7fe95ba208 | |||
dc93c38313 | |||
f8fd84339e | |||
f52b038ba7 | |||
f9baddf80a | |||
b29c9588f1 | |||
e7ce41ddba | |||
d2b871cb5a | |||
2ed40e017d | |||
8c60df4494 | |||
57285afc42 | |||
59414fbe2c | |||
5feac462e5 | |||
b631d57574 | |||
b98663a291 | |||
6f9a01dd01 | |||
ae4f2628f4 | |||
b51da8cbec | |||
e4cc01face | |||
090a22761f | |||
862d44ef01 | |||
653518d50d | |||
0f744857d4 | |||
374d9046f3 | |||
d3cc98c478 | |||
ed3409a14b | |||
fa69ce339d | |||
dedebe5ecb | |||
94f8884083 | |||
e306c2dced | |||
b332bf0ac6 | |||
78d7ea32a4 | |||
b9f0fb1368 | |||
5771190b78 | |||
7ab5dfb706 | |||
82e35e0ee3 | |||
8dedeb286b | |||
c2818b644a | |||
46c179ee53 | |||
d306929844 | |||
fee82cecc7 | |||
a55509ed4b | |||
9237569b4f | |||
6f20ca06b1 | |||
7602ad2e19 | |||
58578352a1 | |||
0b5ffc1579 | |||
e6553f919e | |||
b60bb75b31 | |||
ebc5233e26 | |||
273e803288 | |||
b7eefd8edf | |||
f2b18ce314 | |||
d2264160e0 | |||
eb5f05c444 | |||
8fec3be4e2 | |||
54ed2820f4 | |||
3b8ae917b2 | |||
e7f6afce81 | |||
c8f38cf499 | |||
196664d529 | |||
e25ea2331a | |||
9e3442f623 | |||
b96807cfc5 | |||
ba91d80c02 | |||
39c409a827 | |||
cb4b5a41d4 | |||
ab3b54f05a | |||
47838e880e | |||
e06f0aedad | |||
44d7668121 | |||
e5869f0bf1 | |||
d098c8d9e4 | |||
9dbca511fe | |||
8902591672 | |||
7922ad2d34 | |||
40a62f4542 | |||
f6f2bdee1f | |||
652ae03468 | |||
fd2e83222c | |||
7b902e4450 | |||
bfd1347c4c | |||
aba4a5b388 | |||
5390ddc0a0 | |||
fd9253ebd7 | |||
a3ae932025 | |||
0ef2c3dbb5 | |||
bf768777fa | |||
9e53a48d7d | |||
15c0fb8f27 | |||
a3588509a9 | |||
5e33a5af1f |
11
CITATION.cff
Normal file
11
CITATION.cff
Normal file
|
@ -0,0 +1,11 @@
|
|||
cff-version: 1.2.0
|
||||
message: "If you use this software, please cite it as below."
|
||||
authors:
|
||||
- family-names: "Go"
|
||||
given-names: "Namhyeon"
|
||||
orcid: "https://orcid.org/0009-0006-8421-0911"
|
||||
title: "ReasonableFramework"
|
||||
version: v1.6.8
|
||||
doi: 10.5281/zenodo.11392417
|
||||
date-released: 2024-05-30
|
||||
url: "https://github.com/gnh1201/reasonableframework"
|
8
FUNDING.yml
Normal file
8
FUNDING.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: gnh1201
|
||||
open_collective: welsonjs
|
||||
liberapay: catswords
|
||||
custom: ['https://www.buymeacoffee.com/catswords', 'https://toss.me/catswords']
|
||||
patreon: catswords # Replace with a single Patreon username
|
||||
ko_fi: catswords
|
107
KOREAN.MD
107
KOREAN.MD
|
@ -1,55 +1,98 @@
|
|||
## 기반 소프트웨어
|
||||
|
||||
본 웹 소프트웨어는 ReasonableFramework 기반으로 작성되었습니다.
|
||||
|
||||
https://github.com/gnh1201/reasonableframework
|
||||
# 본 웹 어플리케이션에 대하여
|
||||
본 웹 어플리케이션은 ReasonableFramework 기반으로 작성됨. https://github.com/gnh1201/reasonableframework
|
||||
|
||||
## 적재된 모듈 목록
|
||||
|
||||
* System: base (시스템 기반)
|
||||
|
||||
* System: config (시스템 설정)
|
||||
|
||||
* System: database (데이터베이스)
|
||||
|
||||
* System: logger (로그)
|
||||
|
||||
* System: uri (URI 및 URL 제어)
|
||||
|
||||
* System: security (보안)
|
||||
|
||||
* Helper: paginate (페이지 네비게이션)
|
||||
|
||||
* Helper: gnuboard, gnuboard.config, gnuboard.lib (그누보드 설정 및 라이브러리 연동)
|
||||
|
||||
* Helper: vworld (국토교통부 vworld 연동)
|
||||
|
||||
* Helper: wprest (워드프레스[wordpress] REST API 클라이언트)
|
||||
|
||||
* Hepler: webpagetool (Proxy 설정, UA 설정, JSON/DOM 파서를 지원하는 HTTP 클라이언트)
|
||||
|
||||
* Helper: noreporting, allreporting (오류 출력 범위를 설정)
|
||||
|
||||
* Helper: isemail.lnk (is_email 지원 -> /vendor/isemail)
|
||||
|
||||
* Helper: metaparser.lnk (HTML META 데이터 파싱 지원 -> /vendor/PHP-MetaParser)
|
||||
|
||||
* Helper: simple_html_dom (HTML DOM 처리기)
|
||||
|
||||
* Helper: oracle (오라클 데이터베이스 접속 및 쿼리)
|
||||
|
||||
* Helper: exectool (PHP 명령행 실행 지원)
|
||||
* 그 외 다양한 사양 지원을 위한 모듈들
|
||||
|
||||
## 기술지원
|
||||
|
||||
* Website: https://exts.kr/go/home
|
||||
|
||||
* E-mail: support@exts.kr
|
||||
|
||||
## 저작권
|
||||
|
||||
* LGPL (별도의 오픈소스 라이센스 문서에 기입 요망)
|
||||
## 오픈소스 라이선스
|
||||
* 이 프로젝트는 LGPL 3.0 오픈소스 라이선스 하에 배포됨.
|
||||
|
||||
## 최근변경
|
||||
* 2024-05-30
|
||||
|
||||
* 2018-07-22
|
||||
## 정적 파일 호스팅 관련 지침 (카페24 CDN 또는 Amazon S3)
|
||||
본 지침은 버전 v1.6.8를 기준으로 한다.
|
||||
|
||||
### 정적 파일 호스팅 서비스의 예시
|
||||
- 카페24 ([10G 광아우토반 FullSSD+](https://hosting.cafe24.com/?controller=new_product_page&page=autobahn) 웹 호스팅 상품 기준)
|
||||
- Amazon S3
|
||||
- Object Storage
|
||||
|
||||
### 카페24 정적 파일 호스팅 사용자
|
||||
|
||||
1. 카페24(cafe24.com) 관리자 페이지에 로그인하여, CDN/스트리밍 도메인 정보를 얻는다.
|
||||
1. 메인 웹 사이트 로그인 -> `나의서비스관리` 클릭
|
||||
2. 좌측 메뉴에서 `서비스 접속관리` -> `서비스 접속 정보` 클릭
|
||||
3. CDN/스트리밍 정보 확인
|
||||
|
||||
```
|
||||
*** CDN ***
|
||||
CDN 하드 용량: 200M
|
||||
CDN 트래픽 용량: 500M
|
||||
FTP 주소: iup.cdn2.cafe24.com
|
||||
FTP 포트: 21
|
||||
FTP 아이디: [사용자 아이디]
|
||||
|
||||
*** 스트리밍 ***
|
||||
스트리밍 하드 용량: 200M
|
||||
스트리밍 트래픽 용량: 500M
|
||||
FTP 주소: wm-004.cafe24.com
|
||||
FTP 포트: 5565
|
||||
FTP 아이디: [사용자 아이디]
|
||||
```
|
||||
|
||||
4. CDN의 경우, `https://[사용자 아이디].cdn2.cafe24.com`(예시)가 접속 주소가 된다.
|
||||
5. 스트리밍의 경우, `mms://wm-004.cafe24.com/[사용자 아이디]/abc.mp3`(예시)가 접속 주소가 된다.
|
||||
|
||||
2. ResonableFramework v1.6.8 설치 및 CDN/스트리밍 설정
|
||||
1. [깃허브 저장소](https://github.com/gnh1201/reasonableframework) 접속 후 `Release` 탭을 누르고 `v1.6.8` 또는 최신 버전을 내려받는다.
|
||||
2. `storage/config/uri.ini.php` 파일의 CDN/스트리밍 관련 부분을 아래와 같이 수정한다.
|
||||
|
||||
```
|
||||
base_cdn_url = https://[사용자 아이디].cdn2.cafe24.com
|
||||
base_vod_url = mms://wm-004.cafe24.com/[사용자 아이디]
|
||||
```
|
||||
|
||||
3. `route` 폴더 밑에 `cdntest.php` 이름의 빈 파일을 만들고, 아래와 같이 입력 후 저장한다.
|
||||
|
||||
```
|
||||
<?php
|
||||
$data = array(
|
||||
"imageurl" => get_cdn_link("/picture.jpg");
|
||||
);
|
||||
renderView("view_cdntest", $data);
|
||||
```
|
||||
|
||||
4. `view` 폴더 밑에 `view_cdntest.php` 이름의 빈 파일을 만들고, 아래와 같이 입력 후 저장한다.
|
||||
|
||||
```
|
||||
<img src="<?php echo $imageurl; ?>" alt="this is cdn test">
|
||||
```
|
||||
|
||||
5. 사용하고 있는 웹 호스팅에 reasonableframework-master 폴더 아래의 모든 파일을 업로드한다.
|
||||
6. 1번에서 얻은 FTP 정보를 이용하여, CDN 서버에 `picture.jpg` 이름으로 임의의 JPG 그림 파일을 업로드한다.
|
||||
7. 웹 브라우저를 열고 `http://[웹 호스팅 주소]/?route=cdntest`에 접속하여 그림이 잘 뜨는지 확인한다.
|
||||
|
||||
### Amazon S3 또는 Object Storage 사용자
|
||||
- 해당 정적 파일 호스팅 업체에서 제공하는 공통 링크를 확인한 뒤, 해당 링크를 `storage/config/uri.ini.php` 파일의 `base_cdn_url`에 반영한다.
|
||||
|
||||
## 기술지원 및 문의사항
|
||||
- 웹사이트: https://catswords.social/@catswords_oss
|
||||
- 이메일: abuse@catswords.net
|
||||
|
|
126
README.md
126
README.md
|
@ -1,10 +1,18 @@
|
|||
# Reasonable PHP Framework
|
||||
- Reasonable Framework is PHP framework for make solid and secure web development.
|
||||
- Old version name: Very Simple PHP Framework (VSPF)
|
||||
# ReasonableFramework
|
||||

|
||||
[](https://zenodo.org/doi/10.5281/zenodo.11392416)
|
||||
|
||||
## Specification
|
||||
- Database connection (via PDO, MySQLi (MySQL Improved), MySQL Tranditional, Oracle(OCI))
|
||||
- Route (Controller), Helper, View Structrue (Model is optional)
|
||||
ReasonableFramework is RVHM structured PHP framework. aka, RSF, VSPF, C-2020-018490
|
||||
|
||||
## Specifications
|
||||
- Various types of database connection drivers. e.g, PHP PDO, MySQLi, Legacy MySQL, MySQL over the shell, Oracle(OCI)
|
||||
- No OOP, Just `RVHM` structure
|
||||
- R is Route. like as `controller`
|
||||
- V is View
|
||||
- H is Helper. like a `import` on Python, Go, NodeJS
|
||||
- M is Model. it implemented with `KV bind`(like as `Map` data structure), Model is optional.
|
||||
- Controllable shared variables: Minimize abuse of global variables. Inspired by the `scope` of AngularJS, and `SharedPreferences` of Android Framework
|
||||
- CGI style compatibility prepared for industrial applications: This framework can utilize both the latest object-oriented style and the CGI style required in industrial applications.
|
||||
|
||||
## Compatible
|
||||
- Tested in PHP 5.3.3
|
||||
|
@ -12,65 +20,69 @@
|
|||
|
||||
## How to use
|
||||
- Extract or clone this project to your (restrictive) shared web hosting.
|
||||
- You can use and intergrate all of PHP packages without Composer and additional extensions! (supported autoloader)
|
||||
- You can use and rewrite by route feature! without heavy frameworks!
|
||||
- You can write your back-end code in route. (the same as controller)
|
||||
- You can config database if you add your custom ini file in config directory.
|
||||
- You can intergrate all of PHP projects (linear, modular (ex. `autoloader`), or others) without complicated extensions.
|
||||
- You can write your code and rewrite by `route` parameter without heavy framework. (like as `controller`)
|
||||
- You can add your custom `ini.php` configuration file in `config` directory.
|
||||
- Enjoy it!
|
||||
|
||||
## Map of structure
|
||||

|
||||
|
||||
## Roadmap: Support legacy
|
||||
- Support critical legacy web server (old: PHP 4.x ~ modern: 7.x)
|
||||
- Support critical old browser (old: IE 6 ~ modern: IE 11)
|
||||
- Do Clean & Modern PHP without hard studies.
|
||||
|
||||
## Contact me
|
||||
- Go Namhyeon <gnh1201@gmail.com>
|
||||
- Website: https://exts.kr/go/home
|
||||

|
||||
|
||||
## Quick Start
|
||||
1. git clone https://github.com/gnh1201/reasonableframework.git
|
||||
2. set up database configuration: storage/config/database.ini
|
||||
3. make route/example.php
|
||||
4. go to [base_url]/?route=example
|
||||
5. enjoy it.
|
||||
2. edit database configuration: `/storage/config/database.ini.php`
|
||||
3. create new file: `/route/example.php`
|
||||
4. go to `http://:base_url/?route=example` or `http://:base_url/example/`(if set `.htaccess`) in the web browser.
|
||||
5. code it.
|
||||
|
||||
## Website example
|
||||
## Use cases
|
||||
- [Send severities from Zabbix to Grafana](https://gist.github.com/gnh1201/792964e9719d2f62157cf46e394888f5)
|
||||
- [REST API Integration (Papago Translation REST API)](https://gist.github.com/gnh1201/081484e6f5e10bd3be819093ba5f49c8)
|
||||
- [Payment Gateway Integration](https://github.com/gnh1201/reasonableframework/blob/master/route/orderpay.pgkcp.php)
|
||||
|
||||
## Remote logging
|
||||
- Remote logging feature based on [RFC3164(The BSD Syslog Protocol)](https://tools.ietf.org/html/rfc3164)
|
||||
|
||||
## Tested on free web hostings
|
||||
|
||||
| Provider | Pass? | Tested version | Note
|
||||
| ---------------------- | ------ | -------------- | -------------------------- |
|
||||
| [vultr.com](https://catswords.re.kr/go/vultr) (Vultr Holdings Co.) | :heavy_check_mark: Passed | v1.6.5.2 | Paid, Pre-configured LAMP server |
|
||||
| cafe24.com (Cafe24 Inc.) | :heavy_check_mark: Passed | v1.6.2 | Paid |
|
||||
| woobi.co.kr (MyCGI) | :heavy_check_mark: Passed | v1.6.2 | |
|
||||
| dothome.co.kr (Anysecure Inc.) | :heavy_check_mark: Passed | v1.5 | |
|
||||
| ivyro.net (Smileserv Inc.) | :heavy_check_mark: Passed | v1.5 | |
|
||||
| 000webhost.com | :warning: Warn | v1.5 | Advertising logo |
|
||||
| freewebhostingarea.com | :heavy_check_mark: Passed | v1.5 | |
|
||||
| infinityfree.net | :warning: Warn | v1.5 | Anti-crawling |
|
||||
| freehosting.io | :heavy_check_mark: Passed | v1.5 | |
|
||||
| freehostingeu.com | :warning: Warn | v1.5 | CURL blocked |
|
||||
| freehostingnoads.net | :warning: Warn | v1.5 | CURL blocked |
|
||||
| awardspace.com | :warning: Warn | v1.5 | CURL blocked |
|
||||
|
||||
## How to use CLI (Command-line interface)
|
||||
```
|
||||
<?php
|
||||
if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
||||
|
||||
loadHelper("string.utl");
|
||||
|
||||
$copyright = read_storage_file("copyright.txt", array(
|
||||
"storage_type" => "terms"
|
||||
));
|
||||
$lines = explode_by_line($copyright);
|
||||
foreach($lines as $line) {
|
||||
$copyright .= "<p>" . $line . "</p>";
|
||||
}
|
||||
|
||||
$data = array(
|
||||
"copyright" => $copyright
|
||||
);
|
||||
|
||||
renderView('templates/default/header');
|
||||
renderView('view_copyright', $data);
|
||||
renderView('templates/default/footer');
|
||||
?>
|
||||
$ php cli.php --route :route --session-id :session_id
|
||||
```
|
||||
|
||||
## CLI mode example
|
||||
```
|
||||
$ php cli.php --route [route name]
|
||||
```
|
||||
## Comment about PSR standards
|
||||
Many people are saying that this project seems to be distant from the [PSR](https://www.php-fig.org/psr/) standards, and that claim is correct.
|
||||
|
||||
## Korean
|
||||
- Resonable PHP Framework(이유있는 PHP 프레임워크)는 한국의 웹 개발 환경에 적합한 PHP 프레임워크입니다.
|
||||
- Composer를 포함한 별도의 개발 보조 도구, PHP 플러그인, PHP 프레임워크가 사용 불가능한 환경에 적합합니다.
|
||||
- 개발 팀원을 대상으로 객체지향(OOP) 교육이 이루어지지 않아도, 그에 준하는 생존주기(Life cycle)를 보장합니다.
|
||||
- Resonable PHP Framework는 CSRF, XSS, SQL Injection 보안 조치를 기본적으로 가지고 있습니다.
|
||||
- 한국에서 사용되는 각종 CMS와 API와 연동되어 한국 환경에서 사용 빈도가 높은 구현 유형을 작성하는데 적합합니다.
|
||||
- MVC 모델과 유사하지만 기존 개발 스킬로도 사용할 수 있도록 더 유연한 모델을 가지고 있습니다.
|
||||
The coding convention of this project is similar to the CGI style that was widely used in the early 2000s. Moreover, this style is still observed in solutions written in PHP that are sold in markets such as [WordPress](https://wordpress.org/) plugins, [a local-optimized CMS](https://github.com/gnuboard/gnuboard5), or [Codecanyon](https://codecanyon.net/) in 2023.
|
||||
|
||||
Although this project hardly uses object-oriented concepts and does not use package managers like Composer much, it still incorporates concepts such as Model, View, Controller, Router, and Helper that are proposed in modern frameworks, and we have made efforts to provide a similar experience as much as possible.
|
||||
|
||||
We made efforts to address common security vulnerabilities (XSS, CSRF, SQL injection) in web applications, and included many code snippets that were designed to minimize reliance on specific DBMS or communication drivers.
|
||||
|
||||
The specifications that this project offers are still in demand in enterprise environments, so it can be a useful solution if you happen to be in such a situation.
|
||||
|
||||
Whenever this project was introduced, I received a lot of questions about PSR, and I also made efforts to find customers who were willing to pay for a PSR version, such as holding conferences for existing customers. However, there is still no good news. Until good news comes, my plan is to mainly maintain this project.
|
||||
|
||||
If you want to comply with the PSR standards and your colleagues are also ready to learn them humbly, we recommend that you consider [Codeigniter](https://github.com/bcit-ci/CodeIgniter) (which has a similar structure to this project) or [Silm Framework](https://github.com/slimphp/Slim).
|
||||
|
||||
## Security Policy
|
||||
- [Security policy](SECURITY.md)
|
||||
|
||||
## Contact us
|
||||
- abuse@catswords.net
|
||||
- ActivityPub [@catswords_oss@catswords.social](https://catswords.social/@catswords_oss)
|
||||
|
|
23
SECURITY.md
Normal file
23
SECURITY.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------------------------------ |
|
||||
| 1.6.x | :white_check_mark: (Current) |
|
||||
| 1.5.x | :x: (EOL: 2020-08-25) |
|
||||
| < 1.5 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
Use this section to tell people how to report a vulnerability.
|
||||
|
||||
Tell them where to go, how often they can expect to get an update on a
|
||||
reported vulnerability, what to expect if the vulnerability is accepted or
|
||||
declined, etc.
|
||||
|
||||
## Contact us
|
||||
* ActivityPub [@catswords_oss@catswords.social](https://catswords.social/@catswords_oss)
|
||||
* abuse@catswords.net
|
|
@ -1,2 +0,0 @@
|
|||
# Confirmed version
|
||||
Last confirmed: 2018-03-09 22:00 (KST, GMT+09:00, Seoul)
|
BIN
assets/img/webpagetool-1.png
Normal file
BIN
assets/img/webpagetool-1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 206 KiB |
BIN
assets/img/webpagetool-2.png
Normal file
BIN
assets/img/webpagetool-2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 187 KiB |
|
@ -18,7 +18,7 @@ function payman_load_widget(data) {
|
|||
|
||||
var check_msgs = payman_get_check_msgs();
|
||||
|
||||
var allows_zero = ["good_mny"];
|
||||
var allows_zero = ["good_mny", "redirect_url"];
|
||||
|
||||
for(var k in check_msgs) {
|
||||
if( !(k in data) || (allows_zero.indexOf(k) < 0 && data[k] == "") ) {
|
||||
|
@ -30,6 +30,10 @@ function payman_load_widget(data) {
|
|||
}
|
||||
}
|
||||
|
||||
if("redirect_url" in data) {
|
||||
req_data['redirect_url'] = data['redirect_url'];
|
||||
}
|
||||
|
||||
if(is_available == true) {
|
||||
$.ajax({
|
||||
type: "post",
|
||||
|
@ -83,3 +87,21 @@ function payman_submit() {
|
|||
$("#payman_orderform").submit();
|
||||
return true;
|
||||
}
|
||||
|
||||
function payman_submit_nw() {
|
||||
var check_msgs = payman_get_check_msgs();
|
||||
for(var k in check_msgs) {
|
||||
if(payman_get_data(k) == "") {
|
||||
alert(check_msgs[k]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
var $obj = $("#payman_orderform");
|
||||
var nw = window.open("", "payman_window", "height=600,width=786,modal=yes,alwaysRaised=yes");
|
||||
$obj.attr("target", "payman_window");
|
||||
$obj.submit();
|
||||
nw.focus();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
5
bootstrap.sh
Normal file
5
bootstrap.sh
Normal file
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
#find . -type d -exec chmod 0755 {} \;
|
||||
#find . -type f -exec chmod 0644 {} \;
|
||||
chmod -R u+rwX,go+rX,go-w .
|
||||
cp ./storage/example/_.htaccess ./.htaccess
|
91
cli.php
91
cli.php
|
@ -2,17 +2,35 @@
|
|||
<?php
|
||||
/**
|
||||
* @file cli.php
|
||||
* @date 2018-07-22
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @created_on 2018-07-22
|
||||
* @created_on 2020-04-20
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief ReasonableFramework CLI mode
|
||||
* @cvs http://github.com/gnh1201/reasonableframework
|
||||
*/
|
||||
|
||||
// example: php cli.php --route=welcome
|
||||
|
||||
define("_DEF_VSPF_", true); // compatible to VSPF
|
||||
define("_DEF_RSF_", true); // compatible to RSF
|
||||
define("APP_DEVELOPMENT", false); // set the status of development
|
||||
define("DOC_EOL", "\r\n"); // set the 'end of line'
|
||||
|
||||
// development mode
|
||||
if(APP_DEVELOPMENT == true) {
|
||||
error_reporting(E_ALL);
|
||||
@ini_set("log_errors", 1);
|
||||
@ini_set("error_log", sprintf("%s/storage/sandbox/logs/error.log", getcwd()));
|
||||
} else {
|
||||
error_reporting(E_ERROR | E_PARSE);
|
||||
}
|
||||
@ini_set("display_errors", 1);
|
||||
|
||||
// set shared vars
|
||||
$shared_vars = array();
|
||||
|
||||
// define system modules
|
||||
$load_systems = array("base", "storage", "config", "security", "uri");
|
||||
$load_systems = array("base", "storage", "config", "security", "database", "uri", "logger");
|
||||
|
||||
// load system modules
|
||||
foreach($load_systems as $system_name) {
|
||||
|
@ -24,10 +42,13 @@ foreach($load_systems as $system_name) {
|
|||
} else {
|
||||
loadModule($system_name);
|
||||
}
|
||||
} else {
|
||||
echo "ERROR: Dose not exists " . $system_inc_file;
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// get configurations
|
||||
// get config
|
||||
$config = get_config();
|
||||
|
||||
// set max_execution_time
|
||||
|
@ -35,6 +56,13 @@ $max_execution_time = get_value_in_array("max_execution_time", $config, 0);
|
|||
@ini_set("max_execution_time", $max_execution_time);
|
||||
//@set_time_limit($max_execution_time);
|
||||
|
||||
// set memory limit
|
||||
$memory_limit = get_value_in_array("memory_limit", $config, "");
|
||||
if(!empty($memory_limit)) {
|
||||
@ini_set("memory_limit", $memory_limit);
|
||||
@ini_set("suhosin.memory_limit", $memory_limit);
|
||||
}
|
||||
|
||||
// autoload module
|
||||
if(!array_key_empty("enable_autoload", $config)) {
|
||||
set_autoloader();
|
||||
|
@ -44,49 +72,26 @@ if(!array_key_empty("enable_autoload", $config)) {
|
|||
$default_timezone = get_value_in_array("timezone", $config, "UTC");
|
||||
date_default_timezone_set($default_timezone);
|
||||
|
||||
// default route
|
||||
// set default route
|
||||
$route = "welcome";
|
||||
|
||||
// parse arguments
|
||||
$num_of_args = count($argv);
|
||||
if($num_of_args > 1) {
|
||||
foreach($argv as $k=>$v) {
|
||||
switch($v) {
|
||||
case "--route":
|
||||
if($k < ($num_of_args - 1)) {
|
||||
$route = $argv[$k + 1];
|
||||
} else {
|
||||
set_error("invaild argument");
|
||||
show_errors();
|
||||
}
|
||||
break;
|
||||
case "--static-ip":
|
||||
if($k < ($num_of_args - 1)) {
|
||||
$host = $argv[$k + 1];
|
||||
set_scope("static_ip", $host);
|
||||
} else {
|
||||
set_error("invaild argument");
|
||||
show_errors();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
set_error("not enough arguments");
|
||||
show_errors();
|
||||
// set arguments of command line
|
||||
$opts = getopt("r::h::", array("route::", "host::"));
|
||||
if(!empty($opts['route'])) {
|
||||
$route = $opts['route'];
|
||||
}
|
||||
|
||||
// load route
|
||||
if(empty($route)) {
|
||||
$route = get_value_in_array("default_route", $config, "welcome");
|
||||
} else {
|
||||
$route_names = explode('/', $route);
|
||||
if(count($route_names) > 1) {
|
||||
$route = $route_names[0];
|
||||
}
|
||||
}
|
||||
// set global variables
|
||||
set_shared_var("route", $route);
|
||||
set_shared_var("host", $opts['host']);
|
||||
|
||||
// get PID(Process ID)
|
||||
set_shared_var("mypid", getmypid());
|
||||
|
||||
// set database connection
|
||||
set_shared_var("dbc", get_db_connect());
|
||||
|
||||
// load route file
|
||||
if(!loadRoute($route, $scope)) {
|
||||
loadRoute("errors/404", $scope);
|
||||
if(!loadRoute($route, $shared_vars)) {
|
||||
loadRoute("errors/404", $shared_vars);
|
||||
}
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
{
|
||||
"name": "gnh1201/reasonableframework",
|
||||
"description": "Reasonable Framework is PHP framework for make solid and secure web development.",
|
||||
"description": "ReasonableFramework is RVHM structured PHP framework with common security",
|
||||
"license": "LGPL-3.0",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Go Namhyeon",
|
||||
"email": "gnh1201@gmail.com"
|
||||
"email": "abuse@catswords.net"
|
||||
}
|
||||
],
|
||||
"require": {}
|
||||
"require": {
|
||||
"phpoffice/phpspreadsheet": "~1.8"
|
||||
}
|
||||
}
|
||||
|
|
86
helper/SSL.class.php
Normal file
86
helper/SSL.class.php
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
// https://stackoverflow.com/questions/3464113/is-it-possible-to-read-ssl-information-in-php-from-any-website
|
||||
|
||||
if(!class_exists("SSL")) {
|
||||
class SSL {
|
||||
public $domain, $validFrom, $validTo, $issuer, $validity, $validitytot, $crtValRemaining;
|
||||
|
||||
private static function instantiate($url, $info) {
|
||||
$obj = new static;
|
||||
$obj->domain = $url;
|
||||
$obj->validFrom = $info['validFrom'];
|
||||
$obj->validTo = $info['validTo'];
|
||||
$obj->issuer = $info['issuer'];
|
||||
$obj->validity = $info['validity'];
|
||||
$obj->validitytot = $info['validitytot'];
|
||||
$obj->crtValRemaining = $info['crtValRemaining'];
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
public static function getSSLinfo($url, $port=443) {
|
||||
$ssl_info = [];
|
||||
$certinfo = static::getCertificateDetails($url, $port);
|
||||
$validFrom_time_t_m = static::dateFormatMonth($certinfo['validFrom_time_t']);
|
||||
$validTo_time_t_m = static::dateFormatMonth($certinfo['validTo_time_t']);
|
||||
|
||||
$validFrom_time_t = static::dateFormat($certinfo['validFrom_time_t']);
|
||||
$validTo_time_t = static::dateFormat($certinfo['validTo_time_t']);
|
||||
$current_t = static::dateFormat(time());
|
||||
|
||||
$ssl_info['validFrom'] = $validFrom_time_t_m;
|
||||
$ssl_info['validTo'] = $validTo_time_t_m;
|
||||
$ssl_info['issuer'] = $certinfo['issuer']['O'];
|
||||
|
||||
$ssl_info['validity'] = static::diffDate($current_t, $validTo_time_t)." days";
|
||||
$ssl_info['validitytot'] = (static::diffDate($validFrom_time_t, $validTo_time_t)-1).' days';
|
||||
|
||||
$ssl_info['crtValRemaining'] = $certinfo['validTo_time_t'];
|
||||
|
||||
return static::instantiate($url, $ssl_info); // return an object
|
||||
}
|
||||
|
||||
private static function getCertificateDetails($url, $port=443) {
|
||||
$urlStr = strtolower(trim($url));
|
||||
|
||||
$parsed = parse_url($urlStr);// add http://
|
||||
if (empty($parsed['scheme'])) {
|
||||
$urlStr = 'http://' . ltrim($urlStr, '/');
|
||||
}
|
||||
$orignal_parse = parse_url($urlStr, PHP_URL_HOST);
|
||||
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
|
||||
$read = stream_socket_client("ssl://".$orignal_parse.":".$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
|
||||
$cert = stream_context_get_params($read);
|
||||
$certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
|
||||
return $certinfo;
|
||||
}
|
||||
|
||||
private static function dateFormat($stamp) {
|
||||
return strftime("%Y-%m-%d", $stamp);
|
||||
}
|
||||
|
||||
private static function dateFormatMonth($stamp) {
|
||||
return strftime("%Y-%b-%d", $stamp);
|
||||
}
|
||||
|
||||
private static function diffDate($from, $to) {
|
||||
$date1=date_create($from);
|
||||
$date2=date_create($to);
|
||||
$diff=date_diff($date1,$date2);
|
||||
return ltrim($diff->format("%R%a"), "+");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
## Example
|
||||
```
|
||||
$certInfo = SSL::getSSLinfo('stackoverflow.com');
|
||||
echo $certInfo->validFrom .'<br>';
|
||||
echo $certInfo->validTo .'<br>';
|
||||
echo $certInfo->issuer .'<br>';
|
||||
echo $certInfo->validity .'<br>';
|
||||
echo $certInfo->validitytot .'<br>';
|
||||
echo $certInfo->crtValRemaining .'<br>';
|
||||
```
|
||||
*/
|
|
@ -12,6 +12,8 @@
|
|||
* @author Andrew Moore
|
||||
* @link http://www.php.net/manual/en/function.uniqid.php#94959
|
||||
*/
|
||||
if(!class_exists("UUID"))
|
||||
{
|
||||
class UUID
|
||||
{
|
||||
/**
|
||||
|
@ -146,9 +148,10 @@ class UUID
|
|||
);
|
||||
}
|
||||
|
||||
public static function is_valid($uuid) {
|
||||
public static function is_valid($uuid)
|
||||
{
|
||||
return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.
|
||||
'[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
|
||||
}
|
||||
}
|
||||
?>
|
||||
}
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set("display_errors", 1);
|
32
helper/api.whois.kr.php
Normal file
32
helper/api.whois.kr.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.whois.kr.php
|
||||
* @date 2019-05-26
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KISA Whois/Domain/IP/AS Query Helper (https://whois.kr)
|
||||
*/
|
||||
|
||||
if(!is_fn("get_whois_kr")) {
|
||||
function get_whois_kr($name, $key, $type="whois") {
|
||||
$response = false;
|
||||
|
||||
switch($type) {
|
||||
case "whois":
|
||||
$response = get_web_json("http://whois.kisa.or.kr/openapi/whois.jsp", "get.cache", array(
|
||||
"query" => $name,
|
||||
"key" => $key,
|
||||
"answer" => "json",
|
||||
));
|
||||
break;
|
||||
case "ipascc":
|
||||
$response = get_web_json("http://whois.kisa.or.kr/openapi/ipascc.jsp", "get.cache", array(
|
||||
"query" => $name,
|
||||
"key" => $key,
|
||||
"answer" => "json",
|
||||
));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
<?php
|
||||
// archivetool.php
|
||||
// todo
|
58
helper/catsplit.format.php
Normal file
58
helper/catsplit.format.php
Normal file
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
/**
|
||||
* @file catsplit.format.php
|
||||
* @date 2019-05-28
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Catsplit format encoder
|
||||
* @documentation https://github.com/gnh1201/catsplit-format
|
||||
*/
|
||||
|
||||
if(!is_fn("catsplit_unescape")) {
|
||||
function catsplit_unescape($data) {
|
||||
return trim($data);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("casplit_escape")) {
|
||||
function casplit_escape($data) {
|
||||
return htmlspecialchars($data);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("catsplit_encode")) {
|
||||
function catsplit_encode($data) {
|
||||
$_ks = array();
|
||||
$_vs = array();
|
||||
foreach($data as $k=>$v) {
|
||||
$_ks[] = $k;
|
||||
$_vs[] = make_safe_argument($v);
|
||||
}
|
||||
$_ks = array_map("casplit_escape", $_ks);
|
||||
$_vs = array_map("casplit_escape", $_vs);
|
||||
|
||||
return sprintf("('%s')<=(%s)", implode("','", $_vs), implode(",", $_ks));
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("catsplit_decode")) {
|
||||
function catsplit_decode($data) {
|
||||
$s_final = array();
|
||||
|
||||
// step 1
|
||||
$s1 = explode(")<=(", substr($data, 1, -1));
|
||||
|
||||
// step 2
|
||||
$s2a = array_map("catsplit_unescape", explode(",", $s1[0]));
|
||||
$s2b = array_map("catsplit_unescape", explode(",", $s1[1]));
|
||||
|
||||
// step 3
|
||||
$s3 = array_combine($s2b, $s2a);
|
||||
|
||||
// step 4
|
||||
foreach($s3 as $k=>$v) {
|
||||
$s_final[$k] = substr(stripslashes($v), 1, -1);
|
||||
}
|
||||
|
||||
return $s_final;
|
||||
}
|
||||
}
|
38
helper/colona.v1.format.php
Normal file
38
helper/colona.v1.format.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
// Go Namhyeon <abuse@catswords.net>
|
||||
// 2019-09-25
|
||||
|
||||
if(!is_fn("decode_colona_format")) {
|
||||
function decode_colona_format($data) {
|
||||
$lines = explode_by_line(remove_utf8_bom($data));
|
||||
$jobargs = array();
|
||||
$eof = false;
|
||||
$delimiter = ":";
|
||||
|
||||
$jobkey = "";
|
||||
$jobvalue = "";
|
||||
foreach($lines as $line) {
|
||||
$pos = strpos($line, $delimiter);
|
||||
|
||||
if($eof) {
|
||||
if($line == "EOF;") {
|
||||
$jobargs[$jobkey] = $jobvalue;
|
||||
$eof = false;
|
||||
} else {
|
||||
$jobvalue .= $line;
|
||||
}
|
||||
} elseif($pos !== false) {
|
||||
$jobkey = rtrim(substr($line, 0, $pos));
|
||||
$jobvalue = ltrim(substr($line, $pos + strlen($delimiter)));
|
||||
if($jobvalue == "<<<EOF") {
|
||||
$jobvalue = "";
|
||||
$eof = true;
|
||||
} else {
|
||||
$jobargs[$jobkey] = $jobvalue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $jobargs;
|
||||
}
|
||||
}
|
31
helper/compress.zip.php
Normal file
31
helper/compress.zip.php
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
// @date 2019-10-13
|
||||
// @author Go Namhyeon <abuse@catswords.net>
|
||||
|
||||
if(!is_fn("unzip")) {
|
||||
function unzip($src, $dst, $options=array()) {
|
||||
$flag = false;
|
||||
|
||||
$method = get_value_in_array("method", $options, "ZipArchive");
|
||||
switch($method) {
|
||||
case "ZipArchive":
|
||||
$handle = new ZipArchive;
|
||||
$res = $handle->open($src);
|
||||
if ($res === TRUE) {
|
||||
$zip->extractTo($dst);
|
||||
$zip->close();
|
||||
$flag = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case "unzip":
|
||||
if(loadHelper("exectool")) {
|
||||
exec_command(sprintf("unzip -d '%s' '%s'", make_safe_argument($src), make_safe_argument($dst)));
|
||||
$flag = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return $flag;
|
||||
}
|
||||
}
|
51
helper/country.kr.php
Normal file
51
helper/country.kr.php
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/**
|
||||
* @file country.kr.php
|
||||
* @date 2018-04-15
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Country Helper (Korean)
|
||||
*/
|
||||
|
||||
// parse telephone number
|
||||
if(!is_fn("get_kr_parsed_tel_number")) {
|
||||
function get_kr_parsed_tel_number($tel) {
|
||||
$output = preg_replace("/[^0-9]/", "", $tel); // 숫자 이외 제거
|
||||
$local_code = substr($tel, 0, 2);
|
||||
if ($local_code == '02') {
|
||||
$output = preg_replace("/([0-9]{2})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $tel);
|
||||
} elseif (strlen($tel) == '8' && in_array($local_code, array('15', '16', '18'))) {
|
||||
$output = preg_replace("/([0-9]{4})([0-9]{4})$/", "\\1-\\2", $tel); // 지능망 번호이면
|
||||
} else {
|
||||
$output = preg_replace("/([0-9]{3})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $tel);
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_kr_get_lastname")) {
|
||||
function get_kr_get_lastname()
|
||||
if(loadHelper("string.utils")) {
|
||||
$words = read_storage_file_by_line("kr.lastname.txt", array(
|
||||
"storage_type" => "country",
|
||||
)));
|
||||
return $words[get_random_index($words)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_kr_get_firstname")) {
|
||||
function get_kr_get_firstname() {
|
||||
if(loadHelper("string.utils")) {
|
||||
$words = read_storage_file_by_line("kr.firstname.txt", array(
|
||||
"storage_type" => "country",
|
||||
)));
|
||||
return $words[get_random_index($words)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_kr_get_generated_name")) {
|
||||
function get_kr_get_generated_name() {
|
||||
return sprintf("%s%s", get_kr_get_lastname(), get_kr_get_firstname());
|
||||
}
|
||||
}
|
41
helper/coupang.api.php
Normal file
41
helper/coupang.api.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
// Coupang Products Search API
|
||||
// https://coupa.ng/bZ3Kba
|
||||
// https://developers.coupangcorp.com/hc/ko/articles/360033461914-HMAC-Signature-%EC%83%9D%EC%84%B1
|
||||
|
||||
loadHelper("webpagetool");
|
||||
|
||||
if(!is_fn("coupang_get_signature")) {
|
||||
function coupang_get_signature($method, $path, $query, $ACCESS_KEY, $SECRET_KEY) {
|
||||
$datetime = date("ymd") . 'T' . date("His") . 'Z';
|
||||
$message = $datetime . strtoupper($method) . str_replace("?", "", $path) . http_build_query($query);
|
||||
$algorithm = "HmacSHA256";
|
||||
$signature = hmacsha256_sign_message($message, $SECRET_KEY);
|
||||
|
||||
return "CEA algorithm=HmacSHA256, access-key=" . $ACCESS_KEY . ", signed-date=" . $datetime . ", signature=" . $signature;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("coupang_search_items")) {
|
||||
function coupang_search_items($keyword, $ACCESS_KEY, $SECRET_KEY) {
|
||||
$URL_PARTS = array("https://api-gateway.coupang.com", "/v2/providers/affiliate_open_api/apis/openapi/v1", "/products/search");
|
||||
$BASE_URL = $URL_PARTS[0] . $URL_PARTS[1];
|
||||
|
||||
$method = "get";
|
||||
$path = $URL_PARTS[1] . $URL_PARTS[2];
|
||||
$query = array(
|
||||
"keyword" => $keyword,
|
||||
"limit" => 20, // default is 20
|
||||
//"subId" => "" // default is null
|
||||
);
|
||||
|
||||
$response = get_web_page($BASE_URL . $URL_PARTS[2], $method, array(
|
||||
"headers" => array(
|
||||
"Authorization" => coupang_get_signature($method, $path, $query, $ACCESS_KEY, $SECRET_KEY)
|
||||
),
|
||||
"data" => $query
|
||||
));
|
||||
|
||||
var_dump($response);
|
||||
}
|
||||
}
|
|
@ -2,18 +2,19 @@
|
|||
/**
|
||||
* @file database.alt.php
|
||||
* @date 2018-09-10
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Database alternative driver switcher
|
||||
*/
|
||||
|
||||
if(!function_exists("exec_db_alt_callback")) {
|
||||
function exec_db_alt_callback($rules, $params=array()) {
|
||||
if(!is_fn("exec_db_alt_callback")) {
|
||||
function exec_db_alt_callback($rules, $params=array(), $driver="") {
|
||||
$result = false;
|
||||
$db_driver = empty($driver) ? get_db_driver() : $driver;
|
||||
|
||||
foreach($rules as $rule) {
|
||||
if($rule['driver'] == $driver) {
|
||||
if($rule['driver'] == $db_driver) {
|
||||
if(loadHelper(sprintf("database.%s", $rule['driver']))) {
|
||||
if(function_exists($rule['callback'])) {
|
||||
if(is_fn($rule['callback'])) {
|
||||
if(is_array($params) && count($params) > 0) {
|
||||
$result = call_user_func_array($rule['callback'], $params);
|
||||
} else {
|
||||
|
@ -32,107 +33,78 @@ if(!function_exists("exec_db_alt_callback")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_db_alt_connect")) {
|
||||
if(!is_fn("get_db_alt_connect")) {
|
||||
function get_db_alt_connect($driver) {
|
||||
$conn = false;
|
||||
$config = get_config();
|
||||
|
||||
$rules = array(
|
||||
array(
|
||||
"driver" => "mysql.pdo",
|
||||
"callback" => "get_db_mysql_pdo_connect"
|
||||
),
|
||||
array(
|
||||
"driver" => "mysql.imp",
|
||||
"callback" => "get_db_mysql_imp_connect"
|
||||
),
|
||||
array(
|
||||
"driver" => "mysql.old",
|
||||
"callback" => "get_db_mysql_old_connect"
|
||||
),
|
||||
array(
|
||||
"driver" => "oracle",
|
||||
"callback" => "get_db_oracle_connect"
|
||||
),
|
||||
array(
|
||||
"driver" => "pgsql",
|
||||
"callback" => "get_db_pgsql_connect"
|
||||
)
|
||||
array("driver" => "mysql.pdo", "callback" => "get_db_mysql_pdo_connect"),
|
||||
array("driver" => "mysql.imp", "callback" => "get_db_mysql_imp_connect"),
|
||||
array("driver" => "mysql.old", "callback" => "get_db_mysql_old_connect"),
|
||||
array("driver" => "mysql.cmd", "callback" => "get_db_mysql_cmd_connect"),
|
||||
array("driver" => "oracle", "callback" => "get_db_oracle_connect"),
|
||||
array("driver" => "pgsql", "callback" => "get_db_pgsql_connect"),
|
||||
array("driver" => "mssql.pdo", "callback" => "get_db_mssql_pdo_connect"),
|
||||
);
|
||||
|
||||
$conn = exec_db_alt_callback($rules);
|
||||
$conn = exec_db_alt_callback($rules, array(), $driver);
|
||||
|
||||
return $conn;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_alt_query")) {
|
||||
function exec_db_alt_query($sql, $bind=array(), $driver="") {
|
||||
if(!is_fn("exec_db_alt_query")) {
|
||||
function exec_db_alt_query($sql, $bind=array(), $options=array()) {
|
||||
$result = false;
|
||||
|
||||
// allow custom db connection object
|
||||
if(array_key_empty("dbc", $options)) {
|
||||
if(!array_key_empty("driver", $options)) {
|
||||
$options['dbc'] = get_db_alt_connect($options['driver']);
|
||||
} else {
|
||||
$options['dbc'] = get_dbc_object();
|
||||
}
|
||||
}
|
||||
|
||||
$rules = array(
|
||||
array(
|
||||
"driver" => "mysql.pdo",
|
||||
"callback" => "exec_db_mysql_pdo_query"
|
||||
),
|
||||
array(
|
||||
"driver" => "mysql.imp",
|
||||
"callback" => "exec_db_mysql_imp_query"
|
||||
),
|
||||
array(
|
||||
"driver" => "mysql.old",
|
||||
"callback" => "exec_db_mysql_old_query"
|
||||
),
|
||||
array(
|
||||
"driver" => "oracle",
|
||||
"callback" => "exec_db_oracle_query"
|
||||
),
|
||||
array(
|
||||
"driver" => "pgsql",
|
||||
"callback" => "exec_db_pgsql_query"
|
||||
)
|
||||
array("driver" => "mysql.pdo", "callback" => "exec_db_mysql_pdo_query"),
|
||||
array("driver" => "mysql.imp", "callback" => "exec_db_mysql_imp_query"),
|
||||
array("driver" => "mysql.old", "callback" => "exec_db_mysql_old_query"),
|
||||
array("driver" => "mysql.cmd", "callback" => "exec_db_mysql_cmd_query"),
|
||||
array("driver" => "oracle", "callback" => "exec_db_oracle_query"),
|
||||
array("driver" => "pgsql", "callback" => "exec_db_pgsql_query"),
|
||||
array("driver" => "mssql.pdo", "callback" => "exec_db_mssql_pdo_query"),
|
||||
);
|
||||
|
||||
$result = exec_db_alt_callback($rules, array($sql, $bind));
|
||||
$result = exec_db_alt_callback($rules, array($sql, $bind, $options), $driver);
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_alt_fetch_all")) {
|
||||
function exec_db_alt_fetch_all($sql, $bind=array()) {
|
||||
if(!is_fn("exec_db_alt_fetch_all")) {
|
||||
function exec_db_alt_fetch_all($sql, $bind=array(), $options=array()) {
|
||||
$rows = array();
|
||||
|
||||
$driver = get_value_in_array("driver", $options, "");
|
||||
$rules = array(
|
||||
array(
|
||||
"driver" => "mysql.pdo",
|
||||
"callback" => "exec_db_mysql_pdo_fetch_all"
|
||||
),
|
||||
array(
|
||||
"driver" => "mysql.imp",
|
||||
"callback" => "exec_db_mysql_imp_fetch_all"
|
||||
),
|
||||
array(
|
||||
"driver" => "mysql.old",
|
||||
"callback" => "exec_db_mysql_old_fetch_all"
|
||||
),
|
||||
array(
|
||||
"driver" => "oracle",
|
||||
"callback" => "exec_db_oracle_fetch_all"
|
||||
),
|
||||
array(
|
||||
"driver" => "pgsql",
|
||||
"callback" => "exec_db_pgsql_fetch_all"
|
||||
)
|
||||
array("driver" => "mysql.pdo", "callback" => "exec_db_mysql_pdo_fetch_all"),
|
||||
array("driver" => "mysql.imp", "callback" => "exec_db_mysql_imp_fetch_all"),
|
||||
array("driver" => "mysql.old", "callback" => "exec_db_mysql_old_fetch_all"),
|
||||
array("driver" => "mysql.cmd", "callback" => "exec_db_mysql_cmd_fetch_all"),
|
||||
array("driver" => "oracle", "callback" => "exec_db_oracle_fetch_all"),
|
||||
array("driver" => "pgsql", "callback" => "exec_db_pgsql_fetch_all"),
|
||||
array("driver" => "mssql.pdo", "callback" => "exec_db_mssql_fetch_all"),
|
||||
);
|
||||
|
||||
$rows = exec_db_alt_callback($rules, array($sql, $bind));
|
||||
$rows = exec_db_alt_callback($rules, array($sql, $bind, $options), $driver);
|
||||
|
||||
return $rows;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_alt_fetch")) {
|
||||
if(!is_fn("exec_db_alt_fetch")) {
|
||||
function exec_db_alt_fetch($sql, $bind) {
|
||||
$fetched = false;
|
||||
|
||||
|
@ -146,7 +118,7 @@ if(!function_exists("exec_db_alt_fetch")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_db_alt_last_id")) {
|
||||
if(!is_fn("get_db_alt_last_id")) {
|
||||
function get_db_alt_last_id($driver) {
|
||||
$last_id = false;
|
||||
|
||||
|
|
56
helper/database.mssql.pdo.php
Normal file
56
helper/database.mssql.pdo.php
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
// database.mssql.pdo.php
|
||||
|
||||
if(!is_fn("get_db_mssql_pdo_connect")) {
|
||||
function get_db_mssql_pdo_connect() {
|
||||
$conn = false;
|
||||
|
||||
$config = get_config();
|
||||
|
||||
try {
|
||||
$conn = new PDO(
|
||||
sprintf(
|
||||
"dblib:host=%s;dbname=%s",
|
||||
$config['db_mssql_host'],
|
||||
$config['db_mssql_name']
|
||||
),
|
||||
$config['db_mssql_username'],
|
||||
$config['db_mssql_password']
|
||||
);
|
||||
$conn->exec("SET CHARACTER SET utf8");
|
||||
$conn->query("SET ANSI_NULLS ON");
|
||||
$conn->query("SET ANSI_WARNINGS ON");
|
||||
} catch(PDOException $e) {
|
||||
set_error($e->getMessage());
|
||||
show_errors();
|
||||
}
|
||||
|
||||
return $conn;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("exec_db_mssql_pdo_query")) {
|
||||
function exec_db_mssql_pdo_query($sql, $bind=array(), $options=array()) {
|
||||
$dbc = get_value_in_array("dbc", $options, get_dbc_object());
|
||||
|
||||
if($dbc !== false) {
|
||||
$binded_sql = get_db_binded_sql($sql, $bind);
|
||||
$sth = $dbc->prepare($binded_sql);
|
||||
$sth->execute();
|
||||
}
|
||||
|
||||
return $sth;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("exec_db_mssql_pdo_fetch_all")) {
|
||||
function exec_db_mssql_pdo_fetch_all($sql, $bind=array(), $options=array()) {
|
||||
$rows = array();
|
||||
|
||||
$sth = exec_db_mssql_pdo_query($sql, $bind, $options);
|
||||
$sth->setFetchMode(PDO::FETCH_ASSOC);
|
||||
$rows = $sth->fetchAll();
|
||||
|
||||
return $rows;
|
||||
}
|
||||
}
|
78
helper/database.mysql.cmd.php
Normal file
78
helper/database.mysql.cmd.php
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?php
|
||||
/**
|
||||
* @file database.mysql.cmd.php
|
||||
* @date 2019-04-06
|
||||
* @auther Go Namhyeon <abuse@catswords.net>
|
||||
* @brief MySQL(MariaDB) command line driver
|
||||
*/
|
||||
|
||||
if(!is_fn("get_db_mysql_cmd_connect")) {
|
||||
function get_db_mysql_cmd_connect() {
|
||||
$result = false;
|
||||
$config = get_config();
|
||||
|
||||
if(loadHelper("exectool")) {
|
||||
$args = array("mysql");
|
||||
$args[] = sprintf("-u'%s'", $config['db_username']);
|
||||
$args[] = sprintf("-p'%s'", $config['db_password']);
|
||||
$args[] = sprintf("-h'%s'", $config['db_host']);
|
||||
$args[] = "-s"; // --slient
|
||||
$args[] = "-N"; // --skip-column-names
|
||||
$args[] = "-e'select 1'";
|
||||
|
||||
$cmd = implode(" ", $args);
|
||||
$result = exec_command($cmd);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("exec_db_mysql_cmd_query")) {
|
||||
function exec_db_mysql_cmd_query($sql, $bind) {
|
||||
$result = false;
|
||||
$config = get_config();
|
||||
$sql = get_db_binded_sql($sql, $bind);
|
||||
|
||||
if(loadHelper("exectool")) {
|
||||
$args = array("mysql");
|
||||
$args[] = sprintf("-u'%s'", $config['db_username']);
|
||||
$args[] = sprintf("-p'%s'", $config['db_password']);
|
||||
$args[] = sprintf("-h'%s'", $config['db_host']);
|
||||
$args[] = "-s"; // --slient
|
||||
$args[] = sprintf("-D'%s'", $config['db_name']);
|
||||
$args[] = sprintf("-e'%s'", make_safe_argument($sql));
|
||||
|
||||
$cmd = implode(" ", $args);
|
||||
$result = exec_command($cmd);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("exec_db_mysql_cmd_fetch_all")) {
|
||||
function exec_db_mysql_cmd_fetch_all($sql, $bind) {
|
||||
$result = false;
|
||||
|
||||
$tsvData = exec_db_mysql_cmd_query($sql, $bind);
|
||||
$lines = explode(DOC_EOL, $tsvData);
|
||||
$rows = array();
|
||||
|
||||
if(is_fn("str_getcsv")) {
|
||||
foreach($lines as $line) {
|
||||
$rows[] = str_getcsv($line, "\t");
|
||||
}
|
||||
} else {
|
||||
foreach($lines as $line) {
|
||||
$rows[] = explode("\t", $line);
|
||||
}
|
||||
}
|
||||
|
||||
if(count($rows) > 0) {
|
||||
$result = $rows;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file database.mysql.imp.php
|
||||
* @date 2018-09-10
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief MySQLi database helper
|
||||
*/
|
||||
|
||||
if(!function_exists("get_db_mysql_imp_connect")) {
|
||||
if(!is_fn("get_db_mysql_imp_connect")) {
|
||||
function get_db_mysql_imp_connect() {
|
||||
$conn = false;
|
||||
$config = get_config();
|
||||
|
@ -23,7 +23,7 @@ if(!function_exists("get_db_mysql_imp_connect")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_mysql_imp_query")) {
|
||||
if(!is_fn("exec_db_mysql_imp_query")) {
|
||||
function exec_db_mysql_imp_query($sql, $bind) {
|
||||
$result = false;
|
||||
$dbc = get_dbc_object();
|
||||
|
@ -35,7 +35,7 @@ if(!function_exists("exec_db_mysql_imp_query")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_mysql_imp_fetch_all")) {
|
||||
if(!is_fn("exec_db_mysql_imp_fetch_all")) {
|
||||
function exec_db_mysql_imp_fetch_all($sql, $bind) {
|
||||
$rows = array();
|
||||
$result = exec_db_mysql_imp_query($sql, $bind);
|
||||
|
@ -48,9 +48,9 @@ if(!function_exists("exec_db_mysql_imp_fetch_all")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("close_db_mysql_imp_connect")) {
|
||||
if(!is_fn("close_db_mysql_imp_connect")) {
|
||||
function close_db_mysql_imp_connect() {
|
||||
$dbc = get_scope("dbc");
|
||||
$dbc = get_shared_var("dbc");
|
||||
return mysqli_close($dbc);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file database.mysql.old.php
|
||||
* @date 2018-09-14
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief MySQL-old (lower than 5.4) database helper
|
||||
*/
|
||||
|
||||
if(!function_exists("get_db_mysql_old_connect")) {
|
||||
if(!is_fn("get_db_mysql_old_connect")) {
|
||||
function get_db_mysql_old_connect() {
|
||||
$conn = false;
|
||||
$config = get_config();
|
||||
|
@ -17,7 +17,7 @@ if(!function_exists("get_db_mysql_old_connect")) {
|
|||
show_errors();
|
||||
}
|
||||
|
||||
if(!@mysql_select_db('database_name', $conn)) {
|
||||
if(!@mysql_select_db($config['db_name'], $conn)) {
|
||||
set_error("Could not select database.");
|
||||
show_errors();
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ if(!function_exists("get_db_mysql_old_connect")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_mysql_old_query")) {
|
||||
if(!is_fn("exec_db_mysql_old_query")) {
|
||||
function exec_db_mysql_old_query($sql, $bind) {
|
||||
$result = false;
|
||||
$dbc = get_dbc_object();
|
||||
|
@ -38,7 +38,7 @@ if(!function_exists("exec_db_mysql_old_query")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_mysql_old_fetch_all")) {
|
||||
if(!is_fn("exec_db_mysql_old_fetch_all")) {
|
||||
function exec_db_mysql_old_fetch_all($sql, $bind) {
|
||||
$rows = array();
|
||||
$result = exec_db_mysql_old_query($sql, $bind);
|
||||
|
@ -51,9 +51,9 @@ if(!function_exists("exec_db_mysql_old_fetch_all")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("close_db_mysql_old_connect")) {
|
||||
if(!is_fn("close_db_mysql_old_connect")) {
|
||||
function close_db_mysql_old_connect() {
|
||||
$dbc = get_scope("dbc");
|
||||
$dbc = get_shared_var("dbc");
|
||||
return mysql_close($dbc);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,20 +2,43 @@
|
|||
/**
|
||||
* @file oracle.php
|
||||
* @date 2018-03-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Oracle database helper for ReasonableFramework
|
||||
*/
|
||||
|
||||
if(!function_exists("get_db_orable_binded_sql")) {
|
||||
if(!is_fn("check_db_oracle_installed")) {
|
||||
function check_db_oracle_installed() {
|
||||
$fn = check_invalid_function(array(
|
||||
"NO_FUNCTION_OCI_PARSE" => "oci_parse",
|
||||
"NO_FUNCTION_OCI_EXECUTE" => "oci_execute",
|
||||
"NO_FUNCTION_OCI_FETCH_ASSOC" => "oci_fetch_assoc",
|
||||
"NO_FUNCTION_OCI_FREE_STATEMENT" => "oci_free_statement",
|
||||
"NO_FUNCTION_OCI_CLOSE" => "oci_close",
|
||||
));
|
||||
|
||||
$is_installed = ($fn == -1);
|
||||
if(!$is_installed) {
|
||||
set_error($fn);
|
||||
}
|
||||
|
||||
return $is_installed;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_db_orable_binded_sql")) {
|
||||
function get_db_orable_binded_sql($sql, $bind) {
|
||||
return get_db_binded_sql($sql, $bind);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_db_oracle_stmt")) {
|
||||
if(!is_fn("get_db_oracle_stmt")) {
|
||||
function get_db_oracle_stmt($sql, $bind) {
|
||||
$stmt = NULL;
|
||||
|
||||
if(!check_db_oracle_installed()) {
|
||||
show_errors();
|
||||
}
|
||||
|
||||
$sql = get_db_orable_binded_sql($sql, $bind);
|
||||
$stmt = oci_parse($conn, $sql);
|
||||
|
||||
|
@ -23,13 +46,13 @@ if(!function_exists("get_db_oracle_stmt")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_oracle_connect")) {
|
||||
if(!is_fn("exec_db_oracle_connect")) {
|
||||
function exec_db_oracle_connect($host, $port, $user, $password, $options=array()) {
|
||||
$conn = NULL;
|
||||
$envs = get_value_in_array("envs", $options, array());
|
||||
|
||||
if(!function_exists("oci_connect")) {
|
||||
exit("OCI (Oracle Extension for PHP) not installed!");
|
||||
if(!check_db_oracle_installed()) {
|
||||
show_errors();
|
||||
}
|
||||
|
||||
if(array_key_empty("NLS_LANG", $envs)) {
|
||||
|
@ -43,7 +66,7 @@ if(!function_exists("exec_db_oracle_connect")) {
|
|||
|
||||
// get oracle db connection info
|
||||
$dbs_id = read_storage_file("tnsname.orax", array(
|
||||
"storage_type" => "config"
|
||||
"storage_type" => "example",
|
||||
));
|
||||
|
||||
// set replace rules
|
||||
|
@ -67,15 +90,12 @@ if(!function_exists("exec_db_oracle_connect")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_oracle_fetch_all")) {
|
||||
if(!is_fn("exec_db_oracle_fetch_all")) {
|
||||
function exec_db_oracle_fetch_all($sql, $bind, $conn) {
|
||||
$rows = array();
|
||||
|
||||
$required_functions = array("oci_parse", "oci_execute", "oci_fetch_assoc", "oci_free_statement");
|
||||
foreach($required_functions as $func_name) {
|
||||
if(!function_exists($func_name)) {
|
||||
exit("OCI (Oracle Extension for PHP) not installed!");
|
||||
}
|
||||
if(!check_db_oracle_installed()) {
|
||||
show_errors();
|
||||
}
|
||||
|
||||
$stmt = get_db_oracle_stmt($sql, $bind);
|
||||
|
@ -91,10 +111,14 @@ if(!function_exists("exec_db_oracle_fetch_all")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("exec_db_oracle_query")) {
|
||||
if(!is_fn("exec_db_oracle_query")) {
|
||||
function exec_db_oracle_query($sql, $bind, $conn) {
|
||||
$flag = false;
|
||||
|
||||
if(!check_db_oracle_installed()) {
|
||||
show_errors();
|
||||
}
|
||||
|
||||
$stmt = get_db_oracle_stmt($sql, $bind);
|
||||
$flag = oci_execute($stmt);
|
||||
|
||||
|
@ -104,9 +128,14 @@ if(!function_exists("exec_db_oracle_query")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("close_db_oracle_connect")) {
|
||||
if(!is_fn("close_db_oracle_connect")) {
|
||||
function close_db_oracle_connect() {
|
||||
$dbc = get_scope("dbc");
|
||||
return oci_close($dbc);
|
||||
$dbc = get_shared_var("dbc");
|
||||
|
||||
if(!check_db_oracle_installed()) {
|
||||
show_errors();
|
||||
}
|
||||
|
||||
return @oci_close($dbc);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<?php
|
||||
/**
|
||||
* @file exectool.php
|
||||
* @date 2018-07-22
|
||||
* @auther Go Namhyeon <gnh1201@gmail.com>
|
||||
* @created_on 2018-07-22
|
||||
* @updated_on 2020-07-10
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @forked from https://github.com/scipag/PHPUtilities
|
||||
* @brief ExecTool helper
|
||||
*/
|
||||
|
@ -13,7 +14,7 @@
|
|||
* in the webserver configuration. The function execTests returns an array, which
|
||||
* contains names of all successful tested PHP functions.
|
||||
*/
|
||||
if(!function_exists("exec_test")) {
|
||||
if(!is_fn("exec_test")) {
|
||||
function exec_test() {
|
||||
$cmd = "whoami";
|
||||
$cmdPath = "/usr/bin/whoami";
|
||||
|
@ -103,7 +104,7 @@ if(!function_exists("exec_test")) {
|
|||
/*
|
||||
* exec_command() executes a command (like "whoami") with the submited method
|
||||
*/
|
||||
if(!function_exists("exec_command")) {
|
||||
if(!is_fn("exec_command")) {
|
||||
function exec_command($command, $method="shell_exec", $options=array()) {
|
||||
$return = false;
|
||||
|
||||
|
@ -133,7 +134,12 @@ if(!function_exists("exec_command")) {
|
|||
return $return;
|
||||
}
|
||||
|
||||
if ($method == "") {
|
||||
// An 'async' option will be return PID
|
||||
if(array_key_equals("async", $options, true)) {
|
||||
$command = sprintf("%s 1>/dev/null 2>&1 & echo $!;", $command);
|
||||
}
|
||||
|
||||
if (empty($method)) {
|
||||
// ob_start() will turn on output buffering to collect all output from
|
||||
// exec_test() and ob_end_clean() will clean the buffer afterwards ("garbage collection")
|
||||
ob_start();
|
||||
|
@ -157,7 +163,6 @@ if(!function_exists("exec_command")) {
|
|||
|
||||
case "exec":
|
||||
exec($command, $output);
|
||||
var_dump($output);
|
||||
break;
|
||||
|
||||
case "shell_exec":
|
||||
|
@ -201,6 +206,11 @@ if(!function_exists("exec_command")) {
|
|||
|
||||
$return = ob_get_clean();
|
||||
|
||||
// PID is integer
|
||||
if(array_key_equals("async", $options, true)) {
|
||||
$return = intval(rtrim($return));
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,26 +2,26 @@
|
|||
/**
|
||||
* @file gnuboard.php
|
||||
* @date 2018-05-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Database Helper for Gnuboard 4, Gnuboard 5
|
||||
*/
|
||||
|
||||
// get database prefix
|
||||
if(!function_exists("gnb_get_db_prefix")) {
|
||||
if(!is_fn("gnb_get_db_prefix")) {
|
||||
function gnb_get_db_prefix($version=4) {
|
||||
return ($version > 4) ? "g5_" : "g4_";
|
||||
}
|
||||
}
|
||||
|
||||
// get table
|
||||
if(!function_exists("gnb_get_db_table")) {
|
||||
if(!is_fn("gnb_get_db_table")) {
|
||||
function gnb_get_db_table($tablename) {
|
||||
return (gnb_get_db_prefix() . $tablename);
|
||||
}
|
||||
}
|
||||
|
||||
// get write table
|
||||
if(!function_exists("gnb_get_write_table")) {
|
||||
if(!is_fn("gnb_get_write_table")) {
|
||||
function gnb_get_write_table($tablename, $version=4) {
|
||||
$write_prefix = gnb_get_db_prefix() . "write_";
|
||||
$write_table = $write_prefix . $tablename;
|
||||
|
@ -30,7 +30,7 @@ if(!function_exists("gnb_get_write_table")) {
|
|||
}
|
||||
|
||||
// get write next
|
||||
if(!function_exists("gnb_get_write_next")) {
|
||||
if(!is_fn("gnb_get_write_next")) {
|
||||
function gnb_get_write_next($tablename) {
|
||||
$row = exec_db_fetch("select min(wr_num) as min_wr_num from " . gnb_get_write_table($tablename));
|
||||
return (intval(get_value_in_array("min_wr_num", $row, 0)) - 1);
|
||||
|
@ -38,7 +38,7 @@ if(!function_exists("gnb_get_write_next")) {
|
|||
}
|
||||
|
||||
// write post
|
||||
if(!function_exists("gnb_write_post")) {
|
||||
if(!is_fn("gnb_write_post")) {
|
||||
function gnb_write_post($tablename, $data=array(), $version=4) {
|
||||
$result = 0;
|
||||
|
||||
|
@ -112,14 +112,14 @@ if(!function_exists("gnb_write_post")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("gnb_get_posts")) {
|
||||
if(!is_fn("gnb_get_posts")) {
|
||||
function gnb_get_posts($table_name, $page=1, $limit=20, $options=array()) {
|
||||
$sql = "select * from " . gnb_get_write_table($table_name) . " order by wr_id desc" . get_page_range($page, $limit);
|
||||
return exec_db_fetch_all($sql);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("gnb_get_post_by_id")) {
|
||||
if(!is_fn("gnb_get_post_by_id")) {
|
||||
function gnb_get_post_by_id($table_name, $post_id) {
|
||||
$sql = "select * from " . gnb_get_write_table($table_name) . " where wr_id = :wr_id";
|
||||
return exec_db_fetch($sql, array(
|
||||
|
@ -128,7 +128,7 @@ if(!function_exists("gnb_get_post_by_id")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("gnb_set_post_parameters")) {
|
||||
if(!is_fn("gnb_set_post_parameters")) {
|
||||
function gnb_set_post_parameters($tablename, $wr_id, $bind=array()) {
|
||||
$flag = false;
|
||||
$excludes = array("wr_id");
|
||||
|
@ -144,7 +144,7 @@ if(!function_exists("gnb_set_post_parameters")) {
|
|||
}
|
||||
|
||||
// get member data
|
||||
if(!function_exists("gnb_get_member")) {
|
||||
if(!is_fn("gnb_get_member")) {
|
||||
function gnb_get_member($user_name, $tablename="member") {
|
||||
$result = array();
|
||||
|
||||
|
@ -160,7 +160,7 @@ if(!function_exists("gnb_get_member")) {
|
|||
}
|
||||
|
||||
// get password
|
||||
if(!function_exists("gnb_get_password")) {
|
||||
if(!is_fn("gnb_get_password")) {
|
||||
function gnb_get_password($password) {
|
||||
$bind = array(
|
||||
"password" => $password,
|
||||
|
@ -171,7 +171,7 @@ if(!function_exists("gnb_get_password")) {
|
|||
}
|
||||
|
||||
// get config
|
||||
if(!function_exists("gnb_get_config")) {
|
||||
if(!is_fn("gnb_get_config")) {
|
||||
function gnb_get_config($tablename="config") {
|
||||
$result = array();
|
||||
|
||||
|
@ -183,7 +183,7 @@ if(!function_exists("gnb_get_config")) {
|
|||
}
|
||||
|
||||
// run login process
|
||||
if(!function_exists("gnb_process_safe_login")) {
|
||||
if(!is_fn("gnb_process_safe_login")) {
|
||||
function gnb_process_safe_login($user_name, $user_password) {
|
||||
$result = false;
|
||||
$mb = gnb_get_member($user_name);
|
||||
|
@ -201,7 +201,7 @@ if(!function_exists("gnb_process_safe_login")) {
|
|||
}
|
||||
|
||||
// run join member
|
||||
if(!function_exists("gnb_join_member")) {
|
||||
if(!is_fn("gnb_join_member")) {
|
||||
function gnb_join_member($user_name, $user_password, $data=array(), $tablename="member") {
|
||||
$result = false;
|
||||
|
||||
|
@ -288,7 +288,7 @@ if(!function_exists("gnb_join_member")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("gnb_make_pipelined_data")) {
|
||||
if(!is_fn("gnb_make_pipelined_data")) {
|
||||
function gnb_make_pipelined_data($data, $delimiter="|") {
|
||||
foreach($data as $k=>$v) {
|
||||
$data[$k] = str_replace($delimiter, " ", $v);
|
||||
|
|
24
helper/hiddentool.php
Normal file
24
helper/hiddentool.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
/**
|
||||
* @file hiddentool.php
|
||||
* @created_on 2021-05-24
|
||||
* @updated_on 2022-09-13
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Tools for Hidden Services (e.g. Tor, I2P, etc...)
|
||||
*/
|
||||
|
||||
if (!is_fn("detect_hidden_service")) {
|
||||
function detect_hidden_service() {
|
||||
$score = 0;
|
||||
|
||||
$suffixes = array("onion", "i2p", "crypto");
|
||||
$forwarded_host = get_header_value("X-Forwarded-Host");
|
||||
if (!empty($forwarded_host)) {
|
||||
if (in_array(end(explode('.', $forwarded_host)), $suffixes)) {
|
||||
$score += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $score;
|
||||
};
|
||||
}
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file hybridauth.dbt.php
|
||||
* @date 2018-04-15
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief HybridAuth DB Helper
|
||||
*/
|
||||
|
||||
if(!function_exists("store_hybridauth_session")) {
|
||||
if(!is_fn("store_hybridauth_session")) {
|
||||
function store_hybridauth_session($data, $user_id) {
|
||||
$connection_id = false;
|
||||
|
||||
|
@ -23,7 +23,7 @@ if(!function_exists("store_hybridauth_session")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_stored_hybridauth_session")) {
|
||||
if(!is_fn("get_stored_hybridauth_session")) {
|
||||
function get_stored_hybridauth_session($connection_id) {
|
||||
$stored_session = false;
|
||||
|
||||
|
@ -39,7 +39,7 @@ if(!function_exists("get_stored_hybridauth_session")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_hybridauth_connection_info")) {
|
||||
if(!is_fn("get_hybridauth_connection_info")) {
|
||||
function get_hybridauth_connection_info($connection_id) {
|
||||
$connection_info = false;
|
||||
|
||||
|
@ -57,7 +57,7 @@ if(!function_exists("get_hybridauth_connection_info")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_hybridauth_connection_id")) {
|
||||
if(!is_fn("get_hybridauth_connection_id")) {
|
||||
function get_hybridauth_connection_id($user_id) {
|
||||
$connection_id = false;
|
||||
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file hybridauth.lnk.php
|
||||
* @date 2018-09-26
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief HybridAuth library RSF Linker
|
||||
***/
|
||||
|
||||
if(!function_exists("hybridauth_load")) {
|
||||
if(!is_fn("hybridauth_load")) {
|
||||
function hybridauth_load($provider="") {
|
||||
$result = false;
|
||||
|
||||
|
@ -43,12 +43,12 @@ if(!function_exists("hybridauth_load")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("hybridauth_check_redirect")) {
|
||||
if(!is_fn("hybridauth_check_redirect")) {
|
||||
function hybridauth_check_redirect() {
|
||||
$flag = false;
|
||||
$requests = get_requests();
|
||||
|
||||
if(loadHelper("string.utl")) {
|
||||
if(loadHelper("string.utils")) {
|
||||
foreach($requests['_ALL'] as $k=>$v) {
|
||||
if(startsWith($k, "hauth")) {
|
||||
$flag = true;
|
||||
|
@ -61,7 +61,7 @@ if(!function_exists("hybridauth_check_redirect")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("hybridauth_process")) {
|
||||
if(!is_fn("hybridauth_process")) {
|
||||
function hybridauth_process() {
|
||||
Hybrid_Endpoint::process();
|
||||
}
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
/**
|
||||
* @file isemail.lnk.php
|
||||
* @date 2018-03-02
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief IsEmail library linker
|
||||
*/
|
||||
|
||||
if(!function_exists("is_email")) {
|
||||
$inc_file = "./vendor/isemail/is_email.php";
|
||||
if(!is_fn("is_email")) {
|
||||
$inc_file = "./vendor/_dist/isemail/is_email.php";
|
||||
if(file_exists($inc_file)) {
|
||||
include($inc_file);
|
||||
}
|
||||
|
|
32
helper/jCryption.lnk.php
Normal file
32
helper/jCryption.lnk.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
/**
|
||||
* @file jCryption.lnk.php
|
||||
* @date 2018-09-30
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief jCryption (alternative HTTPS on javascript) Helper
|
||||
*/
|
||||
|
||||
if(!is_fn("jCryption_load")) {
|
||||
function jCryption_load() {
|
||||
$required_files = array(
|
||||
"jCryption/sqAES",
|
||||
"jCryption/JCryption"
|
||||
);
|
||||
foreach($required_files as $file) {
|
||||
$inc_file = get_current_working_dir() . "/vendor/_dist/" . $file . ".php";
|
||||
if(file_exists($inc_file)) {
|
||||
include($inc_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("jCryption_get")) {
|
||||
function jCryption_get($idx=0, $selector="") {
|
||||
$s = array();
|
||||
$s[] = "JCryption::decrypt();";
|
||||
$s[] = sprintf("$(function(){$(\"%s\").jCryption();});", $selector);
|
||||
$s[] = sprintf("%s/vendor/_dist/jCryption/js/jquery.jcryption.3.1.0.js", base_url());
|
||||
return $s[$idx];
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @file jcryption.lnk.php
|
||||
* @date 2018-09-30
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief jCryption (alternative HTTPS on javascript) Helper
|
||||
*/
|
||||
|
||||
if(!function_exists("jcryption_load")) {
|
||||
function jcryption_load() {
|
||||
$required_files = array(
|
||||
"jCryption/sqAES",
|
||||
"jCryption/JCryption"
|
||||
);
|
||||
foreach($required_files as $file) {
|
||||
$inc_file = get_current_working_dir() . "/vendor/" . $file . ".php";
|
||||
if(file_exists($inc_file)) {
|
||||
include($inc_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("jcryption_get_code")) {
|
||||
function jcryption_get_code() {
|
||||
return "JCryption::decrypt();";
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("jcryption_get_jscode")) {
|
||||
function jcryption_get_jscode($selector) {
|
||||
return "$(function() { $(" . $selector . ").jCryption(); });";
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("jcryption_get_js_url")) {
|
||||
function jcryption_get_js_url() {
|
||||
return "JCryption::decrypt();";
|
||||
}
|
||||
return base_url() . "vendor/jCryption/js/jquery.jcryption.3.1.0.js";
|
||||
}
|
||||
}
|
69
helper/json.format.php
Normal file
69
helper/json.format.php
Normal file
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
// @created_on 2019-10-13
|
||||
// @updated_on 2020-01-27
|
||||
// @author Go Namhyeon <abuse@catswords.net>
|
||||
|
||||
if(!is_fn("json_decode_ex")) {
|
||||
function json_decode_ex($data, $options=array()) {
|
||||
$result = false;
|
||||
|
||||
$is_assoc = array_key_equals("assoc", $options, true);
|
||||
|
||||
$invalid_fn = array(
|
||||
"NO_FUNCTION_JSON_DECODE" => "json_decode",
|
||||
"NO_FUNCTION_JSON_LAST_ERROR" => "json_last_error",
|
||||
);
|
||||
$error = check_invalid_function($invalid_fn);
|
||||
if($error == JSON_ERROR_NONE) {
|
||||
if($is_assoc) {
|
||||
$result = json_decode($data, true);
|
||||
} else {
|
||||
$result = json_decode($data);
|
||||
}
|
||||
} else {
|
||||
$result = new stdClass();
|
||||
$result->error = $error;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("json_encode_ex")) {
|
||||
function json_encode_ex($data, $options=array()) {
|
||||
$result = false;
|
||||
|
||||
$is_adaptive = array_key_equals("adaptive", $options, true);
|
||||
$is_pretty = array_key_equals("pretty", $options, true);
|
||||
|
||||
$invalid_fn = array(
|
||||
"NO_FUNCTION_JSON_ENCODE" => "json_decode",
|
||||
"NO_FUNCTION_JSON_LAST_ERROR" => "json_last_error",
|
||||
);
|
||||
$error = check_invalid_function($invalid_fn);
|
||||
if($error == JSON_ERROR_NONE) {
|
||||
if($is_adaptive) {
|
||||
// 2018-06-01: Adaptive JSON is always quotes without escape non-ascii characters
|
||||
$lines = array();
|
||||
foreach($data as $k=>$v) {
|
||||
if(is_array($v)) {
|
||||
$lines[] = sprintf("\"%s\":%s", make_safe_argument($k), get_adaptive_json($v));
|
||||
} else {
|
||||
$lines[] = sprintf("\"%s\":\"%s\"", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
}
|
||||
$result = "{" . implode(",", $lines) . "}";
|
||||
} else {
|
||||
if($is_pretty) {
|
||||
$result = json_encode($data, JSON_PRETTY_PRINT);
|
||||
} else {
|
||||
$result = json_encode($data);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$result = sprintf("{\"error\": \"%s\"}", $error);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file kimsboard7.dbt.php
|
||||
* @date 2018-08-20
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Database Helper for Kimsboard 7 (experimental)
|
||||
*/
|
||||
|
||||
|
|
75
helper/lguplus.api.php
Normal file
75
helper/lguplus.api.php
Normal file
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
/**
|
||||
* @file lguplus.api.php
|
||||
* @date 2019-10-07
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief `LGU+`or `LGUPlus` is trandmark of LGUPlus Co. Ltd.
|
||||
*/
|
||||
|
||||
require_once("./vendor/_dist/lguplus/openapi/message.php");
|
||||
use openapi\message;
|
||||
|
||||
function lguplus_get_config() {
|
||||
$config = get_config();
|
||||
return array(
|
||||
"enabled" => $config['lguplus_enabled'],
|
||||
"key" => $config['lguplus_key'],
|
||||
"secret" => $config['lguplus_secret'],
|
||||
"from" => $config['lguplus_from'],
|
||||
"country" => $config['lguplus_country'],
|
||||
"subject" => $config['lguplus_subject']
|
||||
);
|
||||
}
|
||||
|
||||
function lguplus_send_message($message, $to="") {
|
||||
$cnf = lguplus_get_config();
|
||||
|
||||
$data = array(
|
||||
"response" => false,
|
||||
"error" => false
|
||||
);
|
||||
|
||||
if(!array_key_equals("enabled", $cnf, 1)) {
|
||||
$data['error'] = "this is disabled. please set lguplus_enabled to 1";
|
||||
return $data;
|
||||
}
|
||||
|
||||
try {
|
||||
$API_KEY = $cnf['key'];
|
||||
$API_PWD = $cnf['secret'];
|
||||
|
||||
$msg = new message($API_KEY, $API_PWD, 1, false);
|
||||
|
||||
$ch = $msg->getHandle( "/v1/send" );
|
||||
|
||||
$data = array(
|
||||
"send_type" => "S", // 발송형태(R:예약,S:즉시)
|
||||
"msg_type" => "S", // SMS : S, LMS : L, MMS : M
|
||||
"to" => $to, // 수신자번호, ","으로 구분하여 100개까지 지정 가능하다.
|
||||
"from" => get_value_in_array("from", $cnf, "01000000000"), // 발신자 번호, 발신자 번호는 사전등록된 번호여야 한다.
|
||||
"subject" => get_value_in_array("subject", $cnf, "Untitled text message"), // LMS, MMS 의 경우, 제목을 입력할 수 있다.
|
||||
"msg" => $message, // 메시지 본문 내용
|
||||
"device_id" => "", // 디바이스 아이디를 지정하여 특정 디바이스를 발송제어할 수 있다.
|
||||
"datetime" => "", // 예약시간(YYYYMMDDHH24MI)
|
||||
"country" => get_value_in_array("country", $cnf, "82"), // 국가 코드
|
||||
);
|
||||
|
||||
$msg->setData( $ch, $data );
|
||||
|
||||
$response = $msg->sendPost($ch);
|
||||
$data['response'] = $response;
|
||||
if ($response === FALSE) {
|
||||
$data['error'] = array(
|
||||
"code" => curl_error($ch),
|
||||
"message" => "CURL_ERROR"
|
||||
);
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
$data['error'] = array(
|
||||
"code" => $e->getCode(),
|
||||
"message" => $e->getMessage()
|
||||
);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
22
helper/lguplus.install.php
Normal file
22
helper/lguplus.install.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
/**
|
||||
* @file lguplus.install.php
|
||||
* @date 2019-10-13
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief `LGU+`or `LGUPlus` is trandmark of LGUPlus Co. Ltd.
|
||||
*/
|
||||
|
||||
if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
||||
|
||||
if(!is_fn("lguplus_install")) {
|
||||
function lguplus_install() {
|
||||
$response = get_web_page("https://openapi.sms.uplus.co.kr/sdkFile/php_sdk.zip");
|
||||
|
||||
$fw = write_storage_file($response['content'], array(
|
||||
"extension" => "zip"
|
||||
));
|
||||
@unzip($fw, get_storage_path());
|
||||
|
||||
// todo
|
||||
}
|
||||
}
|
48
helper/mailgun.api.php
Normal file
48
helper/mailgun.api.php
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
/**
|
||||
* @file mailgun.api.php
|
||||
* @date 2019-04-12
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Mailgun REST API interface module
|
||||
* @documentation https://documentation.mailgun.com/en/latest/api-sending.html
|
||||
*/
|
||||
|
||||
if(!is_fn("mailgun_get_config")) {
|
||||
function mailgun_get_config() {
|
||||
$config = get_config();
|
||||
|
||||
return array(
|
||||
"domain" => get_value_in_array("mailgun_domain", $config, ""),
|
||||
"name" => get_value_in_array("mailgun_name", $config, "John Doe"),
|
||||
"from" => get_value_in_array("mailgun_from", $config, ""),
|
||||
"apikey" => get_value_in_array("mailgun_apikey", $config, ""),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("mailgun_send_message")) {
|
||||
function mailgun_send_message($content, $to, $subject="Untitled") {
|
||||
$response = false;
|
||||
|
||||
// get mailgun configuration
|
||||
$cnf = mailgun_get_config();
|
||||
|
||||
// make request
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json(sprintf("https://api.mailgun.net/v3/%s/messages", $domain), array(
|
||||
"headers" => array(
|
||||
"Content-Type" => "multipart/form-data",
|
||||
"Authentication" => array("Basic", "api", $cnf['apikey']),
|
||||
),
|
||||
"data" => array(
|
||||
"from" => sprintf("%s <%s>", $cnf['name'], $cnf['from']),
|
||||
"to" => $to,
|
||||
"subject" => $subject,
|
||||
"text" => $content,
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file metaparser.lnk.php
|
||||
* @date 2018-03-21
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief PHP-Metaparser library linker
|
||||
*/
|
||||
|
||||
|
|
21
helper/migrate.1.5.php
Normal file
21
helper/migrate.1.5.php
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
// @file migrate.1.5.php
|
||||
// migration helper from ResaonbleFramework 1.5
|
||||
|
||||
if(!is_fn("check_function_exists")) {
|
||||
function check_function_exists($fn) {
|
||||
return is_fn($fn);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("set_scope")) {
|
||||
function set_scope($k, $v) {
|
||||
return set_shared_var($k, $v);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_scope")) {
|
||||
function get_scope($k) {
|
||||
return get_shared_var($k);
|
||||
}
|
||||
}
|
74
helper/mobiletool.php
Normal file
74
helper/mobiletool.php
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
/**
|
||||
* @file mobiletool.php
|
||||
* @date 2019-04-29
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Mobile Tool
|
||||
* @documentation https://www.w3.org/Mobile/training/device-detection/mobile_detector.txt
|
||||
*/
|
||||
|
||||
if(!is_fn("detect_mobile")) {
|
||||
function detect_mobile() {
|
||||
// This function returns the value of a local variable ($dm)
|
||||
// that is 0 if a desktop client is detected and > 0 for mobile.
|
||||
// Adapted only very lightly from original code posted PascalV in response to
|
||||
// the lightweight device detection (http://mobiforge.com/developing/story/lightweight-device-detection-php)
|
||||
|
||||
$dm = 0;
|
||||
|
||||
if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone)/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
if((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') > 0) or ((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'], 0, 4));
|
||||
$mobile_agents = array(
|
||||
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
|
||||
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
|
||||
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
|
||||
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
|
||||
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
|
||||
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
|
||||
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
|
||||
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
|
||||
'wapr','webc','winw','winw','xda','xda-'
|
||||
);
|
||||
|
||||
if(in_array($mobile_ua, $mobile_agents)) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
if(strpos(strtolower($_SERVER['ALL_HTTP']),'operamini') > 0) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),' ppc;') > 0) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows ce') > 0) {
|
||||
$dm++;
|
||||
} elseif(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows') > 0) {
|
||||
$dm = 0;
|
||||
}
|
||||
|
||||
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'iemobile') > 0) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
// detect android os
|
||||
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'android') > 0) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
// detect tizen os
|
||||
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'tizen') > 0) {
|
||||
$dm++;
|
||||
}
|
||||
|
||||
return $dm;
|
||||
}
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @file naturename.kr.php
|
||||
* @date 2018-04-15
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief Korean nature name generator
|
||||
*/
|
||||
|
||||
function naturename_kr_get_prefix_name() {
|
||||
$words = "김,이,박,최,정,강,조,윤,장,임,고";
|
||||
$prefix_names = explode(",", $words);
|
||||
shuffle($prefix_names);
|
||||
return $prefix_names[0];
|
||||
}
|
||||
|
||||
function naturename_kr_get_suffix_name($year="", $gender="") {
|
||||
$words = "영자,정자,순자,춘자,경자,옥자,명자,숙자,정순,화자,영수,영호,영식,정웅,영길,영일,정수,정남,광수,중수,정숙,영숙,영순,영희,정희,옥순,영철,종수,정식,정호,영환,명숙,경숙,순옥,현숙,성수,성호,상철,경수,상호,미경,미숙,경희,미영,영미,영진,병철,진호,재호,은정,은주,은영,현주,은경,지영,현정,미정,정훈,성훈,성진,상훈,성민,상현,준호,선영,지연,혜진,지훈,민수,지혜,지은,수진,은지,아름,지현,보람,현우,동현,준영,진우,유진,민지,수빈,지원,현지,예진,예지,민석,준혁,승현,서연,민서,서현,서영,수민,예원,민준,민재,도현,현준,승민,지민,서윤,예은,하은,지우,윤서,준서,우진,건우,예준,지후,채원,하윤,지아,은서,서준,주원,시우,도윤";
|
||||
$suffix_names = explode(",", $words);
|
||||
shuffle($suffix_names);
|
||||
return $suffix_names[0];
|
||||
}
|
||||
|
||||
function naturename_kr_get_generated_name() {
|
||||
return naturename_kr_get_prefix_name() . naturename_kr_get_suffix_name();
|
||||
}
|
|
@ -1,12 +1,13 @@
|
|||
<?php
|
||||
/**
|
||||
* @file networktool.php
|
||||
* @date 2018-04-11
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @created_on 2018-04-11
|
||||
* @updated_on 2022-09-16
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Network tool helper
|
||||
*/
|
||||
|
||||
if(!function_exists("get_network_event")) {
|
||||
if(!is_fn("get_network_event")) {
|
||||
function get_network_event() {
|
||||
$config = get_config();
|
||||
|
||||
|
@ -24,7 +25,7 @@ if(!function_exists("get_network_event")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_network_client_addr")) {
|
||||
if(!is_fn("get_network_client_addr")) {
|
||||
function get_network_client_addr() {
|
||||
$addr = '';
|
||||
if (isset($_SERVER['HTTP_CLIENT_IP']))
|
||||
|
@ -47,7 +48,7 @@ if(!function_exists("get_network_client_addr")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_network_server_addr")) {
|
||||
if(!is_fn("get_network_server_addr")) {
|
||||
function get_network_server_addr() {
|
||||
$addr = '';
|
||||
if(isset($_SERVER['SERVER_ADDR']) && isset($_SERVER['SERVER_PORT'])) {
|
||||
|
@ -56,7 +57,7 @@ if(!function_exists("get_network_server_addr")) {
|
|||
$addr = $_SERVER['SERVER_ADDR'];
|
||||
} else if(isset($_SERVER['LOCAL_ADDR'])) {
|
||||
$addr = $_SERVER['LOCAL_ADDR'];
|
||||
} else if(function_exists('gethostname') && function_exists('gethostbyname')) {
|
||||
} else if(is_fn(array("gethostname", "gethostbyname"))) {
|
||||
$host = gethostname();
|
||||
$addr = gethostbyname($host);
|
||||
} else {
|
||||
|
@ -66,14 +67,14 @@ if(!function_exists("get_network_server_addr")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_network_hostname")) {
|
||||
if(!is_fn("get_network_hostname")) {
|
||||
function get_network_hostname() {
|
||||
$host = '';
|
||||
if(isset($_SERVER['HTTP_HOST'])) {
|
||||
$host = $_SERVER['HTTP_HOST'];
|
||||
} else if(isset($_SERVER['SERVER_NAME'])) {
|
||||
$host = $_SERVER['SERVER_NAME'];
|
||||
} else if(function_exists('gethostname')) {
|
||||
} else if(!is_fn('gethostname')) {
|
||||
$host = gethostname();
|
||||
} else {
|
||||
$host = 'UNKNOWN';
|
||||
|
@ -83,13 +84,13 @@ if(!function_exists("get_network_hostname")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("check_secure_protocol")) {
|
||||
if(!is_fn("check_secure_protocol")) {
|
||||
function check_secure_protocol() {
|
||||
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_os_platform")) {
|
||||
if(!is_fn("get_os_platform")) {
|
||||
function get_os_platform() {
|
||||
$os = "";
|
||||
|
||||
|
@ -103,7 +104,7 @@ if(!function_exists("get_os_platform")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_network_outbound_addr")) {
|
||||
if(!is_fn("get_network_outbound_addr")) {
|
||||
function get_network_outbound_addr($protocol="") {
|
||||
$addr = false;
|
||||
$config = get_config();
|
||||
|
@ -126,3 +127,11 @@ if(!function_exists("get_network_outbound_addr")) {
|
|||
return $addr;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("detect_perf_agent")) {
|
||||
function detect_perf_agent() {
|
||||
$evt = get_network_event();
|
||||
$agent = $evt['agent'];
|
||||
return preg_match('(PingdomPageSpeed|GTmetrix)', $agent) === 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
/**
|
||||
* @file obfuscator.php
|
||||
* @date 2018-10-21
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief PHP Obfuscator for ReasonableFramework
|
||||
*/
|
||||
|
||||
if(!function_exists("get_obfuscator")) {
|
||||
if(!is_fn("get_obfuscator")) {
|
||||
function get_obfuscator() {
|
||||
$obfuscator = rand(1, 15);
|
||||
set_scope("obfuscator", $obfuscator);
|
||||
set_shared_var("obfuscator", $obfuscator);
|
||||
return $obfuscator;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_obfuscated_result")) {
|
||||
if(!is_fn("get_obfuscated_result")) {
|
||||
function get_obfuscated_result($raw) {
|
||||
$result = false;
|
||||
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file pagenate.php
|
||||
* @date 2018-01-01
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Page navigation helper
|
||||
*/
|
||||
|
||||
if(!function_exists("paginate_get_current_page")) {
|
||||
if(!is_fn("paginate_get_current_page")) {
|
||||
function paginate_get_current_page($page=1) {
|
||||
$current_page = 1;
|
||||
|
||||
|
@ -18,7 +18,7 @@ if(!function_exists("paginate_get_current_page")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("paginate_get_total_pages")) {
|
||||
if(!is_fn("paginate_get_total_pages")) {
|
||||
function paginate_get_total_pages($item_per_page=1.0, $total_records=1.0) {
|
||||
$total_pages = 1;
|
||||
|
||||
|
@ -30,7 +30,7 @@ if(!function_exists("paginate_get_total_pages")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("paginate_get_query_string")) {
|
||||
if(!is_fn("paginate_get_query_string")) {
|
||||
function paginate_get_query_string() {
|
||||
loadHelper("networktool");
|
||||
$net_event = get_network_event();
|
||||
|
@ -39,7 +39,7 @@ if(!function_exists("paginate_get_query_string")) {
|
|||
}
|
||||
|
||||
// https://www.sanwebe.com/2011/05/php-pagination-function
|
||||
if(!function_exists("paginate_make_html")) {
|
||||
if(!is_fn("paginate_make_html")) {
|
||||
function paginate_make_html($item_per_page, $current_page, $total_records, $total_pages, $page_url, $qry='') {
|
||||
$pagination = '';
|
||||
if($total_pages > 0 && $total_pages != 1 && $current_page <= $total_pages) { //verify total pages and current page number
|
||||
|
|
68
helper/perftool.php
Normal file
68
helper/perftool.php
Normal file
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
/**
|
||||
* @file perftool.php
|
||||
* @created_on 2020-02-19
|
||||
* @updated_on 2020-02-24
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief PerfTool helper
|
||||
*/
|
||||
|
||||
if(!is_fn("get_cpu_idle")) {
|
||||
function get_cpu_idle() {
|
||||
$idle = false;
|
||||
|
||||
if(loadHelper("exectool")) {
|
||||
$idle = floatval(trim(exec_command("top -n 1 -b | grep -i Cpu\(s\) | awk '{print \$8}'"))) / 100.0;
|
||||
}
|
||||
|
||||
return $idle;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_cpu_idle2")) {
|
||||
function get_cpu_idle2() {
|
||||
$idle = false;
|
||||
|
||||
if(loadHelper("exectool")) {
|
||||
$idle = floatval(trim(exec_command("grep 'cpu ' /proc/stat | awk '{idle=(\$5)/(\$2+\$4+\$5)} END {print idle}'")));
|
||||
}
|
||||
|
||||
return $idle;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("set_min_cpu_idle")) {
|
||||
function set_min_cpu_idle($ratio=0.01) {
|
||||
$wait = 0;
|
||||
|
||||
// default (cpu_sleep_time): 3 seconds
|
||||
$cpu_sleep_time = floatval(get_value_in_array("cpu_sleep_time", $config, 3));
|
||||
if($ratio > 0 && $ratio < 1) {
|
||||
while(get_cpu_idle() < $ratio) {
|
||||
if($wait == 0) {
|
||||
write_common_log("CPU usage exceeded. wait a few seconds...", "helper/preftool");
|
||||
}
|
||||
|
||||
sleep($cpu_sleep_time);
|
||||
$wait++;
|
||||
}
|
||||
}
|
||||
|
||||
if($wait > 0) {
|
||||
write_common_log(sprintf("CPU usage recovered. waited %s seconds ago", ($wait * $cpu_sleep_time)), "helper/preftool");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("set_cpu_usage_limit")) {
|
||||
function set_cpu_usage_limit($ratio=0.9) {
|
||||
$config = get_config();
|
||||
$num_cores = get_value_in_array("cpu_num_cores", $config, 1);
|
||||
$pid = get_shared_var("mypid");
|
||||
|
||||
if(!empty($pid) && loadHelper("exectool")) {
|
||||
write_common_log(sprintf("Limited CPU usage (%s, %s)<=(PID, LIMIT)", $pid, ($ratio * $num_cores) * 100), "helper/perftool");
|
||||
exec_command(sprintf("cpulimit --pid %s --limit %s", $pid, ($ratio * $num_cores) * 100));
|
||||
}
|
||||
}
|
||||
}
|
39
helper/pgkcp.install.php
Normal file
39
helper/pgkcp.install.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
/**
|
||||
* @file pgkcp.install.php
|
||||
* @date 2019-10-13
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) Auto-Install Tool
|
||||
*/
|
||||
|
||||
if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
||||
|
||||
loadHelper("pgkcp.lnk");
|
||||
|
||||
if(!is_fn("install_pgkcp")) {
|
||||
function install_pgkcp() {
|
||||
$response = get_web_page("https://admin8.kcp.co.kr/assist/download/sampleDownload", "get", array(
|
||||
"type1" => "FM01",
|
||||
"type2" => "FS04"
|
||||
));
|
||||
|
||||
// step 1
|
||||
$fw = write_storage_file($response['content'], array(
|
||||
"extension" => "zip"
|
||||
));
|
||||
@unzip($fw, get_storage_path());
|
||||
|
||||
// step 2
|
||||
$fw = write_storage_file("", array(
|
||||
"mode" => "fake",
|
||||
"filename" => sprintf("NHNKCP_PAYMENT_STANDARD_PHP/NHNKCP_PAYMENT_STANDARD_LINUX_PHP.zip"),
|
||||
));
|
||||
@unzip($fw, get_storage_path());
|
||||
|
||||
// step 3
|
||||
exec_command("cp -r %s/NHNKCP_PAYMENT_STANDARD_LINUX_PHP/* %s/", get_storage_path(), get_pgkcp_dir());
|
||||
|
||||
// if success, directory exists
|
||||
return is_dir(get_pgkcp_dir());
|
||||
}
|
||||
}
|
|
@ -1,19 +1,31 @@
|
|||
<?php
|
||||
/**
|
||||
* @file pgkcp.lnk.php
|
||||
* @date 2018-08-25
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @created_on 2018-08-25
|
||||
* @updated_on 2020-01-13
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) Helper
|
||||
*/
|
||||
|
||||
if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
||||
|
||||
if(!function_exists("get_pgkcp_config")) {
|
||||
loadHelper("json.format");
|
||||
loadHelper("webpagetool");
|
||||
loadHelper("compress.zip");
|
||||
loadHelper("exectool");
|
||||
|
||||
if(!is_fn("get_pgkcp_config")) {
|
||||
function get_pgkcp_dir() {
|
||||
return get_current_working_dir() . "/vendor/_dist/pgkcp";
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_pgkcp_config")) {
|
||||
function get_pgkcp_config() {
|
||||
$pgkcp_config = array();
|
||||
|
||||
// include configuration file
|
||||
$inc_file = get_current_working_dir() . "/vendor/pgkcp/cfg/site_conf_inc.php";
|
||||
$inc_file = get_pgkcp_dir() . "/cfg/site_conf_inc.php";
|
||||
if(file_exists($inc_file)) {
|
||||
include($inc_file);
|
||||
|
||||
|
@ -36,11 +48,12 @@ if(!function_exists("get_pgkcp_config")) {
|
|||
"storage_type" => "payman"
|
||||
));
|
||||
if(!empty($fr)) {
|
||||
$api_config = json_decode($fr, true);
|
||||
$api_config_fields = array("g_conf_gw_url", "g_conf_js_url", "g_conf_site_cd", "g_conf_site_key", "g_conf_site_name");
|
||||
foreach($api_config_fields as $name) {
|
||||
$pgkcp_config[$name] = get_value_in_array($name, $api_config, $pgkcp_config[$name]);
|
||||
}
|
||||
$_pgkcp_config = json_decode($fr);
|
||||
$pgkcp_config['g_conf_gw_url'] = get_property_value("g_conf_gw_url", $_pgkcp_config);
|
||||
$pgkcp_config['g_conf_js_url'] = get_property_value("g_conf_js_url", $_pgkcp_config);
|
||||
$pgkcp_config['g_conf_site_cd'] = get_property_value("g_conf_site_cd", $_pgkcp_config);
|
||||
$pgkcp_config['g_conf_site_key'] = get_property_value("g_conf_site_key", $_pgkcp_config);
|
||||
$pgkcp_config['g_conf_site_name'] = get_property_value("g_conf_site_name", $_pgkcp_config);
|
||||
}
|
||||
} else {
|
||||
set_error("PGKCP configuration file does not exists.");
|
||||
|
@ -50,7 +63,7 @@ if(!function_exists("get_pgkcp_config")) {
|
|||
// check installed platform
|
||||
$platform = get_pgkcp_platform($pgkcp_config);
|
||||
if(empty($platform)) {
|
||||
set_error("pp_cli or pp_cli.exe file not found");
|
||||
set_error("pp_cli(pp_cli.exe) file is not found or executable");
|
||||
show_errors();
|
||||
} else {
|
||||
$pgkcp_config['g_conf_platform'] = $platform;
|
||||
|
@ -60,17 +73,17 @@ if(!function_exists("get_pgkcp_config")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_pgkcp_platform")) {
|
||||
if(!is_fn("get_pgkcp_platform")) {
|
||||
function get_pgkcp_platform($pgkcp_config) {
|
||||
$platform = false;
|
||||
|
||||
$exe_files = array(
|
||||
$executables = array(
|
||||
"default" => $pgkcp_config['g_conf_home_dir'] . "/bin/pp_cli",
|
||||
"win32" => $pgkcp_config['g_conf_home_dir'] . "/bin/pp_cli.exe"
|
||||
);
|
||||
|
||||
foreach($exe_files as $k=>$v) {
|
||||
if(file_exists($v)) {
|
||||
foreach($executables as $k=>$v) {
|
||||
if(file_exists($v) && is_executable($v)) {
|
||||
$platform = $k;
|
||||
break;
|
||||
}
|
||||
|
@ -80,9 +93,9 @@ if(!function_exists("get_pgkcp_platform")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("load_pgkcp_library")) {
|
||||
if(!is_fn("load_pgkcp_library")) {
|
||||
function load_pgkcp_library() {
|
||||
$inc_file = get_current_working_dir() . "/vendor/pgkcp/res/pp_cli_hub_lib.php";
|
||||
$inc_file = get_pgkcp_dir() . "/sample/pp_cli_hub_lib.php";
|
||||
if(file_exists($inc_file)) {
|
||||
include($inc_file);
|
||||
} else {
|
||||
|
|
39
helper/rfc3164.proto.php
Normal file
39
helper/rfc3164.proto.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
/*
|
||||
* @file rfc3164.proto.php
|
||||
* @author Go Namhyeon <abuse@catswords.net> (Modified)
|
||||
* @author Troy Davis (@tory) - https://gist.github.com/troy/2220679 (Original)
|
||||
* @brief Helper for RFC3164(The BSD Syslog Protocol) - https://tools.ietf.org/html/rfc3164
|
||||
* @created_on 2018-03-02
|
||||
* @updated_on 2020-01-23
|
||||
*/
|
||||
|
||||
if(!is_fn("rfc3164_get_config")) {
|
||||
function rfc3164_get_config() {
|
||||
$config = get_config();
|
||||
return array(
|
||||
"enabled" => get_value_in_array("rfc3164_enabled", $config, ""),
|
||||
"host" => get_value_in_array("rfc3164_host", $config, ""),
|
||||
"port" => get_value_in_array("rfc3164_port", $config, "")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("rfc3164_send_message")) {
|
||||
function rfc3164_send_message($message, $component = "web", $program = "next_big_thing") {
|
||||
$_config = rfc3164_get_config();
|
||||
|
||||
$enabled = array_key_equals("enabled", $_config, 1);
|
||||
$host = get_value_in_array("host", $_config, "");
|
||||
$port = get_value_in_array("port", $_config, "");
|
||||
|
||||
if($enabled !== false) {
|
||||
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
|
||||
foreach(explode("\n", $message) as $line) {
|
||||
$syslog_message = "<22>" . date('M d H:i:s ') . $program . ' ' . $component . ': ' . $line;
|
||||
socket_sendto($sock, $syslog_message, strlen($syslog_message), 0, $host, $port);
|
||||
}
|
||||
socket_close($sock);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1206,7 +1206,7 @@ class simple_html_dom
|
|||
|
||||
$charset = null;
|
||||
|
||||
if (function_exists('get_last_retrieve_url_contents_content_type'))
|
||||
if (!is_fn('get_last_retrieve_url_contents_content_type'))
|
||||
{
|
||||
$contentTypeHeader = get_last_retrieve_url_contents_content_type();
|
||||
$success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches);
|
||||
|
@ -1248,7 +1248,7 @@ class simple_html_dom
|
|||
{
|
||||
// Use this in case mb_detect_charset isn't installed/loaded on this machine.
|
||||
$charset = false;
|
||||
if (function_exists('mb_detect_encoding'))
|
||||
if (!is_fn('mb_detect_encoding'))
|
||||
{
|
||||
// Have php try to detect the encoding from the text given to us.
|
||||
$charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) );
|
||||
|
|
|
@ -1,128 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @file socialhub.utl.php
|
||||
* @date 2018-09-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief SocialHub Utilities (refactoring from SocioRouter Utilities)
|
||||
*/
|
||||
|
||||
if(!function_exists("socialhub_send_message")) {
|
||||
function socialhub_send_message($provider, $adapter, $message, $options=array()) {
|
||||
$response = false;
|
||||
$status = array(
|
||||
"message" => $message
|
||||
);
|
||||
|
||||
switch($provider) {
|
||||
case "facebook":
|
||||
$status['link'] = get_value_in_array("link", $options, "");
|
||||
$status['picture'] = get_value_in_array("picture", $options, "");
|
||||
$response = $adapter->setUserStatus($status);
|
||||
break;
|
||||
|
||||
case "linkedin":
|
||||
$status['content'] = array(
|
||||
"title" => get_value_in_array("title", $options, ""),
|
||||
"description" => get_value_in_array("description", $options, ""),
|
||||
"submitted-url" => get_value_in_array("link", $options, ""),
|
||||
"submitted-image-url" => get_value_in_array("picture", $options, "")
|
||||
);
|
||||
$status['visibility'] = array(
|
||||
"code" => "anyone"
|
||||
);
|
||||
$response = $adapter->setUserStatus($status);
|
||||
break;
|
||||
|
||||
case "twitter":
|
||||
$status['link'] = get_value_in_array("link", $options, "");
|
||||
$status['picture'] = get_value_in_array("picture", $options, "");
|
||||
$response = $adapter->setUserStatus($status);
|
||||
break;
|
||||
|
||||
default:
|
||||
set_error("Unknown provider");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("socialhub_parse_object_id")) {
|
||||
function socialhub_parse_object_id($provider, $response) {
|
||||
$object_id = false;
|
||||
|
||||
switch($provider) {
|
||||
case "facebook":
|
||||
$decodedBody = get_property_value("decodedBody", $response, true);
|
||||
$object_id = $decodedBody['id'];
|
||||
break;
|
||||
case "linkedin":
|
||||
$object_id = get_property_value("updateKey", $response);
|
||||
break;
|
||||
case "twitter":
|
||||
$object_id = get_property_value("id_str", $response);
|
||||
break;
|
||||
}
|
||||
|
||||
return $object_id;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("socialhub_get_object")) {
|
||||
function socialhub_get_object($provider, $adapter, $object_id) {
|
||||
$result = false;
|
||||
$access_token = $adapter->getAccessToken();
|
||||
|
||||
switch($provider) {
|
||||
case "facebook":
|
||||
$result = array(
|
||||
"post" => socialhub_get_object_facebook($provider, $adapter, $object_id, "post"),
|
||||
"likes" => socialhub_get_object_facebook($provider, $adapter, $object_id, "likes"),
|
||||
"comments" => socialhub_get_object_facebook($provider, $adapter, $object_id, "comments"),
|
||||
"sharedposts" => socialhub_get_object_facebook($provider, $adapter, $object_id, "sharedposts"),
|
||||
"reactions" => socialhub_get_object_facebook($provider, $adapter, $object_id, "reactions"),
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("socialhub_get_object_facebook")) {
|
||||
function socialhub_get_object_facebook($adapter, $object_id, $type="post") {
|
||||
$result = false;
|
||||
$response = false;
|
||||
|
||||
try {
|
||||
switch($object_type) {
|
||||
case "post":
|
||||
$response = $adapter->api()->get("/" . $object_id, $access_token);
|
||||
break;
|
||||
case "likes":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/likes", $access_token);
|
||||
break;
|
||||
case "comments":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/comments", $access_token);
|
||||
break;
|
||||
case "sharedposts":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/sharedposts", $access_token);
|
||||
break;
|
||||
case "reactions":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/reactions", $access_token);
|
||||
break;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
set_error($e->getMessage());
|
||||
show_errors();
|
||||
}
|
||||
|
||||
// get response body
|
||||
$body = get_property_value("body", $response, true);
|
||||
$decoded_body = json_decode($body);
|
||||
$result = $decoded_body;
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
128
helper/socialtool.php
Normal file
128
helper/socialtool.php
Normal file
|
@ -0,0 +1,128 @@
|
|||
<?php
|
||||
/**
|
||||
* @file socialtools.php
|
||||
* @date 2018-09-27
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief SocialTools (refactoring from SocioRouter)
|
||||
*/
|
||||
|
||||
if(!is_fn("social_send_message")) {
|
||||
function social_send_message($provider, $adapter, $message, $options=array()) {
|
||||
$response = false;
|
||||
$status = array(
|
||||
"message" => $message
|
||||
);
|
||||
|
||||
switch($provider) {
|
||||
case "facebook":
|
||||
$status['link'] = get_value_in_array("link", $options, "");
|
||||
$status['picture'] = get_value_in_array("picture", $options, "");
|
||||
$response = $adapter->setUserStatus($status);
|
||||
break;
|
||||
|
||||
case "linkedin":
|
||||
$status['content'] = array(
|
||||
"title" => get_value_in_array("title", $options, ""),
|
||||
"description" => get_value_in_array("description", $options, ""),
|
||||
"submitted-url" => get_value_in_array("link", $options, ""),
|
||||
"submitted-image-url" => get_value_in_array("picture", $options, "")
|
||||
);
|
||||
$status['visibility'] = array(
|
||||
"code" => "anyone"
|
||||
);
|
||||
$response = $adapter->setUserStatus($status);
|
||||
break;
|
||||
|
||||
case "twitter":
|
||||
$status['link'] = get_value_in_array("link", $options, "");
|
||||
$status['picture'] = get_value_in_array("picture", $options, "");
|
||||
$response = $adapter->setUserStatus($status);
|
||||
break;
|
||||
|
||||
default:
|
||||
set_error("Unknown provider");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("social_parse_object_id")) {
|
||||
function social_parse_object_id($provider, $response) {
|
||||
$object_id = false;
|
||||
|
||||
switch($provider) {
|
||||
case "facebook":
|
||||
$decodedBody = get_property_value("decodedBody", $response, true);
|
||||
$object_id = $decodedBody['id'];
|
||||
break;
|
||||
case "linkedin":
|
||||
$object_id = get_property_value("updateKey", $response);
|
||||
break;
|
||||
case "twitter":
|
||||
$object_id = get_property_value("id_str", $response);
|
||||
break;
|
||||
}
|
||||
|
||||
return $object_id;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("social_get_object")) {
|
||||
function social_get_object($provider, $adapter, $object_id) {
|
||||
$result = false;
|
||||
$access_token = $adapter->getAccessToken();
|
||||
|
||||
switch($provider) {
|
||||
case "facebook":
|
||||
$result = array(
|
||||
"post" => social_get_object_facebook($provider, $adapter, $object_id, "post"),
|
||||
"likes" => social_get_object_facebook($provider, $adapter, $object_id, "likes"),
|
||||
"comments" => social_get_object_facebook($provider, $adapter, $object_id, "comments"),
|
||||
"sharedposts" => social_get_object_facebook($provider, $adapter, $object_id, "sharedposts"),
|
||||
"reactions" => social_get_object_facebook($provider, $adapter, $object_id, "reactions"),
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("social_get_object_facebook")) {
|
||||
function social_get_object_facebook($adapter, $object_id, $type="post") {
|
||||
$result = false;
|
||||
$response = false;
|
||||
|
||||
try {
|
||||
switch($object_type) {
|
||||
case "post":
|
||||
$response = $adapter->api()->get("/" . $object_id, $access_token);
|
||||
break;
|
||||
case "likes":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/likes", $access_token);
|
||||
break;
|
||||
case "comments":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/comments", $access_token);
|
||||
break;
|
||||
case "sharedposts":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/sharedposts", $access_token);
|
||||
break;
|
||||
case "reactions":
|
||||
$response = $adapter->api()->get("/" . $object_id . "/reactions", $access_token);
|
||||
break;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
set_error($e->getMessage());
|
||||
show_errors();
|
||||
}
|
||||
|
||||
// get response body
|
||||
$body = get_property_value("body", $response, true);
|
||||
$decoded_body = json_decode($body);
|
||||
$result = $decoded_body;
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file spreadsheet-reader.lnk.php
|
||||
* @date 2018-09-20
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Excel file parser
|
||||
***/
|
||||
|
||||
if(!function_exists("parse_excel_file")) {
|
||||
if(!is_fn("parse_excel_file")) {
|
||||
function parse_excel_file($filepath, $format="xlsx", $setColumnName=false) {
|
||||
$rows = array();
|
||||
|
||||
|
@ -19,14 +19,14 @@ if(!function_exists("parse_excel_file")) {
|
|||
//"spreadsheet-reader/SpreadsheetReader_ODS"
|
||||
);
|
||||
foreach($required_files as $file) {
|
||||
include("./vendor/" . $file . ".php");
|
||||
include("./vendor/_dist/" . $file . ".php");
|
||||
}
|
||||
|
||||
$spreadsheet = false;
|
||||
$columnNames = array();
|
||||
$fileFormat = strtolower($format);
|
||||
|
||||
/*
|
||||
$fileFormat = strtolower($format);
|
||||
if($fileFormat == "xlsx") {
|
||||
$spreadsheet = new SpreadsheetReader_XLSX($filepath);
|
||||
} elseif($fileFormat == "xls") {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/**
|
||||
* @file staticgen.php
|
||||
* @date 2018-07-22
|
||||
* @auther Go Namhyeon <gnh1201@gmail.com>
|
||||
* @auther Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Static Web Generation Tool for ResaonableFramework
|
||||
*/
|
||||
|
||||
|
|
318
helper/string.utils.php
Normal file
318
helper/string.utils.php
Normal file
|
@ -0,0 +1,318 @@
|
|||
<?php
|
||||
/**
|
||||
* @file string.utils.php
|
||||
* @created_on 2018-05-27
|
||||
* @updated_on 2020-02-21
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief String utility helper
|
||||
*/
|
||||
|
||||
if(!is_fn("get_converted_string")) {
|
||||
function get_converted_string($str, $to_charset="detect", $from_charset="detect") {
|
||||
$result = false;
|
||||
|
||||
// detect charset (input)
|
||||
if($form_charset == "detect") {
|
||||
if(is_fn(array("mb_detect_encoding", "mb_detect_order"))) {
|
||||
$from_charset = mb_detect_encoding($str, mb_detect_order(), true);
|
||||
} else {
|
||||
$from_charset = "ISO-8859-1";
|
||||
}
|
||||
}
|
||||
|
||||
// detect charset (output)
|
||||
if($to_charset == "detect") {
|
||||
if(is_fn("mb_internal_encoding")) {
|
||||
$to_charset = mb_internal_encoding();
|
||||
} elseif(is_fn("iconv_get_encoding")) {
|
||||
$to_charset = iconv_get_encoding("internal_encoding");
|
||||
} else {
|
||||
$_candidates = array(
|
||||
ini_get("default_charset"),
|
||||
ini_get("iconv.internal_encoding"),
|
||||
ini_get("mbstring.internal_encoding"),
|
||||
"UTF-8"
|
||||
);
|
||||
foreach($_candidates as $_candidate) {
|
||||
if(!empty($_candidate)) {
|
||||
$to_charset = $_candidate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// normalize charset (UPPERCASE)
|
||||
$from_charset = strtoupper($from_charset);
|
||||
$to_charset = strtoupper($to_charset);
|
||||
|
||||
// test conditions
|
||||
if($from_charset == $to_charset) {
|
||||
$result = $str;
|
||||
} elseif(is_fn("iconv")) {
|
||||
$result = iconv($from_charset, $to_charset, $str);
|
||||
} elseif(is_fn("mb_convert_encoding")) {
|
||||
$result = mb_convert_encoding($str, $to_charset, $from_charset);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("nl2p")) {
|
||||
function nl2p($str) {
|
||||
$paragraphs = "";
|
||||
foreach(explode_by_line($str) as $line) {
|
||||
if(trim($line)) {
|
||||
$paragraphs .= '<p>' . $line . '</p>';
|
||||
}
|
||||
}
|
||||
return $paragraphs;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("br2nl")) {
|
||||
function br2nl($string) {
|
||||
return preg_replace('/\<br(\s*)?\/?\>/i', DOC_EOL, $string);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("br2p")) {
|
||||
function br2p($string) {
|
||||
return nl2p(br2nl($string));
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_formatted_number")) {
|
||||
function get_formatted_number($value) {
|
||||
return number_format(floatval($value));
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_cutted_string")) {
|
||||
function get_cutted_string($str, $start, $len=null, $charset="utf-8") {
|
||||
$result = "";
|
||||
|
||||
if(is_fn("iconv_substr")) {
|
||||
$result = iconv_substr($str, $start, $len, $charset);
|
||||
} elseif(is_fn("mb_substr")) {
|
||||
$result = mb_substr($str, $start, $len, $charset);
|
||||
} else {
|
||||
$result = substr($str, $start, $len);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_string_length")) {
|
||||
function get_string_length($str, $charset="utf-8") {
|
||||
$len = 0;
|
||||
|
||||
if(is_fn("iconv_strlen")) {
|
||||
$len = iconv_strlen($str, $charset);
|
||||
} elseif(is_fn("mb_strlen")) {
|
||||
$len = mb_strlen($str, $charset);
|
||||
} else {
|
||||
$len = strlen($str);
|
||||
}
|
||||
|
||||
return $len;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_splitted_strings")) {
|
||||
function get_splitted_strings($str, $len=32, $chsarset="utf-8") {
|
||||
$strings = array();
|
||||
|
||||
$_len = get_string_length($str);
|
||||
$_pos = 0;
|
||||
if($len >= $_len) {
|
||||
$strings[] = $str;
|
||||
} else {
|
||||
$__len = ceil($_len / $len);
|
||||
for($i = 0; $i < $__len; $i++) {
|
||||
$_pos = $len * $i;
|
||||
$strings[] = get_cutted_string($str, $_pos, $len, $charset);
|
||||
}
|
||||
|
||||
if($_len - $_pos > 0) {
|
||||
$strings[] = $strings[] = get_cutted_string($str, $_pos);
|
||||
}
|
||||
}
|
||||
|
||||
return $strings;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("explode_by_line")) {
|
||||
function explode_by_line($str) {
|
||||
return preg_split('/\n|\r\n?/', $str);
|
||||
}
|
||||
}
|
||||
|
||||
// Deprecated: split_by_line()
|
||||
if(!is_fn("split_by_line")) {
|
||||
function split_by_line($str) {
|
||||
return explode_by_line($str);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("explode_storage_file_by_line")) {
|
||||
function explode_storage_file_by_line($filename, $options=array()) {
|
||||
return explode_by_line(read_storage_file($filename, $options));
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("strlike")) {
|
||||
function strlike($haystack, $needle) {
|
||||
$flag = false;
|
||||
|
||||
$s = explode("%", $needle);
|
||||
$d = count($s);
|
||||
switch($d) {
|
||||
case 3:
|
||||
$flag = (strpos($haystack, $s[1]) !== false);
|
||||
break;
|
||||
case 2:
|
||||
if($s[1] == "") {
|
||||
//$flag = (strpos($haystack, $s[0]) === 0);
|
||||
$flag = is_prefix($haystack, $s[0]);
|
||||
} elseif($s[0] == "") {
|
||||
//$flag = (strpos($haystack, $s[1]) !== false);
|
||||
$flag = is_suffix($haystack, $s[1]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$flag = ($needle === $haystack);
|
||||
}
|
||||
|
||||
return $flag;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("is_prefix")) {
|
||||
function is_prefix($haystack, $needle) {
|
||||
$length = strlen($needle);
|
||||
return (substr($haystack, 0, $length) === $needle);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("is_suffix")) {
|
||||
function is_suffix($haystack, $needle) {
|
||||
$length = strlen($needle);
|
||||
if($length == 0) {
|
||||
return true;
|
||||
}
|
||||
return (substr($haystack, -$length) === $needle);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("multi_explode")) {
|
||||
function multi_explode($delimiters, $string) {
|
||||
$ready = str_replace($delimiters, $delimiters[0], $string);
|
||||
$launch = explode($delimiters[0], $ready);
|
||||
return $launch;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("multi_strpos")) {
|
||||
function multi_strpos($string, $delimiters, $offset=0) {
|
||||
$last_pos = strlen($string) - 1;
|
||||
$pos = $last_pos;
|
||||
|
||||
if($offset > 0) {
|
||||
$string = substr($offset);
|
||||
}
|
||||
|
||||
foreach($delimiters as $s) {
|
||||
$new_pos = strpos($string, $s);
|
||||
if($new_pos !== false && $pos > $new_pos) {
|
||||
$pos = $new_pos;
|
||||
}
|
||||
}
|
||||
|
||||
return (($pos < $last_pos) ? $pos : false);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("parse_pipelined_data")) {
|
||||
function parse_pipelined_data($pipelined_data, $keynames=array()) {
|
||||
$result = array();
|
||||
$parsed_data = explode("|", $pipelined_data);
|
||||
|
||||
if(count($keynames) > 0) {
|
||||
$i = 0;
|
||||
foreach($keynames as $name) {
|
||||
$result[$name] = $parsed_data[$i];
|
||||
$i++;
|
||||
}
|
||||
} else {
|
||||
$result = $parsed_data;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/questions/10290849/how-to-remove-multiple-utf-8-bom-sequences
|
||||
if(!is_fn("remove_utf8_bom")) {
|
||||
function remove_utf8_bom($text) {
|
||||
$bom = pack('H*','EFBBBF');
|
||||
$text = preg_replace("/^$bom/", '', $text);
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_tokenized_text")) {
|
||||
function get_tokenized_text($text, $delimiters=array()) {
|
||||
if(count($delimiters) > 0) {
|
||||
return array_values(array_filter(multi_explode($delimiters, $text)));
|
||||
} else {
|
||||
return preg_split('/\s+/', $text, -1, PREG_SPLIT_NO_EMPTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_highlighted_html_by_words")) {
|
||||
function get_highlighted_html_by_word($word, $text, $delimiters=array()) {
|
||||
$html = $text;
|
||||
|
||||
$words = get_tokenized_text($word, $delimiters);
|
||||
if(check_array_length($words, 0) > 0) {
|
||||
$html = preg_replace(sprintf("/%s/i", implode("|", $words)), "<strong class=\"highlight\">$0</strong>", $text);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_floating_percentage")) {
|
||||
function get_floating_percentage($x, $a=5) {
|
||||
return round(floatval($x) / 100.0, $a);
|
||||
}
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/questions/13108157
|
||||
if(!is_fn("get_csv_from_array")) {
|
||||
function get_csv_from_array($data, $delimiter = ',', $enclosure = '"', $escape_char = "\\") {
|
||||
$f = fopen('php://memory', 'r+');
|
||||
foreach ($data as $item) {
|
||||
fputcsv($f, $item, $delimiter, $enclosure, $escape_char);
|
||||
}
|
||||
rewind($f);
|
||||
return stream_get_contents($f);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("eregi")) {
|
||||
function eregi($pattern, $subject, &$matches=NULL) {
|
||||
return preg_match(sprintf("/%s/i", $pattern), $subject, $matches);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("eregi_replace")) {
|
||||
function eregi_replace($pattern, $replacement, $subject) {
|
||||
return preg_replace(sprintf("/%s/i", $pattern), $replacement, $subject);
|
||||
}
|
||||
}
|
|
@ -1,164 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @file string.utl.php
|
||||
* @date 2018-05-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief String utility helper
|
||||
*/
|
||||
|
||||
// for Korean Telephone Number
|
||||
if(!function_exists("parse_tel_number_kr")) {
|
||||
function parse_tel_number_kr($tel) {
|
||||
$output = preg_replace("/[^0-9]/", "", $tel); // 숫자 이외 제거
|
||||
$local_code = substr($tel, 0, 2);
|
||||
|
||||
if ($local_code == '02') {
|
||||
$output = preg_replace("/([0-9]{2})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $tel);
|
||||
} elseif (strlen($tel) == '8' && in_array($local_code, array('15', '16', '18'))) {
|
||||
$output = preg_replace("/([0-9]{4})([0-9]{4})$/", "\\1-\\2", $tel); // 지능망 번호이면
|
||||
} else {
|
||||
$output = preg_replace("/([0-9]{3})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $tel);
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_converted_string")) {
|
||||
function get_converted_string($str, $to_charset, $from_charset) {
|
||||
$result = false;
|
||||
|
||||
if($form_charset == "detect") {
|
||||
if(function_exists("mb_detect_encoding") && function_exists("mb_detect_order")) {
|
||||
$from_charset = mb_detect_encoding($str, mb_detect_order(), true);
|
||||
} else {
|
||||
$from_charset = "ISO-8859-1";
|
||||
}
|
||||
}
|
||||
|
||||
if(function_exists("iconv")) {
|
||||
$result = iconv($from_charset, $to_charset, $str);
|
||||
} elseif(function_exists("mb_convert_encoding")) {
|
||||
$result = mb_convert_encoding($str, $to_charset, $from_charset);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("nl2p")) {
|
||||
function nl2p($string) {
|
||||
$paragraphs = '';
|
||||
foreach (explode("\n", $string) as $line) {
|
||||
if (trim($line)) {
|
||||
$paragraphs .= '<p>' . $line . '</p>';
|
||||
}
|
||||
}
|
||||
return $paragraphs;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("br2nl")) {
|
||||
function br2nl($string) {
|
||||
return preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("br2p")) {
|
||||
function br2p($string) {
|
||||
return nl2p(br2nl($string));
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_formatted_number")) {
|
||||
function get_formatted_number($value) {
|
||||
return number_format(floatval($value));
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_cutted_string")) {
|
||||
function get_cutted_string($str, $start, $len=0, $charset="utf-8") {
|
||||
$result = "";
|
||||
|
||||
if(function_exists("iconv_substr")) {
|
||||
$result = iconv_substr($str, $start, $len, $charset);
|
||||
} elseif(function_exists("mb_substr")) {
|
||||
$result = mb_substr($str, $start, $len, $charset);
|
||||
} else {
|
||||
$result = substr($str, $start, $len);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("explode_by_line")) {
|
||||
function explode_by_line($str) {
|
||||
return preg_split('/\n|\r\n?/', $str);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("read_storage_file_by_line")) {
|
||||
function read_storage_file_by_line($filename, $options=array()) {
|
||||
return explode_by_line(read_storage_file($filename, $options));
|
||||
}
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php
|
||||
if(!function_exists("startsWith")) {
|
||||
function startsWith($haystack, $needle) {
|
||||
$length = strlen($needle);
|
||||
return (substr($haystack, 0, $length) === $needle);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("endsWith")) {
|
||||
function endsWith($haystack, $needle) {
|
||||
$length = strlen($needle);
|
||||
if($length == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (substr($haystack, -$length) === $needle);
|
||||
}
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/questions/4955433/php-multiple-delimiters-in-explode/27767665#27767665
|
||||
if(!function_exists("multiexplode")) {
|
||||
function multiexplode($delimiters, $string) {
|
||||
$ready = str_replace($delimiters, $delimiters[0], $string);
|
||||
$launch = explode($delimiters[0], $ready);
|
||||
return $launch;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("parse_pipelined_data")) {
|
||||
function parse_pipelined_data($pipelined_data, $keynames=array()) {
|
||||
$result = array();
|
||||
$parsed_data = explode("|", $pipelined_data);
|
||||
|
||||
if(count($keynames) > 0) {
|
||||
$i = 0;
|
||||
foreach($keynames as $name) {
|
||||
$result[$name] = $parsed_data[$i];
|
||||
$i++;
|
||||
}
|
||||
} else {
|
||||
$result = $parsed_data;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(function_exists("eregi_compatible")) {
|
||||
function eregi_compatible($pattern, $subject, &$matches=NULL) {
|
||||
return preg_match(sprintf("/%s/i", $pattern), $subject, $matches);
|
||||
}
|
||||
}
|
||||
|
||||
if(function_exists("eregi_replace_compatible")) {
|
||||
function eregi_replace_compatible($pattern, $replacement, $subject) {
|
||||
return preg_replace(sprintf("/%s/i", $pattern), $replacement, $subject);
|
||||
}
|
||||
}
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file tablewiz.php
|
||||
* @date 2018-02-26
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief TableWiz helper
|
||||
*/
|
||||
|
||||
if(!function_exists("tablewiz_cut_str")) {
|
||||
if(!is_fn("tablewiz_cut_str")) {
|
||||
function tablewiz_cut_str($str, $strlimit=0) {
|
||||
$plaintext = strip_tags($str);
|
||||
|
||||
|
@ -19,7 +19,7 @@ if(!function_exists("tablewiz_cut_str")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("tablewiz_create")) {
|
||||
if(!is_fn("tablewiz_create")) {
|
||||
function tablewiz_create($rows, $bind=array(), $domid="", $domclass="", $strlimit=0, $thead_html=array(), $tbody_html_list=array()) {
|
||||
$html = "";
|
||||
|
||||
|
|
36
helper/thumbnail.youtube.php
Normal file
36
helper/thumbnail.youtube.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
if(!is_fn("get_youtube_thumbnail")) {
|
||||
function get_youtube_thumbnail($vi) {
|
||||
$ytimgs = array();
|
||||
$ytimg_urls = array();
|
||||
|
||||
$ytimg_url = "http://img.youtube.com/vi/:vi/:rs.jpg";
|
||||
$ytimg_types = array(
|
||||
"t0" => "0",
|
||||
"t1" => "1",
|
||||
"t2" => "2",
|
||||
"t3" => "3",
|
||||
"de" => "default",
|
||||
"mq" => "mqdefault",
|
||||
"hq" => "hqdefault",
|
||||
"sd" => "sddefault",
|
||||
"mx" => "maxresdefault"
|
||||
);
|
||||
|
||||
foreach($ytimg_types as $k=>$v) {
|
||||
$url = get_web_binded_url($ytimg_url, array(
|
||||
"vi" => $vi,
|
||||
"rs" => $v
|
||||
));
|
||||
$response = get_web_page($url, "get.cache");
|
||||
$ytimgs[$k] = $response['content'];
|
||||
$fpath = write_storage_file($response['content'], array(
|
||||
"filename" => $response['sha1']
|
||||
));
|
||||
$ytimg_urls[$k] = get_storage_url() . "/" . $response['sha1'];
|
||||
}
|
||||
|
||||
return $ytimg_urls;
|
||||
}
|
||||
}
|
|
@ -2,12 +2,12 @@
|
|||
/**
|
||||
* @file timetool.php
|
||||
* @date 2018-09-26
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Time tools
|
||||
*/
|
||||
|
||||
/* Query a time server (C) 1999-09-29, Ralf D. Kloth (QRQ.software) <ralf at qrq.de> */
|
||||
if(!function_exists("query_time_server")) {
|
||||
if(!is_fn("query_time_server")) {
|
||||
function query_time_server($timeserver, $socket) {
|
||||
// parameters: server, socket, error code, error text, timeout
|
||||
$fp = fsockopen($timeserver,$socket,$err,$errstr,5);
|
||||
|
@ -28,7 +28,7 @@ if(!function_exists("query_time_server")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_server_time")) {
|
||||
if(!is_fn("get_server_time")) {
|
||||
function get_server_time($timeserver="time.bora.net") {
|
||||
$timestamp = false;
|
||||
$timercvd = query_time_server($timeserver, 37);
|
||||
|
|
97
helper/twilio.api.php
Normal file
97
helper/twilio.api.php
Normal file
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
/**
|
||||
* @file twilio.api.php
|
||||
* @date 2019-04-08
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Twilio REST API interface module
|
||||
* @documentation https://www.twilio.com/docs/sms/send-messages
|
||||
*/
|
||||
|
||||
if(!is_fn("twilio_get_config")) {
|
||||
function twilio_get_config() {
|
||||
$config = get_config();
|
||||
|
||||
return array(
|
||||
"sid" => get_value_in_array("twilio_sid", $config, ""),
|
||||
"token" => get_value_in_array("twilio_token", $config, ""),
|
||||
"from" => get_value_in_array("twilio_from", $config, ""),
|
||||
"char_limit" => get_value_in_array("twilio_char_limit", $config, 160)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("twilio_get_message_blocks")) {
|
||||
function twilio_parse_messages($message) {
|
||||
$strings = array();
|
||||
|
||||
$cnf = twilio_get_config();
|
||||
|
||||
if(loadHelper("string.utils")) {
|
||||
$strings = get_splitted_strings($message, $cnf['char_limit']);
|
||||
} else {
|
||||
$strings[] = substr($messages, 0, $cnf['char_limit']);
|
||||
}
|
||||
|
||||
return $strings;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("twilio_send_message")) {
|
||||
function twilio_send_message($message, $to) {
|
||||
$response = false;
|
||||
|
||||
$cnf = twilio_get_config();
|
||||
$messages = twilio_parse_messages($message);
|
||||
|
||||
if(loadHelper("webpagetool")) {
|
||||
$bind = array(
|
||||
"sid" => $cnf['sid']
|
||||
);
|
||||
$request_url = get_web_binded_url("https://api.twilio.com/2010-04-01/Accounts/:sid/Messages.json", $bind);
|
||||
foreach($messages as $_message) {
|
||||
$response = get_web_json($request_url, "post.cmd", array(
|
||||
"headers" => array(
|
||||
"Content-Type" => "application/x-www-form-urlencoded",
|
||||
"Authentication" => array("Basic", $cnf['sid'], $cnf['token']),
|
||||
),
|
||||
"data" => array(
|
||||
"Body" => $_message,
|
||||
"From" => $cnf['from'],
|
||||
"To" => $to,
|
||||
)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("twilio_send_voice")) {
|
||||
function twilio_send_voice($message="", $to) {
|
||||
$response = false;
|
||||
|
||||
$cnf = twilio_get_config();
|
||||
$url = "http://catswords.re.kr/ep/storage/data/voice.xml";
|
||||
|
||||
if(loadHelper("webpagetool")) {
|
||||
$bind = array(
|
||||
"sid" => $cnf['sid']
|
||||
);
|
||||
$request_url = sprintf("https://api.twilio.com/2010-04-01/Accounts/:sid/Calls.json", $bind);
|
||||
$response = get_web_page($request_url, "post.cmd", array(
|
||||
"headers" => array(
|
||||
"Content-Type" => "application/x-www-form-urlencoded",
|
||||
"Authentication" => array("Basic", $cnf['sid'], $cnf['token']),
|
||||
),
|
||||
"data" => array(
|
||||
"Url" => $url,
|
||||
"From" => $cnf['from'],
|
||||
"To" => $to,
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file vworld.php
|
||||
* @date 2018-01-11
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Geo Helper based on vWorld (vworld.kr, molit.go.kr)
|
||||
*/
|
||||
|
||||
if(!function_exists("vworld_utf8_replace")) {
|
||||
if(!is_fn("vworld_utf8_replace")) {
|
||||
function vworld_utf8_replace($data) {
|
||||
$regex = <<<'END'
|
||||
/
|
||||
|
@ -32,7 +32,7 @@ END;
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("vworld_geocode_keyword")) {
|
||||
if(!is_fn("vworld_geocode_keyword")) {
|
||||
function vworld_geocode_keyword($keyword, $category="Poi", $multiple=false) {
|
||||
global $config;
|
||||
|
||||
|
@ -132,7 +132,7 @@ if(!function_exists("vworld_geocode_keyword")) {
|
|||
}
|
||||
|
||||
// get geocode from vworld
|
||||
if(!function_exists("vworld_geocode_addr2coord")) {
|
||||
if(!is_fn("vworld_geocode_addr2coord")) {
|
||||
function vworld_geocode_addr2coord($addr) {
|
||||
global $config;
|
||||
|
||||
|
@ -228,7 +228,7 @@ if(!function_exists("vworld_geocode_addr2coord")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("vworld_adaptive_addr2coord")) {
|
||||
if(!is_fn("vworld_adaptive_addr2coord")) {
|
||||
function vworld_adaptive_addr2coord($addr) {
|
||||
$geopoint = array(
|
||||
"address" => "",
|
||||
|
|
74
helper/webhooktool.php
Normal file
74
helper/webhooktool.php
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
/**
|
||||
* @file webhooktool.php
|
||||
* @date 2019-05-04
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief WebhookTools
|
||||
* @trademark
|
||||
* * `NateOn` is trademark of SK Communications Co Ltd., SK Planet Co Ltd., or other SK businesses.
|
||||
* * `Discord' is trademark of Discord Inc. (Originally Hammer And Chisel)
|
||||
* * `Slack` is trademark of Slack Technologies Inc.
|
||||
*/
|
||||
|
||||
if(!is_fn("send_web_hook")) {
|
||||
function send_web_hook($message, $networkid, $options=array()) {
|
||||
$response = false;
|
||||
|
||||
$id = get_value_in_array("id", $options, "");
|
||||
$username = get_value_in_array("username", $options, "ReasonableBot");
|
||||
$message = str_replace("http:", "hxxp:", $message);
|
||||
|
||||
switch($networkid) {
|
||||
case "nateon":
|
||||
$request_url = sprintf("https://teamroom.nate.com/api/webhook/%s", $id);
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_page($request_url, "post", array(
|
||||
"headers" => array(
|
||||
"Content-Type" => "application/x-www-form-urlencoded",
|
||||
),
|
||||
"data" => array(
|
||||
"content" => urlencode($message),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case "discord":
|
||||
$request_url = sprintf("https://discordapp.com/api/webhooks/%s", $id);
|
||||
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($request_url, "jsondata", array(
|
||||
"headers" => array(
|
||||
"Content-Type" => "application/json",
|
||||
),
|
||||
"data" => array(
|
||||
"content" => $message,
|
||||
"username" => $username,
|
||||
),
|
||||
));
|
||||
}
|
||||
break;
|
||||
|
||||
case "slack":
|
||||
$request_url = sprintf("https://hooks.slack.com/services/%s", $id);
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($request_url, "jsondata", array(
|
||||
"headers" => array(
|
||||
"Content-Type" => "application/json",
|
||||
),
|
||||
"data" => array(
|
||||
"channel" => sprintf("#%s", get_value_in_array("channel", $options, "general")),
|
||||
"username" => $username,
|
||||
"text" => $message,
|
||||
"icon_emoji" => sprintf(":%s:", get_value_in_array("emoji", $options, "ghost")),
|
||||
),
|
||||
));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
|
@ -1,30 +1,34 @@
|
|||
<?php
|
||||
/**
|
||||
* @file webpagetool.php
|
||||
* @date 2018-06-01
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @created_on 2018-06-01
|
||||
* @updated_on 2021-02-01
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief WebPageTool helper
|
||||
*/
|
||||
|
||||
/****** START EXAMPLES *****/
|
||||
/* // REQUEST GET: $response = get_web_page($url, "get", $data); */
|
||||
/* // REQUEST POST: $response = get_web_page($url, "post", $data); */
|
||||
/* // REQUEST GET with CACHE: $response = get_web_page($url, "get.cache", $data); */
|
||||
/* // REQUEST POST with CACHE: $response = get_web_page($url, "post.cache", $data); */
|
||||
/* // REQUEST GET by CMD with CACHE: $response = get_web_page($url, "get.cmd.cache"); */
|
||||
/* // REQUEST GET by SOCK with CACHE: $response = get_web_page($url, "get.sock.cache"); */
|
||||
/* // REQUEST GET by FGC: $response = get_web_page($url, "get.fgc"); */
|
||||
/* // REQUEST GET by WGET: $response = get_web_page($url, "get.wget"); */
|
||||
/* // PRINT CONTENT: echo $response['content']; */
|
||||
/****** END EXAMPLES *****/
|
||||
/****** EXAMPLES { *****/
|
||||
/* * GET: $response = get_web_page($url, "get", $data); */
|
||||
/* * POST: $response = get_web_page($url, "post", $data); */
|
||||
/* * GET/ASYNC: $response = get_web_page($url, "get.async", $data); */
|
||||
/* * GET/CACHE: $response = get_web_page($url, "get.cache", $data); */
|
||||
/* * POST/CACHE: $response = get_web_page($url, "post.cache", $data); */
|
||||
/* * GET/CMD/CACHE: $response = get_web_page($url, "get.cmd.cache"); */
|
||||
/* * GET/CMD/CACHE: $response = get_web_page($url, "get.sock.cache"); */
|
||||
/* * GET/FGC: $response = get_web_page($url, "get.fgc"); */
|
||||
/* * GET/WGET: $response = get_web_page($url, "get.wget"); */
|
||||
/* * GET/ARIA: $response = get_web_page($url, "get.aria"); */
|
||||
/* * GET/HTTPIE: $response = get_web_page($url, "get.httpie"); */
|
||||
/* * PRINT: echo $response['content']; */
|
||||
/****** } // END EXAMPLES *****/
|
||||
|
||||
if(!function_exists("get_web_fgc")) {
|
||||
if(!is_fn("get_web_fgc")) {
|
||||
function get_web_fgc($url) {
|
||||
return (ini_get("allow_url_fopen") ? file_get_contents($url) : false);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_build_qs")) {
|
||||
if(!is_fn("get_web_build_qs")) {
|
||||
function get_web_build_qs($url="", $data) {
|
||||
$qs = "";
|
||||
if(empty($url)) {
|
||||
|
@ -32,19 +36,37 @@ if(!function_exists("get_web_build_qs")) {
|
|||
} else {
|
||||
$pos = strpos($url, '?');
|
||||
if ($pos === false) {
|
||||
$qs = $url . '?' . http_build_query($data);
|
||||
$qs = $url . '?' . http_build_query($data, '', '&');
|
||||
} else {
|
||||
$qs = $url . '&' . http_build_query($data);
|
||||
$qs = $url . '&' . http_build_query($data, '', '&');
|
||||
}
|
||||
}
|
||||
return $qs;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_cmd")) {
|
||||
if(!is_fn("get_web_binded_url")) {
|
||||
function get_web_binded_url($url="", $bind) {
|
||||
if(is_array($bind) && check_array_length($bind, 0) > 0) {
|
||||
$bind_keys = array_keys($bind);
|
||||
usort($bind_keys, "compare_db_key_length");
|
||||
foreach($bind_keys as $k) {
|
||||
$url = str_replace(":" . $k, $bind[$k], $url);
|
||||
}
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_web_cmd")) {
|
||||
function get_web_cmd($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45, $headers=array()) {
|
||||
$output = "";
|
||||
|
||||
// set method
|
||||
$req_methods = explode(".", $method);
|
||||
$method = $req_methods[0];
|
||||
|
||||
// set command
|
||||
$args = array("curl");
|
||||
$cmd = "";
|
||||
|
||||
|
@ -54,52 +76,122 @@ if(!function_exists("get_web_cmd")) {
|
|||
}
|
||||
|
||||
if($method == "get") {
|
||||
$args[] = sprintf("-A '%s'", make_safe_argument($ua)); // set agent
|
||||
$args[] = sprintf("-A '%s'", get_web_user_agent($ua)); // set agent
|
||||
$args[] = "-k"; // allow self-signed certificate (the same as --insecure)
|
||||
foreach($headers as $k=>$v) {
|
||||
// the same as --header
|
||||
if(is_array($v)) {
|
||||
if($k == "Authentication") {
|
||||
if($v[0] == "Basic" && check_array_length($v, 3) == 0) {
|
||||
$args[] = sprintf("-u '%s:%s'", make_safe_argument($v[1]), make_safe_argument($v[2]));
|
||||
} else {
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument(implode(" ", $v)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
$args[] = get_web_build_qs($url, $data);
|
||||
|
||||
}
|
||||
$args[] = sprintf("'%s'", make_safe_argument(get_web_build_qs($url, $data)));
|
||||
}
|
||||
|
||||
if($method == "post") {
|
||||
$args[] = "-X POST"; // set post request (the same as --request)
|
||||
$args[] = sprintf("-A '%s'", make_safe_argument($ua)); // set agent
|
||||
$args[] = sprintf("-A '%s'", get_web_user_agent($ua)); // set agent
|
||||
$args[] = "-k"; // allow self-signed certificate (the same as --insecure)
|
||||
|
||||
foreach($headers as $k=>$v) {
|
||||
// the same as --header
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
foreach($data as $k=>$v) {
|
||||
if(substr($v, 0, 1) == "@") { // if this is a file
|
||||
// the same as --form
|
||||
$args[] = sprintf("-F '%s=%s' ", make_safe_argument($k), make_safe_argument($v));
|
||||
if(is_array($v)) {
|
||||
if($k == "Authentication") {
|
||||
if($v[0] == "Basic" && check_array_length($v, 3) == 0) {
|
||||
$args[] = sprintf("-u '%s:%s'", make_safe_argument($v[1]), make_safe_argument($v[2]));
|
||||
} else {
|
||||
// the same as --data
|
||||
$args[] = sprintf("-d '%s=%s' ", make_safe_argument($k), make_safe_argument($v));
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument(implode(" ", $v)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
}
|
||||
|
||||
if($method == "jsondata") {
|
||||
$data_string = json_encode($data);
|
||||
$args[] = "-X POST"; // set post request (the same as -X)
|
||||
$args[] = sprintf("-A '%s'", make_safe_argument($ua)); // set agent
|
||||
$args[] = "-k"; // allow self-signed certificate (the same as --insecure)
|
||||
$headers['Content-Type'] = "application/json";
|
||||
$headers['Content-Length'] = strlen($data_string);
|
||||
foreach($headers as $k=>$v) {
|
||||
$args[] = sprintf("--header '%s: %s'", make_safe_argument($k), make_safe_argument($v));
|
||||
$_data = array();
|
||||
foreach($data as $k=>$v) {
|
||||
if(substr($v, 0, 1) == "@") { // if this is a file
|
||||
// the same as --form
|
||||
$args[] = sprintf("-F %s='%s'", make_safe_argument($k), make_safe_argument($v));
|
||||
} else {
|
||||
$_data[$k] = $v;
|
||||
/*
|
||||
if(array_key_equals("Content-Type", $headers, "multipart/form-data")) {
|
||||
$args[] = sprintf("-F %s='%s'", make_safe_argument($k), make_safe_argument($v));
|
||||
} elseif(array_key_equals("Content-Type", $headers, "application/x-www-form-urlencoded")) {
|
||||
$args[] = sprintf("--data-urlencode %s='%s'", make_safe_argument($k), make_safe_argument($v));
|
||||
} else { // the same as --data
|
||||
$args[] = sprintf("-d %s='%s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
$args[] = sprintf("--data '%s'", $data_string);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
// #110 [helper/webpagetool] post array data, but (string)`Array` given
|
||||
if(count($_data) > 0) {
|
||||
$args[] = sprintf("--data '%s'", get_web_build_qs("", $_data));
|
||||
}
|
||||
|
||||
$args[] = $url;
|
||||
}
|
||||
|
||||
if($method == "jsondata" || $method == "rawdata") {
|
||||
$args[] = "-X POST"; // set post request (the same as -X)
|
||||
$args[] = sprintf("-A '%s'", get_web_user_agent($ua)); // set agent
|
||||
$args[] = "-k"; // allow self-signed certificate (the same as --insecure)
|
||||
|
||||
if($method == "jsondata") {
|
||||
$_data = json_encode($data);
|
||||
$headers['Content-Type'] = "application/json;charset=utf-8";
|
||||
$headers['Accept'] = "application/json, text/plain, */*";
|
||||
} else {
|
||||
// possible: application/octet-stream (RFC2046)
|
||||
$_data = $data;
|
||||
$headers['Content-Type'] = "text/plain;charset=utf-8";
|
||||
$headers['Accept'] = "text/plain, */*";
|
||||
}
|
||||
|
||||
// get content size
|
||||
$headers['Content-Length'] = strlen($_data);
|
||||
|
||||
// set headers
|
||||
foreach($headers as $k=>$v) {
|
||||
// the same as --header
|
||||
if(is_array($v)) {
|
||||
if($k == "Authentication") {
|
||||
if($v[0] == "Basic" && check_array_length($v, 3) == 0) {
|
||||
$args[] = sprintf("-u '%s:%s'", make_safe_argument($v[1]), make_safe_argument($v[2]));
|
||||
} else {
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument(implode(" ", $v)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$args[] = sprintf("-H '%s: %s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
}
|
||||
$args[] = sprintf("--data '%s'", $_data);
|
||||
$args[] = sprintf("'%s'", $url);
|
||||
}
|
||||
|
||||
// complete and run command
|
||||
$cmd = trim(implode(" ", $args));
|
||||
|
||||
// do async(background)
|
||||
if(in_array("async", $req_methods)) {
|
||||
$cmd = sprintf("%s 1>/dev/null 2>&1 & echo $!;", $cmd);
|
||||
}
|
||||
|
||||
// run command
|
||||
if(!empty($cmd)) {
|
||||
$output = exec_command($cmd, "shell_exec");
|
||||
$output = exec_command($cmd);
|
||||
}
|
||||
|
||||
return $output;
|
||||
|
@ -107,7 +199,7 @@ if(!function_exists("get_web_cmd")) {
|
|||
}
|
||||
|
||||
// http://dev.epiloum.net/109
|
||||
if(!function_exists("get_web_sock")) {
|
||||
if(!is_fn("get_web_sock")) {
|
||||
function get_web_sock($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$output = "";
|
||||
|
||||
|
@ -194,19 +286,19 @@ if(!function_exists("get_web_sock")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_wget")) {
|
||||
if(!is_fn("get_web_wget")) {
|
||||
function get_web_wget($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$content = false;
|
||||
|
||||
$filename = make_random_id(32);
|
||||
$filepath = write_storage_file("", array(
|
||||
$fw = write_storage_file("", array(
|
||||
"filename" => $filename,
|
||||
"mode" => "fake"
|
||||
"mode" => "fake",
|
||||
));
|
||||
|
||||
$cmd = sprintf("wget '%s' -O %s", $url, $filepath);
|
||||
$cmd = sprintf("wget '%s' -O %s", $url, $fw);
|
||||
if(loadHelper("exectool")) {
|
||||
exec_command($cmd, "shell_exec");
|
||||
exec_command($cmd);
|
||||
$content = read_storage_file($filename);
|
||||
}
|
||||
|
||||
|
@ -214,10 +306,137 @@ if(!function_exists("get_web_wget")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_curl")) {
|
||||
if(!is_fn("get_web_aria")) {
|
||||
function get_web_aria($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45, $headers=array()) {
|
||||
$content = false;
|
||||
|
||||
$filename = make_random_id(32);
|
||||
$fw = write_storage_file("", array(
|
||||
"filename" => $filename,
|
||||
"mode" => "fake"
|
||||
));
|
||||
|
||||
// init args
|
||||
$args = array();
|
||||
|
||||
// make args
|
||||
$args[] = "aria2c";
|
||||
$args[] = "--out=" . $fw; // set output file
|
||||
$args[] = "--connect-timeout=" . $ct_out; // connection timeout (seconds)
|
||||
$args[] = "--timeout=" . $t_out; // timeout (seconds)
|
||||
|
||||
// set proxy
|
||||
if(!empty($proxy)) {
|
||||
$args[] = "--http-proxy=" . $proxy;
|
||||
}
|
||||
|
||||
// set user agent
|
||||
if(!empty($ua)) {
|
||||
$args[] = "--user-agent=" . $ua;
|
||||
}
|
||||
|
||||
// set headers
|
||||
foreach($headers as $k=>$v) {
|
||||
if(is_array($v)) {
|
||||
if($k == "Authentication") {
|
||||
if($v[0] == "Basic" && check_array_length($v, 3) == 0) {
|
||||
$args[] = sprintf("--header='%s: Basic %s'", $k, base64_decode($v[1] . ":" . $v[2]));
|
||||
} else {
|
||||
$args[] = sprintf("--header='%s: %s %s'", $k, make_safe_argument(implode(" ", $v)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$args[] = sprintf("--header='%s: %s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
}
|
||||
|
||||
// set URL
|
||||
$args[] = $url;
|
||||
|
||||
// build a command
|
||||
$cmd = implode(" ", $args);
|
||||
|
||||
// execute a command
|
||||
exec_command($cmd);
|
||||
|
||||
// read contents
|
||||
$content = read_storage_file($filename);
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_web_httpie")) {
|
||||
function get_web_httpie($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45, $headers=array()) {
|
||||
$content = false;
|
||||
|
||||
$filename = make_random_id(32);
|
||||
$fw = write_storage_file("", array(
|
||||
"filename" => $filename,
|
||||
"mode" => "fake"
|
||||
));
|
||||
|
||||
// init args
|
||||
$args = array();
|
||||
|
||||
// make args
|
||||
$args[] = "http";
|
||||
|
||||
// set method, URL
|
||||
if($method == "jsondata") {
|
||||
$args[] = "POST";
|
||||
$args[] = $url;
|
||||
$args[] = sprintf("body='%s'", json_encode($data));
|
||||
} elseif($method == "post") {
|
||||
$args[] = "POST";
|
||||
$args[] = $url;
|
||||
$args[] = sprintf("body='%s'", get_web_build_qs("", $data));
|
||||
} else {
|
||||
$args[] = get_web_build_qs($url, $data);
|
||||
}
|
||||
|
||||
// set timeout
|
||||
$args[] = "--timeout=" . $t_out;
|
||||
|
||||
// set proxy
|
||||
if(!empty($proxy)) {
|
||||
$args[] = "--proxy=" . $proxy;
|
||||
}
|
||||
|
||||
// set headers
|
||||
foreach($headers as $k=>$v) {
|
||||
if(is_array($v)) {
|
||||
if($k == "Authentication") {
|
||||
if($v[0] == "Basic" && check_array_length($v, 3) == 0) {
|
||||
$args[] = sprintf("-a '%s:%s'", $v[1], $v[2]);
|
||||
} else {
|
||||
$args[] = sprintf("'%s:%s'", $k, make_safe_argument(implode(" ", $v)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$args[] = sprintf("'%s:%s'", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
}
|
||||
|
||||
// set output file
|
||||
$args[] = ">";
|
||||
$args[] = $fw;
|
||||
|
||||
// execute a command
|
||||
$cmd = implode(" ", $args);
|
||||
exec_command($cmd);
|
||||
|
||||
// read contents
|
||||
$content = read_storage_file($filename);
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_web_curl")) {
|
||||
function get_web_curl($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45, $headers=array()) {
|
||||
$content = false;
|
||||
$req_headers = array();
|
||||
$_headers = array();
|
||||
|
||||
if(!in_array("curl", get_loaded_extensions())) {
|
||||
$error_msg = "cURL extension needs to be installed.";
|
||||
|
@ -243,15 +462,15 @@ if(!function_exists("get_web_curl")) {
|
|||
);
|
||||
|
||||
if(empty($options[CURLOPT_USERAGENT])) {
|
||||
$ua = "ReasonableFramework/1.1 (https://github.com/gnh1201/reasonableframework)";
|
||||
$ua = get_web_user_agent($ua);
|
||||
$options[CURLOPT_USERAGENT] = $ua;
|
||||
}
|
||||
|
||||
if(count($data) > 0) {
|
||||
if($method == "post") {
|
||||
foreach($data as $k=>$v) {
|
||||
if(substr($v, 0, 1) == "@") { // if this is a file
|
||||
if(function_exists("curl_file_create")) { // php 5.5+
|
||||
if(is_string($v) && substr($v, 0, 1) == "@") { // if this is a file
|
||||
if(is_fn("curl_file_create")) { // php 5.5+
|
||||
$data[$k] = curl_file_create(substr($v, 1));
|
||||
} else {
|
||||
$data[$k] = "@" . realpath(substr($v, 1));
|
||||
|
@ -260,28 +479,53 @@ if(!function_exists("get_web_curl")) {
|
|||
}
|
||||
|
||||
$options[CURLOPT_POST] = 1;
|
||||
if(is_array($data)) {
|
||||
$options[CURLOPT_POSTFIELDS] = get_web_build_qs("", $data);
|
||||
} else {
|
||||
$options[CURLOPT_POSTFIELDS] = $data;
|
||||
}
|
||||
}
|
||||
|
||||
if($method == "get") {
|
||||
$options[CURLOPT_URL] = get_web_build_qs($url, $data);
|
||||
}
|
||||
|
||||
if($method == "jsondata") {
|
||||
$data_string = json_encode($data);
|
||||
$_data = json_encode($data);
|
||||
$options[CURLOPT_CUSTOMREQUEST] = "POST";
|
||||
$options[CURLOPT_POST] = 1;
|
||||
$options[CURLOPT_POSTFIELDS] = $data_string;
|
||||
$headers['Content-Type'] = "application/json";
|
||||
$headers['Content-Length'] = strlen($data_string);
|
||||
$options[CURLOPT_POSTFIELDS] = $_data;
|
||||
$headers['Content-Type'] = "application/json;charset=utf-8";
|
||||
$headers['Accept'] = "application/json, text/plain, */*";
|
||||
$headers['Content-Length'] = strlen($_data);
|
||||
}
|
||||
|
||||
if($method == "rawdata") {
|
||||
$_data = $data;
|
||||
$options[CURLOPT_CUSTOMREQUEST] = "POST";
|
||||
$options[CURLOPT_POST] = 1;
|
||||
$options[CURLOPT_POSTFIELDS] = $_data;
|
||||
$headers['Content-Type'] = "application/octet-stream";
|
||||
$headers['Accept'] = "application/octet-stream, */*";
|
||||
$headers['Content-Length'] = strlen($_data);
|
||||
}
|
||||
}
|
||||
|
||||
if(count($headers) > 0) {
|
||||
foreach($headers as $k=>$v) {
|
||||
$req_headers[] = sprintf("%s: %s", make_safe_argument($k), make_safe_argument($v));
|
||||
if(is_array($v)) {
|
||||
if($k == "Authorization" || $k == "Authentication") {
|
||||
if($v[0] == "Basic" && check_array_length($v, 3) == 0) {
|
||||
$options[CURLOPT_USERPWD] = sprintf("%s:%s", make_safe_argument($v[1]), make_safe_argument($v[2]));
|
||||
} else {
|
||||
$_headers[] = sprintf("%s: %s", make_safe_argument($k), make_safe_argument(implode(" ", $v)));
|
||||
}
|
||||
$options[CURLOPT_HTTPHEADER] = $req_headers;
|
||||
}
|
||||
} else {
|
||||
$_headers[] = sprintf("%s: %s", make_safe_argument($k), make_safe_argument($v));
|
||||
}
|
||||
}
|
||||
$options[CURLOPT_HTTPHEADER] = $_headers;
|
||||
}
|
||||
|
||||
$ch = curl_init();
|
||||
|
@ -301,18 +545,29 @@ if(!function_exists("get_web_curl")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_page")) {
|
||||
if(!is_fn("get_web_page")) {
|
||||
function get_web_page($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$status = false;
|
||||
$resno = false;
|
||||
$errno = false;
|
||||
$content = false;
|
||||
$req_method = $method;
|
||||
$_method = $method;
|
||||
|
||||
// check request method
|
||||
if (!is_string($method)) {
|
||||
set_error("method must be string");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
// get process ID
|
||||
$pid = getmyid();
|
||||
|
||||
// set user agent
|
||||
if(empty($ua)) {
|
||||
$ua = "ReasonableFramework/1.1 (https://github.com/gnh1201/reasonableframework)";
|
||||
}
|
||||
$ua = get_web_user_agent($ua);
|
||||
|
||||
// set method
|
||||
$method = strtolower($method);
|
||||
$req_methods = explode(".", $method);
|
||||
|
||||
// redefine data
|
||||
$headers = array();
|
||||
|
@ -321,45 +576,60 @@ if(!function_exists("get_web_page")) {
|
|||
$data = $data['data'];
|
||||
}
|
||||
|
||||
// set method
|
||||
$method = strtolower($method);
|
||||
$res_methods = explode(".", $method);
|
||||
// redefine data (JSON-RPC 1.1 / JSON-RPC 2.0)
|
||||
if(in_array("jsonrpc", $req_methods) && in_array("compatible", $req_methods)) {
|
||||
$req_methods[] = "jsondata";
|
||||
$headers['Content-Type'] = "application/json-rpc";
|
||||
$data = array_merge(array(
|
||||
"jsonrpc" => "1.1"
|
||||
), $data);
|
||||
} elseif(in_array("jsonrpc", $req_methods) || in_array("jsonrpc2", $req_methods)) {
|
||||
$req_methods[] = "jsondata";
|
||||
$headers['Content-Type'] = "application/json-rpc";
|
||||
$data = array_merge(array(
|
||||
"jsonrpc" => "2.0"
|
||||
), $data);
|
||||
}
|
||||
|
||||
if(in_array("cache", $res_methods)) {
|
||||
$content = get_web_cache($url, $method, $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("cmd", $res_methods)) {
|
||||
$content = get_web_cmd($url, $res_methods[0], $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
} elseif(in_array("fgc", $res_methods)) {
|
||||
// do request
|
||||
if(in_array("cache", $req_methods)) {
|
||||
$content = get_web_cache($url, $method, $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
} elseif(in_array("async", $req_methods)) {
|
||||
$pid = get_web_async($url, $req_methods[0], $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
$content = posix_getpgid($pid);
|
||||
} elseif(in_array("cmd", $req_methods)) {
|
||||
$content = get_web_cmd($url, $req_methods[0], $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
} elseif(in_array("fgc", $req_methods)) {
|
||||
$content = get_web_fgc($url);
|
||||
} elseif(in_array("sock", $res_methods)) {
|
||||
$content = get_web_sock($url, $res_methods[0], $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("wget", $res_methods)) {
|
||||
$content = get_web_wget($url, $res_methods[0], $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("jsondata", $res_methods)) {
|
||||
$curl_result = get_web_curl($url, "jsondata", $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
$content = $curl_result['content'];
|
||||
$status = $curl_result['status'];
|
||||
$resno = $curl_result['resno'];
|
||||
$errno = $curl_result['errno'];
|
||||
} elseif(in_array("sock", $req_methods)) {
|
||||
$content = get_web_sock($url, $req_methods[0], $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("wget", $req_methods)) {
|
||||
$content = get_web_wget($url, $req_methods[0], $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("aria", $req_methods)) {
|
||||
$content = get_web_aria($url, $req_methods[0], $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("httpie", $req_methods)) {
|
||||
$content = get_web_httpie($url, $req_methods[0], $data, $proxy, $ua, $ct_out, $t_out);
|
||||
} elseif(in_array("jsondata", $req_methods)) {
|
||||
$response = get_web_curl($url, "jsondata", $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
$content = $response['content'];
|
||||
$status = $response['status'];
|
||||
$resno = $response['resno'];
|
||||
$errno = $response['errno'];
|
||||
|
||||
if($content !== false) {
|
||||
// nothing
|
||||
} else {
|
||||
if(!($content !== false)) {
|
||||
$content = get_web_cmd($url, "jsondata", $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
}
|
||||
} else {
|
||||
$curl_result = get_web_curl($url, $method, $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
$content = $curl_result['content'];
|
||||
$status = $curl_result['status'];
|
||||
$resno = $curl_result['resno'];
|
||||
$errno = $curl_result['errno'];
|
||||
$_result = get_web_curl($url, $method, $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
$content = $_result['content'];
|
||||
$status = $_result['status'];
|
||||
$resno = $_result['resno'];
|
||||
$errno = $_result['errno'];
|
||||
|
||||
if($content !== false) {
|
||||
// nothing
|
||||
} else {
|
||||
if(!($content !== false)) {
|
||||
$res = get_web_page($url, $method . ".cmd", $data, $proxy, $ua, $ct_out, $t_out);
|
||||
$content = $res['content'];
|
||||
$req_method = $res['method'];
|
||||
$_method = $res['method'];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -375,6 +645,7 @@ if(!function_exists("get_web_page")) {
|
|||
"resno" => $resno,
|
||||
"errno" => $errno,
|
||||
"id" => get_web_identifier($url, $method, $data),
|
||||
"pid" => $pid,
|
||||
"md5" => get_hashed_text($content, "md5"),
|
||||
"sha1" => get_hashed_text($content, "sha1"),
|
||||
"gz_content" => get_hashed_text($gz_content, "base64"),
|
||||
|
@ -382,50 +653,107 @@ if(!function_exists("get_web_page")) {
|
|||
"gz_md5" => get_hashed_text($gz_content, "md5"),
|
||||
"gz_sha1" => get_hashed_text($gz_content, "sha1"),
|
||||
"gz_ratio" => $gz_ratio,
|
||||
"method" => $req_method,
|
||||
"params" => $data,
|
||||
"method" => $_method,
|
||||
"headers" => $headers,
|
||||
"params" => $data
|
||||
);
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_identifier")) {
|
||||
function get_web_identifier($url, $method="get", $data=array()) {
|
||||
$hash_data = (count($data) > 0) ? get_hashed_text(serialize($data)) : "*";
|
||||
return get_hashed_text(sprintf("%s.%s.%s", get_hashed_text($method), get_hashed_text($url), $hash_data));
|
||||
if(!is_fn("get_web_identifier")) {
|
||||
function get_web_identifier($url, $method="get", $data=array(), $headers=array()) {
|
||||
$checksum_data = (count($data) > 0) ? get_hashed_text(serialize($data)) : "*";
|
||||
$checksum_header = (count($headers) > 0) ? get_hashed_text(serialize($data)) : "*";
|
||||
$checksum_method = get_hashed_text($method);
|
||||
$checksum_url = get_hashed_text($url);
|
||||
|
||||
$checksums = array($checksum_method, $checksum_url, $checksum_data);
|
||||
if($checksum_header != "*") { // compatible below 1.6
|
||||
$checksums[] = $checksum_header;
|
||||
}
|
||||
|
||||
return get_hashed_text(implode(".", $checksums));
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_cache")) {
|
||||
function get_web_cache($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
if(!is_fn("get_web_async")) {
|
||||
function get_web_async($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45, $headers=array()) {
|
||||
$pid = 0;
|
||||
|
||||
$_method = sprintf("%s.%s", $method, "async");
|
||||
$pid = get_web_cmd($url, $_method, $data, $proxy, $ua, $ct_out, $t_out, $headers);
|
||||
|
||||
return $pid;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_web_cache")) {
|
||||
function get_web_cache($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45, $headers=array()) {
|
||||
$content = false;
|
||||
$config = get_config();
|
||||
|
||||
$cache_enabled = array_key_equals("cache_enabled", $config, 1);
|
||||
// max_age(seconds), the value 0 is forever
|
||||
$cache_max_age = intval(get_value_in_array("cache_max_age", $config, 0));
|
||||
$cache_hits = 0;
|
||||
|
||||
$gz_content = false;
|
||||
if($cache_enabled) {
|
||||
$identifier = get_web_identifier($url, $method, $data);
|
||||
$gz_content = read_storage_file($identifier, array(
|
||||
"storage_type" => "cache"
|
||||
"storage_type" => "cache",
|
||||
"max_age" => $cache_max_age
|
||||
));
|
||||
|
||||
if($gz_content === false) {
|
||||
$no_cache_method = str_replace(".cache", "", $method);
|
||||
$response = get_web_page($url, $no_cache_method, $data, $proxy, $ua, $ct_out, $t_out);
|
||||
$content = $response['content'];
|
||||
$gz_content = gzdeflate($content);
|
||||
write_common_log("cache_max_age: " . $cache_max_age, "helper/webpagetool");
|
||||
if($gz_content !== false) {
|
||||
$content = gzinflate($gz_content);
|
||||
$cache_hits++;
|
||||
write_common_log(sprintf("Cache hit. %s, %s, %s", $identifier, strlen($content), strlen($gz_content)), "helper/webpagetool");
|
||||
} else {
|
||||
write_common_log(sprintf("Cache no hit. %s", $identifier), "helper/webpagetool");
|
||||
}
|
||||
}
|
||||
|
||||
// save web page cache
|
||||
write_storage_file($gz_content, array(
|
||||
if($cache_hits == 0) {
|
||||
$_old_methods = explode(".", $method);
|
||||
$_new_methods = array();
|
||||
foreach($_old_methods as $v) {
|
||||
if($v != "cache") {
|
||||
$_new_methods[] = $v;
|
||||
}
|
||||
}
|
||||
$_method = implode(".", $_new_methods);
|
||||
|
||||
$_data = $data;
|
||||
if(count($headers) > 0) {
|
||||
$_data = array(
|
||||
"headers" => $headers,
|
||||
"data" => $data
|
||||
);
|
||||
}
|
||||
|
||||
$response = get_web_page($url, $_method, $_data, $proxy, $ua, $ct_out, $t_out);
|
||||
$content = $response['content'];
|
||||
if($cache_enabled) {
|
||||
$gz_content = gzdeflate($content);
|
||||
$fw = write_storage_file($gz_content, array(
|
||||
"storage_type" => "cache",
|
||||
"filename" => $identifier
|
||||
));
|
||||
} else {
|
||||
$content = gzinflate($gz_content);
|
||||
if(!$fw) {
|
||||
write_common_log("Failed to write cache file", "helper/webpagetool");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_json")) {
|
||||
if(!is_fn("get_web_json")) {
|
||||
function get_web_json($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$result = false;
|
||||
|
||||
|
@ -438,7 +766,7 @@ if(!function_exists("get_web_json")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_dom")) {
|
||||
if(!is_fn("get_web_dom")) {
|
||||
function get_web_dom($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$result = false;
|
||||
$response = get_web_page($url, $method, $data, $proxy, $ua, $ct_out, $t_out);
|
||||
|
@ -452,7 +780,7 @@ if(!function_exists("get_web_dom")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_meta")) {
|
||||
if(!is_fn("get_web_meta")) {
|
||||
function get_web_meta($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$result = false;
|
||||
$response = get_web_page($url, $method, $data, $proxy, $ua, $ct_out, $t_out);
|
||||
|
@ -469,7 +797,7 @@ if(!function_exists("get_web_meta")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_web_xml")) {
|
||||
if(!is_fn("get_web_xml")) {
|
||||
function get_web_xml($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$result = false;
|
||||
|
||||
|
@ -482,7 +810,22 @@ if(!function_exists("get_web_xml")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_parsed_json")) {
|
||||
if(!is_fn("get_web_cspt")) {
|
||||
function get_web_cspt($url, $method="get", $data=array(), $proxy="", $ua="", $ct_out=45, $t_out=45) {
|
||||
$result = false;
|
||||
|
||||
$response = get_web_page($url, $method, $data, $proxy, $ua, $ct_out, $t_out);
|
||||
if($response['size'] > 0) {
|
||||
if(loadHelper("casplit.format")) {
|
||||
$result = catsplit_decode($response['content']);
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_parsed_json")) {
|
||||
function get_parsed_json($raw, $options=array()) {
|
||||
$result = false;
|
||||
|
||||
|
@ -496,11 +839,11 @@ if(!function_exists("get_parsed_json")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_parsed_xml")) {
|
||||
if(!is_fn("get_parsed_xml")) {
|
||||
function get_parsed_xml($raw, $options=array()) {
|
||||
$result = false;
|
||||
|
||||
if(function_exists("simplexml_load_string")) {
|
||||
if(is_fn("simplexml_load_string")) {
|
||||
$result = simplexml_load_string($response['content'], null, LIBXML_NOCDATA);
|
||||
}
|
||||
|
||||
|
@ -508,12 +851,12 @@ if(!function_exists("get_parsed_xml")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_parsed_dom")) {
|
||||
if(!is_fn("get_parsed_dom")) {
|
||||
function get_parsed_dom($raw, $options=array()) {
|
||||
$result = false;
|
||||
|
||||
if(loadHelper("simple_html_dom")) {
|
||||
$result = function_exists("str_get_html") ? str_get_html($response['content']) : $raw;
|
||||
$result = is_fn("str_get_html") ? str_get_html($response['content']) : $raw;
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
@ -521,28 +864,30 @@ if(!function_exists("get_parsed_dom")) {
|
|||
}
|
||||
|
||||
// 2018-06-01: Adaptive JSON is always quotes without escape non-ascii characters
|
||||
if(!function_exists("get_adaptive_json")) {
|
||||
if(!is_fn("get_adaptive_json")) {
|
||||
function get_adaptive_json($data) {
|
||||
$result = "";
|
||||
$lines = array();
|
||||
foreach($data as $k=>$v) {
|
||||
if(is_array($v)) {
|
||||
$lines[] = sprintf("\"%s\":%s", addslashes($k), get_adaptive_json($v));
|
||||
} else {
|
||||
$lines[] = sprintf("\"%s\":\"%s\"", addslashes($k), addslashes($v));
|
||||
if(loadHelper("json.format")) {
|
||||
return json_encode_ex($data, array("adaptive" => true));
|
||||
}
|
||||
}
|
||||
$result = "{" . implode(",", $lines) . "}";
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
// 2018-09-10: support webproxy
|
||||
if(!function_exists("get_webproxy_url")) {
|
||||
if(!is_fn("get_webproxy_url")) {
|
||||
function get_webproxy_url($url, $route="webproxy") {
|
||||
return get_route_link($route, array(
|
||||
"url" => $url
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("get_web_user_agent")) {
|
||||
function get_web_user_agent($ua="") {
|
||||
if(empty($ua)) {
|
||||
$ua = "ReasonableFramework/1.6.7-preview1 (Server; PHP " . phpversion() . "; https://catswords.social/@catswords_oss; abuse@catswords.net)";
|
||||
} else {
|
||||
$ua = make_safe_argument($ua);
|
||||
}
|
||||
return $ua;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file wprest.php
|
||||
* @date 2018-03-14
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Wordpress Rest API helper
|
||||
*/
|
||||
|
||||
if(!function_exists("get_wp_posts")) {
|
||||
if(!is_fn("get_wp_posts")) {
|
||||
function get_wp_posts($wp_server_url) {
|
||||
$results = array();
|
||||
|
||||
|
@ -43,7 +43,7 @@ if(!function_exists("get_wp_posts")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("parse_wp_posts")) {
|
||||
if(!is_fn("parse_wp_posts")) {
|
||||
function parse_wp_posts($wp_server_url) {
|
||||
$rest_no_route = false;
|
||||
|
||||
|
@ -90,7 +90,7 @@ if(!function_exists("parse_wp_posts")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_wp_new_message")) {
|
||||
if(!is_fn("get_wp_new_message")) {
|
||||
function get_wp_new_message($title, $content, $link="") {
|
||||
$new_message = "";
|
||||
|
||||
|
@ -111,7 +111,7 @@ if(!function_exists("get_wp_new_message")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("authenticate_wp")) {
|
||||
if(!is_fn("authenticate_wp")) {
|
||||
function authenticate_wp($wp_server_url, $client_id, $client_secret, $route="", $code="", $scope="basic", $state="") {
|
||||
$flag = false;
|
||||
|
||||
|
@ -172,7 +172,7 @@ if(!function_exists("authenticate_wp")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("write_wp_post")) {
|
||||
if(!is_fn("write_wp_post")) {
|
||||
function write_wp_post($wp_server_url, $access_token, $data=array()) {
|
||||
$default_data = array(
|
||||
"title" => "Untitled",
|
||||
|
@ -201,7 +201,7 @@ if(!function_exists("write_wp_post")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("get_wp_categories")) {
|
||||
if(!is_fn("get_wp_categories")) {
|
||||
function get_wp_categories($wp_server_url, $access_token) {
|
||||
$response = get_web_json(get_web_build_qs($wp_server_url, array(
|
||||
"rest_route" => "/wp/v2/categories"
|
||||
|
|
321
helper/zabbix.api.php
Normal file
321
helper/zabbix.api.php
Normal file
|
@ -0,0 +1,321 @@
|
|||
<?php
|
||||
/**
|
||||
* @file zabbix.api.php
|
||||
* @created_on 2019-04-08
|
||||
* @updated_on 2020-03-05
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Zabbix JSON-RPC API (3.0) interface module
|
||||
* @documentation https://www.zabbix.com/documentation/current/ (4.4)
|
||||
*/
|
||||
|
||||
if(!is_fn("get_zabbix_config")) {
|
||||
function get_zabbix_config() {
|
||||
$config = get_config();
|
||||
|
||||
return array(
|
||||
"host" => get_value_in_array("zabbix_host", $config, "127.0.0.1"),
|
||||
"username" => get_value_in_array("zabbix_username", $config, "Admin"),
|
||||
"password" => get_value_in_array("zabbix_password", $config, "zabbix"),
|
||||
"protocol" => get_value_in_array("zabbix_protocol", $config, "http"),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_base_url")) {
|
||||
function zabbix_get_api_url() {
|
||||
$cnf = get_zabbix_config();
|
||||
return sprintf("%s://%s/zabbix/api_jsonrpc.php", $cnf['protocol'], $cnf['host']);
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_id")) {
|
||||
function zabbix_get_id() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_authenticate")) {
|
||||
function zabbix_authenticate() {
|
||||
$response = false;
|
||||
|
||||
// get zabbix configuration
|
||||
$cnf = get_zabbix_config();
|
||||
|
||||
// get zabbix api url
|
||||
$zabbix_api_url = zabbix_get_api_url($cnf['host'], $cnf['protocol']);
|
||||
|
||||
// connect to zabbix server
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "user.login",
|
||||
"params" => array(
|
||||
"user" => $cnf['username'],
|
||||
"password" => $cnf['password'],
|
||||
),
|
||||
"id" => zabbix_get_id(),
|
||||
"auth" => null
|
||||
));
|
||||
}
|
||||
|
||||
// set connection to global scope
|
||||
set_shared_var("zabbix_api_url", $zabbix_api_url);
|
||||
set_shared_var("zabbix_auth", get_property_value("result", $response));
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_hostgroups")) {
|
||||
function zabbix_get_hostgroups() {
|
||||
$hostgroups = false;
|
||||
$response = false;
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
// connect to zabbix server
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "hostgroup.get",
|
||||
"params" => array(
|
||||
"output" => "extend"
|
||||
),
|
||||
"id" => zabbix_get_id(),
|
||||
"auth" => $zabbix_auth
|
||||
));
|
||||
|
||||
$hostgroups = get_property_value("result", $response);
|
||||
}
|
||||
|
||||
return $hostgroups;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_hosts")) {
|
||||
function zabbix_get_hosts() {
|
||||
$hosts = false;
|
||||
$response = false;
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
// connect to zabbix server
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "host.get",
|
||||
"params" => array(
|
||||
"output" => array("hostid", "host", "status"),
|
||||
"selectInterfaces" => array("interfaceid", "ip"),
|
||||
"selectGroups" => "extend"
|
||||
),
|
||||
"id" => zabbix_get_id(),
|
||||
"auth" => $zabbix_auth
|
||||
));
|
||||
|
||||
$hosts = get_property_value("result", $response);
|
||||
}
|
||||
|
||||
return $hosts;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_retrieve_hosts")) {
|
||||
function zabbix_retrieve_hosts() {
|
||||
return zabbix_get_hosts();
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_items")) {
|
||||
function zabbix_get_items($hostids=null) {
|
||||
$items = false;
|
||||
$results = false;
|
||||
$response = false;
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
// connect to zabbix server
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "host.get",
|
||||
"params" => array(
|
||||
"selectInventory" => true,
|
||||
"selectItems" => array("name", "key_", "status", "lastvalue", "units", "itemid", "lastclock", "value_type", "itemid"),
|
||||
"output" => "extend",
|
||||
"hostids" => $hostids,
|
||||
"expandDescription" => 1,
|
||||
"expandData" => 1,
|
||||
),
|
||||
"id" => zabbix_get_id(),
|
||||
"auth" => $zabbix_auth
|
||||
));
|
||||
$results = get_property_value("result", $response);
|
||||
foreach($results as $result) {
|
||||
$items = get_property_value("items", $result);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_problems")) {
|
||||
function zabbix_get_problems($hostids=null) {
|
||||
$problems = false;
|
||||
$response = false;
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
// connect to zabbix server
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "problem.get",
|
||||
"params" => array(
|
||||
"output" => "extend",
|
||||
"selectAcknowledges" => "extend",
|
||||
"selectTags" => "extend",
|
||||
"selectSuppressionData" => "extend",
|
||||
"hostids" => $hostids,
|
||||
"recent" => "false",
|
||||
//"suppressed" => "false",
|
||||
//"acknowledged" => "false",
|
||||
//"sortfield" => ["eventid"],
|
||||
//"sortorder" => "DESC",
|
||||
//"time_from" => get_current_datetime(array("adjust" => "1 hour"))
|
||||
),
|
||||
"id" => zabbix_get_id(),
|
||||
"auth" => $zabbix_auth
|
||||
));
|
||||
}
|
||||
|
||||
$problems = get_property_value("result", $response);
|
||||
|
||||
return $problems;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_triggers")) {
|
||||
function zabbix_get_triggers($hostids=null) {
|
||||
$triggers = false;
|
||||
$response = false;
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
if(loadHelper("webpagetool")) {
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "trigger.get",
|
||||
"params" => array(
|
||||
"hostids" => $hostids,
|
||||
"output" => "extend",
|
||||
"selectFunctions" => "extend",
|
||||
"filter" => array(
|
||||
"value" => 1,
|
||||
"status" => 0
|
||||
)
|
||||
),
|
||||
"id" => zabbix_get_id(),
|
||||
"auth" => $zabbix_auth
|
||||
));
|
||||
}
|
||||
$triggers = get_property_value("result", $response);
|
||||
|
||||
return $triggers;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_alerts")) {
|
||||
function zabbix_get_alerts($hostids=null, $time_from=0, $time_till=0) {
|
||||
$alerts = false;
|
||||
$response = false;
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
if(loadHelper("webpagetool")) {
|
||||
$params = array(
|
||||
"output" => "extend",
|
||||
"hostids" => $hostids,
|
||||
"sortfield" => array("clock", "eventid"),
|
||||
"sortorder" => "DESC"
|
||||
);
|
||||
|
||||
if($time_from > 0) {
|
||||
$params['time_from'] = $time_from - 1;
|
||||
}
|
||||
|
||||
if($time_till > 0) {
|
||||
$params['time_till'] = $time_till + 1;
|
||||
}
|
||||
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "event.get",
|
||||
"params" => array(
|
||||
"output" => "extend",
|
||||
"hostids" => $hostids,
|
||||
"sortfield" => array("clock", "eventid"),
|
||||
"sortorder" => "DESC"
|
||||
),
|
||||
"auth" => $zabbix_auth,
|
||||
"id" => zabbix_get_id()
|
||||
));
|
||||
|
||||
$alerts = get_property_value("result", $response);
|
||||
}
|
||||
|
||||
return $alerts;
|
||||
}
|
||||
}
|
||||
|
||||
if(!is_fn("zabbix_get_records")) {
|
||||
function zabbix_get_records($itemids, $now_dt="", $adjust="-24h", $value_type=3) {
|
||||
$records = false;
|
||||
$response = false;
|
||||
|
||||
// get current datetime
|
||||
if(empty($now_dt)) {
|
||||
$now_dt = get_current_datetime();
|
||||
}
|
||||
|
||||
// get zabbix authentication
|
||||
$zabbix_api_url = get_shared_var("zabbix_api_url");
|
||||
$zabbix_auth = get_shared_var("zabbix_auth");
|
||||
|
||||
// set time range variables
|
||||
$time_from = get_current_timestamp(array("now" => $now_dt, "adjust" => $adjust));
|
||||
$time_till = get_current_timestamp(array("now" => $now_dt));
|
||||
|
||||
// get history
|
||||
// 0-numeric float; 1-character; 2-log; 3-numeric unsigned; 4-text
|
||||
if(loadHelper("webpagetool")) {
|
||||
$params = array(
|
||||
"output" => "extend",
|
||||
"history" => $value_type,
|
||||
"itemids" => $itemids,
|
||||
"sortfield" => "clock",
|
||||
"sortorder" => "DESC",
|
||||
"time_from" => $time_from,
|
||||
"time_till" => $time_till
|
||||
);
|
||||
|
||||
$response = get_web_json($zabbix_api_url, "jsonrpc2.cache", array(
|
||||
"method" => "history.get",
|
||||
"params" => $params,
|
||||
"auth" => $zabbix_auth,
|
||||
"id" => zabbix_get_id()
|
||||
));
|
||||
|
||||
$records = get_property_value("result", $response);
|
||||
}
|
||||
|
||||
return $records;
|
||||
}
|
||||
}
|
|
@ -2,26 +2,26 @@
|
|||
/**
|
||||
* @file zeroboard4.dbt.php
|
||||
* @date 2018-08-20
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Database Helper for Zeroboard 4 PL 9 (experimental)
|
||||
*/
|
||||
|
||||
// get database prefix
|
||||
if(!function_exists("zb4_get_db_prefix")) {
|
||||
if(!is_fn("zb4_get_db_prefix")) {
|
||||
function zb4_get_db_prefix() {
|
||||
return "zetyx_";
|
||||
}
|
||||
}
|
||||
|
||||
// get table
|
||||
if(!function_exists("zb4_get_db_table")) {
|
||||
if(!is_fn("zb4_get_db_table")) {
|
||||
function zb4_get_db_table($tablename) {
|
||||
return (zb4_get_db_prefix() . $tablename);
|
||||
}
|
||||
}
|
||||
|
||||
// get write table
|
||||
if(!function_exists("zb4_get_write_table")) {
|
||||
if(!is_fn("zb4_get_write_table")) {
|
||||
function zb4_get_write_table($tablename, $version=4) {
|
||||
$write_prefix = zb4_get_db_prefix() . "board_";
|
||||
$write_table = $write_prefix . $tablename;
|
||||
|
@ -30,7 +30,7 @@ if(!function_exists("zb4_get_write_table")) {
|
|||
}
|
||||
|
||||
// write post
|
||||
if(!function_exists("zb4_write_post")) {
|
||||
if(!is_fn("zb4_write_post")) {
|
||||
function zb4_write_post($tablename, $data=array()) {
|
||||
$result = 0;
|
||||
$write_table = zb4_get_write_table($tablename);
|
||||
|
@ -105,14 +105,14 @@ if(!function_exists("zb4_write_post")) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!function_exists("zb4_get_posts")) {
|
||||
if(!is_fn("zb4_get_posts")) {
|
||||
function zb4_get_posts($table_name, $page=1, $limit=20, $options=array()) {
|
||||
$sql = "select * from " . zb4_get_write_table($table_name) . " order by no desc" . get_page_range($page, $limit);
|
||||
return exec_db_fetch_all($sql);
|
||||
}
|
||||
}
|
||||
|
||||
if(!function_exists("zb4_get_post_by_id")) {
|
||||
if(!is_fn("zb4_get_post_by_id")) {
|
||||
function zb4_get_post_by_id($table_name, $post_id) {
|
||||
$sql = "select * from " . zb4_get_write_table($table_name) . " where no = :no";
|
||||
return exec_db_fetch($sql, array(
|
||||
|
|
132
index.php
132
index.php
|
@ -1,17 +1,70 @@
|
|||
<?php
|
||||
/**
|
||||
* @file index.php
|
||||
* @date 2018-05-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief ReasonableFramework
|
||||
* @cvs http://github.com/gnh1201/reasonableframework
|
||||
* @created_on 2018-05-27
|
||||
* @updated_on 2020-06-14
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief ReasonableFramework is RVHM structured PHP framework with common security
|
||||
* @cvs https://github.com/gnh1201/reasonableframework
|
||||
* @sponsor https://patreon.com/catswords (with advanced security)
|
||||
*/
|
||||
|
||||
define("_DEF_VSPF_", true); // compatible to VSPF
|
||||
define("_DEF_RSF_", true); // compatible to RSF
|
||||
define("APP_DEVELOPMENT", false); // set the status of development
|
||||
define("DOC_EOL", "\r\n"); // set the 'end of line'
|
||||
define("CORS_DOMAINS", false); // common security: allow origin domains (e.g. example.org,*.example.org)
|
||||
define("PHP_FIREWALL_REQUEST_URI", strip_tags($_SERVER['REQUEST_URI'])); // advanced security
|
||||
define("PHP_FIREWALL_ACTIVATION", false); // advanced security
|
||||
define("PHP_DDOS_PROTECTION", false); // advanced security
|
||||
|
||||
// development mode
|
||||
if(APP_DEVELOPMENT == true) {
|
||||
error_reporting(E_ALL);
|
||||
@ini_set("log_errors", 1);
|
||||
@ini_set("error_log", sprintf("%s/storage/sandbox/logs/error.log", getcwd()));
|
||||
} else {
|
||||
error_reporting(E_ERROR | E_PARSE);
|
||||
}
|
||||
@ini_set("display_errors", 1);
|
||||
|
||||
// CORS Security (https or http)
|
||||
if(CORS_DOMAINS !== false) {
|
||||
$domains = explode(",", CORS_DOMAINS);
|
||||
$_origin = array_key_exists("HTTP_ORIGIN", $_SERVER) ? $_SERVER['HTTP_ORIGIN'] : "";
|
||||
$origins = array();
|
||||
if(!in_array("*", $domains)) {
|
||||
foreach($domains as $domain) {
|
||||
if(!empty($domain)) {
|
||||
if(substr($domain, 0, 2) == "*.") { // support wildcard
|
||||
$needle = substr($domain, 1);
|
||||
$length = strlen($needle);
|
||||
if(substr($_origin, -$length) === $needle) {
|
||||
$origins[] = $_origin;
|
||||
}
|
||||
} else {
|
||||
$origins[] = sprintf("https://%s", $domain);
|
||||
$origins[] = sprintf("http://%s", $domain);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(count($origins) > 0) {
|
||||
if(in_array($_origin, $origins)) {
|
||||
header(sprintf("Access-Control-Allow-Origin: %s", $_origin));
|
||||
} else {
|
||||
header(sprintf("Access-Control-Allow-Origin: %s", $origins[0]));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
}
|
||||
}
|
||||
|
||||
// set shared vars
|
||||
$shared_vars = array();
|
||||
|
||||
// define system modules
|
||||
$load_systems = array("base", "storage", "config", "database", "uri", "security", "logger");
|
||||
$load_systems = array("base", "storage", "config", "security", "database", "uri", "logger");
|
||||
|
||||
// load system modules
|
||||
foreach($load_systems as $system_name) {
|
||||
|
@ -23,15 +76,46 @@ foreach($load_systems as $system_name) {
|
|||
} else {
|
||||
loadModule($system_name);
|
||||
}
|
||||
} else {
|
||||
echo "ERROR: Dose not exists " . $system_inc_file;
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// get config
|
||||
$config = get_config();
|
||||
|
||||
// get requests
|
||||
$requests = get_requests();
|
||||
|
||||
// get PID(Process ID)
|
||||
set_shared_var("mypid", getmypid());
|
||||
|
||||
// set database connection
|
||||
// variable _unset_dbc: will not connect to database
|
||||
$_unset_dbc = get_requested_value("_unset_dbc");
|
||||
if(empty($_unset_dbc)) {
|
||||
set_shared_var("dbc", get_db_connect());
|
||||
}
|
||||
|
||||
// set max_execution_time
|
||||
$max_execution_time = get_value_in_array("max_execution_time", $config, 0);
|
||||
@ini_set("max_execution_time", $max_execution_time);
|
||||
$max_execution_time = get_value_in_array("max_execution_time", $config, -1);
|
||||
set_max_execution_time($max_execution_time);
|
||||
|
||||
// set memory limit
|
||||
$memory_limit = get_value_in_array("memory_limit", $config, -1);
|
||||
set_memory_limit($memory_limit);
|
||||
|
||||
// set upload max filesize
|
||||
$upload_max_filesize = get_value_in_array("upload_max_filesize", $config, -1);
|
||||
set_upload_max_filesize($upload_max_filesize);
|
||||
|
||||
// set post max size
|
||||
$post_max_size = get_value_in_array("post_max_size", $config, -1);
|
||||
set_post_max_size($post_max_size);
|
||||
|
||||
// start session
|
||||
start_isolated_session();
|
||||
|
||||
// set autoloader
|
||||
if(!array_key_empty("enable_autoload", $config)) {
|
||||
|
@ -43,22 +127,28 @@ $default_timezone = get_value_in_array("timezone", $config, "UTC");
|
|||
date_default_timezone_set($default_timezone);
|
||||
|
||||
// write visit log
|
||||
write_visit_log();
|
||||
$log_mode_visit = get_value_in_array("log_mode_visit", $config, "");
|
||||
write_visit_log($log_mode_visit);
|
||||
|
||||
// route controller
|
||||
$route = get_value_in_array("route", $requests['all'], "");
|
||||
// get requested route
|
||||
$route = read_route();
|
||||
|
||||
// advanced security: PHP firewall
|
||||
if(PHP_FIREWALL_ACTIVATION !== false) {
|
||||
loadHelper("php-firewall.lnk");
|
||||
}
|
||||
|
||||
// advanced security: DDOS protection
|
||||
if(PHP_DDOS_PROTECTION !== false) {
|
||||
loadHelper("php-ddos.lnk");
|
||||
}
|
||||
|
||||
// load route
|
||||
if(empty($route)) {
|
||||
$route = get_value_in_array("default_route", $config, "welcome");
|
||||
} else {
|
||||
$route_names = explode('/', $route);
|
||||
if(count($route_names) > 1) {
|
||||
$route = $route_names[0];
|
||||
}
|
||||
if(!loadRoute($route, $shared_vars)) {
|
||||
loadRoute("errors/404", $shared_vars);
|
||||
}
|
||||
|
||||
// load route file
|
||||
if(!loadRoute($route, $scope)) {
|
||||
loadRoute("errors/404", $scope);
|
||||
}
|
||||
// disconnect database
|
||||
close_db_connect();
|
||||
|
||||
// EOF
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file api.getorder.pgkcp.php
|
||||
* @date 2018-09-24
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) get completed order
|
||||
*/
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file api.gnuboard.php
|
||||
* @date 2018-05-31
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Integration controller for Gnuboard CMS 4.x, 5.x
|
||||
*/
|
||||
|
||||
|
|
18
route/api.mailgun.php
Normal file
18
route/api.mailgun.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.mailgun.php
|
||||
* @date 2019-04-15
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Mailgun API controller
|
||||
*/
|
||||
|
||||
loadHelper("mailgun.api");
|
||||
|
||||
$content = get_requested_value("content", array("_JSON", "_ALL"));
|
||||
$subject = get_requested_value("subject", array("_JSON", "_ALL"));
|
||||
$to = get_requested_value("to", array("_JSON", "_ALL"));
|
||||
|
||||
$response = mailgun_send_message($content, $to, $subject);
|
||||
|
||||
header("Content-Type: application/json");
|
||||
echo json_encode($response);
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file api.setconfig.pgkcp.php
|
||||
* @date 2018-09-30
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) set configuration API
|
||||
*/
|
||||
|
||||
|
|
231
route/api.social.php
Normal file
231
route/api.social.php
Normal file
|
@ -0,0 +1,231 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.social.php
|
||||
* @date 2018-09-26
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief SocialTools API (refactoring from SocioRouter API)
|
||||
*/
|
||||
|
||||
loadHelper("hybridauth.lnk");
|
||||
loadHelper("hybridauth.dbt");
|
||||
loadHelper("socialtool");
|
||||
|
||||
set_session_token();
|
||||
$_token = get_session_token();
|
||||
|
||||
$provider = get_requested_value("provider");
|
||||
$action = get_requested_value("action");
|
||||
$redirect_uri = get_requested_value("redirect_uri");
|
||||
$user_id = get_requested_value("user_id");
|
||||
|
||||
$connection_id = get_requested_value("connection_id");
|
||||
$message = get_requested_value("message");
|
||||
|
||||
// if make new connection
|
||||
if($action != "new") {
|
||||
$api_session_id = get_session("api_session_id");
|
||||
} else {
|
||||
$api_session_id = "";
|
||||
set_session("api_session_id", $api_session_id);
|
||||
}
|
||||
|
||||
$session_data = array();
|
||||
if(!empty($api_session_id)) {
|
||||
$fr = read_storage_file($api_session_id, array(
|
||||
"storage_type" => "session"
|
||||
));
|
||||
if(!$fr) {
|
||||
// renew api session id
|
||||
$api_session_id = "";
|
||||
set_session("api_session_id", $api_session_id);
|
||||
} else {
|
||||
$session_data = json_decode($fr);
|
||||
$provider = get_property_value("provider", $session_data);
|
||||
$action = get_property_value("action", $session_data);
|
||||
$redirect_uri = get_property_value("redirect_uri", $session_data);
|
||||
$user_id = get_property_value("user_id", $session_data);
|
||||
$connection_id = get_property_value("connection_id", $session_data);
|
||||
$message = get_property_value("message", $session_data);
|
||||
}
|
||||
}
|
||||
|
||||
if(empty($provider)) {
|
||||
set_error("provider is required field.");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
$hauth_adapter = null;
|
||||
$hauth_session = null;
|
||||
$hauth_profile = null;
|
||||
|
||||
// load library
|
||||
$configfile = hybridauth_load($provider);
|
||||
if(!$configfile) {
|
||||
set_error("can not load hybridauth library");
|
||||
show_errors();
|
||||
}
|
||||
$hauth = new Hybrid_Auth($configfile);
|
||||
|
||||
// try session restore
|
||||
$session_flag = false;
|
||||
if(!empty($connection_id)) {
|
||||
$hauth_session = get_stored_hybridauth_session($connection_id);
|
||||
if(!empty($hauth_session)) {
|
||||
try {
|
||||
$hauth->restoreSessionData($hauth_session);
|
||||
$session_flag = true;
|
||||
} catch(Exception $e) {
|
||||
set_error("maybe, your connection is broken.");
|
||||
show_errors();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check hybridauth request
|
||||
if($hauth->isConnectedWith($provider)) {
|
||||
$hauth_session = $hauth->getSessionData();
|
||||
$connection_id = store_hybridauth_session($hauth_session, $user_id);
|
||||
if($connection_id) {
|
||||
$session_flag = true;
|
||||
}
|
||||
}
|
||||
|
||||
// save session
|
||||
$api_session_id = get_hashed_text(make_random_id(32));
|
||||
$session_data = array(
|
||||
"api_session_id" => $api_session_id,
|
||||
"provider" => $provider,
|
||||
"action" => $action,
|
||||
"redirect_uri" => $redirect_uri,
|
||||
"user_id" => $user_id,
|
||||
"connection_id" => $connection_id,
|
||||
"message" => $message
|
||||
);
|
||||
$fw = write_storage_file(json_encode($session_data), array(
|
||||
"storage_type" => "session",
|
||||
"filename" => $api_session_id
|
||||
));
|
||||
if(!$fw) {
|
||||
set_error("maybe, your storage is write-protected.");
|
||||
show_errors();
|
||||
} else {
|
||||
set_session("api_session_id", $api_session_id);
|
||||
}
|
||||
|
||||
if(hybridauth_check_redirect()) {
|
||||
hybridauth_process();
|
||||
}
|
||||
|
||||
// try authenticate
|
||||
try {
|
||||
if(!$session_flag) {
|
||||
$hauth_adapter = $hauth->authenticate($provider);
|
||||
} else {
|
||||
$hauth_adapter = $hauth->getAdapter($provider);
|
||||
}
|
||||
$session_flag = true;
|
||||
} catch(Exception $e) {
|
||||
$hauth_adapter = $hauth->authenticate($provider);
|
||||
}
|
||||
|
||||
if(!$session_flag) {
|
||||
// if failed authenticate
|
||||
redirect_uri(get_route_link("api.social", array(
|
||||
"provider" => $provider,
|
||||
"action" => $action,
|
||||
"redirect_uri" => $redirect_uri,
|
||||
"user_id" => $user_id,
|
||||
"connection_id" => $connection_id
|
||||
), false));
|
||||
}
|
||||
|
||||
// get user profile
|
||||
$hauth_profile = $hauth_adapter->getUserProfile();
|
||||
|
||||
// do action
|
||||
$context = array();
|
||||
switch($action) {
|
||||
case "inbound":
|
||||
break;
|
||||
case "outbound":
|
||||
$response = social_send_message($provider, $hauth_adapter, $message);
|
||||
$object_id = social_parse_object_id($provider, $response);
|
||||
$context = array(
|
||||
"success" => !(!$object_id),
|
||||
"message" => "Have a nice day",
|
||||
"user_id" => $user_id,
|
||||
"provider" => $provider,
|
||||
"object_id" => $object_id
|
||||
);
|
||||
break;
|
||||
case "new":
|
||||
$context = array(
|
||||
"success" => true,
|
||||
"message" => "Authenticated",
|
||||
"user_id" => $user_id,
|
||||
"provider" => $provider,
|
||||
"profile" => $hauth_profile,
|
||||
);
|
||||
break;
|
||||
case "login":
|
||||
$context = array(
|
||||
"success" => true,
|
||||
"message" => "Authenticated",
|
||||
"user_id" => $user_id,
|
||||
"provider" => $provider,
|
||||
"profile" => $hauth_profile,
|
||||
);
|
||||
break;
|
||||
case "bgworker":
|
||||
$response = social_send_message($provider, $hauth_adapter, $message);
|
||||
$object_id = social_parse_object_id($provider, $response);
|
||||
$context = array(
|
||||
"success" => !(!$object_id),
|
||||
"message" => "Have a nice day",
|
||||
"id" => $user_id,
|
||||
"connection" => $connection_id,
|
||||
"provider" => $provider,
|
||||
"object_id" => $object_id
|
||||
);
|
||||
break;
|
||||
case "cancel": // listen cancel authenticated callback
|
||||
break;
|
||||
case "delete": // listen delete ping
|
||||
break;
|
||||
case "accept": // listen accept ping
|
||||
break;
|
||||
case "object": // get object by id
|
||||
$object_id = get_requested_value("object_id");
|
||||
$context = array(
|
||||
"success" => true,
|
||||
"message" => "Found",
|
||||
"response" => social_get_object($provider, $hauth_adapter, $object_id)
|
||||
);
|
||||
break;
|
||||
default:
|
||||
set_error("Unknown action");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
if(empty($redirect_uri)) {
|
||||
header("Content-Type: application/json");
|
||||
echo json_encode($context);
|
||||
} else {
|
||||
$_display_name = get_hashed_text($hauth_profile->displayName, "base64");
|
||||
$_idt_hash = get_hashed_text($hauth_profile->identifier, "sha1");
|
||||
$_idt_name = $_idt_hash . "@" . $provider;
|
||||
$_idt = get_hashed_text($_idt_name, "sha1");
|
||||
|
||||
// renew api session id
|
||||
$api_session_id = "";
|
||||
set_session("api_session_id", $api_session_id);
|
||||
|
||||
// go to redirect uri
|
||||
redirect_with_params($redirect_uri, array(
|
||||
"connection_id" => $connection_id,
|
||||
"provider" => $provider,
|
||||
"display_name" => $_display_name,
|
||||
"idt" => $_idt,
|
||||
"_token" => $_token
|
||||
));
|
||||
}
|
|
@ -1,231 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.socialhub.php
|
||||
* @date 2018-09-26
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief SocialHub API (refactoring from SocioRouter API)
|
||||
*/
|
||||
|
||||
loadHelper("hybridauth.lnk");
|
||||
loadHelper("hybridauth.dbt");
|
||||
loadHelper("socialhub.utl");
|
||||
|
||||
set_session_token();
|
||||
$_token = get_session_token();
|
||||
|
||||
$provider = get_requested_value("provider");
|
||||
$action = get_requested_value("action");
|
||||
$redirect_uri = get_requested_value("redirect_uri");
|
||||
$user_id = get_requested_value("user_id");
|
||||
|
||||
$connection_id = get_requested_value("connection_id");
|
||||
$message = get_requested_value("message");
|
||||
|
||||
// if make new connection
|
||||
if($action != "new") {
|
||||
$api_session_id = get_session("api_session_id");
|
||||
} else {
|
||||
$api_session_id = "";
|
||||
set_session("api_session_id", $api_session_id);
|
||||
}
|
||||
|
||||
$session_data = array();
|
||||
if(!empty($api_session_id)) {
|
||||
$fr = read_storage_file($api_session_id, array(
|
||||
"storage_type" => "session"
|
||||
));
|
||||
if(!$fr) {
|
||||
// renew api session id
|
||||
$api_session_id = "";
|
||||
set_session("api_session_id", $api_session_id);
|
||||
} else {
|
||||
$session_data = json_decode($fr);
|
||||
$provider = get_property_value("provider", $session_data);
|
||||
$action = get_property_value("action", $session_data);
|
||||
$redirect_uri = get_property_value("redirect_uri", $session_data);
|
||||
$user_id = get_property_value("user_id", $session_data);
|
||||
$connection_id = get_property_value("connection_id", $session_data);
|
||||
$message = get_property_value("message", $session_data);
|
||||
}
|
||||
}
|
||||
|
||||
if(empty($provider)) {
|
||||
set_error("provider is required field.");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
$hauth_adapter = null;
|
||||
$hauth_session = null;
|
||||
$hauth_profile = null;
|
||||
|
||||
// load library
|
||||
$configfile = hybridauth_load($provider);
|
||||
if(!$configfile) {
|
||||
set_error("can not load hybridauth library");
|
||||
show_errors();
|
||||
}
|
||||
$hauth = new Hybrid_Auth($configfile);
|
||||
|
||||
// try session restore
|
||||
$session_flag = false;
|
||||
if(!empty($connection_id)) {
|
||||
$hauth_session = get_stored_hybridauth_session($connection_id);
|
||||
if(!empty($hauth_session)) {
|
||||
try {
|
||||
$hauth->restoreSessionData($hauth_session);
|
||||
$session_flag = true;
|
||||
} catch(Exception $e) {
|
||||
set_error("maybe, your connection is broken.");
|
||||
show_errors();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check hybridauth request
|
||||
if($hauth->isConnectedWith($provider)) {
|
||||
$hauth_session = $hauth->getSessionData();
|
||||
$connection_id = store_hybridauth_session($hauth_session, $user_id);
|
||||
if($connection_id) {
|
||||
$session_flag = true;
|
||||
}
|
||||
}
|
||||
|
||||
// save session
|
||||
$api_session_id = get_hashed_text(make_random_id(32));
|
||||
$session_data = array(
|
||||
"api_session_id" => $api_session_id,
|
||||
"provider" => $provider,
|
||||
"action" => $action,
|
||||
"redirect_uri" => $redirect_uri,
|
||||
"user_id" => $user_id,
|
||||
"connection_id" => $connection_id,
|
||||
"message" => $message
|
||||
);
|
||||
$fw = write_storage_file(json_encode($session_data), array(
|
||||
"storage_type" => "session",
|
||||
"filename" => $api_session_id
|
||||
));
|
||||
if(!$fw) {
|
||||
set_error("maybe, your storage is write-protected.");
|
||||
show_errors();
|
||||
} else {
|
||||
set_session("api_session_id", $api_session_id);
|
||||
}
|
||||
|
||||
if(hybridauth_check_redirect()) {
|
||||
hybridauth_process();
|
||||
}
|
||||
|
||||
// try authenticate
|
||||
try {
|
||||
if(!$session_flag) {
|
||||
$hauth_adapter = $hauth->authenticate($provider);
|
||||
} else {
|
||||
$hauth_adapter = $hauth->getAdapter($provider);
|
||||
}
|
||||
$session_flag = true;
|
||||
} catch(Exception $e) {
|
||||
$hauth_adapter = $hauth->authenticate($provider);
|
||||
}
|
||||
|
||||
if(!$session_flag) {
|
||||
// if failed authenticate
|
||||
redirect_uri(get_route_link("api.socialhub", array(
|
||||
"provider" => $provider,
|
||||
"action" => $action,
|
||||
"redirect_uri" => $redirect_uri,
|
||||
"user_id" => $user_id,
|
||||
"connection_id" => $connection_id
|
||||
), false));
|
||||
}
|
||||
|
||||
// get user profile
|
||||
$hauth_profile = $hauth_adapter->getUserProfile();
|
||||
|
||||
// do action
|
||||
$context = array();
|
||||
switch($action) {
|
||||
case "inbound":
|
||||
break;
|
||||
case "outbound":
|
||||
$response = socialhub_send_message($provider, $hauth_adapter, $message);
|
||||
$object_id = socialhub_parse_object_id($provider, $response);
|
||||
$context = array(
|
||||
"success" => !(!$object_id),
|
||||
"message" => "Have a nice day",
|
||||
"user_id" => $user_id,
|
||||
"provider" => $provider,
|
||||
"object_id" => $object_id
|
||||
);
|
||||
break;
|
||||
case "new":
|
||||
$context = array(
|
||||
"success" => true,
|
||||
"message" => "Authenticated",
|
||||
"user_id" => $user_id,
|
||||
"provider" => $provider,
|
||||
"profile" => $hauth_profile,
|
||||
);
|
||||
break;
|
||||
case "login":
|
||||
$context = array(
|
||||
"success" => true,
|
||||
"message" => "Authenticated",
|
||||
"user_id" => $user_id,
|
||||
"provider" => $provider,
|
||||
"profile" => $hauth_profile,
|
||||
);
|
||||
break;
|
||||
case "bgworker":
|
||||
$response = socialhub_send_message($provider, $hauth_adapter, $message);
|
||||
$object_id = socialhub_parse_object_id($provider, $response);
|
||||
$context = array(
|
||||
"success" => !(!$object_id),
|
||||
"message" => "Have a nice day",
|
||||
"id" => $user_id,
|
||||
"connection" => $connection_id,
|
||||
"provider" => $provider,
|
||||
"object_id" => $object_id
|
||||
);
|
||||
break;
|
||||
case "cancel": // listen cancel authenticated callback
|
||||
break;
|
||||
case "delete": // listen delete ping
|
||||
break;
|
||||
case "accept": // listen accept ping
|
||||
break;
|
||||
case "object": // get object by id
|
||||
$object_id = get_requested_value("object_id");
|
||||
$context = array(
|
||||
"success" => true,
|
||||
"message" => "Found",
|
||||
"response" => socialhub_get_object($provider, $hauth_adapter, $object_id)
|
||||
);
|
||||
break;
|
||||
default:
|
||||
set_error("Unknown action");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
if(empty($redirect_uri)) {
|
||||
header("Content-Type: application/json");
|
||||
echo json_encode($context);
|
||||
} else {
|
||||
$_display_name = get_hashed_text($hauth_profile->displayName, "base64");
|
||||
$_idt_hash = get_hashed_text($hauth_profile->identifier, "sha1");
|
||||
$_idt_name = $_idt_hash . "@" . $provider;
|
||||
$_idt = get_hashed_text($_idt_name, "sha1");
|
||||
|
||||
// renew api session id
|
||||
$api_session_id = "";
|
||||
set_session("api_session_id", $api_session_id);
|
||||
|
||||
// go to redirect uri
|
||||
redirect_with_params($redirect_uri, array(
|
||||
"connection_id" => $connection_id,
|
||||
"provider" => $provider,
|
||||
"display_name" => $_display_name,
|
||||
"idt" => $_idt,
|
||||
"_token" => $_token
|
||||
));
|
||||
}
|
58
route/api.twilio.php
Normal file
58
route/api.twilio.php
Normal file
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.twilio.php
|
||||
* @date 2019-04-15
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Twilio API controller (or domestic API)
|
||||
*/
|
||||
|
||||
loadHelper("twilio.api"); // for voice, or international
|
||||
loadHelper("lguplus.api"); // for domestic
|
||||
loadHelper("string.utils");
|
||||
|
||||
$action = get_requested_value("action", array("_JSON", "_ALL"));
|
||||
$message = get_requested_value("message", array("_JSON", "_ALL"));
|
||||
$to = get_requested_value("to", array("_JSON", "_ALL"));
|
||||
|
||||
$country = get_requested_value("country", array("_JSON", "_ALL"));
|
||||
$is_domestic = array_key_equals("lguplus_country", $config, $country);
|
||||
if(!$is_domestic) {
|
||||
$to = sprintf("+%s%s", $country, $to);
|
||||
} else {
|
||||
$to = sprintf("%s%s", (substr($to, 0, 1) == "0" ? "" : "0"), $to);
|
||||
}
|
||||
|
||||
$response = false;
|
||||
|
||||
// temporary filter (example)
|
||||
$terms = get_tokenized_text($message);
|
||||
if(in_array("fuck", $terms) || in_array("bitch", $terms) || in_array("hell", $terms)) {
|
||||
$action = "denied";
|
||||
}
|
||||
|
||||
switch($action) {
|
||||
case "text":
|
||||
if(!$is_domestic) {
|
||||
$response = twilio_send_message($message, $to);
|
||||
} else {
|
||||
$response = lguplus_send_message($message, $to);
|
||||
}
|
||||
break;
|
||||
|
||||
case "voice":
|
||||
$response = twilio_send_voice($message, $to);
|
||||
break;
|
||||
|
||||
case "denied":
|
||||
$response = array("error" => "action is denied");
|
||||
break;
|
||||
|
||||
default:
|
||||
$response = array("error" => "action is required");
|
||||
break;
|
||||
}
|
||||
|
||||
write_common_log(sprintf("message: %s, to: %s", $message, $to), "api.twilio");
|
||||
|
||||
header("Content-Type: application/json");
|
||||
echo json_encode($response);
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.newuuid.php
|
||||
* @file api.uuid.php
|
||||
* @date 2018-08-19
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief UUID Generator API
|
||||
*/
|
||||
|
22
route/api.zabbix.php
Normal file
22
route/api.zabbix.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
/**
|
||||
* @file api.zabbix.php
|
||||
* @date 2019-04-15
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Zabbix API
|
||||
*/
|
||||
|
||||
loadHelper("zabbix.api");
|
||||
|
||||
$data = array();
|
||||
|
||||
$data['authenticate'] = zabbix_authenticate();
|
||||
$data['hosts'] = zabbix_retrieve_hosts();
|
||||
$data['items'] = array();
|
||||
|
||||
foreach($data['hosts']->result as $host) {
|
||||
$data['items'][$host->hostid] = zabbix_get_items($host->hostid);
|
||||
}
|
||||
|
||||
header("Content-type: application/json");
|
||||
echo json_encode($data);
|
40
route/mobileswitcher.php
Normal file
40
route/mobileswitcher.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
/**
|
||||
* @file mobileswitcher.php
|
||||
* @date 2019-04-29
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief mobile device switcher
|
||||
*/
|
||||
|
||||
loadHelper("mobiletool");
|
||||
loadHelper("networktool");
|
||||
|
||||
$do = get_requested_value("do");
|
||||
$from = get_requested_value("from");
|
||||
$redirect_url = get_requested_value("redirect_url");
|
||||
$dm = detect_mobile();
|
||||
$ne = get_network_event();
|
||||
|
||||
if($from == "pc") {
|
||||
$dm = 1;
|
||||
} elseif($from == "mobile") {
|
||||
$dm = 0;
|
||||
}
|
||||
|
||||
$data = array(
|
||||
"action" => $action,
|
||||
"from" => $from,
|
||||
"dm" => $dm,
|
||||
"redirect_url" => get_final_link($redirect_url, array(
|
||||
"action" => "mobileswitcher",
|
||||
"dm" => $dm,
|
||||
"do" => $do,
|
||||
"redirect_url" => get_final_link($redirect_url, array(
|
||||
"action" => "mobileswitcher",
|
||||
"dm" => $dm,
|
||||
), false),
|
||||
)),
|
||||
"ua" => get_hashed_text($ne['agent'], "base64"),
|
||||
);
|
||||
|
||||
renderView("view_mobileswitcher", $data);
|
|
@ -1,14 +1,15 @@
|
|||
<?php
|
||||
/**
|
||||
* @file ordercomplete.pgkcp.php
|
||||
* @date 2018-09-03
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @brief KCP PG(Payment Gateway) contoller when complete
|
||||
* @created_on 2018-09-03
|
||||
* @updated_on 2020-01-25
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) contoller when completed
|
||||
*/
|
||||
|
||||
// detect CSRF attack
|
||||
if(check_token_abuse_by_requests("_token", "_POST")) {
|
||||
set_error("Access denied. (Expired session or Website attacker)");
|
||||
set_error("Access denied because of security violation");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
|
@ -26,16 +27,16 @@ $pay_method_alias = get_requested_value("pay_method_alias");
|
|||
// A001: free plan (무료)
|
||||
// A002: hand-writing payment (수기결제, 무통장입금 등)
|
||||
$action = "cancel";
|
||||
if(in_array($res_cd, array("0000", "A001")) {
|
||||
if(in_array($res_cd, array("0000", "A001"))) {
|
||||
$action = "complete";
|
||||
} elseif(in_array($res_cd, array("A002")) {
|
||||
} elseif(in_array($res_cd, array("A002"))) {
|
||||
$action = "hold";
|
||||
}
|
||||
|
||||
// check ordr_idxx
|
||||
if(empty($ordr_idxx)) {
|
||||
set_error("ordr_idxx can not empty");
|
||||
set_errors();
|
||||
set_error("ordr_idxx is required");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
// write storage file
|
||||
|
@ -51,9 +52,37 @@ if(!$fw) {
|
|||
show_errors();
|
||||
}
|
||||
|
||||
// response
|
||||
$_token = get_session_token();
|
||||
if(empty($redirect_url)) {
|
||||
$jscontent = <<<EOF
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf8">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">//<!--<![CDATA[
|
||||
if(window.opener && !window.opener.closed) {
|
||||
window.opener.payman_callback({
|
||||
"token": "$_token",
|
||||
"ordr_idxx": "$ordr_idxx",
|
||||
"res_cd": "$res_cd",
|
||||
"pay_method_alias": "$pay_method_alias"
|
||||
});
|
||||
window.close();
|
||||
self.close();
|
||||
this.close();
|
||||
}
|
||||
//]]>--></script>
|
||||
</body>
|
||||
</html>
|
||||
EOF;
|
||||
echo $jscontent;
|
||||
} else {
|
||||
// redirect
|
||||
redirect_uri(get_final_link($redirect_url, array(
|
||||
"_token" => get_session_token(),
|
||||
"_token" => $_token,
|
||||
"_route" => get_requested_value("route"),
|
||||
"_action" => $action,
|
||||
"_ordr_idxx" => $ordr_idxx,
|
||||
|
@ -62,3 +91,4 @@ redirect_uri(get_final_link($redirect_url, array(
|
|||
), false), array(
|
||||
"check_origin" => true
|
||||
));
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file orderform.php
|
||||
* @date 2018-09-03
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief order form
|
||||
*/
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ $data = array(
|
|||
"buyr_mail" => get_requested_value("buyr_mail"),
|
||||
"buyr_tel1" => get_requested_value("buyr_tel1"),
|
||||
"pay_data" => get_requested_value("pay_data"),
|
||||
"eng_flag" => get_requested_value("eng_flag")
|
||||
);
|
||||
|
||||
renderView("view_orderform.widget", $data);
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
/**
|
||||
* @file orderpay.pgkcp.php
|
||||
* @date 2018-08-25
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @updated 2019-10-14
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) Controller
|
||||
*/
|
||||
|
||||
if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
||||
|
||||
$debug = get_requested_value("debug");
|
||||
$mode = get_requested_value("mode");
|
||||
|
||||
if($debug != "true") {
|
||||
// 필수 항목 체크
|
||||
|
@ -20,8 +22,8 @@ if($debug != "true") {
|
|||
}
|
||||
|
||||
// detect CSRF attack
|
||||
if(check_token_abuse_by_requests("_token")) {
|
||||
set_error("Access denied. (Expired session or Website attacker)");
|
||||
if($mode != "widget" && check_token_abuse_by_requests("_token")) {
|
||||
set_error("Access denied because of security violation");
|
||||
show_errors();
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +50,7 @@ $data = array(
|
|||
|
||||
// 1. 주문 정보 입력: 결제에 필요한 주문 정보를 입력 및 설정합니다.
|
||||
$fieldnames = array(
|
||||
"redirect_url", // Redirect URL
|
||||
"pay_method", // 지불 방법
|
||||
"pay_method_alias", // 지불 방법 별칭
|
||||
"ordr_idxx", // 주문 번호
|
||||
|
@ -108,6 +111,8 @@ $payinfo['res_msg'] = "";
|
|||
$payinfo['enc_info'] = "";
|
||||
$payinfo['enc_data'] = "";
|
||||
$payinfo['ret_pay_method'] = "";
|
||||
$payinfo['tran_cd'] = ""; // tran_cd가 유효하여야만 이후 tno 반환
|
||||
$payinfo['use_pay_method'] = "";
|
||||
$payinfo['ordr_chk'] = ""; // 주문정보 검증 관련 정보
|
||||
|
||||
// 변경 제한 영역: 현금영수증 관련 정보
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<?php
|
||||
/**
|
||||
* @file orderpay.step2.pgkcp.php
|
||||
* @date 2018-08-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @created_on 2018-08-27
|
||||
* @updated_on 2020-01-25
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) contoller when done
|
||||
*/
|
||||
|
||||
|
@ -10,13 +11,13 @@ if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
|||
|
||||
// detect CSRF attack
|
||||
if(check_token_abuse_by_requests("_token", "_POST")) {
|
||||
set_error("Access denied. (Expired session or Website attacker)");
|
||||
set_error("Access denied because of security violation");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
loadHelper("webpagetool"); // load webpage tools
|
||||
loadHelper("networktool"); // load network tools
|
||||
loadHelper("string.utl"); // load string utility
|
||||
loadHelper("string.utils"); // load string utility
|
||||
loadHelper("pgkcp.lnk"); // load KCP PG Helper
|
||||
loadHelper("JSLoader.class"); // load javascript loader
|
||||
|
||||
|
@ -274,6 +275,11 @@ if($req_tx == "pay") {
|
|||
}
|
||||
} // End of [res_cd = "0000"]
|
||||
|
||||
// set encoding
|
||||
foreach($payres as $k=>$v) {
|
||||
$payres[$k] = get_converted_string($v, "utf-8", "cp949");
|
||||
}
|
||||
|
||||
// set result
|
||||
extract($payres);
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file orderpay.step3.pgkcp.php
|
||||
* @date 2018-08-27
|
||||
* @author Go Namhyeon <gnh1201@gmail.com>
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief KCP PG(Payment Gateway) contoller when done
|
||||
*/
|
||||
|
||||
|
@ -10,7 +10,7 @@ if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
|||
|
||||
// detect CSRF attack
|
||||
if(check_token_abuse_by_requests("_token", "_POST")) {
|
||||
set_error("Access denied. (Expired session or Website attacker)");
|
||||
set_error("Access denied because of security violation");
|
||||
show_errors();
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
|||
|
||||
$data = array(
|
||||
"name" => "Hong gil dong",
|
||||
"email" => "support@exts.kr",
|
||||
"email" => "abuse@catswords.net",
|
||||
"tel" => ""01000000000",
|
||||
"base_url" => base_url()
|
||||
);
|
||||
|
|
2
route/ping.php
Normal file
2
route/ping.php
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?php
|
||||
echo "pong";
|
103
route/webapp.php
Normal file
103
route/webapp.php
Normal file
|
@ -0,0 +1,103 @@
|
|||
<?php
|
||||
/**
|
||||
* @file webapp.php
|
||||
* @date 2019-02-23
|
||||
* @author Go Namhyeon <abuse@catswords.net>
|
||||
* @brief Isolator(Compatibility mode) for legacy application
|
||||
*/
|
||||
|
||||
loadHelper("isemail.lnk");
|
||||
|
||||
if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
||||
|
||||
// Protect GET method
|
||||
foreach($_GET as $k=>$v) {
|
||||
$_GET[$k] = get_requested_value($k, "_GET");
|
||||
}
|
||||
|
||||
// Protect POST method
|
||||
foreach($_POST as $k=>$v) {
|
||||
$_POST[$k] = get_requested_value($k, "_POST");
|
||||
}
|
||||
|
||||
// Protect REQUEST(ALL) method
|
||||
foreach($_REQUEST as $k=>$v) {
|
||||
$_REQUEST[$k] = get_requested_value($k, "_ALL");
|
||||
}
|
||||
|
||||
// get self filename
|
||||
$self_filename = "";
|
||||
|
||||
// get routes
|
||||
$routes = read_route_all();
|
||||
|
||||
// set path and URL
|
||||
$webapp_root = $_SERVER["DOCUMENT_ROOT"] . "/webapp";
|
||||
$webapp_url = base_url() . "webapp";
|
||||
|
||||
// set DOCUMENT_ROOT forcely
|
||||
$_SERVER["DOCUMENT_ROOT"] = $webapp_root;
|
||||
|
||||
// set file path
|
||||
$appfile = $webapp_root . "/" . implode("/", $routes);
|
||||
|
||||
$appfile_path = $appfile . ".php";
|
||||
|
||||
// get end of routes
|
||||
$is_static_file = false;
|
||||
$is_redirect_to_index = false;
|
||||
$end_route = end($routes);
|
||||
$end_routes_attributes = explode(".", $end_route);
|
||||
$end_fra = $end_routes_attributes[0];
|
||||
$end_era = end($end_routes_attributes);
|
||||
|
||||
if($end_era == "php" || file_exists($appfile_path)) {
|
||||
$appfile_path = str_replace(".php.php", ".php", $appfile_path);
|
||||
if(file_exists($appfile_path)) {
|
||||
include($appfile_path);
|
||||
$self_filename = $end_fra . ".php";
|
||||
} else {
|
||||
set_error("Webapp 404 Not Found");
|
||||
show_errors();
|
||||
}
|
||||
} else {
|
||||
if(file_exists($appfile . "/index.php")) {
|
||||
$appfile .= "/index.php";
|
||||
if(empty($end_era)) {
|
||||
include($appfile);
|
||||
} else {
|
||||
$is_redirect_to_index = true;
|
||||
}
|
||||
} elseif(file_exists($appfile . "/index.html")) {
|
||||
$is_static_file = true;
|
||||
$appfile .= "/index.html";
|
||||
if(empty($end_era)) {
|
||||
$end_era = "html";
|
||||
} else {
|
||||
$is_redirect_to_index = true;
|
||||
}
|
||||
} else {
|
||||
$is_static_file = true;
|
||||
}
|
||||
}
|
||||
|
||||
if($is_redirect_to_index == true) {
|
||||
redirect_uri(base_url() . implode("/", $routes) . "/");
|
||||
exit;
|
||||
}
|
||||
|
||||
if($is_static_file == true) {
|
||||
if(file_exists($appfile)) {
|
||||
set_header_content_type($end_era);
|
||||
header("Cache-Control: max-age=86400");
|
||||
|
||||
$fp = fopen($appfile, "r") or die("404 Not Found");
|
||||
while(!feof($fp)) {
|
||||
echo fread($fp, 8192);
|
||||
}
|
||||
fclose($fp);
|
||||
} else {
|
||||
set_error("404 Not Found");
|
||||
show_errors();
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ if(!defined("_DEF_RSF_")) set_error_exit("do not allow access");
|
|||
loadHelper("webpagetool");
|
||||
|
||||
$method = get_requested_value("method");
|
||||
$mime = get_requested_value("mime"); // example: text/html, image/jpeg
|
||||
$url = get_requested_value("url");
|
||||
|
||||
$res_method = "get.cache";
|
||||
|
@ -14,7 +15,10 @@ if(in_array("nocache", $res_methods)) {
|
|||
|
||||
if(!empty($url)) {
|
||||
$response = get_web_page($url, $res_method);
|
||||
echo $response['content'];
|
||||
if(!empty($mime)) {
|
||||
header(sprintf("Content-Type: %s", $mime));
|
||||
}
|
||||
print_r($response['content']);
|
||||
}
|
||||
|
||||
write_common_log(sprintf("%s\t%s\t%s", get_current_datetime(), "webproxy", $url));
|
||||
write_common_log($url, "webproxy");
|
||||
|
|
18
storage/config/3rdparty.ini.php
Normal file
18
storage/config/3rdparty.ini.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
[3rdparty]
|
||||
zabbix_host=
|
||||
zabbix_username=
|
||||
zabbix_password=
|
||||
zabbix_protocol=http
|
||||
twilio_sid=
|
||||
twilio_token=
|
||||
twilio_from=
|
||||
twilio_char_limit=160
|
||||
vworld_api_key=
|
||||
vworld_api_domain=
|
||||
mailgun_domain=
|
||||
mailgun_name=
|
||||
mailgun_from=
|
||||
mailgun_apikey=
|
||||
EOF;
|
|
@ -6,5 +6,8 @@ db_host = localhost
|
|||
db_name = dbname
|
||||
db_username = dbusername
|
||||
db_password = dbpassword
|
||||
db_retry_limit = 3
|
||||
db_fetch_mode = sql
|
||||
db_separated_tables =
|
||||
storage_dir = storage
|
||||
EOF;
|
||||
|
|
5
storage/config/deprecated.ini.php
Normal file
5
storage/config/deprecated.ini.php
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
[deprecated]
|
||||
deprecated_fn=check_invalid_function,check_function_exists,array_multikey_empty,split_by_line,startsWith,endsWith
|
||||
EOF;
|
|
@ -29,15 +29,15 @@ return array(
|
|||
"Google" => array(
|
||||
"enabled" => true,
|
||||
"keys" => array(
|
||||
"id" => get_value_in_array("sns_google_id", $config, ""),
|
||||
"secret" => get_value_in_array("sns_google_secret", $config, ""),
|
||||
"id" => get_value_in_array("social_google_id", $config, ""),
|
||||
"secret" => get_value_in_array("social_google_secret", $config, ""),
|
||||
),
|
||||
),
|
||||
"Facebook" => array(
|
||||
"enabled" => true,
|
||||
"keys" => array(
|
||||
"id" => get_value_in_array("sns_facebook_id", $config, ""),
|
||||
"secret" => get_value_in_array("sns_facebook_secret", $config, ""),
|
||||
"id" => get_value_in_array("social_facebook_id", $config, ""),
|
||||
"secret" => get_value_in_array("social_facebook_secret", $config, ""),
|
||||
),
|
||||
"trustForwarded" => false,
|
||||
"scope" => array("email", "public_profile"),
|
||||
|
@ -45,8 +45,8 @@ return array(
|
|||
"Twitter" => array(
|
||||
"enabled" => true,
|
||||
"keys" => array(
|
||||
"key" => get_value_in_array("sns_twitter_key", $config, ""),
|
||||
"secret" => get_value_in_array("sns_twitter_secret", $config, ""),
|
||||
"key" => get_value_in_array("social_twitter_key", $config, ""),
|
||||
"secret" => get_value_in_array("social_twitter_secret", $config, ""),
|
||||
),
|
||||
"includeEmail" => false,
|
||||
),
|
||||
|
@ -58,8 +58,8 @@ return array(
|
|||
"LinkedIn" => array(
|
||||
"enabled" => true,
|
||||
"keys" => array(
|
||||
"id" => get_value_in_array("sns_linkedin_id", $config, ""),
|
||||
"secret" => get_value_in_array("sns_linkedin_secret", $config, ""),
|
||||
"id" => get_value_in_array("social_linkedin_id", $config, ""),
|
||||
"secret" => get_value_in_array("social_linkedin_secret", $config, ""),
|
||||
),
|
||||
"fields" => array(),
|
||||
),
|
||||
|
|
6
storage/config/l10n.ini.php
Normal file
6
storage/config/l10n.ini.php
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
[l10n]
|
||||
l10n_enabled=0
|
||||
l10n_default_language=ko
|
||||
EOF;
|
11
storage/config/lguplus.ini.php
Normal file
11
storage/config/lguplus.ini.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
lguplus_enabled = 1
|
||||
lguplus_key = ""
|
||||
lguplus_secret = ""
|
||||
lguplus_id = ""
|
||||
lguplus_pw = ""
|
||||
lguplus_from = ""
|
||||
lguplus_country = "82"
|
||||
lguplus_subject = "Untitled text message"
|
||||
EOF;
|
9
storage/config/logger.ini.php
Normal file
9
storage/config/logger.ini.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
[logger]
|
||||
rfc3164_enabled=0
|
||||
rfc3164_host=logs6.papertrailapp.com
|
||||
rfc3164_port=42986
|
||||
log_rotate_size=104857600
|
||||
log_rotate_ratio=0.9
|
||||
EOF;
|
|
@ -4,7 +4,12 @@ return <<<EOF
|
|||
masterkey=ZVScK4o3DTQsQjyr
|
||||
masteriv=qcLHsW6g11E1JEAF
|
||||
salt=H6hclwzFplRQw39C
|
||||
saltdisabled=0
|
||||
adjectives=warty,hoary,breezy,dapper,edgy,feisty,gutsy,hardy,intrepid,jaunty,karmic,lucid,maverick,natty,oneiric,precise,quantal,raring,saucy,trusty,utopic,vivid,wliy,xeniel,yakkety,zesty
|
||||
animals=warthog,hedgehog,badger,drake,eft,fawn,gibbon,heron,ibex,jackalope,koala,lynx,meerkat,narwhal,ocelot,pangolin,quetzal,ringtail,salamander,tahr,unicorn,vervet,werewolf,xerus,yak,zapus
|
||||
httpencrypt=auto
|
||||
https=auto
|
||||
hashalgos=md5,sha1,crypt,crc32,base64,sql_password
|
||||
sandboxdisabled=1
|
||||
allowextensionsdisabled=1
|
||||
allowextensions=png,gif,jpg,jpeg,tif,xls,ppt,doc,xlsx,pptx,docx,odt,odp,ods,xlsm,tiff,pdf,xlsm,mp3,ogg,m4a,wma,wav
|
||||
EOF;
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
[sns]
|
||||
sns_facebook_id=
|
||||
sns_facebook_secret=
|
||||
sns_twitter_key=
|
||||
sns_twitter_secret=
|
||||
sns_linkedin_id=
|
||||
sns_linkedin_secret=
|
||||
sns_google_id=
|
||||
sns_google_secret=
|
||||
EOF;
|
12
storage/config/social.ini.php
Normal file
12
storage/config/social.ini.php
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
return <<<EOF
|
||||
[social]
|
||||
social_facebook_id=
|
||||
social_facebook_secret=
|
||||
social_twitter_key=
|
||||
social_twitter_secret=
|
||||
social_linkedin_id=
|
||||
social_linkedin_secret=
|
||||
soclai_google_id=
|
||||
social_google_secret=
|
||||
EOF;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user