Compare commits
457 Commits
release-20
...
master
Author | SHA1 | Date |
---|---|---|
Andrew Dolgov | 9f734c9050 | 3 years ago |
Andrew Dolgov | 3b70d1f622 | 3 years ago |
Andrew Dolgov | 2a5c2be6cd | 3 years ago |
Andrew Dolgov | 41245da8a6 | 3 years ago |
Andrew Dolgov | 6fe0751038 | 3 years ago |
Andrew Dolgov | 377e0b812c | 3 years ago |
Andrew Dolgov | dd30825b94 | 3 years ago |
fox | d1ffe6d6cf | 3 years ago |
Philip Klempin | aead30a041 | 3 years ago |
Andrew Dolgov | a936e80630 | 3 years ago |
Andrew Dolgov | 9e7e0e84d7 | 3 years ago |
Andrew Dolgov | c6f5902cbc | 3 years ago |
Andrew Dolgov | a9646b9574 | 3 years ago |
Andrew Dolgov | 145fc31625 | 3 years ago |
Andrew Dolgov | 949e2ab4d2 | 3 years ago |
Andrew Dolgov | 8ed927dbd2 | 3 years ago |
Andrew Dolgov | 78ff7770d1 | 3 years ago |
fox | 012a9fdee3 | 3 years ago |
Jon Schewe | e44f0cb937 | 3 years ago |
Andrew Dolgov | 36e174750e | 3 years ago |
fox | b8f82ca12f | 3 years ago |
jmechnich | e8f9567d79 | 3 years ago |
Andrew Dolgov | a1173ab06a | 3 years ago |
Andrew Dolgov | 2c931df77c | 3 years ago |
Andrew Dolgov | 5c60254474 | 3 years ago |
Andrew Dolgov | 0808123179 | 3 years ago |
fox | 5ed108dce4 | 3 years ago |
fox | 28eafa2bcd | 3 years ago |
wn_ | 23b4152c9e | 3 years ago |
wn_ | 992e9cd9e3 | 3 years ago |
Nils Gotzhein | b6b6771d8d | 3 years ago |
fox | a73e3bec45 | 3 years ago |
wn_ | cf0ec06b8c | 3 years ago |
Andrew Dolgov | 73d14338ab | 3 years ago |
Andrew Dolgov | 9669bb94de | 3 years ago |
Andrew Dolgov | 44c5d0feba | 3 years ago |
fox | cd26dbe64c | 3 years ago |
Philip Klempin | 14d57d9a14 | 3 years ago |
fox | 7bd9572aa1 | 3 years ago |
Philip Klempin | 1d4d3bc49c | 3 years ago |
Weblate | f16fc3bf41 | 3 years ago |
Andrew Dolgov | 93a5ba55d3 | 3 years ago |
Andrew Dolgov | 800ebd6373 | 3 years ago |
Andrew Dolgov | 69f261c41d | 3 years ago |
Andrew Dolgov | e9c062a189 | 3 years ago |
fox | 34807bacd4 | 3 years ago |
Andrew Dolgov | 4e9c3500fb | 3 years ago |
Philip Klempin | b3bedd0a94 | 3 years ago |
Andrew Dolgov | 8ed8a10965 | 3 years ago |
Andrew Dolgov | 92c78beb90 | 3 years ago |
Andrew Dolgov | 8e1281b41e | 3 years ago |
Andrew Dolgov | 326850845d | 3 years ago |
Andrew Dolgov | dff479af64 | 3 years ago |
Andrew Dolgov | d09a64d6f9 | 3 years ago |
Andrew Dolgov | 8574532b7f | 4 years ago |
Andrew Dolgov | 4795c4a2a9 | 4 years ago |
Eike | 0f51350e9f | 4 years ago |
Andrew Dolgov | 295fc1f88a | 4 years ago |
Andrew Dolgov | 2adf364c2c | 4 years ago |
Andrew Dolgov | 9f6237a1b8 | 4 years ago |
Andrew Dolgov | 57cd8acfc9 | 4 years ago |
fox | 77031575ab | 4 years ago |
linkai | 983655165e | 4 years ago |
kdan | 6c06a26649 | 4 years ago |
Andrew Dolgov | f423874e05 | 4 years ago |
Andrew Dolgov | b5a559a1a7 | 4 years ago |
Andrew Dolgov | e3c4724dc1 | 4 years ago |
fox | 82749ee7a7 | 4 years ago |
Jacek Tomasiak | 0c38dc8456 | 4 years ago |
kdan | 2ccf0e50a2 | 4 years ago |
linkai | acf0e0d266 | 4 years ago |
Andrew Dolgov | b2f888e386 | 4 years ago |
Andrew Dolgov | fea59de26b | 4 years ago |
Andrew Dolgov | 86300a0ca8 | 4 years ago |
Andrew Dolgov | d11718c89c | 4 years ago |
linkai | 0574675ed6 | 4 years ago |
Andrew Dolgov | e8f78181f1 | 4 years ago |
Andrew Dolgov | 88a7130d79 | 4 years ago |
Andrew Dolgov | e8e4fc641e | 4 years ago |
Andrew Dolgov | df145c8064 | 4 years ago |
Andrew Dolgov | c6befcddb7 | 4 years ago |
Andrew Dolgov | 5a71426ea5 | 4 years ago |
Andrew Dolgov | b3d45a4a5d | 4 years ago |
Andrew Dolgov | cc634ba91d | 4 years ago |
Eike | b12072fef9 | 4 years ago |
fox | a6c5dda7e0 | 4 years ago |
Oliver Haucke | cfd9e6b53b | 4 years ago |
fox | 0f61675cd0 | 4 years ago |
Rodney Stromlund | c18383d1ea | 4 years ago |
Andrew Dolgov | 3e22368962 | 4 years ago |
Andrew Dolgov | eadaaebd58 | 4 years ago |
fox | 61b4a678ea | 4 years ago |
Cyb10101 | c15c1dfb0b | 4 years ago |
Andrew Dolgov | a61348e2b7 | 4 years ago |
Andrew Dolgov | a5af15cfe9 | 4 years ago |
Andrew Dolgov | 49ef15f11d | 4 years ago |
Andrew Dolgov | c0fba62fa0 | 4 years ago |
Andrew Dolgov | 0acd33abe3 | 4 years ago |
Андрій Жук | 0294297ccc | 4 years ago |
Piotr | a4f82fddf4 | 4 years ago |
Glandos | 49b25a6430 | 4 years ago |
fox | f2f2b6d1f4 | 4 years ago |
wn_ | 5d5c034a90 | 4 years ago |
fox | 0b82afabd5 | 4 years ago |
wn_ | 2ed5a79e64 | 4 years ago |
Andrew Dolgov | 8c32ed76df | 4 years ago |
Andrew Dolgov | ceb8179ccc | 4 years ago |
Andrew Dolgov | 19c277391e | 4 years ago |
Andrew Dolgov | 58ab641fea | 4 years ago |
Andrew Dolgov | be2d1602bd | 4 years ago |
Andrew Dolgov | e3c51b0e6c | 4 years ago |
Andrew Dolgov | c34a4c85bd | 4 years ago |
Andrew Dolgov | 0f6644880a | 4 years ago |
Andrew Dolgov | 98251022d4 | 4 years ago |
Andrew Dolgov | 334a361e79 | 4 years ago |
Andrew Dolgov | d275134f26 | 4 years ago |
Andrew Dolgov | 2e6d48ead7 | 4 years ago |
Andrew Dolgov | 43744412f4 | 4 years ago |
Andrew Dolgov | ef5d6b9b78 | 4 years ago |
Andrew Dolgov | e12a6ca540 | 4 years ago |
Andrew Dolgov | 1f5adf1600 | 4 years ago |
Andrew Dolgov | 68299c914b | 4 years ago |
fox | 56f7b25e85 | 4 years ago |
wn_ | 711e8e70e0 | 4 years ago |
Andrew Dolgov | 718c9f07fa | 4 years ago |
Andrew Dolgov | 43ea36d030 | 4 years ago |
fox | ce9955c6ff | 4 years ago |
wn_ | cd52ca80ab | 4 years ago |
wn_ | baf3ecd4cf | 4 years ago |
Andrew Dolgov | 968270ed48 | 4 years ago |
wn_ | 541a07250c | 4 years ago |
wn_ | f057c124d1 | 4 years ago |
wn_ | 7ea48f7a4b | 4 years ago |
wn_ | b6ae280446 | 4 years ago |
Andrew Dolgov | db0315e596 | 4 years ago |
Andrew Dolgov | 88534a8ae4 | 4 years ago |
Andrew Dolgov | 82bed1e651 | 4 years ago |
fox | 7c2b473d12 | 4 years ago |
wn_ | 401b22666d | 4 years ago |
Andrew Dolgov | 0f5fd9ea13 | 4 years ago |
Andrew Dolgov | 32c080bec0 | 4 years ago |
Andrew Dolgov | 166517240e | 4 years ago |
Andrew Dolgov | 7a1e1630d8 | 4 years ago |
Andrew Dolgov | 92f859add2 | 4 years ago |
Andrew Dolgov | a0e41f41a4 | 4 years ago |
Andrew Dolgov | 7ec8a6cad0 | 4 years ago |
Andrew Dolgov | d9ba403927 | 4 years ago |
Andrew Dolgov | 44b274b6d4 | 4 years ago |
fox | c134aa387d | 4 years ago |
Andrew Dolgov | f81a579386 | 4 years ago |
JustAMacUser | 39bbbef030 | 4 years ago |
Andrew Dolgov | 1870fe172b | 4 years ago |
Andrew Dolgov | b23ba3e236 | 4 years ago |
Andrew Dolgov | a0ce7f556b | 4 years ago |
Andrew Dolgov | 1664b87821 | 4 years ago |
Andrew Dolgov | 13210747d8 | 4 years ago |
Andrew Dolgov | 15b39a534d | 4 years ago |
Andrew Dolgov | f7ee812db2 | 4 years ago |
fox | 1b71cd9f44 | 4 years ago |
Jordan Galby | 3d801b1ac5 | 4 years ago |
Andrew Dolgov | 2f402d598d | 4 years ago |
Andrew Dolgov | 38ab3ef11c | 4 years ago |
Andrew Dolgov | 4ddcd54e8d | 4 years ago |
fox | 06ebb81eb8 | 4 years ago |
Philip Klempin | fa22e1bc35 | 4 years ago |
Andrew Dolgov | 4e81233ac9 | 4 years ago |
Andrew Dolgov | fcce1c443e | 4 years ago |
Andrew Dolgov | bc73bf0f67 | 4 years ago |
Andrew Dolgov | efde6d36c7 | 4 years ago |
Andrew Dolgov | e85cba5958 | 4 years ago |
Marek Pavelka | f9d366f028 | 4 years ago |
Andrew Dolgov | 52d1a5c96d | 4 years ago |
Andrew Dolgov | 580eccd3da | 4 years ago |
Andrew Dolgov | b9268fcc88 | 4 years ago |
Andrew Dolgov | 96d89fe912 | 4 years ago |
Andrew Dolgov | bd1630d278 | 4 years ago |
Andrew Dolgov | 76a6060ca3 | 4 years ago |
Andrew Dolgov | 4949e1a590 | 4 years ago |
Andrew Dolgov | 146b1e0feb | 4 years ago |
Andrew Dolgov | 6e0474a7c8 | 4 years ago |
Andrew Dolgov | f67d2623b7 | 4 years ago |
Andrew Dolgov | a4da2f1e62 | 4 years ago |
Andrew Dolgov | 755072de91 | 4 years ago |
Andrew Dolgov | de47082ca6 | 4 years ago |
Andrew Dolgov | f9a381ecca | 4 years ago |
Andrew Dolgov | 27ab16b6dc | 4 years ago |
Andrew Dolgov | 324aef9f6f | 4 years ago |
Andrew Dolgov | 03361dda34 | 4 years ago |
Andrew Dolgov | 24e64b8c78 | 4 years ago |
Andrew Dolgov | 21e0b28cf1 | 4 years ago |
Andrew Dolgov | f9a9fcbb56 | 4 years ago |
Andrew Dolgov | 3e1b3e8ea8 | 4 years ago |
Andrew Dolgov | 143617afb1 | 4 years ago |
Andrew Dolgov | 84fe383ed4 | 4 years ago |
Andrew Dolgov | 16726ec07f | 4 years ago |
Andrew Dolgov | a0dd5baa51 | 4 years ago |
Andrew Dolgov | 5e738ec278 | 4 years ago |
Andrew Dolgov | 71b12857e0 | 4 years ago |
Andrew Dolgov | 353ee40378 | 4 years ago |
Andrew Dolgov | 668b0ac7a6 | 4 years ago |
Andrew Dolgov | fb89c3bad0 | 4 years ago |
Andrew Dolgov | 5bc47451e1 | 4 years ago |
Andrew Dolgov | 36ad46e60d | 4 years ago |
Ptsa Daniel | 02af69328f | 4 years ago |
Dario Di Ludovico | 4aa595e3ba | 4 years ago |
Andrew Dolgov | 96031c80bf | 4 years ago |
Andrew Dolgov | e826c9e055 | 4 years ago |
Andrew Dolgov | f58879c1dc | 4 years ago |
Andrew Dolgov | bdc72e5b63 | 4 years ago |
Andrew Dolgov | df9c389cbf | 4 years ago |
Andrew Dolgov | b6033d0bbd | 4 years ago |
Andrew Dolgov | 0b93d8d013 | 4 years ago |
Andrew Dolgov | 089fa5ec26 | 4 years ago |
Andrew Dolgov | 87d13e826f | 4 years ago |
Andrew Dolgov | eba8c97f36 | 4 years ago |
Andrew Dolgov | a3ab4020bf | 4 years ago |
Andrew Dolgov | ddfa39015e | 4 years ago |
Andrew Dolgov | 6ec66d0ce5 | 4 years ago |
Andrew Dolgov | f804caec90 | 4 years ago |
Andrew Dolgov | ae7b87bca9 | 4 years ago |
Andrew Dolgov | 2160a86092 | 4 years ago |
Andrew Dolgov | 4e1c78374f | 4 years ago |
Andrew Dolgov | 74391ec30a | 4 years ago |
Andrew Dolgov | dd9d017f7d | 4 years ago |
Andrew Dolgov | 9b321be270 | 4 years ago |
Andrew Dolgov | 4fe2e6bbf1 | 4 years ago |
Andrew Dolgov | b1961163b8 | 4 years ago |
Andrew Dolgov | bc7cb76379 | 4 years ago |
Weblate | 63ca6333a5 | 4 years ago |
Andrew Dolgov | ea25c49eb9 | 4 years ago |
Andrew Dolgov | fe4c284858 | 4 years ago |
fox | 9b2267510b | 4 years ago |
wn_ | fed5158ec5 | 4 years ago |
Andrew Dolgov | cfb4882591 | 4 years ago |
Andrew Dolgov | 28dd255c30 | 4 years ago |
Andrew Dolgov | bfeaf4d6a4 | 4 years ago |
Andrew Dolgov | ef03f8188c | 4 years ago |
Andrew Dolgov | c26f58d8a5 | 4 years ago |
Andrew Dolgov | a125e8540d | 4 years ago |
Andrew Dolgov | 1fb7125f90 | 4 years ago |
Andrew Dolgov | 46b77fc6b7 | 4 years ago |
Andrew Dolgov | 5db6939dc9 | 4 years ago |
Andrew Dolgov | 603cc89638 | 4 years ago |
Andrew Dolgov | f4d0e7bb6d | 4 years ago |
Andrew Dolgov | 72c04123d4 | 4 years ago |
Andrew Dolgov | 518e677a6b | 4 years ago |
Andrew Dolgov | 266c8a6eae | 4 years ago |
Andrew Dolgov | ac6a59914b | 4 years ago |
Andrew Dolgov | ffb93d72ac | 4 years ago |
Andrew Dolgov | 773bad1490 | 4 years ago |
Andrew Dolgov | 1dcc36deca | 4 years ago |
Andrew Dolgov | c036c27ec7 | 4 years ago |
Andrew Dolgov | 17650775d2 | 4 years ago |
Andrew Dolgov | 5bb8714839 | 4 years ago |
Andrew Dolgov | 77b5201b7d | 4 years ago |
Andrew Dolgov | d6fd0d5462 | 4 years ago |
Andrew Dolgov | 39c570a9ff | 4 years ago |
Andrew Dolgov | b27218a1e3 | 4 years ago |
fox | cb81b784e8 | 4 years ago |
Andrew Dolgov | 1d9fa2a42e | 4 years ago |
ltGuillaume | 825e362f0e | 4 years ago |
Andrew Dolgov | 7b0b5b55c7 | 4 years ago |
Andrew Dolgov | 68ecf52594 | 4 years ago |
Andrew Dolgov | 473ea6255c | 4 years ago |
Andrew Dolgov | 217922899d | 4 years ago |
Andrew Dolgov | 270f0c3132 | 4 years ago |
Andrew Dolgov | 63651bd91d | 4 years ago |
Andrew Dolgov | e5469479c1 | 4 years ago |
Andrew Dolgov | 42e057c808 | 4 years ago |
Andrew Dolgov | 53dcd4b229 | 4 years ago |
fox | 42cb2e5112 | 4 years ago |
wn_ | 2e8b064236 | 4 years ago |
Andrew Dolgov | 2cd159e2ce | 4 years ago |
Andrew Dolgov | 2aed79d729 | 4 years ago |
Andrew Dolgov | ecb94ec23d | 4 years ago |
Andrew Dolgov | 5c1f9f31bd | 4 years ago |
Andrew Dolgov | fe06416f17 | 4 years ago |
Andrew Dolgov | 98c75a9e43 | 4 years ago |
Andrew Dolgov | b649d2240f | 4 years ago |
Andrew Dolgov | c8883d3440 | 4 years ago |
Andrew Dolgov | bc2953b5e7 | 4 years ago |
Andrew Dolgov | 198c9b4069 | 4 years ago |
Andrew Dolgov | e8e6329040 | 4 years ago |
Andrew Dolgov | c744cfe2dc | 4 years ago |
Andrew Dolgov | d016f7a499 | 4 years ago |
Andrew Dolgov | 476965b161 | 4 years ago |
fox | c9b0196de0 | 4 years ago |
Threk | 9442ceb7bd | 4 years ago |
Andrew Dolgov | f398fea414 | 4 years ago |
Andrew Dolgov | cb4b730e42 | 4 years ago |
Andrew Dolgov | 386dc415d9 | 4 years ago |
Andrew Dolgov | 9b8b07376f | 4 years ago |
Andrew Dolgov | f90531ae40 | 4 years ago |
Andrew Dolgov | 6cf771f2bc | 4 years ago |
Andrew Dolgov | c50a4296a5 | 4 years ago |
Andrew Dolgov | 04128c7870 | 4 years ago |
Andrew Dolgov | 2f6ea8b387 | 4 years ago |
Andrew Dolgov | b74e313844 | 4 years ago |
Andrew Dolgov | 4fda5ccd0e | 4 years ago |
Andrew Dolgov | 30765805fd | 4 years ago |
Andrew Dolgov | 31b29e0a56 | 4 years ago |
Andrew Dolgov | 8f8ca49e4b | 4 years ago |
Andrew Dolgov | 4ede76280b | 4 years ago |
Andrew Dolgov | bd4ade6329 | 4 years ago |
Andrew Dolgov | 5eb0f3d640 | 4 years ago |
Andrew Dolgov | e19570f422 | 4 years ago |
Andrew Dolgov | c0fb0a5ec0 | 4 years ago |
Andrew Dolgov | 921569e5da | 4 years ago |
Andrew Dolgov | 8256ab5dd9 | 4 years ago |
Andrew Dolgov | 0cb719a404 | 4 years ago |
Marek Pavelka | 5c6c123676 | 4 years ago |
Andrew Dolgov | dfdb746a76 | 4 years ago |
Andrew Dolgov | cb7f322f09 | 4 years ago |
Andrew Dolgov | 06cb181f73 | 4 years ago |
Andrew Dolgov | 75e659ba65 | 4 years ago |
Andrew Dolgov | 0730128a97 | 4 years ago |
Andrew Dolgov | dbda996a7a | 4 years ago |
Andrew Dolgov | 1aedd22306 | 4 years ago |
Andrew Dolgov | 50087df162 | 4 years ago |
Andrew Dolgov | adf7189e94 | 4 years ago |
Andrew Dolgov | 3b67abb0ea | 4 years ago |
Andrew Dolgov | 6f93c45c28 | 4 years ago |
Andrew Dolgov | 9ec0732942 | 4 years ago |
Andrew Dolgov | ba86c64d38 | 4 years ago |
fox | c4b78ed0a6 | 4 years ago |
sam302psu | 57fdf032e9 | 4 years ago |
sam302psu | 8f8142df29 | 4 years ago |
Andrew Dolgov | 386316aba1 | 4 years ago |
Andrew Dolgov | 1ab6ca57af | 4 years ago |
Andrew Dolgov | d6629ed188 | 4 years ago |
Andrew Dolgov | 86b12fc06c | 4 years ago |
Andrew Dolgov | 08ff629af5 | 4 years ago |
Andrew Dolgov | d4ad483add | 4 years ago |
Andrew Dolgov | 982bd838bf | 4 years ago |
Andrew Dolgov | 30b94fb194 | 4 years ago |
Andrew Dolgov | 1a7f724bfa | 4 years ago |
Andrew Dolgov | 20d0cbff77 | 4 years ago |
Andrew Dolgov | f9888fc67f | 4 years ago |
Andrew Dolgov | c4eaab8a31 | 4 years ago |
Andrew Dolgov | 7cf12233d7 | 4 years ago |
Andrew Dolgov | dae0476159 | 4 years ago |
Andrew Dolgov | 2005a7bf4f | 4 years ago |
Andrew Dolgov | f097ae608d | 4 years ago |
Andrew Dolgov | 3bab5ca6b1 | 4 years ago |
Andrew Dolgov | f195e86be3 | 4 years ago |
Andrew Dolgov | 84d8b08d1f | 4 years ago |
Andrew Dolgov | 70adfd4a74 | 4 years ago |
Andrew Dolgov | 6f835ded78 | 4 years ago |
Andrew Dolgov | f56a4eab17 | 4 years ago |
Andrew Dolgov | 372e8e062c | 4 years ago |
Andrew Dolgov | 51ed72efab | 4 years ago |
fox | cd504b0e60 | 4 years ago |
wn_ | 03400bd8d4 | 4 years ago |
Andrew Dolgov | 031ee47a3e | 4 years ago |
Andrew Dolgov | b150e46a52 | 4 years ago |
Andrew Dolgov | cd962dfa00 | 4 years ago |
Andrew Dolgov | 56f658711f | 4 years ago |
Andrew Dolgov | 8b1a2406e6 | 4 years ago |
Andrew Dolgov | 127a868e40 | 4 years ago |
Andrew Dolgov | f38be747d1 | 4 years ago |
Andrew Dolgov | f96abd2b52 | 4 years ago |
Andrew Dolgov | 2d1391a02b | 4 years ago |
Andrew Dolgov | dbad39d7a2 | 4 years ago |
Andrew Dolgov | 6359259dbb | 4 years ago |
Andrew Dolgov | 320503dd39 | 4 years ago |
Andrew Dolgov | 20a844085f | 4 years ago |
Andrew Dolgov | 1e6973307c | 4 years ago |
Andrew Dolgov | 7ef72fe0dc | 4 years ago |
Andrew Dolgov | b05d4e3d9f | 4 years ago |
Andrew Dolgov | bf02afed45 | 4 years ago |
Andrew Dolgov | 1bb0d9b603 | 4 years ago |
Andrew Dolgov | a22ddb2fe0 | 4 years ago |
Andrew Dolgov | bada1601fc | 4 years ago |
Andrew Dolgov | f4fdc9c2a3 | 4 years ago |
Andrew Dolgov | afc7142250 | 4 years ago |
Andrew Dolgov | e2cbb54b2c | 4 years ago |
Andrew Dolgov | 7f2fe465b0 | 4 years ago |
Andrew Dolgov | d821e4b090 | 4 years ago |
Andrew Dolgov | 85f411d688 | 4 years ago |
Andrew Dolgov | 15f9cb708e | 4 years ago |
Andrew Dolgov | de63e3799a | 4 years ago |
Ptsa Daniel | 5832b0b040 | 4 years ago |
Andrew Dolgov | cf5c7c4f29 | 4 years ago |
Andrew Dolgov | 78a7b3642f | 4 years ago |
Andrew Dolgov | dfff2cef7b | 4 years ago |
Andrew Dolgov | 5edcbf2e9b | 4 years ago |
Andrew Dolgov | c1cd3324e3 | 4 years ago |
Andrew Dolgov | 6d06450649 | 4 years ago |
Andrew Dolgov | 126b1fd2de | 4 years ago |
Andrew Dolgov | c521e26a19 | 4 years ago |
Andrew Dolgov | d6bb77f452 | 4 years ago |
Andrew Dolgov | ebf16a36a1 | 4 years ago |
Andrew Dolgov | ef8c3abd7e | 4 years ago |
Andrew Dolgov | 3fd7856543 | 4 years ago |
fox | c6fb62f384 | 4 years ago |
Andrew Dolgov | bc4475b669 | 4 years ago |
Andrew Dolgov | cf1ede0ba8 | 4 years ago |
fox | 1baf8c5217 | 4 years ago |
Andrew Dolgov | d577eb898c | 4 years ago |
Andrew Dolgov | c01b6e43fd | 4 years ago |
wn_ | 86513d70dd | 4 years ago |
Andrew Dolgov | bf9033beb6 | 4 years ago |
Andrew Dolgov | 167c9fc34e | 4 years ago |
Andrew Dolgov | e6a875b7e4 | 4 years ago |
Andrew Dolgov | 4896874bda | 4 years ago |
Andrew Dolgov | fa7c6a6129 | 4 years ago |
Dario Di Ludovico | b63119df33 | 4 years ago |
Andrew Dolgov | b5d9b285f1 | 4 years ago |
Weblate | 05364e11ed | 4 years ago |
Andrew Dolgov | cb512d653c | 4 years ago |
Andrew Dolgov | 2a0b3a161c | 4 years ago |
Weblate | ab0bf8692d | 4 years ago |
Andrew Dolgov | c21fbb2d13 | 4 years ago |
Andrew Dolgov | 15cad4a9c0 | 4 years ago |
Andrew Dolgov | 634f1210a6 | 4 years ago |
Andrew Dolgov | 9a2f893672 | 4 years ago |
Andrew Dolgov | 8d49b6396e | 4 years ago |
Ptsa Daniel | 5794a801f0 | 4 years ago |
Dario Di Ludovico | 1dfa699aea | 4 years ago |
Glandos | a6853d2f49 | 4 years ago |
Andrew Dolgov | 26a6177bc9 | 4 years ago |
Andrew Dolgov | 9689f884ab | 4 years ago |
Andrew Dolgov | 05f690c86b | 4 years ago |
Andrew Dolgov | 3ab664f846 | 4 years ago |
Andrew Dolgov | f3d4bae32e | 4 years ago |
Andrew Dolgov | 51142e1bf8 | 4 years ago |
Andrew Dolgov | 7815a881e8 | 4 years ago |
Andrew Dolgov | 56b10fea18 | 4 years ago |
Andrew Dolgov | fd9cd52929 | 4 years ago |
Andrew Dolgov | a1ca62af50 | 4 years ago |
Andrew Dolgov | 22ae284db4 | 4 years ago |
Andrew Dolgov | 281f2efeb8 | 4 years ago |
Andrew Dolgov | 89ad25405e | 4 years ago |
Andrew Dolgov | 8915bd1b21 | 4 years ago |
Andrew Dolgov | 34c74400a4 | 4 years ago |
Andrew Dolgov | dcf0135285 | 4 years ago |
Andrew Dolgov | 59c14e9c00 | 4 years ago |
Andrew Dolgov | efd196839a | 4 years ago |
Andrew Dolgov | 1464abbbfc | 4 years ago |
Andrew Dolgov | f137e64a13 | 4 years ago |
Andrew Dolgov | c96172fa04 | 4 years ago |
Andrew Dolgov | 5aa05c90e1 | 4 years ago |
Andrew Dolgov | 011e318947 | 4 years ago |
Andrew Dolgov | 6f02b1afd0 | 4 years ago |
Frenck Lutke | 27b676b7b2 | 4 years ago |
Andrew Dolgov | 7f18e8c33b | 4 years ago |
Andrew Dolgov | 7869378436 | 4 years ago |
Frenck Lutke | 2f2642bbd4 | 4 years ago |
Andrew Dolgov | 00d0cb8c81 | 4 years ago |
Andrew Dolgov | 2621fe7955 | 4 years ago |
Andrew Dolgov | bd2314170d | 4 years ago |
Andrew Dolgov | e858e979e9 | 4 years ago |
Andrew Dolgov | 49a9afadce | 4 years ago |
Andrew Dolgov | 1112922029 | 4 years ago |
Andrew Dolgov | 8026f3c3bd | 4 years ago |
Andrew Dolgov | 988eb3ac91 | 4 years ago |
Andrew Dolgov | 922a699215 | 4 years ago |
@ -0,0 +1,198 @@
|
||||
<?php
|
||||
class Db_Migrations {
|
||||
|
||||
private $base_filename = "schema.sql";
|
||||
private $base_path;
|
||||
private $migrations_path;
|
||||
private $migrations_table;
|
||||
private $base_is_latest;
|
||||
private $pdo;
|
||||
|
||||
private $cached_version;
|
||||
private $cached_max_version;
|
||||
private $max_version_override;
|
||||
|
||||
function __construct() {
|
||||
$this->pdo = Db::pdo();
|
||||
}
|
||||
|
||||
function initialize_for_plugin(Plugin $plugin, bool $base_is_latest = true, string $schema_suffix = "sql") {
|
||||
$plugin_dir = PluginHost::getInstance()->get_plugin_dir($plugin);
|
||||
$this->initialize($plugin_dir . "/${schema_suffix}",
|
||||
strtolower("ttrss_migrations_plugin_" . get_class($plugin)),
|
||||
$base_is_latest);
|
||||
}
|
||||
|
||||
function initialize(string $root_path, string $migrations_table, bool $base_is_latest = true, int $max_version_override = 0) {
|
||||
$this->base_path = "$root_path/" . Config::get(Config::DB_TYPE);
|
||||
$this->migrations_path = $this->base_path . "/migrations";
|
||||
$this->migrations_table = $migrations_table;
|
||||
$this->base_is_latest = $base_is_latest;
|
||||
$this->max_version_override = $max_version_override;
|
||||
}
|
||||
|
||||
private function set_version(int $version) {
|
||||
Debug::log("Updating table {$this->migrations_table} with version ${version}...", Debug::LOG_EXTENDED);
|
||||
|
||||
$sth = $this->pdo->query("SELECT * FROM {$this->migrations_table}");
|
||||
|
||||
if ($res = $sth->fetch()) {
|
||||
$sth = $this->pdo->prepare("UPDATE {$this->migrations_table} SET schema_version = ?");
|
||||
} else {
|
||||
$sth = $this->pdo->prepare("INSERT INTO {$this->migrations_table} (schema_version) VALUES (?)");
|
||||
}
|
||||
|
||||
$sth->execute([$version]);
|
||||
|
||||
$this->cached_version = $version;
|
||||
}
|
||||
|
||||
function get_version() : int {
|
||||
if (isset($this->cached_version))
|
||||
return $this->cached_version;
|
||||
|
||||
try {
|
||||
$sth = $this->pdo->query("SELECT * FROM {$this->migrations_table}");
|
||||
|
||||
if ($res = $sth->fetch()) {
|
||||
return (int) $res['schema_version'];
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
} catch (PDOException $e) {
|
||||
$this->create_migrations_table();
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
private function create_migrations_table() {
|
||||
$this->pdo->query("CREATE TABLE IF NOT EXISTS {$this->migrations_table} (schema_version integer not null)");
|
||||
}
|
||||
|
||||
private function migrate_to(int $version) {
|
||||
try {
|
||||
if ($version <= $this->get_version()) {
|
||||
Debug::log("Refusing to apply version $version: current version is higher", Debug::LOG_VERBOSE);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($version == 0)
|
||||
Debug::log("Loading base database schema...", Debug::LOG_VERBOSE);
|
||||
else
|
||||
Debug::log("Starting migration to $version...", Debug::LOG_VERBOSE);
|
||||
|
||||
$lines = $this->get_lines($version);
|
||||
|
||||
if (count($lines) > 0) {
|
||||
// mysql doesn't support transactions for DDL statements
|
||||
if (Config::get(Config::DB_TYPE) != "mysql")
|
||||
$this->pdo->beginTransaction();
|
||||
|
||||
foreach ($lines as $line) {
|
||||
Debug::log($line, Debug::LOG_EXTENDED);
|
||||
try {
|
||||
$this->pdo->query($line);
|
||||
} catch (PDOException $e) {
|
||||
Debug::log("Failed on line: $line", Debug::LOG_VERBOSE);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
if ($version == 0 && $this->base_is_latest)
|
||||
$this->set_version($this->get_max_version());
|
||||
else
|
||||
$this->set_version($version);
|
||||
|
||||
if (Config::get(Config::DB_TYPE) != "mysql")
|
||||
$this->pdo->commit();
|
||||
|
||||
Debug::log("Migration finished, current version: " . $this->get_version(), Debug::LOG_VERBOSE);
|
||||
|
||||
Logger::log(E_USER_NOTICE, "Applied migration to version $version for {$this->migrations_table}");
|
||||
} else {
|
||||
Debug::log("Migration failed: schema file is empty or missing.", Debug::LOG_VERBOSE);
|
||||
}
|
||||
|
||||
} catch (PDOException $e) {
|
||||
Debug::log("Migration failed: " . $e->getMessage(), Debug::LOG_VERBOSE);
|
||||
try {
|
||||
$this->pdo->rollback();
|
||||
} catch (PDOException $ie) {
|
||||
//
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
function get_max_version() : int {
|
||||
if ($this->max_version_override > 0)
|
||||
return $this->max_version_override;
|
||||
|
||||
if (isset($this->cached_max_version))
|
||||
return $this->cached_max_version;
|
||||
|
||||
$migrations = glob("{$this->migrations_path}/*.sql");
|
||||
|
||||
if (count($migrations) > 0) {
|
||||
natsort($migrations);
|
||||
|
||||
$this->cached_max_version = (int) basename(array_pop($migrations), ".sql");
|
||||
|
||||
} else {
|
||||
$this->cached_max_version = 0;
|
||||
}
|
||||
|
||||
return $this->cached_max_version;
|
||||
}
|
||||
|
||||
function is_migration_needed() : bool {
|
||||
return $this->get_version() != $this->get_max_version();
|
||||
}
|
||||
|
||||
function migrate() : bool {
|
||||
|
||||
if ($this->get_version() == -1) {
|
||||
try {
|
||||
$this->migrate_to(0);
|
||||
} catch (PDOException $e) {
|
||||
user_error("Failed to load base schema for {$this->migrations_table}: " . $e->getMessage(), E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for ($i = $this->get_version() + 1; $i <= $this->get_max_version(); $i++) {
|
||||
try {
|
||||
$this->migrate_to($i);
|
||||
} catch (PDOException $e) {
|
||||
user_error("Failed to apply migration ${i} for {$this->migrations_table}: " . $e->getMessage(), E_USER_WARNING);
|
||||
return false;
|
||||
//throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
return !$this->is_migration_needed();
|
||||
}
|
||||
|
||||
private function get_lines(int $version) : array {
|
||||
if ($version > 0)
|
||||
$filename = "{$this->migrations_path}/${version}.sql";
|
||||
else
|
||||
$filename = "{$this->base_path}/{$this->base_filename}";
|
||||
|
||||
if (file_exists($filename)) {
|
||||
$lines = array_filter(preg_split("/[\r\n]/", file_get_contents($filename)),
|
||||
function ($line) {
|
||||
return strlen(trim($line)) > 0 && strpos($line, "--") !== 0;
|
||||
});
|
||||
|
||||
return array_filter(explode(";", implode("", $lines)), function ($line) {
|
||||
return strlen(trim($line)) > 0 && !in_array(strtolower($line), ["begin", "commit"]);
|
||||
});
|
||||
|
||||
} else {
|
||||
user_error("Requested schema file ${filename} not found.", E_USER_ERROR);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
@ -1,173 +1,12 @@
|
||||
<?php
|
||||
class Db_Prefs {
|
||||
private $pdo;
|
||||
private static $instance;
|
||||
private $cache;
|
||||
|
||||
function __construct() {
|
||||
$this->pdo = Db::pdo();
|
||||
$this->cache = [];
|
||||
$this->cache_prefs();
|
||||
}
|
||||
|
||||
private function __clone() {
|
||||
//
|
||||
}
|
||||
|
||||
public static function get() {
|
||||
if (self::$instance == null)
|
||||
self::$instance = new self();
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
private function cache_prefs() {
|
||||
if (!empty($_SESSION["uid"])) {
|
||||
$profile = $_SESSION["profile"] ?? false;
|
||||
|
||||
if (!is_numeric($profile) || !$profile || get_schema_version() < 63) $profile = null;
|
||||
|
||||
$sth = $this->pdo->prepare("SELECT up.pref_name, pt.type_name, up.value
|
||||
FROM ttrss_user_prefs up
|
||||
JOIN ttrss_prefs p ON (up.pref_name = p.pref_name)
|
||||
JOIN ttrss_prefs_types pt ON (p.type_id = pt.id)
|
||||
WHERE
|
||||
up.pref_name NOT LIKE '_MOBILE%' AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL)) AND
|
||||
owner_uid = :uid");
|
||||
|
||||
$sth->execute([":profile" => $profile, ":uid" => $_SESSION["uid"]]);
|
||||
|
||||
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
|
||||
$pref_name = $row["pref_name"];
|
||||
|
||||
$this->cache[$pref_name] = [
|
||||
"type" => $row["type_name"],
|
||||
"value" => $row["value"]
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
// this class is a stub for the time being (to be removed)
|
||||
|
||||
function read($pref_name, $user_id = false, $die_on_error = false) {
|
||||
|
||||
if (!$user_id) {
|
||||
$user_id = $_SESSION["uid"];
|
||||
$profile = $_SESSION["profile"] ?? false;
|
||||
} else {
|
||||
$profile = false;
|
||||
}
|
||||
|
||||
if ($user_id == ($_SESSION['uid'] ?? false) && isset($this->cache[$pref_name])) {
|
||||
$tuple = $this->cache[$pref_name];
|
||||
return $this->convert($tuple["value"], $tuple["type"]);
|
||||
}
|
||||
|
||||
if (!is_numeric($profile) || !$profile || get_schema_version() < 63) $profile = null;
|
||||
|
||||
$sth = $this->pdo->prepare("SELECT up.pref_name, pt.type_name, up.value
|
||||
FROM ttrss_user_prefs up
|
||||
JOIN ttrss_prefs p ON (up.pref_name = p.pref_name)
|
||||
JOIN ttrss_prefs_types pt ON (p.type_id = pt.id)
|
||||
WHERE
|
||||
up.pref_name = :pref_name AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL)) AND
|
||||
owner_uid = :uid");
|
||||
|
||||
$sth->execute([":uid" => $user_id, ":profile" => $profile, ":pref_name" => $pref_name]);
|
||||
|
||||
if ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
|
||||
$value = $row["value"];
|
||||
$type_name = $row["type_name"];
|
||||
|
||||
if ($user_id == ($_SESSION["uid"] ?? false)) {
|
||||
$this->cache[$pref_name] = [
|
||||
"type" => $row["type_name"],
|
||||
"value" => $row["value"]
|
||||
];
|
||||
}
|
||||
|
||||
return $this->convert($value, $type_name);
|
||||
|
||||
} else if ($die_on_error) {
|
||||
user_error("Failed retrieving preference $pref_name for user $user_id", E_USER_ERROR);
|
||||
} else {
|
||||
user_error("Failed retrieving preference $pref_name for user $user_id", E_USER_WARNING);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function convert($value, $type_name) {
|
||||
if ($type_name == "bool") {
|
||||
return $value == "true";
|
||||
} else if ($type_name == "integer") {
|
||||
return (int)$value;
|
||||
} else {
|
||||
return $value;
|
||||
}
|
||||
return get_pref($pref_name, $user_id);
|
||||
}
|
||||
|
||||
function write($pref_name, $value, $user_id = false, $strip_tags = true) {
|
||||
if ($strip_tags) $value = strip_tags($value);
|
||||
|
||||
if (!$user_id) {
|
||||
$user_id = $_SESSION["uid"];
|
||||
@$profile = $_SESSION["profile"] ?? false;
|
||||
} else {
|
||||
$profile = null;
|
||||
return set_pref($pref_name, $value, $user_id, $strip_tags);
|
||||
}
|
||||
|
||||
if (!is_numeric($profile) || !$profile || get_schema_version() < 63) $profile = null;
|
||||
|
||||
$type_name = "";
|
||||
$current_value = "";
|
||||
|
||||
if (isset($this->cache[$pref_name])) {
|
||||
$type_name = $this->cache[$pref_name]["type"];
|
||||
$current_value = $this->cache[$pref_name]["value"];
|
||||
}
|
||||
|
||||
if (!$type_name) {
|
||||
$sth = $this->pdo->prepare("SELECT type_name
|
||||
FROM ttrss_prefs,ttrss_prefs_types
|
||||
WHERE pref_name = ? AND type_id = ttrss_prefs_types.id");
|
||||
$sth->execute([$pref_name]);
|
||||
|
||||
if ($row = $sth->fetch())
|
||||
$type_name = $row["type_name"];
|
||||
|
||||
} else if ($current_value == $value) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($type_name) {
|
||||
if ($type_name == "bool") {
|
||||
if ($value == "1" || $value == "true") {
|
||||
$value = "true";
|
||||
} else {
|
||||
$value = "false";
|
||||
}
|
||||
} else if ($type_name == "integer") {
|
||||
$value = (int)$value;
|
||||
}
|
||||
|
||||
if ($pref_name == 'USER_TIMEZONE' && $value == '') {
|
||||
$value = 'UTC';
|
||||
}
|
||||
|
||||
$sth = $this->pdo->prepare("UPDATE ttrss_user_prefs SET
|
||||
value = :value WHERE pref_name = :pref_name
|
||||
AND (profile = :profile OR (:profile IS NULL AND profile IS NULL))
|
||||
AND owner_uid = :uid");
|
||||
|
||||
$sth->execute([":pref_name" => $pref_name, ":value" => $value, ":uid" => $user_id, ":profile" => $profile]);
|
||||
|
||||
if ($user_id == $_SESSION["uid"]) {
|
||||
$this->cache[$pref_name]["type"] = $type_name;
|
||||
$this->cache[$pref_name]["value"] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,83 +0,0 @@
|
||||
<?php
|
||||
class DbUpdater {
|
||||
|
||||
private $pdo;
|
||||
private $db_type;
|
||||
private $need_version;
|
||||
|
||||
function __construct($pdo, $db_type, $need_version) {
|
||||
$this->pdo = $pdo;
|
||||
$this->db_type = $db_type;
|
||||
$this->need_version = (int) $need_version;
|
||||
}
|
||||
|
||||
function get_schema_version() {
|
||||
$row = $this->pdo->query("SELECT schema_version FROM ttrss_version")->fetch();
|
||||
return (int) $row['schema_version'];
|
||||
}
|
||||
|
||||
function is_update_required() {
|
||||
return $this->get_schema_version() < $this->need_version;
|
||||
}
|
||||
|
||||
function get_schema_lines($version) {
|
||||
$filename = "schema/versions/".$this->db_type."/$version.sql";
|
||||
|
||||
if (file_exists($filename)) {
|
||||
return explode(";", (string)preg_replace("/[\r\n]/", "", (string)file_get_contents($filename)));
|
||||
} else {
|
||||
user_error("DB Updater: schema file for version $version is not found.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function update_to($version, $html_output = true) {
|
||||
if ($this->get_schema_version() == $version - 1) {
|
||||
|
||||
$lines = $this->get_schema_lines($version);
|
||||
|
||||
if (is_array($lines)) {
|
||||
|
||||
$this->pdo->beginTransaction();
|
||||
|
||||
foreach ($lines as $line) {
|
||||
if (strpos($line, "--") !== 0 && $line) {
|
||||
|
||||
if ($html_output)
|
||||
print "<pre>$line</pre>";
|
||||
else
|
||||
Debug::log("> $line");
|
||||
|
||||
try {
|
||||
$this->pdo->query($line); // PDO returns errors as exceptions now
|
||||
} catch (PDOException $e) {
|
||||
if ($html_output) {
|
||||
print "<div class='text-error'>Error: " . $e->getMessage() . "</div>";
|
||||
} else {
|
||||
Debug::log("Error: " . $e->getMessage());
|
||||
}
|
||||
|
||||
$this->pdo->rollBack();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$db_version = $this->get_schema_version();
|
||||
|
||||
if ($db_version == $version) {
|
||||
$this->pdo->commit();
|
||||
return true;
|
||||
} else {
|
||||
$this->pdo->rollBack();
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
<?php
|
||||
interface Logger_Adapter {
|
||||
function log_error(int $errno, string $errstr, string $file, int $line, $context);
|
||||
}
|
@ -0,0 +1,413 @@
|
||||
<?php
|
||||
class Prefs {
|
||||
// (this is the database-backed version of Config.php)
|
||||
|
||||
const PURGE_OLD_DAYS = "PURGE_OLD_DAYS";
|
||||
const DEFAULT_UPDATE_INTERVAL = "DEFAULT_UPDATE_INTERVAL";
|
||||
//const DEFAULT_ARTICLE_LIMIT = "DEFAULT_ARTICLE_LIMIT";
|
||||
//const ALLOW_DUPLICATE_POSTS = "ALLOW_DUPLICATE_POSTS";
|
||||
const ENABLE_FEED_CATS = "ENABLE_FEED_CATS";
|
||||
const SHOW_CONTENT_PREVIEW = "SHOW_CONTENT_PREVIEW";
|
||||
const SHORT_DATE_FORMAT = "SHORT_DATE_FORMAT";
|
||||
const LONG_DATE_FORMAT = "LONG_DATE_FORMAT";
|
||||
const COMBINED_DISPLAY_MODE = "COMBINED_DISPLAY_MODE";
|
||||
const HIDE_READ_FEEDS = "HIDE_READ_FEEDS";
|
||||
const ON_CATCHUP_SHOW_NEXT_FEED = "ON_CATCHUP_SHOW_NEXT_FEED";
|
||||
const FEEDS_SORT_BY_UNREAD = "FEEDS_SORT_BY_UNREAD";
|
||||
const REVERSE_HEADLINES = "REVERSE_HEADLINES";
|
||||
const DIGEST_ENABLE = "DIGEST_ENABLE";
|
||||
const CONFIRM_FEED_CATCHUP = "CONFIRM_FEED_CATCHUP";
|
||||
const CDM_AUTO_CATCHUP = "CDM_AUTO_CATCHUP";
|
||||
const _DEFAULT_VIEW_MODE = "_DEFAULT_VIEW_MODE";
|
||||
const _DEFAULT_VIEW_LIMIT = "_DEFAULT_VIEW_LIMIT";
|
||||
//const _PREFS_ACTIVE_TAB = "_PREFS_ACTIVE_TAB";
|
||||
//const STRIP_UNSAFE_TAGS = "STRIP_UNSAFE_TAGS";
|
||||
const BLACKLISTED_TAGS = "BLACKLISTED_TAGS";
|
||||
const FRESH_ARTICLE_MAX_AGE = "FRESH_ARTICLE_MAX_AGE";
|
||||
const DIGEST_CATCHUP = "DIGEST_CATCHUP";
|
||||
const CDM_EXPANDED = "CDM_EXPANDED";
|
||||
const PURGE_UNREAD_ARTICLES = "PURGE_UNREAD_ARTICLES";
|
||||
const HIDE_READ_SHOWS_SPECIAL = "HIDE_READ_SHOWS_SPECIAL";
|
||||
const VFEED_GROUP_BY_FEED = "VFEED_GROUP_BY_FEED";
|
||||
const STRIP_IMAGES = "STRIP_IMAGES";
|
||||
const _DEFAULT_VIEW_ORDER_BY = "_DEFAULT_VIEW_ORDER_BY";
|
||||
const ENABLE_API_ACCESS = "ENABLE_API_ACCESS";
|
||||
//const _COLLAPSED_SPECIAL = "_COLLAPSED_SPECIAL";
|
||||
//const _COLLAPSED_LABELS = "_COLLAPSED_LABELS";
|
||||
//const _COLLAPSED_UNCAT = "_COLLAPSED_UNCAT";
|
||||
//const _COLLAPSED_FEEDLIST = "_COLLAPSED_FEEDLIST";
|
||||
//const _MOBILE_ENABLE_CATS = "_MOBILE_ENABLE_CATS";
|
||||
//const _MOBILE_SHOW_IMAGES = "_MOBILE_SHOW_IMAGES";
|
||||
//const _MOBILE_HIDE_READ = "_MOBILE_HIDE_READ";
|
||||
//const _MOBILE_SORT_FEEDS_UNREAD = "_MOBILE_SORT_FEEDS_UNREAD";
|
||||
//const _MOBILE_BROWSE_CATS = "_MOBILE_BROWSE_CATS";
|
||||
//const _THEME_ID = "_THEME_ID";
|
||||
const USER_TIMEZONE = "USER_TIMEZONE";
|
||||
const USER_STYLESHEET = "USER_STYLESHEET";
|
||||
//const SORT_HEADLINES_BY_FEED_DATE = "SORT_HEADLINES_BY_FEED_DATE";
|
||||
const SSL_CERT_SERIAL = "SSL_CERT_SERIAL";
|
||||
const DIGEST_PREFERRED_TIME = "DIGEST_PREFERRED_TIME";
|
||||
//const _PREFS_SHOW_EMPTY_CATS = "_PREFS_SHOW_EMPTY_CATS";
|
||||
const _DEFAULT_INCLUDE_CHILDREN = "_DEFAULT_INCLUDE_CHILDREN";
|
||||
//const AUTO_ASSIGN_LABELS = "AUTO_ASSIGN_LABELS";
|
||||
const _ENABLED_PLUGINS = "_ENABLED_PLUGINS";
|
||||
//const _MOBILE_REVERSE_HEADLINES = "_MOBILE_REVERSE_HEADLINES";
|
||||
const USER_CSS_THEME = "USER_CSS_THEME";
|
||||
const USER_LANGUAGE = "USER_LANGUAGE";
|
||||
const DEFAULT_SEARCH_LANGUAGE = "DEFAULT_SEARCH_LANGUAGE";
|
||||
const _PREFS_MIGRATED = "_PREFS_MIGRATED";
|
||||
const HEADLINES_NO_DISTINCT = "HEADLINES_NO_DISTINCT";
|
||||
const DEBUG_HEADLINE_IDS = "DEBUG_HEADLINE_IDS";
|
||||
const DISABLE_CONDITIONAL_COUNTERS = "DISABLE_CONDITIONAL_COUNTERS";
|
||||
const WIDESCREEN_MODE = "WIDESCREEN_MODE";
|
||||
const CDM_ENABLE_GRID = "CDM_ENABLE_GRID";
|
||||
|
||||
private const _DEFAULTS = [
|
||||
Prefs::PURGE_OLD_DAYS => [ 60, Config::T_INT ],
|
||||
Prefs::DEFAULT_UPDATE_INTERVAL => [ 30, Config::T_INT ],
|
||||
//Prefs::DEFAULT_ARTICLE_LIMIT => [ 30, Config::T_INT ],
|
||||
//Prefs::ALLOW_DUPLICATE_POSTS => [ false, Config::T_BOOL ],
|
||||
Prefs::ENABLE_FEED_CATS => [ true, Config::T_BOOL ],
|
||||
Prefs::SHOW_CONTENT_PREVIEW => [ true, Config::T_BOOL ],
|
||||
Prefs::SHORT_DATE_FORMAT => [ "M d, G:i", Config::T_STRING ],
|
||||
Prefs::LONG_DATE_FORMAT => [ "D, M d Y - G:i", Config::T_STRING ],
|
||||
Prefs::COMBINED_DISPLAY_MODE => [ true, Config::T_BOOL ],
|
||||
Prefs::HIDE_READ_FEEDS => [ false, Config::T_BOOL ],
|
||||
Prefs::ON_CATCHUP_SHOW_NEXT_FEED => [ false, Config::T_BOOL ],
|
||||
Prefs::FEEDS_SORT_BY_UNREAD => [ false, Config::T_BOOL ],
|
||||
Prefs::REVERSE_HEADLINES => [ false, Config::T_BOOL ],
|
||||
Prefs::DIGEST_ENABLE => [ false, Config::T_BOOL ],
|
||||
Prefs::CONFIRM_FEED_CATCHUP => [ true, Config::T_BOOL ],
|
||||
Prefs::CDM_AUTO_CATCHUP => [ false, Config::T_BOOL ],
|
||||
Prefs::_DEFAULT_VIEW_MODE => [ "adaptive", Config::T_STRING ],
|
||||
Prefs::_DEFAULT_VIEW_LIMIT => [ 30, Config::T_INT ],
|
||||
//Prefs::_PREFS_ACTIVE_TAB => [ "", Config::T_STRING ],
|
||||
//Prefs::STRIP_UNSAFE_TAGS => [ true, Config::T_BOOL ],
|
||||
Prefs::BLACKLISTED_TAGS => [ 'main, generic, misc, uncategorized, blog, blogroll, general, news', Config::T_STRING ],
|
||||
Prefs::FRESH_ARTICLE_MAX_AGE => [ 24, Config::T_INT ],
|
||||
Prefs::DIGEST_CATCHUP => [ false, Config::T_BOOL ],
|
||||
Prefs::CDM_EXPANDED => [ true, Config::T_BOOL ],
|
||||
Prefs::PURGE_UNREAD_ARTICLES => [ true, Config::T_BOOL ],
|
||||
Prefs::HIDE_READ_SHOWS_SPECIAL => [ true, Config::T_BOOL ],
|
||||
Prefs::VFEED_GROUP_BY_FEED => [ false, Config::T_BOOL ],
|
||||
Prefs::STRIP_IMAGES => [ false, Config::T_BOOL ],
|
||||
Prefs::_DEFAULT_VIEW_ORDER_BY => [ "default", Config::T_STRING ],
|
||||
Prefs::ENABLE_API_ACCESS => [ false, Config::T_BOOL ],
|
||||
//Prefs::_COLLAPSED_SPECIAL => [ false, Config::T_BOOL ],
|
||||
//Prefs::_COLLAPSED_LABELS => [ false, Config::T_BOOL ],
|
||||
//Prefs::_COLLAPSED_UNCAT => [ false, Config::T_BOOL ],
|
||||
//Prefs::_COLLAPSED_FEEDLIST => [ false, Config::T_BOOL ],
|
||||
//Prefs::_MOBILE_ENABLE_CATS => [ false, Config::T_BOOL ],
|
||||
//Prefs::_MOBILE_SHOW_IMAGES => [ false, Config::T_BOOL ],
|
||||
//Prefs::_MOBILE_HIDE_READ => [ false, Config::T_BOOL ],
|
||||
//Prefs::_MOBILE_SORT_FEEDS_UNREAD => [ false, Config::T_BOOL ],
|
||||
//Prefs::_MOBILE_BROWSE_CATS => [ true, Config::T_BOOL ],
|
||||
//Prefs::_THEME_ID => [ 0, Config::T_BOOL ],
|
||||
Prefs::USER_TIMEZONE => [ "Automatic", Config::T_STRING ],
|
||||
Prefs::USER_STYLESHEET => [ "", Config::T_STRING ],
|
||||
//Prefs::SORT_HEADLINES_BY_FEED_DATE => [ false, Config::T_BOOL ],
|
||||
Prefs::SSL_CERT_SERIAL => [ "", Config::T_STRING ],
|
||||
Prefs::DIGEST_PREFERRED_TIME => [ "00:00", Config::T_STRING ],
|
||||
//Prefs::_PREFS_SHOW_EMPTY_CATS => [ false, Config::T_BOOL ],
|
||||
Prefs::_DEFAULT_INCLUDE_CHILDREN => [ false, Config::T_BOOL ],
|
||||
//Prefs::AUTO_ASSIGN_LABELS => [ false, Config::T_BOOL ],
|
||||
Prefs::_ENABLED_PLUGINS => [ "", Config::T_STRING ],
|
||||
//Prefs::_MOBILE_REVERSE_HEADLINES => [ false, Config::T_BOOL ],
|
||||
Prefs::USER_CSS_THEME => [ "" , Config::T_STRING ],
|
||||
Prefs::USER_LANGUAGE => [ "" , Config::T_STRING ],
|
||||
Prefs::DEFAULT_SEARCH_LANGUAGE => [ "" , Config::T_STRING ],
|
||||
Prefs::_PREFS_MIGRATED => [ false, Config::T_BOOL ],
|
||||
Prefs::HEADLINES_NO_DISTINCT => [ false, Config::T_BOOL ],
|
||||
Prefs::DEBUG_HEADLINE_IDS => [ false, Config::T_BOOL ],
|
||||
Prefs::DISABLE_CONDITIONAL_COUNTERS => [ false, Config::T_BOOL ],
|
||||
Prefs::WIDESCREEN_MODE => [ false, Config::T_BOOL ],
|
||||
Prefs::CDM_ENABLE_GRID => [ false, Config::T_BOOL ],
|
||||
];
|
||||
|
||||
const _PROFILE_BLACKLIST = [
|
||||
//Prefs::ALLOW_DUPLICATE_POSTS,
|
||||
Prefs::PURGE_OLD_DAYS,
|
||||
Prefs::PURGE_UNREAD_ARTICLES,
|
||||
Prefs::DIGEST_ENABLE,
|
||||
Prefs::DIGEST_CATCHUP,
|
||||
Prefs::BLACKLISTED_TAGS,
|
||||
Prefs::ENABLE_API_ACCESS,
|
||||
//Prefs::UPDATE_POST_ON_CHECKSUM_CHANGE,
|
||||
Prefs::DEFAULT_UPDATE_INTERVAL,
|
||||
Prefs::USER_TIMEZONE,
|
||||
//Prefs::SORT_HEADLINES_BY_FEED_DATE,
|
||||
Prefs::SSL_CERT_SERIAL,
|
||||
Prefs::DIGEST_PREFERRED_TIME,
|
||||
Prefs::_PREFS_MIGRATED
|
||||
];
|
||||
|
||||
private static $instance;
|
||||
private $cache = [];
|
||||
|
||||
/** @var PDO */
|
||||
private $pdo;
|
||||
|
||||
public static function get_instance() : Prefs {
|
||||
if (self::$instance == null)
|
||||
self::$instance = new self();
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
static function is_valid(string $pref_name) {
|
||||
return isset(self::_DEFAULTS[$pref_name]);
|
||||
}
|
||||
|
||||
static function get_default(string $pref_name) {
|
||||
if (self::is_valid($pref_name))
|
||||
return self::_DEFAULTS[$pref_name][0];
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
function __construct() {
|
||||
$this->pdo = Db::pdo();
|
||||
|
||||
if (!empty($_SESSION["uid"])) {
|
||||
$owner_uid = (int) $_SESSION["uid"];
|
||||
$profile_id = $_SESSION["profile"] ?? null;
|
||||
|
||||
$this->cache_all($owner_uid, $profile_id);
|
||||
$this->migrate($owner_uid, $profile_id);
|
||||
};
|
||||
}
|
||||
|
||||
private function __clone() {
|
||||
//
|
||||
}
|
||||
|
||||
static function get_all(int $owner_uid, int $profile_id = null) {
|
||||
return self::get_instance()->_get_all($owner_uid, $profile_id);
|
||||
}
|
||||
|
||||
private function _get_all(int $owner_uid, int $profile_id = null) {
|
||||
$rv = [];
|
||||
|
||||
$ref = new ReflectionClass(get_class($this));
|
||||
|
||||
foreach ($ref->getConstants() as $const => $cvalue) {
|
||||
if (isset($this::_DEFAULTS[$const])) {
|
||||
list ($def_val, $type_hint) = $this::_DEFAULTS[$const];
|
||||
|
||||
array_push($rv, [
|
||||
"pref_name" => $const,
|
||||
"value" => $this->_get($const, $owner_uid, $profile_id),
|
||||
"type_hint" => $type_hint,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $rv;
|
||||
}
|
||||
|
||||
private function cache_all(int $owner_uid, $profile_id = null) {
|
||||
if (!$profile_id) $profile_id = null;
|
||||
|
||||
// fill cache with defaults
|
||||
$ref = new ReflectionClass(get_class($this));
|
||||
foreach ($ref->getConstants() as $const => $cvalue) {
|
||||
if (isset($this::_DEFAULTS[$const])) {
|
||||
list ($def_val, $type_hint) = $this::_DEFAULTS[$const];
|
||||
|
||||
$this->_set_cache($const, $def_val, $owner_uid, $profile_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (get_schema_version() >= 141) {
|
||||
// fill in any overrides from the database
|
||||
$sth = $this->pdo->prepare("SELECT pref_name, value FROM ttrss_user_prefs2
|
||||
WHERE owner_uid = :uid AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
|
||||
$sth->execute(["uid" => $owner_uid, "profile" => $profile_id]);
|
||||
|
||||
while ($row = $sth->fetch()) {
|
||||
$this->_set_cache($row["pref_name"], $row["value"], $owner_uid, $profile_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static function get(string $pref_name, int $owner_uid, int $profile_id = null) {
|
||||
return self::get_instance()->_get($pref_name, $owner_uid, $profile_id);
|
||||
}
|
||||
|
||||
private function _get(string $pref_name, int $owner_uid, int $profile_id = null) {
|
||||
if (isset(self::_DEFAULTS[$pref_name])) {
|
||||
if (!$profile_id || in_array($pref_name, self::_PROFILE_BLACKLIST)) $profile_id = null;
|
||||
|
||||
list ($def_val, $type_hint) = self::_DEFAULTS[$pref_name];
|
||||
|
||||
$cached_value = $this->_get_cache($pref_name, $owner_uid, $profile_id);
|
||||
|
||||
if ($this->_is_cached($pref_name, $owner_uid, $profile_id)) {
|
||||
$cached_value = $this->_get_cache($pref_name, $owner_uid, $profile_id);
|
||||
return Config::cast_to($cached_value, $type_hint);
|
||||
} else if (get_schema_version() >= 141) {
|
||||
$sth = $this->pdo->prepare("SELECT value FROM ttrss_user_prefs2
|
||||
WHERE pref_name = :name AND owner_uid = :uid AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
|
||||
$sth->execute(["uid" => $owner_uid, "profile" => $profile_id, "name" => $pref_name ]);
|
||||
|
||||
if ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
|
||||
$this->_set_cache($pref_name, $row["value"], $owner_uid, $profile_id);
|
||||
|
||||
return Config::cast_to($row["value"], $type_hint);
|
||||
} else {
|
||||
$this->_set_cache($pref_name, $def_val, $owner_uid, $profile_id);
|
||||
|
||||
return $def_val;
|
||||
}
|
||||
} else {
|
||||
return Config::cast_to($def_val, $type_hint);
|
||||
|
||||
}
|
||||
} else {
|
||||
user_error("Attempt to get invalid preference key: $pref_name (UID: $owner_uid, profile: $profile_id)", E_USER_WARNING);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function _is_cached(string $pref_name, int $owner_uid, int $profile_id = null) {
|
||||
$cache_key = sprintf("%d/%d/%s", $owner_uid, $profile_id, $pref_name);
|
||||
return isset($this->cache[$cache_key]);
|
||||
}
|
||||
|
||||
private function _get_cache(string $pref_name, int $owner_uid, int $profile_id = null) {
|
||||
$cache_key = sprintf("%d/%d/%s", $owner_uid, $profile_id, $pref_name);
|
||||
|
||||
if (isset($this->cache[$cache_key]))
|
||||
return $this->cache[$cache_key];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function _set_cache(string $pref_name, $value, int $owner_uid, int $profile_id = null) {
|
||||
$cache_key = sprintf("%d/%d/%s", $owner_uid, $profile_id, $pref_name);
|
||||
|
||||
$this->cache[$cache_key] = $value;
|
||||
}
|
||||
|
||||
static function set(string $pref_name, $value, int $owner_uid, int $profile_id = null, bool $strip_tags = true) {
|
||||
return self::get_instance()->_set($pref_name, $value, $owner_uid, $profile_id);
|
||||
}
|
||||
|
||||
private function _delete(string $pref_name, int $owner_uid, int $profile_id = null) {
|
||||
$sth = $this->pdo->prepare("DELETE FROM ttrss_user_prefs2
|
||||
WHERE pref_name = :name AND owner_uid = :uid AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
|
||||
return $sth->execute(["uid" => $owner_uid, "profile" => $profile_id, "name" => $pref_name ]);
|
||||
}
|
||||
|
||||
private function _set(string $pref_name, $value, int $owner_uid, int $profile_id = null, bool $strip_tags = true) {
|
||||
if (!$profile_id) $profile_id = null;
|
||||
|
||||
if ($profile_id && in_array($pref_name, self::_PROFILE_BLACKLIST))
|
||||
return false;
|
||||
|
||||
if (isset(self::_DEFAULTS[$pref_name])) {
|
||||
list ($def_val, $type_hint) = self::_DEFAULTS[$pref_name];
|
||||
|
||||
if ($strip_tags)
|
||||
$value = trim(strip_tags($value));
|
||||
|
||||
$value = Config::cast_to($value, $type_hint);
|
||||
|
||||
// is this a good idea or not? probably not (user-set value remains user-set even if its at default)
|
||||
//if ($value == $def_val)
|
||||
// return $this->_delete($pref_name, $owner_uid, $profile_id);
|
||||
|
||||
if ($value == $this->_get($pref_name, $owner_uid, $profile_id))
|
||||
return false;
|
||||
|
||||
$this->_set_cache($pref_name, $value, $owner_uid, $profile_id);
|
||||
|
||||
$sth = $this->pdo->prepare("SELECT COUNT(pref_name) AS count FROM ttrss_user_prefs2
|
||||
WHERE pref_name = :name AND owner_uid = :uid AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
$sth->execute(["uid" => $owner_uid, "profile" => $profile_id, "name" => $pref_name ]);
|
||||
|
||||
if ($row = $sth->fetch()) {
|
||||
if ($row["count"] == 0) {
|
||||
$sth = $this->pdo->prepare("INSERT INTO ttrss_user_prefs2
|
||||
(pref_name, value, owner_uid, profile)
|
||||
VALUES
|
||||
(:name, :value, :uid, :profile)");
|
||||
|
||||
return $sth->execute(["uid" => $owner_uid, "profile" => $profile_id, "name" => $pref_name, "value" => $value ]);
|
||||
|
||||
} else {
|
||||
$sth = $this->pdo->prepare("UPDATE ttrss_user_prefs2
|
||||
SET value = :value
|
||||
WHERE pref_name = :name AND owner_uid = :uid AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
|
||||
return $sth->execute(["uid" => $owner_uid, "profile" => $profile_id, "name" => $pref_name, "value" => $value ]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
user_error("Attempt to set invalid preference key: $pref_name (UID: $owner_uid, profile: $profile_id)", E_USER_WARNING);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function migrate(int $owner_uid, int $profile_id = null) {
|
||||
if (get_schema_version() < 141)
|
||||
return;
|
||||
|
||||
if (!$profile_id) $profile_id = null;
|
||||
|
||||
if (!$this->_get(Prefs::_PREFS_MIGRATED, $owner_uid, $profile_id)) {
|
||||
|
||||
$in_nested_tr = false;
|
||||
|
||||
try {
|
||||
$this->pdo->beginTransaction();
|
||||
} catch (PDOException $e) {
|
||||
$in_nested_tr = true;
|
||||
}
|
||||
|
||||
$sth = $this->pdo->prepare("SELECT pref_name, value FROM ttrss_user_prefs
|
||||
WHERE owner_uid = :uid AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
$sth->execute(["uid" => $owner_uid, "profile" => $profile_id]);
|
||||
|
||||
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
|
||||
if (isset(self::_DEFAULTS[$row["pref_name"]])) {
|
||||
list ($def_val, $type_hint) = self::_DEFAULTS[$row["pref_name"]];
|
||||
|
||||
$user_val = Config::cast_to($row["value"], $type_hint);
|
||||
|
||||
if ($user_val != $def_val) {
|
||||
$this->_set($row["pref_name"], $user_val, $owner_uid, $profile_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->_set(Prefs::_PREFS_MIGRATED, "1", $owner_uid, $profile_id);
|
||||
|
||||
if (!$in_nested_tr)
|
||||
$this->pdo->commit();
|
||||
|
||||
Logger::log(E_USER_NOTICE, sprintf("Migrated preferences of user %d (profile %d)", $owner_uid, $profile_id));
|
||||
}
|
||||
}
|
||||
|
||||
static function reset(int $owner_uid, int $profile_id = null) {
|
||||
if (!$profile_id) $profile_id = null;
|
||||
|
||||
$sth = Db::pdo()->prepare("DELETE FROM ttrss_user_prefs2
|
||||
WHERE owner_uid = :uid AND pref_name != :mig_key AND
|
||||
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
|
||||
|
||||
$sth->execute(["uid" => $owner_uid, "mig_key" => self::_PREFS_MIGRATED, "profile" => $profile_id]);
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
{
|
||||
"require": {
|
||||
"spomky-labs/otphp": "^10.0",
|
||||
"chillerlan/php-qrcode": "^3.3",
|
||||
"mervick/material-design-icons": "^2.2",
|
||||
"j4mie/idiorm": "^1.5"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^0.12.99"
|
||||
}
|
||||
}
|
@ -0,0 +1,669 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "76e40cf59f811ee42d14ac41159c570a",
|
||||
"packages": [
|
||||
{
|
||||
"name": "beberlei/assert",
|
||||
"version": "v3.2.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/beberlei/assert.git",
|
||||
"reference": "d63a6943fc4fd1a2aedb65994e3548715105abcf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/beberlei/assert/zipball/d63a6943fc4fd1a2aedb65994e3548715105abcf",
|
||||
"reference": "d63a6943fc4fd1a2aedb65994e3548715105abcf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-ctype": "*",
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-simplexml": "*",
|
||||
"php": "^7"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "*",
|
||||
"phpstan/phpstan-shim": "*",
|
||||
"phpunit/phpunit": ">=6.0.0 <8"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Assert\\": "lib/Assert"
|
||||
},
|
||||
"files": [
|
||||
"lib/Assert/functions.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-2-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Benjamin Eberlei",
|
||||
"email": "kontakt@beberlei.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "Richard Quadling",
|
||||
"email": "rquadling@gmail.com",
|
||||
"role": "Collaborator"
|
||||
}
|
||||
],
|
||||
"description": "Thin assertion library for input validation in business models.",
|
||||
"keywords": [
|
||||
"assert",
|
||||
"assertion",
|
||||
"validation"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/beberlei/assert/issues",
|
||||
"source": "https://github.com/beberlei/assert/tree/v3"
|
||||
},
|
||||
"time": "2019-12-19T17:51:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "chillerlan/php-qrcode",
|
||||
"version": "3.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/chillerlan/php-qrcode.git",
|
||||
"reference": "d8bf297e6843a53aeaa8f3285ce04fc349d133d6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/d8bf297e6843a53aeaa8f3285ce04fc349d133d6",
|
||||
"reference": "d8bf297e6843a53aeaa8f3285ce04fc349d133d6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"chillerlan/php-settings-container": "^1.2",
|
||||
"ext-mbstring": "*",
|
||||
"php": "^7.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8.5",
|
||||
"setasign/fpdf": "^1.8.2"
|
||||
},
|
||||
"suggest": {
|
||||
"chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.",
|
||||
"setasign/fpdf": "Required to use the QR FPDF output."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"chillerlan\\QRCode\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Kazuhiko Arase",
|
||||
"homepage": "https://github.com/kazuhikoarase"
|
||||
},
|
||||
{
|
||||
"name": "Smiley",
|
||||
"email": "smiley@chillerlan.net",
|
||||
"homepage": "https://github.com/codemasher"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"description": "A QR code generator. PHP 7.2+",
|
||||
"homepage": "https://github.com/chillerlan/php-qrcode",
|
||||
"keywords": [
|
||||
"phpqrcode",
|
||||
"qr",
|
||||
"qr code",
|
||||
"qrcode",
|
||||
"qrcode-generator"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/chillerlan/php-qrcode/issues",
|
||||
"source": "https://github.com/chillerlan/php-qrcode/tree/3.4.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://ko-fi.com/codemasher",
|
||||
"type": "ko_fi"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-18T20:51:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "chillerlan/php-settings-container",
|
||||
"version": "1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/chillerlan/php-settings-container.git",
|
||||
"reference": "b9b0431dffd74102ee92348a63b4c33fc8ba639b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/b9b0431dffd74102ee92348a63b4c33fc8ba639b",
|
||||
"reference": "b9b0431dffd74102ee92348a63b4c33fc8ba639b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-json": "*",
|
||||
"php": "^7.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8.3"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"chillerlan\\Settings\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Smiley",
|
||||
"email": "smiley@chillerlan.net",
|
||||
"homepage": "https://github.com/codemasher"
|
||||
}
|
||||
],
|
||||
"description": "A container class for immutable settings objects. Not a DI container. PHP 7.2+",
|
||||
"homepage": "https://github.com/chillerlan/php-settings-container",
|
||||
"keywords": [
|
||||
"PHP7",
|
||||
"Settings",
|
||||
"container",
|
||||
"helper"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/chillerlan/php-settings-container/issues",
|
||||
"source": "https://github.com/chillerlan/php-settings-container"
|
||||
},
|
||||
"time": "2019-09-10T00:09:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "j4mie/idiorm",
|
||||
"version": "v1.5.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/j4mie/idiorm.git",
|
||||
"reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/j4mie/idiorm/zipball/d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4",
|
||||
"reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-pdo_sqlite": "*",
|
||||
"phpunit/phpunit": "^4.8"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"idiorm.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-2-Clause",
|
||||
"BSD-3-Clause",
|
||||
"BSD-4-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jamie Matthews",
|
||||
"email": "jamie.matthews@gmail.com",
|
||||
"homepage": "http://j4mie.org",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Simon Holywell",
|
||||
"email": "treffynnon@php.net",
|
||||
"homepage": "http://simonholywell.com",
|
||||
"role": "Maintainer"
|
||||
},
|
||||
{
|
||||
"name": "Durham Hale",
|
||||
"email": "me@durhamhale.com",
|
||||
"homepage": "http://durhamhale.com",
|
||||
"role": "Maintainer"
|
||||
}
|
||||
],
|
||||
"description": "A lightweight nearly-zero-configuration object-relational mapper and fluent query builder for PHP5",
|
||||
"homepage": "http://j4mie.github.com/idiormandparis",
|
||||
"keywords": [
|
||||
"idiorm",
|
||||
"orm",
|
||||
"query builder"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/j4mie/idiorm/issues",
|
||||
"source": "https://github.com/j4mie/idiorm"
|
||||
},
|
||||
"time": "2020-04-29T00:37:09+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mervick/material-design-icons",
|
||||
"version": "2.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mervick/material-design-icons.git",
|
||||
"reference": "635435c8d3df3a6da3241648caf8a65d1c07cc1a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/mervick/material-design-icons/zipball/635435c8d3df3a6da3241648caf8a65d1c07cc1a",
|
||||
"reference": "635435c8d3df3a6da3241648caf8a65d1c07cc1a",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "library",
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT",
|
||||
"CC-BY-4.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Andrey Izman",
|
||||
"email": "izmanw@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Google Material Design Icons For Using With Bootstrap",
|
||||
"homepage": "http://github.com/mervick/material-design-icons",
|
||||
"keywords": [
|
||||
"bootstrap",
|
||||
"google",
|
||||
"icons",
|
||||
"icons-web-font",
|
||||
"material",
|
||||
"material-design",
|
||||
"web-font"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/mervick/material-design-icons/issues",
|
||||
"source": "http://github.com/mervick/material-design-icons"
|
||||
},
|
||||
"time": "2016-02-22T01:05:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "paragonie/constant_time_encoding",
|
||||
"version": "v2.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/paragonie/constant_time_encoding.git",
|
||||
"reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
|
||||
"reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7|^8"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^6|^7|^8|^9",
|
||||
"vimeo/psalm": "^1|^2|^3|^4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"ParagonIE\\ConstantTime\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Paragon Initiative Enterprises",
|
||||
"email": "security@paragonie.com",
|
||||
"homepage": "https://paragonie.com",
|
||||
"role": "Maintainer"
|
||||
},
|
||||
{
|
||||
"name": "Steve 'Sc00bz' Thomas",
|
||||
"email": "steve@tobtu.com",
|
||||
"homepage": "https://www.tobtu.com",
|
||||
"role": "Original Developer"
|
||||
}
|
||||
],
|
||||
"description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
|
||||
"keywords": [
|
||||
"base16",
|
||||
"base32",
|
||||
"base32_decode",
|
||||
"base32_encode",
|
||||
"base64",
|
||||
"base64_decode",
|
||||
"base64_encode",
|
||||
"bin2hex",
|
||||
"encoding",
|
||||
"hex",
|
||||
"hex2bin",
|
||||
"rfc4648"
|
||||
],
|
||||
"support": {
|
||||
"email": "info@paragonie.com",
|
||||
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
|
||||
"source": "https://github.com/paragonie/constant_time_encoding"
|
||||
},
|
||||
"time": "2020-12-06T15:14:20+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spomky-labs/otphp",
|
||||
"version": "v10.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Spomky-Labs/otphp.git",
|
||||
"reference": "f44cce5a9db4b8da410215d992110482c931232f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f",
|
||||
"reference": "f44cce5a9db4b8da410215d992110482c931232f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"beberlei/assert": "^3.0",
|
||||
"ext-mbstring": "*",
|
||||
"paragonie/constant_time_encoding": "^2.0",
|
||||
"php": "^7.2|^8.0",
|
||||
"thecodingmachine/safe": "^0.1.14|^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"php-coveralls/php-coveralls": "^2.0",
|
||||
"phpstan/phpstan": "^0.12",
|
||||
"phpstan/phpstan-beberlei-assert": "^0.12",
|
||||
"phpstan/phpstan-deprecation-rules": "^0.12",
|
||||
"phpstan/phpstan-phpunit": "^0.12",
|
||||
"phpstan/phpstan-strict-rules": "^0.12",
|
||||
"phpunit/phpunit": "^8.0",
|
||||
"thecodingmachine/phpstan-safe-rule": "^1.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"v10.0": "10.0.x-dev",
|
||||
"v9.0": "9.0.x-dev",
|
||||
"v8.3": "8.3.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"OTPHP\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Florent Morselli",
|
||||
"homepage": "https://github.com/Spomky"
|
||||
},
|
||||
{
|
||||
"name": "All contributors",
|
||||
"homepage": "https://github.com/Spomky-Labs/otphp/contributors"
|
||||
}
|
||||
],
|
||||
"description": "A PHP library for generating one time passwords according to RFC 4226 (HOTP Algorithm) and the RFC 6238 (TOTP Algorithm) and compatible with Google Authenticator",
|
||||
"homepage": "https://github.com/Spomky-Labs/otphp",
|
||||
"keywords": [
|
||||
"FreeOTP",
|
||||
"RFC 4226",
|
||||
"RFC 6238",
|
||||
"google authenticator",
|
||||
"hotp",
|
||||
"otp",
|
||||
"totp"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/Spomky-Labs/otphp/issues",
|
||||
"source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1"
|
||||
},
|
||||
"time": "2020-01-28T09:24:19+00:00"
|
||||
},
|
||||
{
|
||||
"name": "thecodingmachine/safe",
|
||||
"version": "v1.3.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thecodingmachine/safe.git",
|
||||
"reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
|
||||
"reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^0.12",
|
||||
"squizlabs/php_codesniffer": "^3.2",
|
||||
"thecodingmachine/phpstan-strict-rules": "^0.12"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "0.1-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Safe\\": [
|
||||
"lib/",
|
||||
"deprecated/",
|
||||
"generated/"
|
||||
]
|
||||
},
|
||||
"files": [
|
||||
"deprecated/apc.php",
|
||||
"deprecated/libevent.php",
|
||||
"deprecated/mssql.php",
|
||||
"deprecated/stats.php",
|
||||
"lib/special_cases.php",
|
||||
"generated/apache.php",
|
||||
"generated/apcu.php",
|
||||
"generated/array.php",
|
||||
"generated/bzip2.php",
|
||||
"generated/calendar.php",
|
||||
"generated/classobj.php",
|
||||
"generated/com.php",
|
||||
"generated/cubrid.php",
|
||||
"generated/curl.php",
|
||||
"generated/datetime.php",
|
||||
"generated/dir.php",
|
||||
"generated/eio.php",
|
||||
"generated/errorfunc.php",
|
||||
"generated/exec.php",
|
||||
"generated/fileinfo.php",
|
||||
"generated/filesystem.php",
|
||||
"generated/filter.php",
|
||||
"generated/fpm.php",
|
||||
"generated/ftp.php",
|
||||
"generated/funchand.php",
|
||||
"generated/gmp.php",
|
||||
"generated/gnupg.php",
|
||||
"generated/hash.php",
|
||||
"generated/ibase.php",
|
||||
"generated/ibmDb2.php",
|
||||
"generated/iconv.php",
|
||||
"generated/image.php",
|
||||
"generated/imap.php",
|
||||
"generated/info.php",
|
||||
"generated/ingres-ii.php",
|
||||
"generated/inotify.php",
|
||||
"generated/json.php",
|
||||
"generated/ldap.php",
|
||||
"generated/libxml.php",
|
||||
"generated/lzf.php",
|
||||
"generated/mailparse.php",
|
||||
"generated/mbstring.php",
|
||||
"generated/misc.php",
|
||||
"generated/msql.php",
|
||||
"generated/mysql.php",
|
||||
"generated/mysqli.php",
|
||||
"generated/mysqlndMs.php",
|
||||
"generated/mysqlndQc.php",
|
||||
"generated/network.php",
|
||||
"generated/oci8.php",
|
||||
"generated/opcache.php",
|
||||
"generated/openssl.php",
|
||||
"generated/outcontrol.php",
|
||||
"generated/password.php",
|
||||
"generated/pcntl.php",
|
||||
"generated/pcre.php",
|
||||
"generated/pdf.php",
|
||||
"generated/pgsql.php",
|
||||
"generated/posix.php",
|
||||
"generated/ps.php",
|
||||
"generated/pspell.php",
|
||||
"generated/readline.php",
|
||||
"generated/rpminfo.php",
|
||||
"generated/rrd.php",
|
||||
"generated/sem.php",
|
||||
"generated/session.php",
|
||||
"generated/shmop.php",
|
||||
"generated/simplexml.php",
|
||||
"generated/sockets.php",
|
||||
"generated/sodium.php",
|
||||
"generated/solr.php",
|
||||
"generated/spl.php",
|
||||
"generated/sqlsrv.php",
|
||||
"generated/ssdeep.php",
|
||||
"generated/ssh2.php",
|
||||
"generated/stream.php",
|
||||
"generated/strings.php",
|
||||
"generated/swoole.php",
|
||||
"generated/uodbc.php",
|
||||
"generated/uopz.php",
|
||||
"generated/url.php",
|
||||
"generated/var.php",
|
||||
"generated/xdiff.php",
|
||||
"generated/xml.php",
|
||||
"generated/xmlrpc.php",
|
||||
"generated/yaml.php",
|
||||
"generated/yaz.php",
|
||||
"generated/zip.php",
|
||||
"generated/zlib.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"description": "PHP core functions that throw exceptions instead of returning FALSE on error",
|
||||
"support": {
|
||||
"issues": "https://github.com/thecodingmachine/safe/issues",
|
||||
"source": "https://github.com/thecodingmachine/safe/tree/v1.3.3"
|
||||
},
|
||||
"time": "2020-10-28T17:51:34+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "phpstan/phpstan",
|
||||
"version": "0.12.99",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpstan/phpstan.git",
|
||||
"reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/b4d40f1d759942f523be267a1bab6884f46ca3f7",
|
||||
"reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1|^8.0"
|
||||
},
|
||||
"conflict": {
|
||||
"phpstan/phpstan-shim": "*"
|
||||
},
|
||||
"bin": [
|
||||
"phpstan",
|
||||
"phpstan.phar"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "0.12-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"description": "PHPStan - PHP Static Analysis Tool",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpstan/phpstan/issues",
|
||||
"source": "https://github.com/phpstan/phpstan/tree/0.12.99"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/ondrejmirtes",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/phpstan",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://www.patreon.com/phpstan",
|
||||
"type": "patreon"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-09-12T20:09:55+00:00"
|
||||
}
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": [],
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.0.0"
|
||||
}
|
After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 4.0 KiB |
@ -0,0 +1,17 @@
|
||||
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
||||
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#257aa7">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g stroke-width="8" transform="matrix(0.83009609,0,0,0.83009609,4.0582705,4.0582705)">
|
||||
<circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
|
||||
<path d="M 36,18 C 36,8.06 27.94,0 18,0">
|
||||
<animateTransform
|
||||
attributeName="transform"
|
||||
type="rotate"
|
||||
from="0 18 18"
|
||||
to="360 18 18"
|
||||
dur="1s"
|
||||
repeatCount="indefinite"/>
|
||||
</path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 740 B |
@ -0,0 +1,33 @@
|
||||
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
||||
<svg width="120" height="30" viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="#257aa7">
|
||||
<circle cx="15" cy="15" r="15">
|
||||
<animate attributeName="r" from="15" to="15"
|
||||
begin="0s" dur="0.8s"
|
||||
values="15;9;15" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="fill-opacity" from="1" to="1"
|
||||
begin="0s" dur="0.8s"
|
||||
values="1;.5;1" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
<circle cx="60" cy="15" r="9" fill-opacity="0.3">
|
||||
<animate attributeName="r" from="9" to="9"
|
||||
begin="0s" dur="0.8s"
|
||||
values="9;15;9" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="fill-opacity" from="0.5" to="0.5"
|
||||
begin="0s" dur="0.8s"
|
||||
values=".5;1;.5" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
<circle cx="105" cy="15" r="15">
|
||||
<animate attributeName="r" from="15" to="15"
|
||||
begin="0s" dur="0.8s"
|
||||
values="15;9;15" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="fill-opacity" from="1" to="1"
|
||||
begin="0s" dur="0.8s"
|
||||
values="1;.5;1" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
@ -1,24 +1,17 @@
|
||||
<?php
|
||||
spl_autoload_register(function($class) {
|
||||
$namespace = '';
|
||||
$class_name = $class;
|
||||
|
||||
if (strpos($class, '\\') !== false)
|
||||
list ($namespace, $class_name) = explode('\\', $class, 2);
|
||||
$root_dir = dirname(__DIR__); // we were in tt-rss/include
|
||||
|
||||
$root_dir = dirname(__DIR__); // we're in tt-rss/include
|
||||
// - internal tt-rss classes are loaded from classes/ and use special naming logic instead of namespaces
|
||||
// - plugin classes are loaded by PluginHandler from plugins.local/ and plugins/
|
||||
|
||||
// 1. third party libraries with namespaces are loaded from vendor/
|
||||
// 2. internal tt-rss classes are loaded from classes/ and use special naming logic instead of namespaces
|
||||
// 3. plugin classes are loaded by PluginHandler from plugins.local/ and plugins/ (TODO: use generic autoloader?)
|
||||
|
||||
if ($namespace && $class_name) {
|
||||
$class_file = "$root_dir/vendor/$namespace/" . str_replace('\\', '/', $class_name) . ".php";
|
||||
} else {
|
||||
$class_file = "$root_dir/classes/" . str_replace("_", "/", strtolower($class)) . ".php";
|
||||
}
|
||||
|
||||
if (file_exists($class_file))
|
||||
include $class_file;
|
||||
|
||||
});
|
||||
|
||||
// also pull composer autoloader
|
||||
require_once "vendor/autoload.php";
|
||||
|
@ -1,215 +0,0 @@
|
||||
<?php
|
||||
/* WARNING! If you modify this file, you are ON YOUR OWN! */
|
||||
|
||||
function make_self_url() {
|
||||
$proto = is_server_https() ? 'https' : 'http';
|
||||
|
||||
return $proto . '://' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
|
||||
}
|
||||
|
||||
function make_self_url_path() {
|
||||
if (!isset($_SERVER["HTTP_HOST"])) return false;
|
||||
|
||||
$proto = is_server_https() ? 'https' : 'http';
|
||||
$url_path = $proto . '://' . $_SERVER["HTTP_HOST"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
|
||||
|
||||
return $url_path;
|
||||
}
|
||||
|
||||
function check_mysql_tables() {
|
||||
$pdo = Db::pdo();
|
||||
|
||||
$sth = $pdo->prepare("SELECT engine, table_name FROM information_schema.tables WHERE
|
||||
table_schema = ? AND table_name LIKE 'ttrss_%' AND engine != 'InnoDB'");
|
||||
$sth->execute([Config::get(Config::DB_NAME)]);
|
||||
|
||||
$bad_tables = [];
|
||||
|
||||
while ($line = $sth->fetch()) {
|
||||
array_push($bad_tables, $line);
|
||||
}
|
||||
|
||||
return $bad_tables;
|
||||
}
|
||||
|
||||
function initial_sanity_check() {
|
||||
|
||||
$errors = array();
|
||||
|
||||
if (!file_exists("config.php")) {
|
||||
array_push($errors, "Configuration file not found. Looks like you forgot to copy config.php-dist to config.php and edit it.");
|
||||
} else {
|
||||
|
||||
if (!file_exists("config.php")) {
|
||||
array_push($errors, "Please copy config.php-dist to config.php");
|
||||
}
|
||||
|
||||
if (strpos(Config::get(Config::PLUGINS), "auth_") === false) {
|
||||
array_push($errors, "Please enable at least one authentication module via Config::get(Config::PLUGINS) constant in config.php");
|
||||
}
|
||||
|
||||
if (function_exists('posix_getuid') && posix_getuid() == 0) {
|
||||
array_push($errors, "Please don't run this script as root.");
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '7.0.0', '<')) {
|
||||
array_push($errors, "PHP version 7.0.0 or newer required. You're using " . PHP_VERSION . ".");
|
||||
}
|
||||
|
||||
if (!class_exists("UConverter")) {
|
||||
array_push($errors, "PHP UConverter class is missing, it's provided by the Internationalization (intl) module.");
|
||||
}
|
||||
|
||||
if (!is_writable(Config::get(Config::CACHE_DIR) . "/images")) {
|
||||
array_push($errors, "Image cache is not writable (chmod -R 777 ".Config::get(Config::CACHE_DIR)."/images)");
|
||||
}
|
||||
|
||||
if (!is_writable(Config::get(Config::CACHE_DIR) . "/upload")) {
|
||||
array_push($errors, "Upload cache is not writable (chmod -R 777 ".Config::get(Config::CACHE_DIR)."/upload)");
|
||||
}
|
||||
|
||||
if (!is_writable(Config::get(Config::CACHE_DIR) . "/export")) {
|
||||
array_push($errors, "Data export cache is not writable (chmod -R 777 ".Config::get(Config::CACHE_DIR)."/export)");
|
||||
}
|
||||
|
||||
if (Config::get(Config::SINGLE_USER_MODE) && class_exists("PDO")) {
|
||||
$pdo = Db::pdo();
|
||||
|
||||
$res = $pdo->query("SELECT id FROM ttrss_users WHERE id = 1");
|
||||
|
||||
if (!$res->fetch()) {
|
||||
array_push($errors, "Config::get(Config::SINGLE_USER_MODE) is enabled in config.php but default admin account is not found.");
|
||||
}
|
||||
}
|
||||
|
||||
if (php_sapi_name() != "cli") {
|
||||
$ref_self_url_path = make_self_url_path();
|
||||
|
||||
if ($ref_self_url_path) {
|
||||
$ref_self_url_path = preg_replace("/\w+\.php$/", "", $ref_self_url_path);
|
||||
}
|
||||
|
||||
if (Config::get(Config::SELF_URL_PATH) == "http://example.org/tt-rss/") {
|
||||
$hint = $ref_self_url_path ? "(possible value: <b>$ref_self_url_path</b>)" : "";
|
||||
array_push($errors,
|
||||
"Please set Config::get(Config::SELF_URL_PATH) to the correct value for your server: $hint");
|
||||
}
|
||||
|
||||
if ($ref_self_url_path &&
|
||||
(!defined('_SKIP_SELF_URL_PATH_CHECKS') || !_SKIP_SELF_URL_PATH_CHECKS) &&
|
||||
Config::get(Config::SELF_URL_PATH) != $ref_self_url_path && Config::get(Config::SELF_URL_PATH) != mb_substr($ref_self_url_path, 0, mb_strlen($ref_self_url_path)-1)) {
|
||||
array_push($errors,
|
||||
"Please set Config::get(Config::SELF_URL_PATH) to the correct value detected for your server: <b>$ref_self_url_path</b> (you're using: <b>" . Config::get(Config::SELF_URL_PATH) . "</b>)");
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_writable(Config::get(Config::ICONS_DIR))) {
|
||||
array_push($errors, "ICONS_DIR defined in config.php is not writable (chmod -R 777 ".Config::get(Config::ICONS_DIR).").\n");
|
||||
}
|
||||
|
||||
if (!is_writable(Config::get(Config::LOCK_DIRECTORY))) {
|
||||
array_push($errors, "Config::get(Config::LOCK_DIRECTORY) defined in config.php is not writable (chmod -R 777 ".Config::get(Config::LOCK_DIRECTORY).").\n");
|
||||
}
|
||||
|
||||
if (!function_exists("curl_init") && !ini_get("allow_url_fopen")) {
|
||||
array_push($errors, "PHP configuration option allow_url_fopen is disabled, and CURL functions are not present. Either enable allow_url_fopen or install PHP extension for CURL.");
|
||||
}
|
||||
|
||||
if (!function_exists("json_encode")) {
|
||||
array_push($errors, "PHP support for JSON is required, but was not found.");
|
||||
}
|
||||
|
||||
if (!class_exists("PDO")) {
|
||||
array_push($errors, "PHP support for PDO is required but was not found.");
|
||||
}
|
||||
|
||||
if (!function_exists("mb_strlen")) {
|
||||
array_push($errors, "PHP support for mbstring functions is required but was not found.");
|
||||
}
|
||||
|
||||
if (!function_exists("hash")) {
|
||||
array_push($errors, "PHP support for hash() function is required but was not found.");
|
||||
}
|
||||
|
||||
if (ini_get("safe_mode")) {
|
||||
array_push($errors, "PHP safe mode setting is obsolete and not supported by tt-rss.");
|
||||
}
|
||||
|
||||
if (!function_exists("mime_content_type")) {
|
||||
array_push($errors, "PHP function mime_content_type() is missing, try enabling fileinfo module.");
|
||||
}
|
||||
|
||||
if (!class_exists("DOMDocument")) {
|
||||
array_push($errors, "PHP support for DOMDocument is required, but was not found.");
|
||||
}
|
||||
|
||||
if (Config::get(Config::DB_TYPE) == "mysql") {
|
||||
$bad_tables = check_mysql_tables();
|
||||
|
||||
if (count($bad_tables) > 0) {
|
||||
$bad_tables_fmt = [];
|
||||
|
||||
foreach ($bad_tables as $bt) {
|
||||
array_push($bad_tables_fmt, sprintf("%s (%s)", $bt['table_name'], $bt['engine']));
|
||||
}
|
||||
|
||||
$msg = "<p>The following tables use an unsupported MySQL engine: <b>" .
|
||||
implode(", ", $bad_tables_fmt) . "</b>.</p>";
|
||||
|
||||
$msg .= "<p>The only supported engine on MySQL is InnoDB. MyISAM lacks functionality to run
|
||||
tt-rss.
|
||||
Please backup your data (via OPML) and re-import the schema before continuing.</p>
|
||||
<p><b>WARNING: importing the schema would mean LOSS OF ALL YOUR DATA.</b></p>";
|
||||
|
||||
|
||||
array_push($errors, $msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count($errors) > 0 && php_sapi_name() != "cli") { ?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Startup failed</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link rel="stylesheet" type="text/css" href="themes/light.css">
|
||||
</head>
|
||||
<body class='sanity_failed claro ttrss_utility'>
|
||||
<div class="content">
|
||||
|
||||
<h1>Startup failed</h1>
|
||||
|
||||
<p>Tiny Tiny RSS was unable to start properly. This usually means a misconfiguration or an incomplete upgrade. Please fix
|
||||
errors indicated by the following messages:</p>
|
||||
|
||||
<?php foreach ($errors as $error) { echo format_error($error); } ?>
|
||||
|
||||
<p>You might want to check tt-rss <a href="https://tt-rss.org/wiki.php">wiki</a> or the
|
||||
<a href="https://community.tt-rss.org/">forums</a> for more information. Please search the forums before creating new topic
|
||||
for your question.</p>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<?php
|
||||
die;
|
||||
} else if (count($errors) > 0) {
|
||||
echo "Tiny Tiny RSS was unable to start properly. This usually means a misconfiguration or an incomplete upgrade.\n";
|
||||
echo "Please fix errors indicated by the following messages:\n\n";
|
||||
|
||||
foreach ($errors as $error) {
|
||||
echo " * " . strip_tags($error)."\n";
|
||||
}
|
||||
|
||||
echo "\nYou might want to check tt-rss wiki or the forums for more information.\n";
|
||||
echo "Please search the forums before creating new topic for your question.\n";
|
||||
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
initial_sanity_check();
|
||||
|
||||
?>
|
@ -1,9 +0,0 @@
|
||||
The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts:
|
||||
|
||||
```html
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
|
||||
rel="stylesheet">
|
||||
```
|
||||
|
||||
Read more in our full usage guide:
|
||||
http://google.github.io/material-design-icons/#icon-font-for-the-web
|
@ -1,36 +0,0 @@
|
||||
@font-face {
|
||||
font-family: 'Material Icons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(MaterialIcons-Regular.eot); /* For IE6-8 */
|
||||
src: local('Material Icons'),
|
||||
local('MaterialIcons-Regular'),
|
||||
url(MaterialIcons-Regular.woff2) format('woff2'),
|
||||
url(MaterialIcons-Regular.woff) format('woff'),
|
||||
url(MaterialIcons-Regular.ttf) format('truetype');
|
||||
}
|
||||
|
||||
.material-icons {
|
||||
font-family: 'Material Icons';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-size: 24px; /* Preferred icon size */
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
text-transform: none;
|
||||
letter-spacing: normal;
|
||||
word-wrap: normal;
|
||||
white-space: nowrap;
|
||||
direction: ltr;
|
||||
|
||||
/* Support for all WebKit browsers. */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
/* Support for Safari and Chrome. */
|
||||
text-rendering: optimizeLegibility;
|
||||
|
||||
/* Support for Firefox. */
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Support for IE. */
|
||||
font-feature-settings: 'liga';
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
* 1.0.0 build 2010031920
|
||||
|
||||
- first public release
|
||||
- help in readme, install
|
||||
- cleanup ans separation of QRtools and QRspec
|
||||
- now TCPDF binding requires minimal changes in TCPDF, having most of job
|
||||
done in QRtools tcpdfBarcodeArray
|
||||
- nicer QRtools::timeBenchmark output
|
||||
- license and copyright notices in files
|
||||
- indent cleanup - from tab to 4spc, keep it that way please :)
|
||||
- sf project, repository, wiki
|
||||
- simple code generator in index.php
|
||||
|
||||
* 1.1.0 build 2010032113
|
||||
|
||||
- added merge tool wich generate merged version of code
|
||||
located in phpqrcode.php
|
||||
- splited qrconst.php from qrlib.php
|
||||
|
||||
* 1.1.1 build 2010032405
|
||||
|
||||
- patch by Rick Seymour allowing saving PNG and displaying it at the same time
|
||||
- added version info in VERSION file
|
||||
- modified merge tool to include version info into generated file
|
||||
- fixed e-mail in almost all head comments
|
||||
|
||||
* 1.1.2 build 2010032722
|
||||
|
||||
- full integration with TCPDF thanks to Nicola Asuni, it's author
|
||||
- fixed bug with alphanumeric encoding detection
|
||||
|
||||
* 1.1.3 build 2010081807
|
||||
|
||||
- short opening tags replaced with standard ones
|
||||
|
||||
* 1.1.4 build 2010100721
|
||||
|
||||
- added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC)
|
@ -1,67 +0,0 @@
|
||||
== REQUIREMENTS ==
|
||||
|
||||
* PHP5
|
||||
* PHP GD2 extension with JPEG and PNG support
|
||||
|
||||
== INSTALLATION ==
|
||||
|
||||
If you want to recreate cache by yourself make sure cache directory is
|
||||
writable and you have permisions to write into it. Also make sure you are
|
||||
able to read files in it if you have cache option enabled
|
||||
|
||||
== CONFIGURATION ==
|
||||
|
||||
Feel free to modify config constants in qrconfig.php file. Read about it in
|
||||
provided comments and project wiki page (links in README file)
|
||||
|
||||
== QUICK START ==
|
||||
|
||||
Notice: probably you should'nt use all of this in same script :)
|
||||
|
||||
<?phpb
|
||||
|
||||
//include only that one, rest required files will be included from it
|
||||
include "qrlib.php"
|
||||
|
||||
//write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H)
|
||||
//each code square will be 4x4 pixels (4x zoom)
|
||||
//code will have 2 code squares white boundary around
|
||||
|
||||
QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2);
|
||||
|
||||
//same as above but outputs file directly into browser (with appr. header etc.)
|
||||
//all other settings are default
|
||||
//WARNING! it should be FIRST and ONLY output generated by script, otherwise
|
||||
//rest of output will land inside PNG binary, breaking it for sure
|
||||
QRcode::png('PHP QR Code :)');
|
||||
|
||||
//show benchmark
|
||||
QRtools::timeBenchmark();
|
||||
|
||||
//rebuild cache
|
||||
QRtools::buildCache();
|
||||
|
||||
//code generated in text mode - as a binary table
|
||||
//then displayed out as HTML using Unicode block building chars :)
|
||||
$tab = $qr->encode('PHP QR Code :)');
|
||||
QRspec::debug($tab, true);
|
||||
|
||||
== TCPDF INTEGRATION ==
|
||||
|
||||
Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.
|
||||
Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)
|
||||
2dbarcodes.php
|
||||
|
||||
Then use similar as example #50 from TCPDF examples:
|
||||
|
||||
<?php
|
||||
|
||||
$style = array(
|
||||
'border' => true,
|
||||
'padding' => 4,
|
||||
'fgcolor' => array(0,0,0),
|
||||
'bgcolor' => false, //array(255,255,255)
|
||||
);
|
||||
|
||||
//code name: QR, specify error correction level after semicolon (L,M,Q,H)
|
||||
$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N');
|
@ -1,165 +0,0 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
@ -1,45 +0,0 @@
|
||||
This is PHP implementation of QR Code 2-D barcode generator. It is pure-php
|
||||
LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.
|
||||
|
||||
== LICENSING ==
|
||||
|
||||
Copyright (C) 2010 by Dominik Dzienia
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file)
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this library; if not, write to the Free Software Foundation, Inc., 51
|
||||
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
== INSTALATION AND USAGE ==
|
||||
|
||||
* INSTALL file
|
||||
* http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page
|
||||
|
||||
== CONTACT ==
|
||||
|
||||
Fell free to contact me via e-mail (deltalab at poczta dot fm) or using
|
||||
folowing project pages:
|
||||
|
||||
* http://sourceforge.net/projects/phpqrcode/
|
||||
* http://phpqrcode.sourceforge.net/
|
||||
|
||||
== ACKNOWLEDGMENTS ==
|
||||
|
||||
Based on C libqrencode library (ver. 3.1.1)
|
||||
Copyright (C) 2006-2010 by Kentaro Fukuchi
|
||||
http://megaui.net/fukuchi/works/qrencode/index.en.html
|
||||
|
||||
QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other
|
||||
countries.
|
||||
|
||||
Reed-Solomon code encoder is written by Phil Karn, KA9Q.
|
||||
Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
|
||||
|
@ -1,2 +0,0 @@
|
||||
1.1.4
|
||||
2010100721
|
Before Width: | Height: | Size: 126 B |
Before Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 205 B |
Before Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 210 B |