Kiitoksia MLInvoicesta, ohjelma on aikaisemmin pelannut vuosia hyvin. (1.17 ollut käytössä)
Nyt tuli kuitenkin ongelmia kun päivitin Linux distroni ja PHP vaihtui siinä 5.6:sta 8.02:ksi.
Osan ongelmista olen saanut rarkottua ja osa on vielä ratkomatta, erityisesti _SESSION objektien avulla tapahtuvan sessionin hallinnan kanssa tuntuisi olevan ongelmia.
Tässä stepit mitä olen tehnyt.
1) Päivitys viimeisimpään git versioon
- purin ensin 1.21.2 version zipin 1.17 version päälle
- ajoin sen jälkeen pätchin 1.21.2:n ja masterissa olevan koodin diffien välillä
- varmistin että tiedostojen käyttöoikeudet pysyivät edelleen samoina
- Jos ymmärsin oikein niin mysql tietokannalle ei tarvise itse ajaa mitään migrointi scriptiä siirryttäessä 1.17:sta uudempiin versioihin?
(backupit tietokannasta ovat kunnossa)
2) Virhe-ilmoitukset logissa curly characterien käytöstä Stringin käsittelyssä. Tämän uskoakseni korjasin seuraavalla tavalla.
- vendor/michelf/php-markdown komponentti jossa käytettiin joissain kohdissa PHP:ssa Stringin käsittelyssä poistettuja { ja } merkkejä.
- korjasin tämän kopioimalla php-markdownin tiedostojen päälle oman distroni php-markdown version 1.9.0:n mukana tulevat uudemmat versiot hakemistosta /usr/share/php/Michelf/ jossa tuo oli googlauksen perusteella korjattu
3) Virhe PHP:n uudemmista versioista poistetusta get_magic_quotes_gpc() funkkarista
- tätä olen yrittänyt korjailla alla olevalla diffillä mutta ihan en ole varma mikä tuo slashien lisäys/poisto logiikka on koska en ole vielä
ehtinyt debugata miten tuota käytetään
--- miscfuncs.php 2019-08-31 15:09:39.000000000 +0300
+++ fixed_mlinvoice/miscfuncs.php 2021-03-08 23:45:19.346966916 +0200
@@ -36,10 +36,7 @@
*/
function gpcAddSlashes($strString)
{
- if (!get_magic_quotes_gpc()) {
- return addslashes($strString);
- }
- return $strString;
+ return addslashes($strString);
}
/**
@@ -51,9 +48,6 @@
*/
function gpcStripSlashes($strString)
{
- if (get_magic_quotes_gpc() && is_string($strString)) {
- return stripslashes($strString);
- }
return $strString;
}
4) PHP:n _SESSION objektin kanssa on edelleen jotain häikkää enkä ole saanut sisään loggausta login.php:sta index.php:hen toimimaan
- Ensimmäinen oma ongelma oli se että logissa näkyi virheitä siitä että sessionfuncs.php:n session_set_save_handler ja session_name funktioita kutsutaan liian myöhään sessionin jo alettua. Yritin korjailla tätä tekemällä funktion
function sesInitSession()
{
error_log("sesInitSession started");
session_set_save_handler(
'dbSessionOpen', 'dbSessionClose', 'dbSessionRead',
'dbSessionWrite', 'dbSessionDestroy', 'dbSessionGc'
);
session_name(_SESSION_NAME_);
if (_SESSION_RESTRICT_PATH_) {
session_set_cookie_params(0, getSelfDirectory() . '/');
}
}
ja kutsumalla sitä login.php:n ja index.php:n alussa ennen session_start kutsua.
Toinen ongelma on se että tuosta huolimatta csrf, REMOTE_ADDR eivät jostain syystä tunnu kunnolla säilyvän _SESSION objektissa. Joitain häkkäilyjä olen tehnyt yrittämällä kutsua noita sesInitSessioneita ja session_start kutsuja aina <php blokkien alussa mutta edelleen en saa loginin jälkeistä header(index.php) siirtymää toimimaan vaan kun index.php:ssa kutsutaan sesVerifySession funktiota niin SESSION['REMOTE_ADDR'] on asettamatta vaikka se on hieman aikaisemmin asetettu oikein login.php:ssa.
Itsellä on mlinvoice käytössä vain yksittäisessä ei internettiin kytketyssä koneessa joten SSL ei ole enabloituna. En tiedä voisiko SSL:n enablointi korjata tuon ongelman uudemmissa PHP versioissa?
En ole vielä ehtinyt testata ja fiksata PHP 8:lla, mutta kannattaa ehkä ottaa kokeiluihin pohjaksi GitHubista master-versio, jossa on päivitetty riippuvuudet, ja kaiken pitäisi toimia ainakin PHP 7.4:ään asti. Seuraavaan versioon on tarkoitus joka tapauksessa saada PHP 8 -tuki kuntoon.
Uusimmassa master-versiossa on lisää korjauksia. Toimii minulla nyt PHP 8:lla muuten, mutta pitää laittaa deprekaatio-varoitukset pois päältä, etteivät ne häiritse. Eli php.ini:ssä pitää olla esim.
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Eväste- ja sessio-ongelmat juontavat yleensä juurensa siihen, että skripti tulostaa jotain ennen kuin headerit lähtevät. Varmista siis, ettei näkyviin edes lähdekoodissa tule mitään ylimääräistä. On tullut vastaan myös tilanteita, joissa Chromium-pohjaiset selaimet Ubuntussa sekoavat jotenkin, ja vain buuttaus auttaa.