From 3b1999d3c84c6c1bce72aa1576277c96adfbefd2 Mon Sep 17 00:00:00 2001 From: Bicsoft Date: Sat, 13 Mar 2021 12:22:03 +0600 Subject: [PATCH] converted to pdo --- CHANGLOG.md | 0 LICENSE.md | 0 README.md | 0 TODO.md | 2 +- bin/freeswitch/application.lua | 0 bin/freeswitch/lib/LIP.lua | 0 bin/freeswitch/spool_failed.lua | 0 bin/sendmail/email_to_fax | 0 bin/sendmail/gateway.php | 0 cache/.gitignore | 0 cache/placeholder | 0 composer.json | 0 composer.lock | 333 +++++- core.zip | Bin 0 -> 220558 bytes core/Account.php | 10 +- core/Account/Did.php | 0 core/Account/Extension.php | 0 core/Account/eaddress.php | 0 core/Action.php | 4 +- core/Api.php | 1 + core/Api/Authenticate.php | 1 + core/Api/CampaignApi.php | 0 core/Api/CoreApi.php | 0 core/Api/GroupApi.php | 0 core/Application.php | 8 +- core/Application/Amd.php | 0 core/Application/Callerid_set.php | 0 core/Application/Connect.php | 0 core/Application/Disconnect.php | 0 core/Application/Dnc.php | 0 core/Application/Email_receive.php | 0 core/Application/Email_send.php | 0 core/Application/Fax_receive.php | 0 core/Application/Fax_send.php | 0 core/Application/Inbound.php | 0 core/Application/Input.php | 0 core/Application/Log.php | 0 core/Application/Originate.php | 0 core/Application/Play_menu.php | 0 core/Application/Record.php | 0 core/Application/Say_alpha.php | 0 core/Application/Say_digit.php | 0 core/Application/Say_number.php | 0 core/Application/Say_time.php | 0 core/Application/Sms_receive.php | 0 core/Application/Sms_send.php | 0 core/Application/Transfer.php | 0 core/Application/Voice_play.php | 0 core/Application/Wait.php | 0 core/Campaign.php | 4 +- core/Contact.php | 16 +- core/Core.php | 1 + core/Exchange/Dialplan.php | 4 +- core/Gateway.php | 0 .../templates/account/extension.twig | 0 .../Freeswitch/templates/application/amd.json | 0 .../templates/application/callerid_set.json | 0 .../templates/application/connect.json | 0 .../templates/application/disconnect.json | 0 .../Freeswitch/templates/application/dnc.json | 0 .../templates/application/fax_receive.json | 0 .../templates/application/fax_send.json | 0 .../templates/application/input.json | 0 .../Freeswitch/templates/application/log.json | 0 .../templates/application/originate/fax.json | 0 .../application/originate/voice.json | 0 .../templates/application/play_menu.json | 0 .../templates/application/record.json | 0 .../templates/application/say_alpha.json | 0 .../templates/application/say_date.json | 0 .../templates/application/say_digit.json | 0 .../templates/application/say_number.json | 0 .../templates/application/say_time.json | 0 .../templates/application/transfer.json | 0 .../Freeswitch/templates/application/tts.json | 0 .../templates/application/voice_play.json | 0 .../templates/application/wait.json | 0 .../Freeswitch/templates/provider.twig | 0 .../Freeswitch/templates/provider/sip.twig | 0 core/Gateway/Freeswitch/templates/user.twig | 0 core/Gateway/Kannel.php | 0 .../Kannel/templates/application/log.json | 0 .../templates/application/sms_receive.json | 0 .../templates/application/sms_send.json | 0 .../Kannel/templates/provider/http.twig | 0 .../templates/provider/http/default.twig | 0 .../Kannel/templates/provider/http/ufone.twig | 0 .../Kannel/templates/provider/smpp.twig | 0 core/Gateway/Sendmail.php | 0 .../templates/application/email_receive.json | 0 .../templates/application/email_send.json | 0 .../Sendmail/templates/application/log.json | 0 core/Group.php | 4 +- core/Message.php | 0 core/Message/Document.php | 4 +- core/Message/Recording.php | 10 +- core/Message/Template.php | 4 +- core/Message/Text.php | 4 +- core/Program.php | 12 +- core/Program/Agent.php | 0 core/Program/Emailtofax.php | 0 .../Emailtofax/data/email_accepted.tpl.php | 0 .../Emailtofax/data/email_error.tpl.php | 0 .../Program/Emailtofax/data/fax_error.tpl.php | 0 .../Emailtofax/data/fax_success.tpl.php | 0 core/Program/Faxtoemail.php | 0 .../Faxtoemail/data/fax_received.tpl.php | 0 core/Program/Forward.php | 0 core/Program/Ivr.php | 1 - core/Program/Receiveemail.php | 0 core/Program/Receivefax.php | 0 core/Program/Receivesms.php | 0 core/Program/Sendemail.php | 0 core/Program/Sendfax.php | 0 core/Program/Sendsms.php | 0 core/Program/Voicemessage.php | 0 core/Program/Voicetts.php | 0 core/Provider.php | 8 +- core/Provider/Emailcmd.php | 0 core/Provider/Http.php | 0 core/Provider/Sip.php | 0 core/Provider/Smpp.php | 0 core/Provider/Smtp.php | 0 core/Request.php | 0 core/Response.php | 0 core/Result.php | 4 +- core/Schedule.php | 2 +- core/Service.php | 0 core/Service/Email.php | 0 core/Service/Fax.php | 0 core/Service/Sms.php | 0 core/Service/Voice.php | 0 core/Spool.php | 4 +- core/Task.php | 6 +- core/Test.php | 55 + core/Transmission.php | 4 +- core/User.php | 952 +++++++++--------- core/User/Permission.php | 5 +- core/User/Role.php | 7 +- core/lib/Conf.php | 21 +- core/lib/Conf/File.php | 1 + core/lib/Conf/System.php | 0 core/lib/Conf/User.php | 0 core/lib/Config.php | 34 +- core/lib/CoreException.php | 0 core/lib/CoreThread.php | 0 core/lib/Corelog.php | 0 core/lib/DB.php | 763 ++++++++------ core/lib/Data.php | 0 core/lib/Http.php | 0 core/lib/Scheme.php | 0 core/lib/Scheme/Node.php | 0 core/lib/Session.php | 23 +- core/lib/Thread/Process.php | 0 core/lib/Thread/Send.php | 0 core/lib/Thread/Task.php | 0 core/lib/Token.php | 0 core/lib/common.php | 4 +- core/lib/init.php | 2 +- data/document/.gitignore | 0 data/recording/.gitignore | 0 data/template/.gitignore | 0 db/data/role_admin.sql | 3 - db/database.sql | 8 +- db/email.sql | 4 +- db/fax.sql | 4 +- db/ictfax.sql | 4 - db/sms.sql | 4 +- db/update/update_0.7.0-to-0.7.1.sql | 0 db/update/update_0.7.1-to-0.8.0.sql | 0 db/update/update_0.8.0-to-0.8.x.sql | 0 db/voice.sql | 5 +- docs/ApiGuide.md | 0 docs/api.md | 0 docs/developer-guide/common.md | 0 docs/developer-guide/introduction.md | 0 docs/features.md | 0 docs/intro_components.md | 0 etc/freeswitch/.gitignore | 0 etc/freeswitch/dialplan/provider/.gitkeep | 0 etc/freeswitch/dialplan/user/.gitkeep | 0 etc/freeswitch/directory/account/.gitkeep | 0 etc/freeswitch/sip_profiles/provider/.gitkeep | 0 etc/http/ictcore.conf | 0 etc/ictcore.conf | 4 +- etc/kannel/.gitignore | 0 etc/kannel/provider/.gitkeep | 0 etc/postscript/rotate.ps | Bin log/.gitignore | 0 tests/bootstrap.php | 0 tests/client.php | 0 tests/configuration.xml | 0 tests/core/ContactTest.php | 0 tests/core/lib/DataTest.php | 0 tests/core/lib/SessionTest.php | 0 tests/core/lib/TokenTest.php | 0 tests/get.php | 0 wwwroot/gateway.php | 0 198 files changed, 1389 insertions(+), 965 deletions(-) mode change 100644 => 100755 CHANGLOG.md mode change 100644 => 100755 LICENSE.md mode change 100644 => 100755 README.md mode change 100644 => 100755 TODO.md mode change 100644 => 100755 bin/freeswitch/application.lua mode change 100644 => 100755 bin/freeswitch/lib/LIP.lua mode change 100644 => 100755 bin/freeswitch/spool_failed.lua mode change 100644 => 100755 bin/sendmail/email_to_fax mode change 100644 => 100755 bin/sendmail/gateway.php mode change 100644 => 100755 cache/.gitignore mode change 100644 => 100755 cache/placeholder mode change 100644 => 100755 composer.json mode change 100644 => 100755 composer.lock create mode 100644 core.zip mode change 100644 => 100755 core/Account.php mode change 100644 => 100755 core/Account/Did.php mode change 100644 => 100755 core/Account/Extension.php mode change 100644 => 100755 core/Account/eaddress.php mode change 100644 => 100755 core/Action.php mode change 100644 => 100755 core/Api/Authenticate.php mode change 100644 => 100755 core/Api/CampaignApi.php mode change 100644 => 100755 core/Api/CoreApi.php mode change 100644 => 100755 core/Api/GroupApi.php mode change 100644 => 100755 core/Application.php mode change 100644 => 100755 core/Application/Amd.php mode change 100644 => 100755 core/Application/Callerid_set.php mode change 100644 => 100755 core/Application/Connect.php mode change 100644 => 100755 core/Application/Disconnect.php mode change 100644 => 100755 core/Application/Dnc.php mode change 100644 => 100755 core/Application/Email_receive.php mode change 100644 => 100755 core/Application/Email_send.php mode change 100644 => 100755 core/Application/Fax_receive.php mode change 100644 => 100755 core/Application/Fax_send.php mode change 100644 => 100755 core/Application/Inbound.php mode change 100644 => 100755 core/Application/Input.php mode change 100644 => 100755 core/Application/Log.php mode change 100644 => 100755 core/Application/Originate.php mode change 100644 => 100755 core/Application/Play_menu.php mode change 100644 => 100755 core/Application/Record.php mode change 100644 => 100755 core/Application/Say_alpha.php mode change 100644 => 100755 core/Application/Say_digit.php mode change 100644 => 100755 core/Application/Say_number.php mode change 100644 => 100755 core/Application/Say_time.php mode change 100644 => 100755 core/Application/Sms_receive.php mode change 100644 => 100755 core/Application/Sms_send.php mode change 100644 => 100755 core/Application/Transfer.php mode change 100644 => 100755 core/Application/Voice_play.php mode change 100644 => 100755 core/Application/Wait.php mode change 100644 => 100755 core/Campaign.php mode change 100644 => 100755 core/Contact.php mode change 100644 => 100755 core/Core.php mode change 100644 => 100755 core/Exchange/Dialplan.php mode change 100644 => 100755 core/Gateway.php mode change 100644 => 100755 core/Gateway/Freeswitch/templates/account/extension.twig mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/amd.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/callerid_set.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/connect.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/disconnect.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/dnc.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/fax_receive.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/fax_send.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/input.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/log.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/originate/fax.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/originate/voice.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/play_menu.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/record.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/say_alpha.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/say_date.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/say_digit.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/say_number.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/say_time.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/transfer.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/tts.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/voice_play.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/application/wait.json mode change 100644 => 100755 core/Gateway/Freeswitch/templates/provider.twig mode change 100644 => 100755 core/Gateway/Freeswitch/templates/provider/sip.twig mode change 100644 => 100755 core/Gateway/Freeswitch/templates/user.twig mode change 100644 => 100755 core/Gateway/Kannel.php mode change 100644 => 100755 core/Gateway/Kannel/templates/application/log.json mode change 100644 => 100755 core/Gateway/Kannel/templates/application/sms_receive.json mode change 100644 => 100755 core/Gateway/Kannel/templates/application/sms_send.json mode change 100644 => 100755 core/Gateway/Kannel/templates/provider/http.twig mode change 100644 => 100755 core/Gateway/Kannel/templates/provider/http/default.twig mode change 100644 => 100755 core/Gateway/Kannel/templates/provider/http/ufone.twig mode change 100644 => 100755 core/Gateway/Kannel/templates/provider/smpp.twig mode change 100644 => 100755 core/Gateway/Sendmail.php mode change 100644 => 100755 core/Gateway/Sendmail/templates/application/email_receive.json mode change 100644 => 100755 core/Gateway/Sendmail/templates/application/email_send.json mode change 100644 => 100755 core/Gateway/Sendmail/templates/application/log.json mode change 100644 => 100755 core/Group.php mode change 100644 => 100755 core/Message.php mode change 100644 => 100755 core/Message/Document.php mode change 100644 => 100755 core/Message/Recording.php mode change 100644 => 100755 core/Message/Template.php mode change 100644 => 100755 core/Message/Text.php mode change 100644 => 100755 core/Program/Agent.php mode change 100644 => 100755 core/Program/Emailtofax.php mode change 100644 => 100755 core/Program/Emailtofax/data/email_accepted.tpl.php mode change 100644 => 100755 core/Program/Emailtofax/data/email_error.tpl.php mode change 100644 => 100755 core/Program/Emailtofax/data/fax_error.tpl.php mode change 100644 => 100755 core/Program/Emailtofax/data/fax_success.tpl.php mode change 100644 => 100755 core/Program/Faxtoemail.php mode change 100644 => 100755 core/Program/Faxtoemail/data/fax_received.tpl.php mode change 100644 => 100755 core/Program/Forward.php mode change 100644 => 100755 core/Program/Ivr.php mode change 100644 => 100755 core/Program/Receiveemail.php mode change 100644 => 100755 core/Program/Receivefax.php mode change 100644 => 100755 core/Program/Receivesms.php mode change 100644 => 100755 core/Program/Sendemail.php mode change 100644 => 100755 core/Program/Sendfax.php mode change 100644 => 100755 core/Program/Sendsms.php mode change 100644 => 100755 core/Program/Voicemessage.php mode change 100644 => 100755 core/Program/Voicetts.php mode change 100644 => 100755 core/Provider.php mode change 100644 => 100755 core/Provider/Emailcmd.php mode change 100644 => 100755 core/Provider/Http.php mode change 100644 => 100755 core/Provider/Sip.php mode change 100644 => 100755 core/Provider/Smpp.php mode change 100644 => 100755 core/Provider/Smtp.php mode change 100644 => 100755 core/Request.php mode change 100644 => 100755 core/Response.php mode change 100644 => 100755 core/Result.php mode change 100644 => 100755 core/Schedule.php mode change 100644 => 100755 core/Service.php mode change 100644 => 100755 core/Service/Email.php mode change 100644 => 100755 core/Service/Fax.php mode change 100644 => 100755 core/Service/Sms.php mode change 100644 => 100755 core/Service/Voice.php mode change 100644 => 100755 core/Spool.php mode change 100644 => 100755 core/Task.php create mode 100644 core/Test.php mode change 100644 => 100755 core/Transmission.php mode change 100644 => 100755 core/User.php mode change 100644 => 100755 core/User/Permission.php mode change 100644 => 100755 core/User/Role.php mode change 100644 => 100755 core/lib/Conf.php mode change 100644 => 100755 core/lib/Conf/File.php mode change 100644 => 100755 core/lib/Conf/System.php mode change 100644 => 100755 core/lib/Conf/User.php mode change 100644 => 100755 core/lib/Config.php mode change 100644 => 100755 core/lib/CoreException.php mode change 100644 => 100755 core/lib/CoreThread.php mode change 100644 => 100755 core/lib/Corelog.php mode change 100644 => 100755 core/lib/Data.php mode change 100644 => 100755 core/lib/Http.php mode change 100644 => 100755 core/lib/Scheme.php mode change 100644 => 100755 core/lib/Scheme/Node.php mode change 100644 => 100755 core/lib/Session.php mode change 100644 => 100755 core/lib/Thread/Process.php mode change 100644 => 100755 core/lib/Thread/Send.php mode change 100644 => 100755 core/lib/Thread/Task.php mode change 100644 => 100755 core/lib/Token.php mode change 100644 => 100755 core/lib/common.php mode change 100644 => 100755 core/lib/init.php mode change 100644 => 100755 data/document/.gitignore mode change 100644 => 100755 data/recording/.gitignore mode change 100644 => 100755 data/template/.gitignore mode change 100644 => 100755 db/database.sql mode change 100644 => 100755 db/email.sql mode change 100644 => 100755 db/fax.sql mode change 100644 => 100755 db/ictfax.sql mode change 100644 => 100755 db/sms.sql mode change 100644 => 100755 db/update/update_0.7.0-to-0.7.1.sql mode change 100644 => 100755 db/update/update_0.7.1-to-0.8.0.sql mode change 100644 => 100755 db/update/update_0.8.0-to-0.8.x.sql mode change 100644 => 100755 db/voice.sql mode change 100644 => 100755 docs/ApiGuide.md mode change 100644 => 100755 docs/api.md mode change 100644 => 100755 docs/developer-guide/common.md mode change 100644 => 100755 docs/developer-guide/introduction.md mode change 100644 => 100755 docs/features.md mode change 100644 => 100755 docs/intro_components.md mode change 100644 => 100755 etc/freeswitch/.gitignore mode change 100644 => 100755 etc/freeswitch/dialplan/provider/.gitkeep mode change 100644 => 100755 etc/freeswitch/dialplan/user/.gitkeep mode change 100644 => 100755 etc/freeswitch/directory/account/.gitkeep mode change 100644 => 100755 etc/freeswitch/sip_profiles/provider/.gitkeep mode change 100644 => 100755 etc/http/ictcore.conf mode change 100644 => 100755 etc/kannel/.gitignore mode change 100644 => 100755 etc/kannel/provider/.gitkeep mode change 100644 => 100755 etc/postscript/rotate.ps mode change 100644 => 100755 log/.gitignore mode change 100644 => 100755 tests/bootstrap.php mode change 100644 => 100755 tests/client.php mode change 100644 => 100755 tests/configuration.xml mode change 100644 => 100755 tests/core/ContactTest.php mode change 100644 => 100755 tests/core/lib/DataTest.php mode change 100644 => 100755 tests/core/lib/SessionTest.php mode change 100644 => 100755 tests/core/lib/TokenTest.php mode change 100644 => 100755 tests/get.php mode change 100644 => 100755 wwwroot/gateway.php diff --git a/CHANGLOG.md b/CHANGLOG.md old mode 100644 new mode 100755 diff --git a/LICENSE.md b/LICENSE.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/TODO.md b/TODO.md old mode 100644 new mode 100755 index ca3be4b..2139fd4 --- a/TODO.md +++ b/TODO.md @@ -16,7 +16,7 @@ ICTCore TODOs * mysql_fetch_object * mysql_fetch_row * mysql_insert_id - * mysql_num_rows + * count * mysql_query * mysql_real_escape_string * mysql_result diff --git a/bin/freeswitch/application.lua b/bin/freeswitch/application.lua old mode 100644 new mode 100755 diff --git a/bin/freeswitch/lib/LIP.lua b/bin/freeswitch/lib/LIP.lua old mode 100644 new mode 100755 diff --git a/bin/freeswitch/spool_failed.lua b/bin/freeswitch/spool_failed.lua old mode 100644 new mode 100755 diff --git a/bin/sendmail/email_to_fax b/bin/sendmail/email_to_fax old mode 100644 new mode 100755 diff --git a/bin/sendmail/gateway.php b/bin/sendmail/gateway.php old mode 100644 new mode 100755 diff --git a/cache/.gitignore b/cache/.gitignore old mode 100644 new mode 100755 diff --git a/cache/placeholder b/cache/placeholder old mode 100644 new mode 100755 diff --git a/composer.json b/composer.json old mode 100644 new mode 100755 diff --git a/composer.lock b/composer.lock old mode 100644 new mode 100755 index e201206..e9d5c40 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_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", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "95e563eecf9988201704aa120c545ece", + "content-hash": "d11e2d0314cddbadc66fe78448c8df08", "packages": [ { "name": "aza/clibase", @@ -258,25 +258,93 @@ ], "time": "2013-05-28T13:05:37+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v0.8.6", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db91d81866c69a42dad1d2926f61515a1e3f42c5", + "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "phenx/php-font-lib": "^0.5.2", + "phenx/php-svg-lib": "^0.3.3", + "php": "^7.1" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.7-dev" + } + }, + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + }, + { + "name": "Brian Sweeney", + "email": "eclecticgeek@gmail.com" + }, + { + "name": "Gabriel Bull", + "email": "me@gabrielbull.com" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "time": "2020-08-30T22:54:22+00:00" + }, { "name": "firebase/php-jwt", - "version": "v5.0.0", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": " 4.8.35" + "phpunit/phpunit": ">=4.8 <=9" }, "type": "library", "autoload": { @@ -302,7 +370,11 @@ ], "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", "homepage": "https://github.com/firebase/php-jwt", - "time": "2017-06-27T22:17:23+00:00" + "keywords": [ + "jwt", + "php" + ], + "time": "2020-03-25T18:49:23+00:00" }, { "name": "firehed/processmanager", @@ -345,12 +417,12 @@ "source": { "type": "git", "url": "https://github.com/ictinnovations/RestServer.git", - "reference": "2b99afbd9702795fea78eeb0ce7797df6bd8b8bf" + "reference": "0a09d5b1537b205d40a42312561367889eb761a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ictinnovations/RestServer/zipball/2b99afbd9702795fea78eeb0ce7797df6bd8b8bf", - "reference": "2b99afbd9702795fea78eeb0ce7797df6bd8b8bf", + "url": "https://api.github.com/repos/ictinnovations/RestServer/zipball/0a09d5b1537b205d40a42312561367889eb761a4", + "reference": "0a09d5b1537b205d40a42312561367889eb761a4", "shasum": "" }, "require": { @@ -387,7 +459,7 @@ "support": { "source": "https://github.com/ictinnovations/RestServer/tree/master" }, - "time": "2017-12-23T13:24:13+00:00" + "time": "2020-05-18T12:02:54+00:00" }, { "name": "nategood/httpful", @@ -484,18 +556,95 @@ }, "time": "2018-08-31T10:55:57+00:00" }, + { + "name": "phenx/php-font-lib", + "version": "0.5.2", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-font-lib.git", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "time": "2020-03-08T15:31:32+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "v0.3.3", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-svg-lib.git", + "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", + "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", + "shasum": "" + }, + "require": { + "sabberworm/php-css-parser": "^8.3" + }, + "require-dev": { + "phpunit/phpunit": "^5.5|^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "time": "2019-09-11T20:02:13+00:00" + }, { "name": "psr/log", - "version": "1.0.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -504,7 +653,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -529,20 +678,65 @@ "psr", "psr-3" ], - "time": "2016-10-10T12:19:37+00:00" + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "8.3.1", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-0": { + "Sabberworm\\CSS": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "time": "2020-06-01T09:10:00+00:00" }, { "name": "swiftmailer/swiftmailer", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", "shasum": "" }, "require": { @@ -577,40 +771,102 @@ } ], "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", + "homepage": "https://swiftmailer.symfony.com", "keywords": [ "email", "mail", "mailer" ], - "time": "2017-05-01T15:54:03+00:00" + "time": "2018-07-31T09:26:32+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.22.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2021-01-07T16:49:33+00:00" }, { "name": "twig/twig", - "version": "v1.35.0", + "version": "v1.44.2", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f" + "reference": "138c493c5b8ee7cff3821f80b8896d371366b5fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/daa657073e55b0a78cce8fdd22682fddecc6385f", - "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/138c493c5b8ee7cff3821f80b8896d371366b5fe", + "reference": "138c493c5b8ee7cff3821f80b8896d371366b5fe", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "psr/container": "^1.0", - "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~3.3@dev" + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.35-dev" + "dev-master": "1.44-dev" } }, "autoload": { @@ -632,23 +888,22 @@ "homepage": "http://fabien.potencier.org", "role": "Lead Developer" }, + { + "name": "Twig Team", + "role": "Contributors" + }, { "name": "Armin Ronacher", "email": "armin.ronacher@active-4.com", "role": "Project Founder" - }, - { - "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", - "role": "Contributors" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", + "homepage": "https://twig.symfony.com", "keywords": [ "templating" ], - "time": "2017-09-27T18:06:46+00:00" + "time": "2021-01-05T10:10:05+00:00" } ], "packages-dev": [], diff --git a/core.zip b/core.zip new file mode 100644 index 0000000000000000000000000000000000000000..d5bfb8cad6b5a759be74850cbfa2dbb3e898fc51 GIT binary patch literal 220558 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 literal 0 HcmV?d00001 diff --git a/core/Account.php b/core/Account.php old mode 100644 new mode 100755 index 0de6178..bc41fb3 --- a/core/Account.php +++ b/core/Account.php @@ -128,7 +128,7 @@ public function __construct($account_id = NULL) $query = "SELECT account_id FROM " . self::$table . " WHERE active=1 AND created_by=%user_id% ORDER BY account_id DESC LIMIT 1"; $result = DB::query(self::$table, $query, array('user_id' => $oSession->user->user_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; $this->account_id = $data['account_id']; } $this->_load(); @@ -184,7 +184,7 @@ public static function search($aFilter = array()) $query = "SELECT account_id, type, username, first_name, last_name, phone, email, created_by FROM " . $from_str; Corelog::log("account search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('account', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aAccount[] = $data; } @@ -211,8 +211,8 @@ public static function getClass(&$account_id, $namespace = 'ICT\\Core\\Account') if (ctype_digit(trim($account_id))) { $query = "SELECT type FROM " . self::$table . " WHERE account_id='%account_id%' "; $result = DB::query(self::$table, $query, array('account_id' => $account_id)); - if (is_resource($result)) { - $account_type = mysql_result($result, 0); + if ($result) { + $account_type = $result[0]; } } else { $account_type = $account_id; @@ -249,7 +249,7 @@ protected function _load() Corelog::log("Loading account: $this->account_id", Corelog::CRUD); $query = "SELECT * FROM " . self::$table . " WHERE account_id='%account_id%' "; $result = DB::query(self::$table, $query, array('account_id' => $this->account_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->account_id = $data['account_id']; $this->type = $data['type']; diff --git a/core/Account/Did.php b/core/Account/Did.php old mode 100644 new mode 100755 diff --git a/core/Account/Extension.php b/core/Account/Extension.php old mode 100644 new mode 100755 diff --git a/core/Account/eaddress.php b/core/Account/eaddress.php old mode 100644 new mode 100755 diff --git a/core/Action.php b/core/Action.php old mode 100644 new mode 100755 index 969cca8..c1674c7 --- a/core/Action.php +++ b/core/Action.php @@ -83,7 +83,7 @@ public static function search($application_id) $aAction = array(); $query = "SELECT action_id FROM " . self::$table . " WHERE application_id='%application_id%' "; $result = DB::query(self::$table, $query, array('application_id' => $application_id)); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aAction[] = $data; } Corelog::log("Search actions for application: $application_id", Corelog::DEBUG, $aAction); @@ -95,7 +95,7 @@ protected function _load() Corelog::log("Loading action: $this->action_id", Corelog::DEBUG); $query = "SELECT * FROM " . self::$table . " WHERE action_id='%action_id%' "; $result = DB::query(self::$table, $query, array('action_id' => $this->action_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; $this->action_id = $data['action_id']; $this->type = $data['type']; $this->action = $data['action']; diff --git a/core/Api.php b/core/Api.php index 99e1951..44fffe4 100755 --- a/core/Api.php +++ b/core/Api.php @@ -59,6 +59,7 @@ protected function set($oEntity, $data) public function create_interface($interface_type = null, $root_path = null) { + global $path_cache; if (!empty($interface_type) && $interface_type = 'rest') { // Initialize the server diff --git a/core/Api/Authenticate.php b/core/Api/Authenticate.php old mode 100644 new mode 100755 index 2702679..7a20241 --- a/core/Api/Authenticate.php +++ b/core/Api/Authenticate.php @@ -24,6 +24,7 @@ class AuthenticateApi extends Api */ public function create($data = array()) { + $key_type = null; $credentials = null; diff --git a/core/Api/CampaignApi.php b/core/Api/CampaignApi.php old mode 100644 new mode 100755 diff --git a/core/Api/CoreApi.php b/core/Api/CoreApi.php old mode 100644 new mode 100755 diff --git a/core/Api/GroupApi.php b/core/Api/GroupApi.php old mode 100644 new mode 100755 diff --git a/core/Application.php b/core/Application.php old mode 100644 new mode 100755 index 9d8d660..e030569 --- a/core/Application.php +++ b/core/Application.php @@ -168,7 +168,7 @@ public static function search($program_id, $weight = NULL) } $query = "SELECT application_id FROM " . self::$table . " WHERE $where"; $result = DB::query(self::$table, $query, array('program_id' => $program_id, 'weight' => $weight)); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aApplication[] = $data; } Corelog::log("Application search for program: $program_id", Corelog::CRUD, $aApplication); @@ -191,8 +191,8 @@ public static function getClass(&$application_id, $namespace = 'ICT\\Core\\Appli if (ctype_digit(trim($application_id))) { $query = "SELECT type FROM " . self::$table . " WHERE application_id='%application_id%' "; $result = DB::query(self::$table, $query, array('application_id' => $application_id)); - if (is_resource($result)) { - $application_type = mysql_result($result, 0); + if ($result) { + $application_type = $result[0]; } } else { $application_type = $application_id; @@ -225,7 +225,7 @@ protected function _load() { $query = "SELECT * FROM " . self::$table . " WHERE application_id='%application_id%' "; $result = DB::query(self::$table, $query, array('application_id' => $this->application_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->application_id = $data['application_id']; $this->name = $data['name']; diff --git a/core/Application/Amd.php b/core/Application/Amd.php old mode 100644 new mode 100755 diff --git a/core/Application/Callerid_set.php b/core/Application/Callerid_set.php old mode 100644 new mode 100755 diff --git a/core/Application/Connect.php b/core/Application/Connect.php old mode 100644 new mode 100755 diff --git a/core/Application/Disconnect.php b/core/Application/Disconnect.php old mode 100644 new mode 100755 diff --git a/core/Application/Dnc.php b/core/Application/Dnc.php old mode 100644 new mode 100755 diff --git a/core/Application/Email_receive.php b/core/Application/Email_receive.php old mode 100644 new mode 100755 diff --git a/core/Application/Email_send.php b/core/Application/Email_send.php old mode 100644 new mode 100755 diff --git a/core/Application/Fax_receive.php b/core/Application/Fax_receive.php old mode 100644 new mode 100755 diff --git a/core/Application/Fax_send.php b/core/Application/Fax_send.php old mode 100644 new mode 100755 diff --git a/core/Application/Inbound.php b/core/Application/Inbound.php old mode 100644 new mode 100755 diff --git a/core/Application/Input.php b/core/Application/Input.php old mode 100644 new mode 100755 diff --git a/core/Application/Log.php b/core/Application/Log.php old mode 100644 new mode 100755 diff --git a/core/Application/Originate.php b/core/Application/Originate.php old mode 100644 new mode 100755 diff --git a/core/Application/Play_menu.php b/core/Application/Play_menu.php old mode 100644 new mode 100755 diff --git a/core/Application/Record.php b/core/Application/Record.php old mode 100644 new mode 100755 diff --git a/core/Application/Say_alpha.php b/core/Application/Say_alpha.php old mode 100644 new mode 100755 diff --git a/core/Application/Say_digit.php b/core/Application/Say_digit.php old mode 100644 new mode 100755 diff --git a/core/Application/Say_number.php b/core/Application/Say_number.php old mode 100644 new mode 100755 diff --git a/core/Application/Say_time.php b/core/Application/Say_time.php old mode 100644 new mode 100755 diff --git a/core/Application/Sms_receive.php b/core/Application/Sms_receive.php old mode 100644 new mode 100755 diff --git a/core/Application/Sms_send.php b/core/Application/Sms_send.php old mode 100644 new mode 100755 diff --git a/core/Application/Transfer.php b/core/Application/Transfer.php old mode 100644 new mode 100755 diff --git a/core/Application/Voice_play.php b/core/Application/Voice_play.php old mode 100644 new mode 100755 diff --git a/core/Application/Wait.php b/core/Application/Wait.php old mode 100644 new mode 100755 diff --git a/core/Campaign.php b/core/Campaign.php old mode 100644 new mode 100755 index da3beeb..0bfd36c --- a/core/Campaign.php +++ b/core/Campaign.php @@ -116,7 +116,7 @@ public static function search($aFilter = array()) $query = "SELECT c.*, p.type AS program_type FROM " . $from_str; Corelog::log("Campaign search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('Campaign', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aCampaign[] = $data; } @@ -127,7 +127,7 @@ private function load() { $query = "SELECT * FROM " . self::$table . " WHERE campaign_id='%campaign_id%' "; $result = DB::query(self::$table, $query, array('campaign_id' => $this->campaign_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->campaign_id = $data['campaign_id']; $this->program_id = $data['program_id']; diff --git a/core/Contact.php b/core/Contact.php old mode 100644 new mode 100755 index 9e2e1a3..13b3277 --- a/core/Contact.php +++ b/core/Contact.php @@ -148,7 +148,7 @@ public static function search($aFilter = array(), $full = false) } Corelog::log("contact search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('contact', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aContact[] = $data; } @@ -177,7 +177,7 @@ private function load() { $query = "SELECT * FROM " . self::$table . " WHERE contact_id='%contact_id%' "; $result = DB::query(self::$table, $query, array('contact_id' => $this->contact_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->contact_id = $data['contact_id']; $this->first_name = $data['first_name']; @@ -199,7 +199,7 @@ private function load() public function delete() { Corelog::log("Contact delete", Corelog::CRUD); - mysql_query("DELETE from contact_link where contact_id=".$this->contact_id); + DB::raw_insert_delete_update("DELETE from contact_link where contact_id=".$this->contact_id); DB::delete(self::$table_link, 'contact_id', $this->contact_id); return DB::delete(self::$table, 'contact_id', $this->contact_id); } @@ -303,12 +303,12 @@ public function link_delete($group_id = null) } else { $link_delete_query = "DELETE FROM ".self::$table_link." WHERE contact_id=%contact_id% AND group_id=%group_id%"; } - DB::query(self::$table, $req_query, array('contact_id' => $this->contact_id, 'group_id' => $group_id)); - $get_link_count = mysql_query("SELECT * from contact_link"); - $result_add = mysql_query("DELETE from contact_link where contact_id=".$this->contact_id." AND group_id=".$group_id); - $result = mysql_num_rows($get_link_count)-1; + DB::insert_delete_update(self::$table, $link_delete_query, array('contact_id' => $this->contact_id, 'group_id' => $group_id)); + $get_link_count = DB::rawSelect("SELECT * from contact_link"); + $result_add = DB::raw_insert_delete_update("DELETE from contact_link where contact_id=".$this->contact_id." AND group_id=".$group_id); + $result = count($get_link_count)-1; //$count_contact = mysql_query("SELECT * from contact_link where group_id=".$group_id." GROUP BY contact_id"); - //$cont_result = mysql_num_rows($count_contact); + //$cont_result = count($count_contact); //$udate_group = mysql_query("UPDATE contact_group set contact_count=".$cont_result." where group_id=".$group_id); Corelog::log("group contacts Deleted: ", Corelog::CRUD); return $result ; diff --git a/core/Core.php b/core/Core.php old mode 100644 new mode 100755 index 6d6f969..c99dc78 --- a/core/Core.php +++ b/core/Core.php @@ -18,6 +18,7 @@ class Core { + public static function statistic($aFilter = array()) { $aWhere = array(); diff --git a/core/Exchange/Dialplan.php b/core/Exchange/Dialplan.php old mode 100644 new mode 100755 index 15a0cb2..2f8555f --- a/core/Exchange/Dialplan.php +++ b/core/Exchange/Dialplan.php @@ -156,7 +156,7 @@ public static function search($aFilter = array()) weight ASC, gateway_flag ASC"; Corelog::log("dialplan search with $query", Corelog::DEBUG); $result = DB::query(self::$table, $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $listDialplan[] = $data; } @@ -168,7 +168,7 @@ private function load() { $query = "SELECT * FROM " . self::$table . " WHERE dialplan_id='%dialplan_id%' "; $result = DB::query(self::$table, $query, array('dialplan_id' => $this->dialplan_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->dialplan_id = $data['dialplan_id']; $this->gateway_flag = $data['gateway_flag']; diff --git a/core/Gateway.php b/core/Gateway.php old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/account/extension.twig b/core/Gateway/Freeswitch/templates/account/extension.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/amd.json b/core/Gateway/Freeswitch/templates/application/amd.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/callerid_set.json b/core/Gateway/Freeswitch/templates/application/callerid_set.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/connect.json b/core/Gateway/Freeswitch/templates/application/connect.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/disconnect.json b/core/Gateway/Freeswitch/templates/application/disconnect.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/dnc.json b/core/Gateway/Freeswitch/templates/application/dnc.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/fax_receive.json b/core/Gateway/Freeswitch/templates/application/fax_receive.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/fax_send.json b/core/Gateway/Freeswitch/templates/application/fax_send.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/input.json b/core/Gateway/Freeswitch/templates/application/input.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/log.json b/core/Gateway/Freeswitch/templates/application/log.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/originate/fax.json b/core/Gateway/Freeswitch/templates/application/originate/fax.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/originate/voice.json b/core/Gateway/Freeswitch/templates/application/originate/voice.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/play_menu.json b/core/Gateway/Freeswitch/templates/application/play_menu.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/record.json b/core/Gateway/Freeswitch/templates/application/record.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/say_alpha.json b/core/Gateway/Freeswitch/templates/application/say_alpha.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/say_date.json b/core/Gateway/Freeswitch/templates/application/say_date.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/say_digit.json b/core/Gateway/Freeswitch/templates/application/say_digit.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/say_number.json b/core/Gateway/Freeswitch/templates/application/say_number.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/say_time.json b/core/Gateway/Freeswitch/templates/application/say_time.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/transfer.json b/core/Gateway/Freeswitch/templates/application/transfer.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/tts.json b/core/Gateway/Freeswitch/templates/application/tts.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/voice_play.json b/core/Gateway/Freeswitch/templates/application/voice_play.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/application/wait.json b/core/Gateway/Freeswitch/templates/application/wait.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/provider.twig b/core/Gateway/Freeswitch/templates/provider.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/provider/sip.twig b/core/Gateway/Freeswitch/templates/provider/sip.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Freeswitch/templates/user.twig b/core/Gateway/Freeswitch/templates/user.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel.php b/core/Gateway/Kannel.php old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/application/log.json b/core/Gateway/Kannel/templates/application/log.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/application/sms_receive.json b/core/Gateway/Kannel/templates/application/sms_receive.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/application/sms_send.json b/core/Gateway/Kannel/templates/application/sms_send.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/provider/http.twig b/core/Gateway/Kannel/templates/provider/http.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/provider/http/default.twig b/core/Gateway/Kannel/templates/provider/http/default.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/provider/http/ufone.twig b/core/Gateway/Kannel/templates/provider/http/ufone.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Kannel/templates/provider/smpp.twig b/core/Gateway/Kannel/templates/provider/smpp.twig old mode 100644 new mode 100755 diff --git a/core/Gateway/Sendmail.php b/core/Gateway/Sendmail.php old mode 100644 new mode 100755 diff --git a/core/Gateway/Sendmail/templates/application/email_receive.json b/core/Gateway/Sendmail/templates/application/email_receive.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Sendmail/templates/application/email_send.json b/core/Gateway/Sendmail/templates/application/email_send.json old mode 100644 new mode 100755 diff --git a/core/Gateway/Sendmail/templates/application/log.json b/core/Gateway/Sendmail/templates/application/log.json old mode 100644 new mode 100755 diff --git a/core/Group.php b/core/Group.php old mode 100644 new mode 100755 index 10300df..1f48234 --- a/core/Group.php +++ b/core/Group.php @@ -86,7 +86,7 @@ public static function search($aFilter = array()) $query = "SELECT group_id, name, contact_total FROM " . $from_str; Corelog::log("group search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('group', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aGroup[] = $data; } @@ -104,7 +104,7 @@ private function load() { $query = "SELECT * FROM " . self::$table . " WHERE group_id='%group_id%' "; $result = DB::query(self::$table, $query, array('group_id' => $this->group_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->group_id = $data['group_id']; $this->name = $data['name']; diff --git a/core/Message.php b/core/Message.php old mode 100644 new mode 100755 diff --git a/core/Message/Document.php b/core/Message/Document.php old mode 100644 new mode 100755 index 1c4b11c..8fa82bf --- a/core/Message/Document.php +++ b/core/Message/Document.php @@ -199,7 +199,7 @@ public static function search($aFilter = array()) $query = "SELECT document_id, name, file_name, type, pages, description FROM " . $from_str; Corelog::log("document search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('document', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aDocument[] = $data; } @@ -210,7 +210,7 @@ protected function load() { $query = "SELECT * FROM " . self::$table . " WHERE document_id='%document_id%' "; $result = DB::query(self::$table, $query, array('document_id' => $this->document_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->document_id = $data['document_id']; $this->name = $data['name']; diff --git a/core/Message/Recording.php b/core/Message/Recording.php old mode 100644 new mode 100755 index b6cb0bb..0d21c69 --- a/core/Message/Recording.php +++ b/core/Message/Recording.php @@ -161,7 +161,7 @@ public static function search($aFilter = array()) $query = "SELECT recording_id, name, file_name, type, length, description FROM " . $from_str; Corelog::log("recording search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('recording', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aRecording[] = $data; } @@ -172,7 +172,7 @@ protected function load() { $query = "SELECT * FROM " . self::$table . " WHERE recording_id='%recording_id%' "; $result = DB::query(self::$table, $query, array('recording_id' => $this->recording_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->recording_id = $data['recording_id']; $this->name = $data['name']; @@ -318,9 +318,9 @@ private function create_wav($sourceFile, $type, $targetFile) private function recording_type_allowed() { $type = array(); - $query = DB::query('codec', 'SELECT * FROM codec WHERE active=1'); - while ($codec = mysql_fetch_object($query)) { - $type[$codec->codec_value] = $codec->codec_value; + $result = DB::query('codec', 'SELECT * FROM codec WHERE active=1'); + forEach ($result as $data) { + $type[$data->codec_value] = $data->codec_value; } return $type; } diff --git a/core/Message/Template.php b/core/Message/Template.php old mode 100644 new mode 100755 index adb9dae..0ac148b --- a/core/Message/Template.php +++ b/core/Message/Template.php @@ -145,7 +145,7 @@ public static function search($aFilter = array()) $query = "SELECT template_id, name, subject, type, length, description FROM " . $from_str; Corelog::log("template search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('template', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aTemplate[] = $data; } @@ -156,7 +156,7 @@ protected function load() { $query = "SELECT * FROM " . self::$table . " WHERE template_id='%template_id%' "; $result = DB::query(self::$table, $query, array('template_id' => $this->template_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->template_id = $data['template_id']; $this->name = $data['name']; diff --git a/core/Message/Text.php b/core/Message/Text.php old mode 100644 new mode 100755 index a772d80..bdca63e --- a/core/Message/Text.php +++ b/core/Message/Text.php @@ -136,7 +136,7 @@ public static function search($aFilter = array()) $query = "SELECT text_id, name, type, length, description FROM " . $from_str; Corelog::log("text search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('text', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aText[] = $data; } @@ -147,7 +147,7 @@ protected function load() { $query = "SELECT * FROM " . self::$table . " WHERE text_id='%text_id%' "; $result = DB::query(self::$table, $query, array('text_id' => $this->text_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->text_id = $data['text_id']; $this->name = $data['name']; diff --git a/core/Program.php b/core/Program.php index 395d586..a58f477 100755 --- a/core/Program.php +++ b/core/Program.php @@ -197,7 +197,7 @@ public static function search($aFilter = array()) $query = "SELECT program_id, name, type, parent_id FROM " . $from_str; Corelog::log("program search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('program', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aProgram[] = $data; } @@ -210,7 +210,7 @@ public static function search_child($program_id) $where = "parent_id='%program_id%'"; $query = "SELECT program_id FROM " . self::$table . " WHERE $where"; $result = DB::query(self::$table, $query, array('program_id' => $program_id)); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aProgram[] = $data; } Corelog::log("Child program search for program: $program_id", Corelog::CRUD, $aProgram); @@ -292,8 +292,8 @@ public static function getClass(&$program_id, $namespace = 'ICT\\Core\\Program') if (ctype_digit(trim($program_id))) { $query = "SELECT type FROM " . self::$table . " WHERE program_id='%program_id%' "; $result = DB::query(self::$table, $query, array('program_id' => $program_id)); - if (is_resource($result)) { - $program_type = mysql_result($result, 0); + if ($result) { + $program_type = $result[0]; } } else { $program_type = $program_id; @@ -326,7 +326,7 @@ protected function _load() { $query = "SELECT * FROM " . self::$table . " WHERE program_id='%program_id%' "; $result = DB::query(self::$table, $query, array('program_id' => $this->program_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->program_id = $data['program_id']; $this->name = $data['name']; @@ -414,7 +414,7 @@ public static function resource_search($resource_type, $resource_id) } $query = "SELECT program_id FROM " . self::$table . "_resource WHERE resource_type IN ('$resource_type') AND resource_id=%resource_id%"; $result = DB::query(self::$table . "_resource", $query, array('resource_id' => $resource_id)); - while ($resource = mysql_fetch_assoc($result)) { + forEach ($result as $resource ) { $aProgram[] = $resource; } diff --git a/core/Program/Agent.php b/core/Program/Agent.php old mode 100644 new mode 100755 diff --git a/core/Program/Emailtofax.php b/core/Program/Emailtofax.php old mode 100644 new mode 100755 diff --git a/core/Program/Emailtofax/data/email_accepted.tpl.php b/core/Program/Emailtofax/data/email_accepted.tpl.php old mode 100644 new mode 100755 diff --git a/core/Program/Emailtofax/data/email_error.tpl.php b/core/Program/Emailtofax/data/email_error.tpl.php old mode 100644 new mode 100755 diff --git a/core/Program/Emailtofax/data/fax_error.tpl.php b/core/Program/Emailtofax/data/fax_error.tpl.php old mode 100644 new mode 100755 diff --git a/core/Program/Emailtofax/data/fax_success.tpl.php b/core/Program/Emailtofax/data/fax_success.tpl.php old mode 100644 new mode 100755 diff --git a/core/Program/Faxtoemail.php b/core/Program/Faxtoemail.php old mode 100644 new mode 100755 diff --git a/core/Program/Faxtoemail/data/fax_received.tpl.php b/core/Program/Faxtoemail/data/fax_received.tpl.php old mode 100644 new mode 100755 diff --git a/core/Program/Forward.php b/core/Program/Forward.php old mode 100644 new mode 100755 diff --git a/core/Program/Ivr.php b/core/Program/Ivr.php old mode 100644 new mode 100755 index 925a613..f31fc66 --- a/core/Program/Ivr.php +++ b/core/Program/Ivr.php @@ -221,7 +221,6 @@ private function _scheme_find_action($aActions, $app_index) private function _scheme_add_action($oScheme, $app_index, $aApps, $aActions) { $app_actions = $this->_scheme_find_action($aActions, $app_index); - //echo "
";print_r($app_actions);
     foreach($app_actions as $key => $action) {
       if ($action->pointer->linked_app_index) { 
         $aApps[$app_index]->processed = true;
diff --git a/core/Program/Receiveemail.php b/core/Program/Receiveemail.php
old mode 100644
new mode 100755
diff --git a/core/Program/Receivefax.php b/core/Program/Receivefax.php
old mode 100644
new mode 100755
diff --git a/core/Program/Receivesms.php b/core/Program/Receivesms.php
old mode 100644
new mode 100755
diff --git a/core/Program/Sendemail.php b/core/Program/Sendemail.php
old mode 100644
new mode 100755
diff --git a/core/Program/Sendfax.php b/core/Program/Sendfax.php
old mode 100644
new mode 100755
diff --git a/core/Program/Sendsms.php b/core/Program/Sendsms.php
old mode 100644
new mode 100755
diff --git a/core/Program/Voicemessage.php b/core/Program/Voicemessage.php
old mode 100644
new mode 100755
diff --git a/core/Program/Voicetts.php b/core/Program/Voicetts.php
old mode 100644
new mode 100755
diff --git a/core/Provider.php b/core/Provider.php
old mode 100644
new mode 100755
index 28d1a00..fbcbb5e
--- a/core/Provider.php
+++ b/core/Provider.php
@@ -125,7 +125,7 @@ public static function search($aFilter = array())
     $query = "SELECT provider_id, name, host, service_flag, node_id, type FROM " . $from_str;
     Corelog::log("provider search with $query", Corelog::DEBUG, array('aFilter' => $aFilter));
     $result = DB::query(self::$table, $query);
-    while ($data = mysql_fetch_assoc($result)) {
+    forEach ($result as $data ) {
       $aProvider[] = $data;
     }
 
@@ -137,8 +137,8 @@ public static function getClass(&$provider_id, $namespace = 'ICT\\Core\\Provider
     if (ctype_digit(trim($provider_id))) {
       $query = "SELECT type FROM " . self::$table . " WHERE provider_id='%provider_id%' ";
       $result = DB::query(self::$table, $query, array('provider_id' => $provider_id));
-      if (is_resource($result)) {
-        $provider_type = mysql_result($result, 0);
+      if ($result) {
+        $provider_type = $result[0];
       }
     } else {
       $provider_type = $provider_id;
@@ -172,7 +172,7 @@ private function _load()
     Corelog::log("Loading provider: $this->provider_id", Corelog::CRUD);
     $query = "SELECT * FROM " . self::$table . " WHERE provider_id='%provider_id%' ";
     $result = DB::query(self::$table, $query, array('provider_id' => $this->provider_id));
-    $data = mysql_fetch_assoc($result);
+    $data = $result[0];
     if ($data) {
       $this->provider_id = $data['provider_id'];
       $this->name = $data['name'];
diff --git a/core/Provider/Emailcmd.php b/core/Provider/Emailcmd.php
old mode 100644
new mode 100755
diff --git a/core/Provider/Http.php b/core/Provider/Http.php
old mode 100644
new mode 100755
diff --git a/core/Provider/Sip.php b/core/Provider/Sip.php
old mode 100644
new mode 100755
diff --git a/core/Provider/Smpp.php b/core/Provider/Smpp.php
old mode 100644
new mode 100755
diff --git a/core/Provider/Smtp.php b/core/Provider/Smtp.php
old mode 100644
new mode 100755
diff --git a/core/Request.php b/core/Request.php
old mode 100644
new mode 100755
diff --git a/core/Response.php b/core/Response.php
old mode 100644
new mode 100755
diff --git a/core/Result.php b/core/Result.php
old mode 100644
new mode 100755
index 3bd7341..6c6f988
--- a/core/Result.php
+++ b/core/Result.php
@@ -93,7 +93,7 @@ public static function search($aFilter = array())
 
     $query = "SELECT * FROM " . $from_str;
     $result = DB::query(self::$table, $query);
-    while ($data = mysql_fetch_assoc($result)) {
+    forEach ($result as $data ) {
       $aResult[] = $data;
     }
     Corelog::log("Result search for spool", Corelog::CRUD, $aResult);
@@ -104,7 +104,7 @@ private function load()
   {
     $query = "SELECT * FROM " . self::$table . " WHERE spool_result_id='%spool_result_id%'";
     $result = DB::query(self::$table, $query, array('spool_result_id' => $this->spool_result_id));
-    $data = mysql_fetch_assoc($result);
+    $data = $result[0];
     if ($data) {
       $this->spool_result_id = $data['spool_result_id'];
       $this->application_id = $data['application_id'];
diff --git a/core/Schedule.php b/core/Schedule.php
old mode 100644
new mode 100755
index a28f0fd..64f71a5
--- a/core/Schedule.php
+++ b/core/Schedule.php
@@ -78,7 +78,7 @@ public function load()
 
     $query = "SELECT * FROM " . self::$sub_table . " WHERE task_id='%task_id%'";
     $schedule = DB::query(self::$sub_table, $query, array('task_id' => $this->task_id));
-    while ($data = mysql_fetch_assoc($schedule)) {
+    foreach ($schedule as $data) {
       $year[] = $data['year'];
       $month[] = $data['month'];
       $day[] = $data['day'];
diff --git a/core/Service.php b/core/Service.php
old mode 100644
new mode 100755
diff --git a/core/Service/Email.php b/core/Service/Email.php
old mode 100644
new mode 100755
diff --git a/core/Service/Fax.php b/core/Service/Fax.php
old mode 100644
new mode 100755
diff --git a/core/Service/Sms.php b/core/Service/Sms.php
old mode 100644
new mode 100755
diff --git a/core/Service/Voice.php b/core/Service/Voice.php
old mode 100644
new mode 100755
diff --git a/core/Spool.php b/core/Spool.php
old mode 100644
new mode 100755
index 5e69c44..7412319
--- a/core/Spool.php
+++ b/core/Spool.php
@@ -154,7 +154,7 @@ public static function search($aFilter = array())
     $query = "SELECT spool_id, account_id, transmission_id, status, response FROM " . $from_str;
     Corelog::log("spool search with $query", Corelog::DEBUG, array('aFilter' => $aFilter));
     $result = DB::query('spool', $query);
-    while ($data = mysql_fetch_assoc($result)) {
+    forEach ($result as $data ) {
       $aSpool[] = $data;
     }
 
@@ -165,7 +165,7 @@ private function load()
   {
     $query = "SELECT * FROM " . self::$table . " WHERE spool_id='%spool_id%' ";
     $result = DB::query(self::$table, $query, array('spool_id' => $this->spool_id));
-    $data = mysql_fetch_assoc($result);
+    $data = $result[0];
     if ($data) {
       $this->spool_id = $data['spool_id'];
       $this->time_spool = $data['time_spool'];
diff --git a/core/Task.php b/core/Task.php
old mode 100644
new mode 100755
index 87f82be..a197f49
--- a/core/Task.php
+++ b/core/Task.php
@@ -125,7 +125,7 @@ public static function search($aFilter = array())
     $query = "SELECT task_id, account_id, type, action, data FROM " . $from_str;
     Corelog::log("task search with $query", Corelog::DEBUG, array('aFilter' => $aFilter));
     $result = DB::query('task', $query);
-    while ($data = mysql_fetch_assoc($result)) {
+    forEach ($result as $data ) {
       $aTask[] = $data;
     }
 
@@ -141,7 +141,7 @@ public static function search_pending()
               WHERE status = " . Task::PENDING . "
                 AND (t.last_run IS NULL OR (t.last_run + 59) < UNIX_TIMESTAMP())"; // don't run a task twice
     $rsTask = DB::query(self::$table, $query, array());
-    while ($data = mysql_fetch_assoc($rsTask)) {
+    forEach ($rsTask as $data) {
       $aTask[] = $data;
     }
     Corelog::log("Task search", Corelog::CRUD, $aTask);
@@ -152,7 +152,7 @@ protected function load()
   {
     $query = "SELECT * FROM " . self::$table . " WHERE task_id='%task_id%'";
     $task = DB::query(self::$table, $query, array('task_id' => $this->task_id));
-    $data = mysql_fetch_assoc($task);
+    $data = $task;
     if ($data) {
       $this->task_id = $data['task_id'];
       $this->type = $data['type'];
diff --git a/core/Test.php b/core/Test.php
new file mode 100644
index 0000000..ac55d0e
--- /dev/null
+++ b/core/Test.php
@@ -0,0 +1,55 @@
+";
+print_r( \ICT\Core\DB::column_list('configuration'));
+echo "
";*/ + +/*echo "statistics:".PHP_EOL; +$aStatic = \ICT\Core\Core::statistic(); +print_r($aStatic);*/ + +/* +echo "user:".PHP_EOL; +$user = \ICT\Core\User::search(array('user_id'=>1)); +print_r($user);*/ + +class Test +{ + public function __construct() + { + echo "const"; + } + + public static function login() + { + \ICT\Core\do_login(1); + } + + // \ICT\Core\Test::user(); from cli + public static function user() + { + echo "user:" . PHP_EOL; + $user = \ICT\Core\User::search(array('user_id' => 1)); + print_r($user); + } + + public static function statistics() + { + echo "statistics:" . PHP_EOL; + $aStatic = \ICT\Core\Core::statistic(); + print_r($aStatic); + } + + public static function auth() + { + //$aStatic = \ICT\Core\Api\AuthenticateApi::create(['username'=>'sxkjk','password'=>'sxkdskk']); + echo \ICT\Core\Api::authenticate(['username'=>'banna','password'=>'alio1610'],User::AUTH_TYPE_DIGEST); + // print_r($aStatic); + } + + + +} \ No newline at end of file diff --git a/core/Transmission.php b/core/Transmission.php old mode 100644 new mode 100755 index 16f144f..991aacb --- a/core/Transmission.php +++ b/core/Transmission.php @@ -260,7 +260,7 @@ public static function search($aFilter = array()) $query = "SELECT t.transmission_id, $owner_fields, $contact_fields, t.status, t.response, t.direction, t.last_run FROM " . $from_str . " LIMIT 5000"; Corelog::log("transmission search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('transmission', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data ) { $aTransmission[] = $data; } @@ -271,7 +271,7 @@ private function load() { $query = "SELECT * FROM " . self::$table . " WHERE transmission_id='%transmission_id%' "; $result = DB::query(self::$table, $query, array('transmission_id' => $this->transmission_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->transmission_id = $data['transmission_id']; $this->title = $data['title']; diff --git a/core/User.php b/core/User.php old mode 100644 new mode 100755 index ed54b68..17ad460 --- a/core/User.php +++ b/core/User.php @@ -17,515 +17,521 @@ class User { - const GUEST = -1; - - const AUTH_TYPE_BASIC = 'basic'; - const AUTH_TYPE_DIGEST = 'digest'; - const AUTH_TYPE_BEARER = 'bearer'; - const AUTH_TYPE_NETWORK = 'network'; - - private static $table = 'usr'; - private static $link_role = 'user_role'; - private static $link_permission = 'user_permission'; - private static $primary_key = 'usr_id'; - private static $fields = array( - 'user_id', // will be mapped to usr_id in database table - 'role_id', - 'username', - 'passwd', - 'password_hash', // will be mapped to passwd in database table - 'password', // dummy field to hold plain password, will not be saved in database - 'first_name', - 'last_name', - 'phone', - 'email', - 'address', - 'company', - 'country_id', - 'timezone_id', - 'active' - ); - private static $read_only = array( - 'user_id', - 'role_id', - 'password_hash' - ); - - /** - * @property-read integer $user_id - * @var integer - */ - public $user_id = NULL; - - /** - * @property-read integer $role_id - * not in use - * @var integer - */ - private $role_id = NULL; - - /** - * @property-read string $username - * @see User::set_username - * @var string - */ - private $username = NULL; - - /** @var string */ - private $passwd = NULL; - - /** - * @property-write string $password - * Accept plain password, which will be imediately converted into md5 hash - * @see User::set_password - */ - /** - * @property-read string $password_hash - * represent password hash value from database - * @see User::get_password_hash - */ - - /** @var string */ - public $first_name = NULL; - - /** @var string */ - public $last_name = NULL; - - /** @var string */ - public $phone = NULL; - - /** @var string */ - public $email = NULL; - - /** @var string */ - public $address = NULL; - - /** @var string */ - public $company = NULL; - - /** @var integer */ - public $country_id = NULL; - - /** @var string */ - public $language_id = NULL; - - /** @var integer */ - public $timezone_id = NULL; - - /** @var integer */ - public $active = 0; - - /** @var integer */ - public $owner_id = null; - - /** - * ***************************************************** Runtime Variables ** - */ - - /** - * @property-read string $aRole - * list of Roles, to set role call role_assign - * @see User::role_assign() and User::role_unassign() - * @var Role[] $aRole - */ - private $aRole = array(); - - /** @var array $aPermission */ - private $aPermission = array(); - - public function __construct($user_id = NULL) - { - if (!empty($user_id)) { - if (!is_numeric($user_id)) { - if (filter_var($user_id, FILTER_VALIDATE_EMAIL)) { - $this->email = $user_id; - } else { - $this->username = $user_id; - } - } else { - $this->user_id = $user_id; - if (User::GUEST == $user_id) { - Corelog::log("Guest user: creating instance", Corelog::CRUD); - $this->user_id = User::GUEST; - $this->username = 'guest'; - $this->first_name = 'Anonymous'; - $this->last_name = 'Guest'; - $this->email = 'no-reply@example.com'; - $this->phone = '1111111111'; - $this->address = Conf::get('company:address', 'PK'); - return $this->user_id; // don't proceed further + const GUEST = -1; + + const AUTH_TYPE_BASIC = 'basic'; + const AUTH_TYPE_DIGEST = 'digest'; + const AUTH_TYPE_BEARER = 'bearer'; + const AUTH_TYPE_NETWORK = 'network'; + + private static $table = 'usr'; + private static $link_role = 'user_role'; + private static $link_permission = 'user_permission'; + private static $primary_key = 'usr_id'; + private static $fields = array( + 'user_id', // will be mapped to usr_id in database table + 'role_id', + 'username', + 'passwd', + 'password_hash', // will be mapped to passwd in database table + 'password', // dummy field to hold plain password, will not be saved in database + 'first_name', + 'last_name', + 'phone', + 'email', + 'address', + 'company', + 'country_id', + 'timezone_id', + 'active' + ); + private static $read_only = array( + 'user_id', + 'role_id', + 'password_hash' + ); + + /** + * @property-read integer $user_id + * @var integer + */ + public $user_id = NULL; + + /** + * @property-read integer $role_id + * not in use + * @var integer + */ + private $role_id = NULL; + + /** + * @property-read string $username + * @see User::set_username + * @var string + */ + private $username = NULL; + + /** @var string */ + private $passwd = NULL; + + /** + * @property-write string $password + * Accept plain password, which will be imediately converted into md5 hash + * @see User::set_password + */ + /** + * @property-read string $password_hash + * represent password hash value from database + * @see User::get_password_hash + */ + + /** @var string */ + public $first_name = NULL; + + /** @var string */ + public $last_name = NULL; + + /** @var string */ + public $phone = NULL; + + /** @var string */ + public $email = NULL; + + /** @var string */ + public $address = NULL; + + /** @var string */ + public $company = NULL; + + /** @var integer */ + public $country_id = NULL; + + /** @var string */ + public $language_id = NULL; + + /** @var integer */ + public $timezone_id = NULL; + + /** @var integer */ + public $active = 0; + + /** @var integer */ + public $owner_id = null; + + /** + * ***************************************************** Runtime Variables ** + */ + + /** + * @property-read string $aRole + * list of Roles, to set role call role_assign + * @see User::role_assign() and User::role_unassign() + * @var Role[] $aRole + */ + private $aRole = array(); + + /** @var array $aPermission */ + private $aPermission = array(); + + public function __construct($user_id = NULL) + { + if (!empty($user_id)) { + if (!is_numeric($user_id)) { + if (filter_var($user_id, FILTER_VALIDATE_EMAIL)) { + $this->email = $user_id; + } else { + $this->username = $user_id; + } + } else { + $this->user_id = $user_id; + if (User::GUEST == $user_id) { + Corelog::log("Guest user: creating instance", Corelog::CRUD); + $this->user_id = User::GUEST; + $this->username = 'guest'; + $this->first_name = 'Anonymous'; + $this->last_name = 'Guest'; + $this->email = 'no-reply@example.com'; + $this->phone = '1111111111'; + $this->address = Conf::get('company:address', 'PK'); + return $this->user_id; // don't proceed further + } + } + $this->load(); } - } - $this->load(); } - } - - public static function search($aFilter = array()) - { - $aUser = array(); - $from_str = self::$table; - $aWhere = array(); - foreach ($aFilter as $search_field => $search_value) { - switch ($search_field) { - case 'user_id': - $aWhere[] = "usr_id = $search_value"; - break; - case 'created_by': - $aWhere[] = "created_by = $search_value"; - break; - case 'username': - case 'phone': - case 'email': - case 'first_name': - case 'last_name': - $aWhere[] = "$search_field = '$search_value'"; - break; - - case 'created_by': - $aWhere[] = "created_by = '$search_value'"; - break; - case 'before': - $aWhere[] = "date_created <= $search_value"; - break; - case 'after': - $aWhere[] = "date_created >= $search_value"; - break; - } + + public static function search($aFilter = array()) + { + $aUser = array(); + $from_str = self::$table; + $aWhere = array(); + foreach ($aFilter as $search_field => $search_value) { + switch ($search_field) { + case 'user_id': + $aWhere[] = "usr_id = $search_value"; + break; + case 'created_by': + $aWhere[] = "created_by = $search_value"; + break; + case 'username': + case 'phone': + case 'email': + case 'first_name': + case 'last_name': + $aWhere[] = "$search_field = '$search_value'"; + break; + + case 'created_by': + $aWhere[] = "created_by = '$search_value'"; + break; + case 'before': + $aWhere[] = "date_created <= $search_value"; + break; + case 'after': + $aWhere[] = "date_created >= $search_value"; + break; + } + } + if (!empty($aWhere)) { + $from_str .= ' WHERE ' . implode(' AND ', $aWhere); + } + + $query = "SELECT usr_id AS user_id, username, first_name, last_name, phone, email FROM " . $from_str; + + Corelog::log("user search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); + $result = DB::query('user', $query); + foreach ($result as $data) { + $aUser[] = $data; + } + + // if no user found, check for guest user + if (empty($aUser) && isset($aFilter['user_id']) && $aFilter['user_id'] == User::GUEST) { + $oUser = new User($aFilter['user_id']); + $aUser[$oUser->user_id] = array( + 'user_id' => $oUser->user_id, + 'username' => $oUser->username, + 'first_name' => $oUser->first_name, + 'last_name' => $oUser->last_name, + 'phone' => $oUser->phone, + 'email' => $oUser->email + ); + } + + return $aUser; } - if (!empty($aWhere)) { - $from_str .= ' WHERE ' . implode(' AND ', $aWhere); + + public function search_role($aFilter = array()) + { + $aFilter['query'] = "SELECT ur.role_id FROM " . self::$link_role . " ur WHERE ur.usr_id=" . $this->user_id; + return Role::search($aFilter); } - $query = "SELECT usr_id AS user_id, username, first_name, last_name, phone, email FROM " . $from_str; - Corelog::log("user search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); - $result = DB::query('user', $query); - while ($data = mysql_fetch_assoc($result)) { - $aUser[] = $data; + public function search_permission($aFilter = array()) + { + $aFilter['query'] = "SELECT up.permission_id FROM " . self::$link_permission . " up WHERE up.usr_id=" . $this->user_id; + return Permission::search($aFilter); } - // if no user found, check for guest user - if (empty($aUser) && isset($aFilter['user_id']) && $aFilter['user_id'] == User::GUEST) { - $oUser = new User($aFilter['user_id']); - $aUser[$oUser->user_id] = array( - 'user_id' => $oUser->user_id, - 'username' => $oUser->username, - 'first_name' => $oUser->first_name, - 'last_name' => $oUser->last_name, - 'phone' => $oUser->phone, - 'email' => $oUser->email - ); + private function load() + { + + Corelog::log("Loading user with id:" . $this->user_id . ' name:' . $this->username, Corelog::CRUD); + if (!empty($this->email)) { + $search_field = 'u.email'; + $search_value = $this->email; + } else if (!empty($this->username)) { + $search_field = 'u.username'; + $search_value = $this->username; + } else { + $search_field = 'u.usr_id'; + $search_value = $this->user_id; + } + $query = "SELECT u.* FROM " . self::$table . " u WHERE %search_field%='%search_value%'"; + $result = DB::query(self::$table, $query, array('search_field' => $search_field, 'search_value' => $search_value)); + + $data = $result[0]; + if ($data) { + $this->user_id = $data['usr_id']; + $this->role_id = $data['role_id']; + $this->username = $data['username']; + $this->passwd = $data['passwd']; + $this->first_name = $data['first_name']; + $this->last_name = $data['last_name']; + $this->phone = $data['phone']; + $this->email = $data['email']; + $this->address = $data['address']; + $this->company = $data['company']; + $this->country_id = $data['country_id']; + $this->language_id = $data['language_id']; + $this->timezone_id = $data['timezone_id']; + $this->active = $data['active']; + + $this->load_role(); + $this->load_permission(); + } else { + throw new CoreException('404', 'User not found'); + } } - return $aUser; - } - - public function search_role($aFilter = array()) { - $aFilter['query'] = "SELECT ur.role_id FROM " . self::$link_role . " ur WHERE ur.usr_id=" . $this->user_id; - return Role::search($aFilter); - } - - public function search_permission($aFilter = array()) { - $aFilter['query'] = "SELECT up.permission_id FROM " . self::$link_permission . " up WHERE up.usr_id=" . $this->user_id; - return Permission::search($aFilter); - } - - private function load() - { - Corelog::log("Loading user with id:" . $this->user_id . ' name:' . $this->username, Corelog::CRUD); - if (!empty($this->email)) { - $search_field = 'u.email'; - $search_value = $this->email; - } else if (!empty($this->username)) { - $search_field = 'u.username'; - $search_value = $this->username; - } else { - $search_field = 'u.usr_id'; - $search_value = $this->user_id; + private function load_role() + { + $this->aRole = array(); + $listRole = $this->search_role(); + foreach ($listRole as $aRole) { + $role_id = $aRole['role_id']; + $this->aRole[$role_id] = new Role($role_id); + } } - $query = "SELECT u.* FROM " . self::$table . " u WHERE %search_field%='%search_value%'"; - $result = DB::query(self::$table, $query, array('search_field' => $search_field, 'search_value' => $search_value)); - $data = mysql_fetch_assoc($result); - if ($data) { - $this->user_id = $data['usr_id']; - $this->role_id = $data['role_id']; - $this->username = $data['username']; - $this->passwd = $data['passwd']; - $this->first_name = $data['first_name']; - $this->last_name = $data['last_name']; - $this->phone = $data['phone']; - $this->email = $data['email']; - $this->address = $data['address']; - $this->company = $data['company']; - $this->country_id = $data['country_id']; - $this->language_id = $data['language_id']; - $this->timezone_id = $data['timezone_id']; - $this->active = $data['active']; - - $this->load_role(); - $this->load_permission(); - } else { - throw new CoreException('404', 'User not found'); + + private function load_permission() + { + $this->aPermission = array(); + $listPermission = $this->search_permission(); + foreach ($listPermission as $aPermission) { + $permission_id = $aPermission['permission_id']; + $this->aPermission[$permission_id] = $aPermission['name']; + } } - } - - private function load_role() - { - $this->aRole = array(); - $listRole = $this->search_role(); - foreach ($listRole as $aRole) { - $role_id = $aRole['role_id']; - $this->aRole[$role_id] = new Role($role_id); + + public function delete() + { + Corelog::log("Deleting user: $this->user_id", Corelog::CRUD); + // first remove roles assignements for current user + $query = 'DELETE FROM ' . self::$link_role . ' WHERE usr_id=%user_id%'; + DB::query(self::$link_role, $query, array('user_id' => $this->user_id)); + // then remove permissions for current user + $query = 'DELETE FROM ' . self::$link_permission . ' WHERE usr_id=%user_id%'; + DB::query(self::$link_permission, $query, array('user_id' => $this->user_id)); + // now delete user + return DB::delete(self::$table, 'usr_id', $this->user_id); } - } - - private function load_permission() - { - $this->aPermission = array(); - $listPermission = $this->search_permission(); - foreach($listPermission as $aPermission) { - $permission_id = $aPermission['permission_id']; - $this->aPermission[$permission_id] = $aPermission['name']; + + public function __isset($field) + { + $method_name = 'isset_' . $field; + if (method_exists($this, $method_name)) { + return $this->$method_name(); + } else { + return isset($this->$field); + } } - } - - public function delete() - { - Corelog::log("Deleting user: $this->user_id", Corelog::CRUD); - // first remove roles assignements for current user - $query = 'DELETE FROM ' . self::$link_role . ' WHERE usr_id=%user_id%'; - DB::query(self::$link_role, $query, array('user_id' => $this->user_id)); - // then remove permissions for current user - $query = 'DELETE FROM ' . self::$link_permission . ' WHERE usr_id=%user_id%'; - DB::query(self::$link_permission, $query, array('user_id' => $this->user_id)); - // now delete user - return DB::delete(self::$table, 'usr_id', $this->user_id); - } - - public function __isset($field) - { - $method_name = 'isset_' . $field; - if (method_exists($this, $method_name)) { - return $this->$method_name(); - } else { - return isset($this->$field); + + public function __get($field) + { + $method_name = 'get_' . $field; + if (method_exists($this, $method_name)) { + return $this->$method_name(); + } else if (!empty($field) && isset($this->$field)) { + return $this->$field; + } + return NULL; } - } - - public function __get($field) - { - $method_name = 'get_' . $field; - if (method_exists($this, $method_name)) { - return $this->$method_name(); - } else if (!empty($field) && isset($this->$field)) { - return $this->$field; + + public function __set($field, $value) + { + $method_name = 'set_' . $field; + if (method_exists($this, $method_name)) { + $this->$method_name($value); + } else if (empty($field) || in_array($field, self::$read_only)) { + return; + } else { + $this->$field = $value; + } } - return NULL; - } - - public function __set($field, $value) - { - $method_name = 'set_' . $field; - if (method_exists($this, $method_name)) { - $this->$method_name($value); - } else if (empty($field) || in_array($field, self::$read_only)) { - return; - } else { - $this->$field = $value; + + public function get_id() + { + return $this->user_id; } - } - public function get_id() - { - return $this->user_id; - } + private function set_username($username) + { + if (empty($this->username)) { + $this->username = $username; + } + } - private function set_username($username) - { - if (empty($this->username)) { - $this->username = $username; + private function set_password($password) + { + $this->passwd = md5($password); } - } - - private function set_password($password) - { - $this->passwd = md5($password); - } - - private function get_password_hash() - { - return $this->passwd; - } - - public function role_assign($role_id) - { - $oRole = new Role($role_id); - $this->aRole[$oRole->role_id] = $oRole; - } - - public function role_unassign($role_id) - { - unset($this->aRole[$role_id]); - } - - public function permission_assign($permission_id) - { - $oPermission = new Permission($permission_id); - $this->aPermission[$oPermission->permission_id] = $oPermission->name; - } - - public function permission_unassign($permission_id) - { - unset($this->aPermission[$permission_id]); - } - - public function save() - { - $data = array( - 'usr_id' => $this->user_id, - 'user_id' => $this->user_id, - 'role_id' => $this->role_id, - 'username' => $this->username, - 'passwd' => $this->password_hash, - 'first_name' => $this->first_name, - 'last_name' => $this->last_name, - 'phone' => $this->phone, - 'email' => $this->email, - 'address' => $this->address, - 'company' => $this->company, - 'country_id' => $this->country_id, - 'language_id' => $this->language_id, - 'timezone_id' => $this->timezone_id, - 'active' => $this->active - // Note: user_id or created_by field can't be updated here, instead use associate method - ); - if (!empty($this->password)) { - $data['passwd'] = md5($this->password); + + private function get_password_hash() + { + return $this->passwd; } - if (isset($data['user_id']) && !empty($data['user_id'])) { - // first remove existing roles assignements - $query = 'DELETE FROM ' . self::$link_role . ' WHERE usr_id=%user_id%'; - DB::query(self::$link_role, $query, array('user_id' => $this->user_id)); - // then remove permissions for current user - $query = 'DELETE FROM ' . self::$link_permission . ' WHERE usr_id=%user_id%'; - DB::query(self::$link_permission, $query, array('user_id' => $this->user_id)); - // update existing record - $result = DB::update(self::$table, $data, 'usr_id'); - Corelog::log("User updated: $this->user_id", Corelog::CRUD); - } else { - // add new - $result = DB::update(self::$table, $data, false); - $data['user_id'] = $data['usr_id']; // mapping - $this->user_id = $data['user_id']; - Corelog::log("New user created: $this->user_id", Corelog::CRUD); + + public function role_assign($role_id) + { + + $oRole = new Role($role_id); + $this->aRole[$oRole->role_id] = $oRole; } - // save roles for current user - foreach ($this->aRole as $oRole) { - $query = "INSERT INTO " . self::$link_role . " (usr_id, role_id) VALUES (%user_id%, %role_id%)"; - $result = DB::query(self::$link_role, $query, array('user_id' => $this->user_id, 'role_id' => $oRole->role_id)); + public function role_unassign($role_id) + { + unset($this->aRole[$role_id]); } - // save permissions for current user - foreach ($this->aPermission as $permission_id) { - $query = "INSERT INTO " . self::$link_permission . " (usr_id, permission_id) VALUES (%user_id%, %permission_id%)"; - $result = DB::query(self::$link_permission, $query, array('user_id' => $this->user_id, 'permission_id' => $permission_id)); + public function permission_assign($permission_id) + { + $oPermission = new Permission($permission_id); + $this->aPermission[$oPermission->permission_id] = $oPermission->name; } - return $result; - } - - public function generate_token() - { - $key_file = Conf::get('security:private_key', '/usr/ictcore/etc/ssh/ib_node'); - $private_key = file_get_contents($key_file); - - $token = array( - "iss" => Conf::get('website:url'), - "iat" => time(), - "nbf" => time(), - "exp" => time() + Conf::get('security:token_expiry', (60 * 60 * 24 * 30 * 12 * 1)), // valid for one year - "user_id" => $this->user_id, - "username" => $this->username, - "is_admin" => can_access('user_create', $this->user_id) ? "1" : "0", - "api-version" => "1.0" - ); + public function permission_unassign($permission_id) + { + unset($this->aPermission[$permission_id]); + } - return JWT::encode($token, $private_key, Conf::get('security:hash_type', 'RS256')); - } - - public static function authenticate($access_key, $key_type = User::AUTH_TYPE_BASIC) - { - $oUser = null; - switch ($key_type) { - case User::AUTH_TYPE_BEARER: - try { - $key_file = Conf::get('security:public_key', '/usr/ictcore/etc/ssh/ib_node.pub'); - $hash_type = Conf::get('security:hash_type', 'RS256'); - $public_key = file_get_contents($key_file); - $token = JWT::decode($access_key, $public_key, array($hash_type)); - if ($token) { - // TODO check api-version - if (!empty($token->user_id)) { - $oUser = new self($token->user_id); - return $oUser; - } - } - } catch (Exception $e) { - Corelog::log('Unable to parse bearer token. error: ' . $e->getMessage(), Corelog::ERROR); + public function save() + { + $data = array( + 'usr_id' => $this->user_id, + 'user_id' => $this->user_id, + 'role_id' => $this->role_id, + 'username' => $this->username, + 'passwd' => $this->password_hash, + 'first_name' => $this->first_name, + 'last_name' => $this->last_name, + 'phone' => $this->phone, + 'email' => $this->email, + 'address' => $this->address, + 'company' => $this->company, + 'country_id' => $this->country_id, + 'language_id' => $this->language_id, + 'timezone_id' => $this->timezone_id, + 'active' => $this->active + // Note: user_id or created_by field can't be updated here, instead use associate method + ); + if (!empty($this->password)) { + $data['passwd'] = md5($this->password); + } + if (isset($data['user_id']) && !empty($data['user_id'])) { + // first remove existing roles assignements + $query = 'DELETE FROM ' . self::$link_role . ' WHERE usr_id=%user_id%'; + DB::query(self::$link_role, $query, array('user_id' => $this->user_id)); + // then remove permissions for current user + $query = 'DELETE FROM ' . self::$link_permission . ' WHERE usr_id=%user_id%'; + DB::query(self::$link_permission, $query, array('user_id' => $this->user_id)); + // update existing record + $result = DB::update(self::$table, $data, 'usr_id'); + Corelog::log("User updated: $this->user_id", Corelog::CRUD); + } else { + // add new + $result = DB::update(self::$table, $data, false); + $data['user_id'] = $data['usr_id']; // mapping + $this->user_id = $data['user_id']; + Corelog::log("New user created: $this->user_id", Corelog::CRUD); } - Corelog::log('Bearer authentication failed', Corelog::ERROR); - return false; - case User::AUTH_TYPE_NETWORK: - return false; // TODO - case User::AUTH_TYPE_DIGEST: - if (!empty($access_key['username'])) { - $oUser = new self($access_key['username']); - if ($oUser->get_password_hash() == $access_key['password']) { - return $oUser; - } + // save roles for current user + foreach ($this->aRole as $oRole) { + $query = "INSERT INTO " . self::$link_role . " (usr_id, role_id) VALUES (%user_id%, %role_id%)"; + $result = DB::query(self::$link_role, $query, array('user_id' => $this->user_id, 'role_id' => $oRole->role_id)); } - Corelog::log('Basic authentication failed', Corelog::ERROR); - return false; - case User::AUTH_TYPE_BASIC: - default: - if (!empty($access_key['username'])) { - $oUser = new self($access_key['username']); - if ($oUser->get_password_hash() == md5($access_key['password'])) { - return $oUser; - } + // save permissions for current user + foreach ($this->aPermission as $permission_id) { + $query = "INSERT INTO " . self::$link_permission . " (usr_id, permission_id) VALUES (%user_id%, %permission_id%)"; + $result = DB::query(self::$link_permission, $query, array('user_id' => $this->user_id, 'permission_id' => $permission_id)); } - Corelog::log('Network authentication has been failed', Corelog::ERROR); - return false; + + return $result; } - } - - public function authorize($permission) - { - $aPart = explode('_', $permission); - $level = count($aPart); - $perm = ''; - - // first check if parent permission exist and then try for sub permissions - for ($i = 0; $i < $level; $i++) { - $perm .= $aPart[$i]; - if (in_array($perm, $this->aPermission)) { - return true; - } else { - $perm .= '_'; - } + + public function generate_token() + { + $key_file = Conf::get('security:private_key', '/usr/ictcore/etc/ssh/ib_node'); + $private_key = file_get_contents($key_file); + + $token = array( + "iss" => Conf::get('website:url'), + "iat" => time(), + "nbf" => time(), + "exp" => time() + Conf::get('security:token_expiry', (60 * 60 * 24 * 30 * 12 * 1)), // valid for one year + "user_id" => $this->user_id, + "username" => $this->username, + "is_admin" => can_access('user_create', $this->user_id) ? "1" : "0", + "api-version" => "1.0" + ); + + return JWT::encode($token, $private_key, Conf::get('security:hash_type', 'RS256')); } - // now try with role permissions - foreach ($this->aRole as $oRole) { - if ($oRole->authorize($permission)) { - return true; - } + public static function authenticate($access_key, $key_type = User::AUTH_TYPE_BASIC) + { + $oUser = null; + switch ($key_type) { + case User::AUTH_TYPE_BEARER: + try { + $key_file = Conf::get('security:public_key', '/usr/ictcore/etc/ssh/ib_node.pub'); + $hash_type = Conf::get('security:hash_type', 'RS256'); + $public_key = file_get_contents($key_file); + $token = JWT::decode($access_key, $public_key, array($hash_type)); + if ($token) { + // TODO check api-version + if (!empty($token->user_id)) { + $oUser = new self($token->user_id); + return $oUser; + } + } + } catch (Exception $e) { + Corelog::log('Unable to parse bearer token. error: ' . $e->getMessage(), Corelog::ERROR); + } + Corelog::log('Bearer authentication failed', Corelog::ERROR); + return false; + + case User::AUTH_TYPE_NETWORK: + return false; // TODO + case User::AUTH_TYPE_DIGEST: + if (!empty($access_key['username'])) { + $oUser = new self($access_key['username']); + if ($oUser->get_password_hash() == $access_key['password']) { + return $oUser; + } + } + Corelog::log('Basic authentication failed', Corelog::ERROR); + return false; + + case User::AUTH_TYPE_BASIC: + default: + if (!empty($access_key['username'])) { + $oUser = new self($access_key['username']); + if ($oUser->get_password_hash() == md5($access_key['password'])) { + return $oUser; + } + } + Corelog::log('Network authentication has been failed', Corelog::ERROR); + return false; + } } - // authorization fialed - return false; - } + public function authorize($permission) + { + $aPart = explode('_', $permission); + $level = count($aPart); + $perm = ''; + + // first check if parent permission exist and then try for sub permissions + for ($i = 0; $i < $level; $i++) { + $perm .= $aPart[$i]; + if (in_array($perm, $this->aPermission)) { + return true; + } else { + $perm .= '_'; + } + } + + // now try with role permissions + foreach ($this->aRole as $oRole) { + if ($oRole->authorize($permission)) { + return true; + } + } + + // authorization fialed + return false; + } } diff --git a/core/User/Permission.php b/core/User/Permission.php old mode 100644 new mode 100755 index 86e8e6c..515cf4e --- a/core/User/Permission.php +++ b/core/User/Permission.php @@ -67,7 +67,7 @@ public static function search($aFilter = array()) $query = "SELECT permission_id, name FROM " . $from_str; Corelog::log("permission search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('permission', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data) { $aPermission[] = $data; } @@ -78,8 +78,7 @@ private function load() { Corelog::log("Loading permission: $this->permission_id", Corelog::CRUD); $query = "SELECT * FROM " . self::$table . " WHERE permission_id='%permission_id%'"; - $result = DB::query(self::$table, $query, array('permission_id' => $this->permission_id)); - $data = mysql_fetch_assoc($result); + $data = DB::query(self::$table, $query, array('permission_id' => $this->permission_id)); if ($data) { $this->permission_id = $data['permission_id']; $this->name = $data['name']; diff --git a/core/User/Role.php b/core/User/Role.php old mode 100644 new mode 100755 index bc5d470..0860f1b --- a/core/User/Role.php +++ b/core/User/Role.php @@ -49,6 +49,8 @@ public function __construct($role_id = NULL) if (!empty($role_id)) { $this->role_id = $role_id; $this->load(); + }else { + } } @@ -76,7 +78,7 @@ public static function search($aFilter = array()) $query = "SELECT role_id, name FROM " . $from_str; Corelog::log("role search with $query", Corelog::DEBUG, array('aFilter' => $aFilter)); $result = DB::query('role', $query); - while ($data = mysql_fetch_assoc($result)) { + forEach ($result as $data) { $aRole[] = $data; } @@ -88,7 +90,7 @@ private function load() Corelog::log("Loading role: $this->role_id", Corelog::CRUD); $query = "SELECT * FROM " . self::$table . " WHERE role_id='%role_id%'"; $result = DB::query(self::$table, $query, array('role_id' => $this->role_id)); - $data = mysql_fetch_assoc($result); + $data = $result[0]; if ($data) { $this->role_id = $data['role_id']; $this->name = $data['name']; @@ -102,6 +104,7 @@ private function load() private function load_permission() { + $this->aPermission = array(); $query = "SELECT rp.permission_id FROM " . self::$link_permission . " rp WHERE rp.role_id=" . $this->role_id; diff --git a/core/lib/Conf.php b/core/lib/Conf.php old mode 100644 new mode 100755 index fc34fe9..af10424 --- a/core/lib/Conf.php +++ b/core/lib/Conf.php @@ -96,16 +96,21 @@ protected static function database_conf_load($filter = array(), $type = null) $filter_string = implode(' AND ', $filter); // in following query ORDER BY class make sure that top level values should be overwritten specific configuration - $query = "SELECT c.type, c.name, cd.data FROM configuration c LEFT JOIN configuration_data cd + + $query = "SELECT c.type, c.name, cd.data FROM configuration c + LEFT JOIN configuration_data cd ON c.configuration_id = cd.configuration_id - WHERE $filter_string + WHERE $filter_string ORDER BY cd.class ASC, cd.node_id ASC, cd.created_by ASC"; - $result = DB::query('configuration', $query); - if (!$result) { + + //$query = "SELECT type, name, data FROM configuration c"; + $result = DB::query("configuration",$query); + + /* if (!$result) { throw new CoreException('500', 'Unable to get configuration, query failed'); - } + }*/ - while ($config = mysql_fetch_assoc($result)) { + foreach($result as $config) { $type = $config['type']; $name = $config['name']; $data = $config['data']; @@ -131,8 +136,8 @@ public static function database_conf_set($type, $name, $data, $reference = array $query = "SELECT configuration_id FROM configuration WHERE (permission_flag & $permission)=$permission AND type='$type' AND name='$name'"; $result = DB::query('configuration', $query); - if (mysql_num_rows($result)) { - $configuration_id = mysql_result($result, 0, 0); + if (count($result)) { + $configuration_id = $result[0][0]; } else { Corelog::log("Unable to save configuration. type:$type, name:$name", Corelog::ERROR); return; diff --git a/core/lib/Conf/File.php b/core/lib/Conf/File.php old mode 100644 new mode 100755 index 6e87eef..a7019dd --- a/core/lib/Conf/File.php +++ b/core/lib/Conf/File.php @@ -23,6 +23,7 @@ class File extends Conf public static function load($file_path = NULL) { + $configSource = is_file($file_path) ? $file_path : self::$config_file; //reading configuration file. diff --git a/core/lib/Conf/System.php b/core/lib/Conf/System.php old mode 100644 new mode 100755 diff --git a/core/lib/Conf/User.php b/core/lib/Conf/User.php old mode 100644 new mode 100755 diff --git a/core/lib/Config.php b/core/lib/Config.php old mode 100644 new mode 100755 index f5e6969..6ff6e1b --- a/core/lib/Config.php +++ b/core/lib/Config.php @@ -91,8 +91,8 @@ public function __construct($file_name = '', $file_path = '', $gateway_flag = 0) } $result = DB::query('config', "SELECT config_id FROM config WHERE file_name='$this->file_name' AND file_path='$this->file_path'"); - if (mysql_num_rows($result)) { - $this->config_id = mysql_result($result, 0, 0); + if ($result) { + $this->config_id = $result[0][0]; } else { Corelog::log("Creating new Config $this->file_name", Corelog::COMMON); } @@ -112,8 +112,7 @@ public function create($source = '', $is_ini = false) 'version' => 1, 'gateway_flag' => $this->gateway_flag ); - DB::update('config', $data); - $this->config_id = mysql_insert_id(DB::$link); + $this->config_id = DB::update('config', $data); } Corelog::log("Config file created $this->file_name", Corelog::COMMON, $this); @@ -132,8 +131,8 @@ public function drop() public function load($group_name = false, $group_child = false, $description = false, $node_id = false) { - $rsConfig = DB::query('config', "SELECT * FROM config WHERE config_id=$this->config_id LIMIT 1"); - if ($rsConfig && $config = mysql_fetch_object($rsConfig)) { + $config = DB::query('config', "SELECT * FROM config WHERE config_id=$this->config_id LIMIT 1"); + if ($config) { $this->config_id = $config->config_id; $this->source = $config->source; $this->version = $config->version; @@ -160,7 +159,7 @@ public function load($group_name = false, $group_child = false, $description = f WHERE file_name='$this->file_name' $group_filter ORDER BY group_name, group_child, config_data_id"; $rsData = DB::query('config_data', $query); - while ($data_row = mysql_fetch_assoc($rsData)) { + forEach ($rsData as $data_row) { $this->data[] = $data_row['data']; } } @@ -193,15 +192,15 @@ public function insert($raw_data, $raw_description = false, $skip_duplicate = fa $raw_description = $this->description; } - $description = mysql_real_escape_string($raw_description, DB::$link); - $data = mysql_real_escape_string($raw_data, DB::$link); + $description = $raw_description; + $data = $raw_data; if ($skip_duplicate) { $query = "SELECT COUNT(*) FROM config_data WHERE group_name='$this->group_name' AND group_child='$this->group_child' AND data='$data' AND description='$description' AND file_name='$this->file_name'"; - $rsQry = mysql_query($query, DB::$link); - if (mysql_result($rsQry, 0, 0) > 0) { + $rsQry = DB::rawSelect($query); + if ($rsQry[0][0] > 0) { return false; } } @@ -238,7 +237,7 @@ public function update() // currently not fully implemented DB::query('config', "UPDATE config SET version=version+1 WHERE file_name='$this->file_name' LIMIT 1"); $result = DB::query('config', "SELECT version FROM config WHERE file_name='$this->file_name' LIMIT 1"); - $this->version = mysql_result($result, 0, 0); + $this->version = $result[0]; return $this->version; } @@ -288,7 +287,7 @@ public function node_update($node_id, $gateway_flag = false) $query_filter"; $rs1 = DB::query('config', $query); - while ($config = mysql_fetch_object($rs1)) { + forEach ($rs1 as $config) { $this->config_id = $config->config_id; $this->load(false, false, false, $node_id); @@ -313,7 +312,7 @@ public function node_update_ack($node_id) { // insert new record in config_node table if there is not already $result = DB::query('config_node', "SELECT * FROM config_node WHERE config_id=$this->config_id AND node_id=$node_id LIMIT 1"); - if (mysql_num_rows($result) < 1) { + if (count($result) < 1) { DB::query('config_node', "INSERT INTO config_node (config_id, node_id, date_created) VALUES ($this->config_id, $node_id, UNIX_TIMESTAMP())"); } @@ -326,13 +325,16 @@ public function clean() { Corelog::log("Cleaning absolute Config files", Corelog::COMMON); $result = DB::query('config', "SELECT config_id FROM config WHERE version < 0"); - while ($result && $config = mysql_fetch_object($result)) { + if($result){ + forEach ($result as $config) { $rsData = DB::query('config_data', "SELECT * FROM config_node WHERE file_name='$config->file_name' AND version > 0"); - if (!mysql_num_rows($rsData)) { + //:confusion + if (!count($rsData)) { DB::query('config_data', "DELETE FROM config_node WHERE file_name='$config->file_name'"); DB::query('config', "DELETE FROM config WHERE config_id=$config->config_id"); } } + } } } \ No newline at end of file diff --git a/core/lib/CoreException.php b/core/lib/CoreException.php old mode 100644 new mode 100755 diff --git a/core/lib/CoreThread.php b/core/lib/CoreThread.php old mode 100644 new mode 100755 diff --git a/core/lib/Corelog.php b/core/lib/Corelog.php old mode 100644 new mode 100755 diff --git a/core/lib/DB.php b/core/lib/DB.php index c92884c..1ed2cca 100755 --- a/core/lib/DB.php +++ b/core/lib/DB.php @@ -10,379 +10,482 @@ * *************************************************************** */ // DB related functions +use ICT\Core\CoreException; +use PDO; + class DB { + static $link = NULL; + static $pdo = NULL; + + public function __construct() + { + $db_port = Conf::get('db:port', '3306'); + $db_host = Conf::get('db:host', 'localhost') . ':' . $db_port; + $db_user = Conf::get('db:user', 'myuser'); + $db_pass = Conf::get('db:pass', ''); + $db_name = Conf::get('db:name', 'ictcore'); + + try { + self::$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); + self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } catch (Exception $e) { + echo "Connection failed" . $e->getMessage(); + } - static $link = NULL; - - static function connect($link_new = FALSE) - { - $db_port = Conf::get('db:port', '3306'); - $db_host = Conf::get('db:host', 'localhost') . ':' . $db_port; - $db_user = Conf::get('db:user', 'myuser'); - $db_pass = Conf::get('db:pass', ''); - $db_name = Conf::get('db:name', 'ictcore'); + //$dsn = $this->_engine.':dbname='.$this->_db.';host='.$this->_server.';charset=utf8'; + //parent::__construct($dsn, $this->_user, $this->_password); + //$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - $link = mysql_connect($db_host, $db_user, $db_pass, $link_new); - if (!$link) { - throw new CoreException('500', 'Unable to connect database server error:' . mysql_error($link)); - } - $result = mysql_select_db($db_name, $link); - if (!$result) { - throw new CoreException('500', 'Unable to select database'); - } - mysql_query("SET time_zone = '+00:00'", $link); // required to bypass server timezone settings - - return $link; - } - - static function next_record_id($table, $field = '') - { - $result = mysql_query("SELECT sequence FROM sequence WHERE table_name='$table'", DB::$link); - if (mysql_num_rows($result)) { - $newid = mysql_result($result, 0) + 1; - mysql_query("UPDATE sequence SET sequence = $newid WHERE table_name = '$table'", DB::$link); - return $newid; - } else { - $field = $field ? $field : $table . '_id'; - $result = mysql_query("SELECT MAX($field) as newid FROM $table", DB::$link); - if ($result) { - $col_newid = mysql_result($result, 0); - $newid = $col_newid ? $col_newid + 1 : 1; - } else { - $newid = 0; - } - $newid = $newid ? $newid + 1 : 1; - mysql_query("INSERT INTO sequence (table_name, sequence) VALUES ('$table', $newid)", DB::$link); - return $newid; } - } - - static function save_record_id($table, $index) - { - $result = mysql_query("SELECT sequence FROM sequence WHERE table_name='$table'", DB::$link); - if (mysql_num_rows($result)) { - mysql_query("UPDATE sequence SET sequence=$index WHERE table_name='$table'", DB::$link); - } else { - mysql_query("INSERT INTO sequence (table_name, sequence) VALUES ('$table', $index)", DB::$link); - } - } - static function getSelectData($DBName, $DBField, $allData = true, $DBOrderField = '0', $check_auth = FALSE) - { - if ($DBOrderField == '0') { - $DBOrderField = $DBField; - } + static function connect($link_new = FALSE) + { + $db_port = Conf::get('db:port', '3306'); + $db_host = Conf::get('db:host', 'localhost') . ':' . $db_port; + $db_user = Conf::get('db:user', 'myuser'); + $db_pass = Conf::get('db:pass', ''); + $db_name = Conf::get('db:name', 'ictcore'); + + try { + self::$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); + self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } catch (Exception $e) { + echo "Connection failed" . $e->getMessage(); + } + //mysqli_query("SET time_zone = '+00:00'", $link); // required to bypass server timezone settings - if ($allData == true) { - $whereCondition = " WHERE %auth_filter%"; - } else { - $whereCondition = " WHERE " . $DBName . "_id <> 0 AND %auth_filter%"; + return self::$pdo; } - $query = " - SELECT " . $DBName . "_id, " . $DBField . " AS name - FROM " . $DBName . " " . $whereCondition . " - ORDER BY $DBName.$DBOrderField"; + static function next_record_id($table, $field = '') + { + //replacing: $result = mysql_query("SELECT sequence FROM sequence WHERE table_name='$table'", DB::$link); + $stmt = self::$pdo->prepare("SELECT sequence FROM sequence WHERE table_name=:table"); + $stmt->execute(['table' => $table]); + $result = $stmt->fetchAll(); + if ($result) { + $newid = count($result) + 1; + //replacing:mysql_query("UPDATE sequence SET sequence = $newid WHERE table_name = '$table'", DB::$link); + $stmt = self::$pdo->prepare("UPDATE sequence SET sequence = :newid WHERE table_name = :table"); + $stmt->execute(['table' => $table, 'newid' => $newid]); + return $newid; + } else { + $field = $field ? $field : $table . '_id'; + //$result = mysql_query("SELECT MAX($field) as newid FROM $table", DB::$link); + //searching maximum value in _id column that is the last id + $stmt = self::$pdo->prepare("SELECT MAX($field) as newid FROM $table"); + $stmt->execute(); + $result = $stmt->fetch(); + if ($result) { + //Replacing: $col_newid = $result[0]; + $col_newid = $result[0]; + $newid = $col_newid ? $col_newid + 1 : 1; + } else { + $newid = 0; + } + $newid = $newid ? $newid + 1 : 1; - return self::getSelectData_custom($DBName, $query, $check_auth); - } + //mysql_query("INSERT INTO sequence (table_name, sequence) VALUES ('$table', $newid)", DB::$link); - static function getSelectData_custom($DBTable, $query, $check_auth = FALSE) - { + $stmt = self::$pdo->prepare("INSERT INTO sequence (table_name, sequence) VALUES (:table, :newid)"); + $stmt->execute(['table_name' => $table, 'newid' => $newid]); - $result = self::query($DBTable, $query, array(), $check_auth); - $aRecord = array(); - while ($record = mysql_fetch_array($result)) { - if (!empty($record[1]) && !is_null($record[1])) { - $id = $record[0]; - $aRecord[$id] = $record[1]; - } + return $newid; + } } - return $aRecord; - } + static function column_list($table) + { + $aColumn = array(); + //$result = mysql_query("SHOW COLUMNS FROM $table", DB::$link); + try { + $stmt = self::$pdo->query("SHOW COLUMNS FROM $table "); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); - static function column_list($table) - { - $aColumn = array(); - $result = mysql_query("SHOW COLUMNS FROM $table", DB::$link); - if ($result === FALSE) { - Corelog::log("DB:unknown table: $table: " . mysql_error(DB::$link), Corelog::ERROR); - return FALSE; - } - while ($column = mysql_fetch_assoc($result)) { - $column_name = $column['Field']; - $aColumn[$column_name] = $column; + if (!$result) { + return FALSE; + } + foreach ($result as $column) { + $column_name = $column['Field']; + $aColumn[$column_name] = $column; + } + } catch (\Exception $exception) { + echo $exception->getMessage(); + Corelog::log("DB:unknown table: $table: " . $exception->getMessage(), Corelog::ERROR); + } + return $aColumn; } - return $aColumn; - } - - static function column_map($aColumn, $aData) - { - static $non_text = array('bit', 'bigint', 'bool', 'boolean', - 'dec', 'decimal', 'double', 'float', - 'int', 'integer', 'mediumint', 'real', - 'smallint', 'tinyint', 'function' - ); - $aMap = array(); // an item will consist array('field' => column_id, 'value' => 'something', is_string = false, 'default' = NULL); - // Field | Type | Null | Key | Default | Extra ==> Value - foreach ($aColumn as $column_name => $column) { - if (array_key_exists($column_name, $aData) && $aData[$column_name] !== NULL) { - $type = strtolower(substr($column['Type'], 0, strpos($column['Type'], '('))); - $aMap[$column_name] = array( - 'name' => $column['Field'], - 'value' => mysql_real_escape_string($aData[$column_name], DB::$link), - 'is_string' => !in_array(trim($type), $non_text), // treat as string field not is a number - 'default' => $column['Default'] + + static function column_map($aColumn, $aData) + { + static $non_text = array('bit', 'bigint', 'bool', 'boolean', + 'dec', 'decimal', 'double', 'float', + 'int', 'integer', 'mediumint', 'real', + 'smallint', 'tinyint', 'function' ); - } - } + $aMap = array(); // an item will consist array('field' => column_id, 'value' => 'something', is_string = false, 'default' = NULL); + // Field | Type | Null | Key | Default | Extra ==> Value + foreach ($aColumn as $column_name => $column) { + if (array_key_exists($column_name, $aData) && $aData[$column_name] !== NULL) { + $type = strtolower(substr($column['Type'], 0, strpos($column['Type'], '('))); + $aMap[$column_name] = array( + 'name' => $column['Field'], + 'value' => $aData[$column_name], + 'is_string' => !in_array(trim($type), $non_text), // treat as string field not is a number + 'default' => $column['Default'] + ); + } + } - return $aMap; - } - - static function where($table, $conditions, $glue = 'AND', $start = 'WHERE') - { - $aColumn = self::column_list($table); - $aFilter = self::column_map($aColumn, $conditions); - - $cond = array(); - foreach ($aFilter as $field => $filter) { - $value = $filter['value']; - if (is_numeric($value)) { - $cond[] = "$field = $value"; - } else if (strpos($value, 'auth_filter') !== false) { - $cond[] = "$value"; - } else if (strpos($value, '%') !== false) { - $cond[] = "$field LIKE '$value'"; - } else if (strpos($value, '=') !== false || strpos($value, '>') !== false || strpos($value, '<') !== false) { - $cond[] = "$field $value"; - } else { - $cond[] = "$field = '$value'"; - } - } - $cond_str = implode(" $glue ", $cond); - if ($cond_str != '') { - return trim("$start ($cond_str)"); + return $aMap; } - return ''; - } - - static function update($table, &$values, $primary_key = FALSE, $check_auth = FALSE, $foreign_table = '', $foreign_key = '') - { - static $non_text = array('bit', 'bigint', 'bool', 'boolean', - 'dec', 'decimal', 'double', 'float', - 'int', 'integer', 'mediumint', 'real', - 'smallint', 'tinyint', 'function' - ); - - $row_id = FALSE; - $oSession = Session::get_instance(); - $user_id = $oSession->user->user_id; - $columns = array(); - $data = array(); - $query_start = ''; - $query_end = ''; - //$query_data = ''; - - $col_result = mysql_query("SHOW COLUMNS FROM $table", DB::$link); - if ($col_result === FALSE) { - Corelog::log("DB:unknown table: $table: " . mysql_error(DB::$link), Corelog::ERROR); - return FALSE; + + static function where($table, $conditions, $glue = 'AND', $start = 'WHERE') + { + $aColumn = self::column_list($table); + $aFilter = self::column_map($aColumn, $conditions); + + $cond = array(); + foreach ($aFilter as $field => $filter) { + $value = $filter['value']; + if (is_numeric($value)) { + $cond[] = "$field = $value"; + } else if (strpos($value, 'auth_filter') !== false) { + $cond[] = "$value"; + } else if (strpos($value, '%') !== false) { + $cond[] = "$field LIKE '$value'"; + } else if (strpos($value, '=') !== false || strpos($value, '>') !== false || strpos($value, '<') !== false) { + $cond[] = "$field $value"; + } else { + $cond[] = "$field = '$value'"; + } + } + $cond_str = implode(" $glue ", $cond); + if ($cond_str != '') { + return trim("$start ($cond_str)"); + } + return ''; } - // Field | Type | Null | Key | Default | Extra ==> Value - while ($column = mysql_fetch_assoc($col_result)) { - $column_name = $column['Field']; - - switch ($column_name) { - case 'date_created': - case 'last_updated': - $columns[$column_name] = $column; - $columns[$column_name]['Value'] = time(); - break; - case 'updated_by': - $columns[$column_name] = $column; - $columns[$column_name]['Value'] = $user_id; - break; - case 'created_by': - $columns[$column_name] = $column; - $columns[$column_name]['Value'] = $user_id; - if (!can_access($table . '_admin')) { - // if no admin then prevent this field from being customized - break; - } - default: - if (array_key_exists($column_name, $values) && $values[$column_name] !== NULL) { - // update <= or if INSERT then don't include empty values - if ($primary_key !== FALSE || ($primary_key === FALSE && $values[$column_name] != '')) { - $columns[$column_name] = $column; - $columns[$column_name]['Value'] = mysql_real_escape_string($values[$column_name], DB::$link); + + static function update($table, &$values, $primary_key = FALSE, $check_auth = FALSE, $foreign_table = '', $foreign_key = '') + { + static $non_text = array('bit', 'bigint', 'bool', 'boolean', + 'dec', 'decimal', 'double', 'float', + 'int', 'integer', 'mediumint', 'real', + 'smallint', 'tinyint', 'function' + ); + + $row_id = FALSE; + $oSession = Session::get_instance(); + $user_id = $oSession->user->user_id; + $columns = array(); + $data = array(); + + // $col_result = mysql_query("SHOW COLUMNS FROM $table", DB::$link); + try { + $stmt = self::$pdo->query("SHOW COLUMNS FROM $table "); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (!$result) { + return FALSE; + } + + + // Field | Type | Null | Key | Default | Extra ==> Value + foreach ($result as $column) { + $column_name = $column['Field']; + + switch ($column_name) { + case 'date_created': + case 'last_updated': + $columns[$column_name] = $column; + $columns[$column_name]['Value'] = time(); + break; + case 'updated_by': + $columns[$column_name] = $column; + $columns[$column_name]['Value'] = $user_id; + break; + case 'created_by': + $columns[$column_name] = $column; + $columns[$column_name]['Value'] = $user_id; + if (!can_access($table . '_admin')) { + // if no admin then prevent this field from being customized + break; + } + default: + if (array_key_exists($column_name, $values) && $values[$column_name] !== NULL) { + // update <= or if INSERT then don't include empty values + if ($primary_key !== FALSE || ($primary_key === FALSE && $values[$column_name] != '')) { + $columns[$column_name] = $column; + $columns[$column_name]['Value'] = $values[$column_name]; + } + } + break; + } + } + + if ($primary_key === FALSE) { // new record => INSERT + // this will fix a bug related to pooerly written loops + if (isset($values['primary_key']) && $values['primary_key'] == $values[$table . '_id']) { + unset($values['primary_key']); + unset($values[$table . '_id']); + } + unset($columns['updated_by']); + unset($columns['last_updated']); + + if ($check_auth && $foreign_table != '') { + $foreign_value = $columns[$foreign_key]['Value']; + if (!self::auth_filter($foreign_table, $foreign_key, $foreign_value)) { + return FALSE; + } + } + + $query_start = "INSERT INTO $table SET"; + $query_end = ''; + } else { // existing record => UPDATE + $row_id = $columns[$primary_key]['Value']; + + /* // remove unchanged columns from query + $current_rs = mysql_query("SELECT * FROM $table_name WHERE $primary_key = $row_id", DB::$link); + $current_data = mysql_fetch_assoc($current_rs); + foreach ($columns as $col_name => $col_value) { + if ($col_value == $current_data[$col_name]) { + unset($columns[$col_name]); + } + } */ + + unset($columns[$primary_key]); + unset($columns['created_by']); + unset($columns['date_created']); + + $query_start = "UPDATE $table SET"; + + if ($check_auth) { + if ($foreign_table == '') { // main table + $auth_filter = self::auth_filter($table); + } else { // sub table + $foreign_value = $columns[$foreign_key]['Value']; + unset($columns[$foreign_key]); + $auth_filter = self::auth_filter($foreign_table, $foreign_key, $foreign_value); + } + if (is_bool($auth_filter)) { + $auth_filter = ($auth_filter) ? 'TRUE' : 'FALSE'; + } + $query_end = "WHERE $primary_key=$row_id AND $auth_filter"; + } else { + $query_end = "WHERE $primary_key=$row_id"; + } + } + + foreach ($columns as $key => $column) { + $value = $column['Value']; + $type = strtolower(substr($column['Type'], 0, strpos($column['Type'], '('))); + if (in_array(trim($type), $non_text)) { // number + if ("$value" === '') { // don't allow empty value as number, instead replace it with NULL + $data[$key] = "$key=NULL"; + } else { + $data[$key] = "$key=$value"; + } + } else { // string + $data[$key] = "$key='$value'"; + } + } + $query_data = implode($data, ', '); + $query_full = "$query_start $query_data $query_end"; + try { + $qry_result = self::$pdo->query($query_full)->execute(); + Corelog::log("DB:update query executed on table: $table", Corelog::DEBUG, $query_full); + $values['primary_key'] = self::$pdo->lastInsertId(); + if ($primary_key === FALSE) { + $values[$table . '_id'] = $values['primary_key']; + } + return $qry_result; + } catch (\Exception $exception) { + Corelog::log("DB:update error table: $table error: " . $exception->getMessage(), Corelog::WARNING); + return FALSE; } - } - break; - } + + + } catch (\Exception $exception) { + Corelog::log("DB:unknown table: $table: " . $exception->getMessage(), Corelog::ERROR); + return FALSE; + } + + + } + + public static function query_result($table, $query) + { + try { + $stmt = self::$pdo->query($query); + $stmt->execute(); + $result = $stmt->fetchColumn(); + return $result; + } catch (\Exception $exception) { + echo $exception->getMessage(); + } } - if ($primary_key === FALSE) { // new record => INSERT - // this will fix a bug related to pooerly written loops - if (isset($values['primary_key']) && $values['primary_key'] == $values[$table . '_id']) { - unset($values['primary_key']); - unset($values[$table . '_id']); - } - unset($columns['updated_by']); - unset($columns['last_updated']); - - if ($check_auth && $foreign_table != '') { - $foreign_value = $columns[$foreign_key]['Value']; - if (!self::auth_filter($foreign_table, $foreign_key, $foreign_value)) { - return FALSE; + static function query($table, $req_query, $aValues = array(), $check_auth = FALSE, $foreign_table = '', $foreign_key = '') + { + // echo PHP_EOL; + //echo $req_query." "; + //echo PHP_EOL; + // print_r($aValues); + //echo PHP_EOL; + + $values = array(); + foreach ($aValues as $key => $value) { + $values["%$key%"] = $value; } - } - - $query_start = "INSERT INTO $table SET"; - $query_end = ''; - } else { // existing record => UPDATE - $row_id = $columns[$primary_key]['Value']; - - /* // remove unchanged columns from query - $current_rs = mysql_query("SELECT * FROM $table_name WHERE $primary_key = $row_id", DB::$link); - $current_data = mysql_fetch_assoc($current_rs); - foreach ($columns as $col_name => $col_value) { - if ($col_value == $current_data[$col_name]) { - unset($columns[$col_name]); + if ($check_auth) { + if ($foreign_table == '') { + $values['%auth_filter%'] = self::auth_filter($table); + } else { + $values['%auth_filter%'] = self::auth_filter($foreign_table, $foreign_key, $values["%$foreign_key%"]); + } + } else { + $values['%auth_filter%'] = TRUE; } - } */ - unset($columns[$primary_key]); - unset($columns['created_by']); - unset($columns['date_created']); + // in case of Boolean following code will remove table prefix if any exist with auth_filter + if (is_bool($values['%auth_filter%'])) { + $boolStr = ($values['%auth_filter%']) ? 'TRUE' : 'FALSE'; + $req_query = preg_replace('/(\w*\.)?\%auth_filter\%/', $boolStr, $req_query); + } - $query_start = "UPDATE $table SET"; - if ($check_auth) { - if ($foreign_table == '') { // main table - $auth_filter = self::auth_filter($table); - } else { // sub table - $foreign_value = $columns[$foreign_key]['Value']; - unset($columns[$foreign_key]); - $auth_filter = self::auth_filter($foreign_table, $foreign_key, $foreign_value); - } - if (is_bool($auth_filter)) { - $auth_filter = ($auth_filter) ? 'TRUE' : 'FALSE'; + $final_query = str_replace(array_keys($values), array_values($values), $req_query); + Corelog::log("DB:query executed on table: $table", Corelog::DEBUG, $final_query); + + //echo PHP_EOL.$final_query . PHP_EOL; + + //return mysql_query($final_query, DB::$link); + try { + $stmt = self::$pdo->query($final_query); + $stmt->execute(); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + return $result; + } catch (\Exception $exception) { + echo $exception->getMessage(); } - $query_end = "WHERE $primary_key=$row_id AND $auth_filter"; - } else { - $query_end = "WHERE $primary_key=$row_id"; - } + + } - foreach ($columns as $key => $column) { - $value = $column['Value']; - $type = strtolower(substr($column['Type'], 0, strpos($column['Type'], '('))); - if (in_array(trim($type), $non_text)) { // number - if ("$value" === '') { // don't allow empty value as number, instead replace it with NULL - $data[$key] = "$key=NULL"; + + static function delete($table, $primary_key, $row_id, $check_auth = FALSE, $foreign_table = '', $foreign_key = '', $foreign_value = '') + { + $values = array($primary_key => $row_id); + Corelog::log("DB:delete requested on table: $table", Corelog::DEBUG); + + if ($check_auth) { + $query = "DELETE FROM $table WHERE $primary_key=%$primary_key% AND %auth_filter%"; + $values[$foreign_key] = $foreign_value; + return self::raw_insert_delete_update($table, $query, $values, TRUE, $foreign_table, $foreign_key); } else { - $data[$key] = "$key=$value"; + $query = "DELETE FROM $table WHERE $primary_key=%$primary_key%"; + return self::raw_insert_delete_update($table, $query, $values, FALSE); } - } else { // string - $data[$key] = "$key='$value'"; - } - } - $query_data = implode($data, ', '); - $query_full = "$query_start $query_data $query_end"; - $qry_result = mysql_query($query_full, DB::$link); - Corelog::log("DB:update query executed on table: $table", Corelog::DEBUG, $query_full); - if ($qry_result === FALSE) { - Corelog::log("DB:update error table: $table error: " . mysql_error(DB::$link), Corelog::WARNING); - return FALSE; - } - $values['primary_key'] = mysql_insert_id(DB::$link); - if ($primary_key === FALSE) { - $values[$table . '_id'] = $values['primary_key']; - } - return $qry_result; - } - - public static function query_result($table, $query, $aValues = array(), $check_auth = FALSE, $foreign_table = '', $foreign_key = '') - { - $result = self::query($table, $query, $aValues , $check_auth, $foreign_table, $foreign_key); - if (is_resource($result)) { - return mysql_result($result, 0); - } - return null; - } - - static function query($table, $req_query, $aValues = array(), $check_auth = FALSE, $foreign_table = '', $foreign_key = '') - { - $values = array(); - foreach ($aValues as $key => $value) { - $values["%$key%"] = mysql_real_escape_string($value, DB::$link); } - if ($check_auth) { - if ($foreign_table == '') { - $values['%auth_filter%'] = self::auth_filter($table); - } else { - $values['%auth_filter%'] = self::auth_filter($foreign_table, $foreign_key, $values["%$foreign_key%"]); - } - } else { - $values['%auth_filter%'] = TRUE; + static function auth_filter($table, $auth_key = 'created_by', $auth_value = FALSE) + { + if (can_access($table . '_admin')) { + echo " ADmin access "; + return TRUE; + } else { + $oSession = Session::get_instance(); + if ($auth_key == 'created_by') { // main table + $auth_value = $oSession->user->user_id; + if (empty($auth_value)) { + return FALSE; // null user id is not allowed + } + } else { // sub table + $user_value = $oSession->user->user_id; + if (empty($user_value)) { + return FALSE; // null user id is not allowed + } + $user_key = 'created_by'; + //Not required in pdo + //$auth_value = mysql_real_escape_string($auth_value, DB::$link); + $parent_query = "SELECT $auth_key FROM $table WHERE $auth_key=$auth_value AND $user_key=$user_value"; + + self::rawSelect($parent_query); + } + + echo " Auth key vlaue:"; + echo "$auth_key=$auth_value "; + + return "$auth_key=$auth_value"; + } } - // in case of Boolean following code will remove table prefix if any exist with auth_filter - if (is_bool($values['%auth_filter%'])) { - $boolStr = ($values['%auth_filter%']) ? 'TRUE' : 'FALSE'; - $req_query = preg_replace('/(\w*\.)?\%auth_filter\%/', $boolStr, $req_query); + public static function rawSelect($query) + { + try { + $stmt = self::$pdo->query($query); + $stmt->execute(); + $result = $stmt->fetchAll(); + return $result; + } catch (\Exception $exception) { + echo $exception->getMessage(); + return FALSE; + } + } - $final_query = str_replace(array_keys($values), array_values($values), $req_query); - Corelog::log("DB:query executed on table: $table", Corelog::DEBUG, $final_query); - return mysql_query($final_query, DB::$link); - } - - static function delete($table, $primary_key, $row_id, $check_auth = FALSE, $foreign_table = '', $foreign_key = '', $foreign_value = '') - { - $values = array($primary_key => $row_id); - Corelog::log("DB:delete requested on table: $table", Corelog::DEBUG); - - if ($check_auth) { - $query = "DELETE FROM $table WHERE $primary_key=%$primary_key% AND %auth_filter%"; - $values[$foreign_key] = $foreign_value; - return self::query($table, $query, $values, TRUE, $foreign_table, $foreign_key); - } else { - $query = "DELETE FROM $table WHERE $primary_key=%$primary_key%"; - return self::query($table, $query, $values, FALSE); + public static function raw_insert_delete_update($query) + { + try { + $stmt = self::$pdo->query($query); + $stmt->execute(); + return $stmt->rowCount(); + } catch (\Exception $exception) { + echo $exception->getMessage(); + return 0; + } } - } - - static function auth_filter($table, $auth_key = 'created_by', $auth_value = FALSE) - { - if (can_access($table . '_admin')) { - return TRUE; - } else { - $oSession = Session::get_instance(); - if ($auth_key == 'created_by') { // main table - $auth_value = $oSession->user->user_id; - if (empty($auth_value)) { - return FALSE; // null user id is not allowed + + + static function insert_delete_update($table, $req_query, $aValues = array(), $check_auth = FALSE, $foreign_table = '', $foreign_key = '') + { + $values = array(); + foreach ($aValues as $key => $value) { + $values["%$key%"] = $value; + } + if ($check_auth) { + if ($foreign_table == '') { + $values['%auth_filter%'] = self::auth_filter($table); + } else { + $values['%auth_filter%'] = self::auth_filter($foreign_table, $foreign_key, $values["%$foreign_key%"]); + } + } else { + $values['%auth_filter%'] = TRUE; } - } else { // sub table - $user_value = $oSession->user->user_id; - if (empty($user_value)) { - return FALSE; // null user id is not allowed + + // in case of Boolean following code will remove table prefix if any exist with auth_filter + if (is_bool($values['%auth_filter%'])) { + $boolStr = ($values['%auth_filter%']) ? 'TRUE' : 'FALSE'; + $req_query = preg_replace('/(\w*\.)?\%auth_filter\%/', $boolStr, $req_query); } - $user_key = 'created_by'; - $auth_value = mysql_real_escape_string($auth_value, DB::$link); - $parent_query = "SELECT $auth_key FROM $table WHERE $auth_key=$auth_value AND $user_key=$user_value"; - $parent_result = mysql_query($parent_query, DB::$link); - if (mysql_num_rows($parent_result) == NULL) { - return FALSE; + + + $final_query = str_replace(array_keys($values), array_values($values), $req_query); + Corelog::log("DB:query executed on table: $table", Corelog::DEBUG, $final_query); + + try { + $stmt = self::$pdo->query($final_query); + $stmt->execute(); + return $stmt->rowCount(); + } catch (\Exception $exception) { + echo $exception->getMessage(); } - } - return "$auth_key=$auth_value"; + } - } + + + } diff --git a/core/lib/Data.php b/core/lib/Data.php old mode 100644 new mode 100755 diff --git a/core/lib/Http.php b/core/lib/Http.php old mode 100644 new mode 100755 diff --git a/core/lib/Scheme.php b/core/lib/Scheme.php old mode 100644 new mode 100755 diff --git a/core/lib/Scheme/Node.php b/core/lib/Scheme/Node.php old mode 100644 new mode 100755 diff --git a/core/lib/Session.php b/core/lib/Session.php old mode 100644 new mode 100755 index 58258f4..2ef4781 --- a/core/lib/Session.php +++ b/core/lib/Session.php @@ -95,13 +95,14 @@ public function read($id) { Corelog::log("Session read requested with id: $id", Corelog::DEBUG); session_write_close(); - $query = "SELECT data FROM session WHERE session_id='$id'"; - if (!$result = mysql_query($query, $this->_db_link)) { - Corelog::log("Session read failed with error: " . mysql_error($this->_db_link), Corelog::WARNING); + $query = "SELECT data FROM session WHERE session_id='".$id."'"; + if (!$result = DB::rawSelect($query)) { + Corelog::log("Session read failed with error: ", Corelog::WARNING); return FALSE; } - if (mysql_num_rows($result)) { - $row = mysql_fetch_assoc($result); + + if (count($result)) { + $row = $result; $data = unserialize($row["data"]); if ($data instanceof Data) { $this->merge($data); @@ -120,15 +121,15 @@ public function write($id, $data) $data = $this; } $values = array( - '%id%' => mysql_real_escape_string($id, $this->_db_link), - '%data%' => mysql_real_escape_string(serialize($data), $this->_db_link) + '%id%' => $id, + '%data%' => serialize($data) ); $query = "INSERT INTO session (session_id, time_start, data) VALUES ('%id%', UNIX_TIMESTAMP(), '%data%') ON DUPLICATE KEY UPDATE time_start=UNIX_TIMESTAMP(), data='%data%'"; $final_query = str_replace(array_keys($values), array_values($values), $query); - mysql_query($final_query, $this->_db_link); - if (mysql_affected_rows($this->_db_link)) { + + if (DB::raw_insert_delete_update($final_query)>0) { return TRUE; } Corelog::log("Session write failed", Corelog::WARNING); @@ -138,7 +139,7 @@ public function destroy($id) { Corelog::log("Session delete requested with id: $id", Corelog::DEBUG); $query = "DELETE FROM session where session_id='$id'"; - $result = mysql_query($query, $this->_db_link); + $result = DB::raw_insert_delete_update($query); if ($result) { return TRUE; } else { @@ -150,7 +151,7 @@ public function gc($life) { Corelog::log("Session gc requested with lif: $life", Corelog::DEBUG); $query = "DELETE FROM session WHERE time_start < " . (time() - $life); - $result = mysql_query($query, $this->_db_link); + $result = DB::raw_insert_delete_update($query); if ($result) { return TRUE; } else { diff --git a/core/lib/Thread/Process.php b/core/lib/Thread/Process.php old mode 100644 new mode 100755 diff --git a/core/lib/Thread/Send.php b/core/lib/Thread/Send.php old mode 100644 new mode 100755 diff --git a/core/lib/Thread/Task.php b/core/lib/Thread/Task.php old mode 100644 new mode 100755 diff --git a/core/lib/Token.php b/core/lib/Token.php old mode 100644 new mode 100755 diff --git a/core/lib/common.php b/core/lib/common.php old mode 100644 new mode 100755 index ca64e01..099b358 --- a/core/lib/common.php +++ b/core/lib/common.php @@ -129,9 +129,9 @@ function do_login($user) } $oSession->user = $oUser; - ICT\Core\Conf\User::load(); + \ICT\Core\Conf\User::load(); Corelog::log("do_login, results", Corelog::DEBUG, $oSession->user); - \ICT\Core\Conf\User::load(); + \ICT\Core\Conf\User::load(); return $oSession->user; } diff --git a/core/lib/init.php b/core/lib/init.php old mode 100644 new mode 100755 index fa44884..ffed034 --- a/core/lib/init.php +++ b/core/lib/init.php @@ -35,7 +35,7 @@ include_once "common.php"; // common functions // Read database and other basic configuration from configuration file -ConfFile::load('/etc/ictcore.conf'); +ConfFile::load($path_etc.'/ictcore.conf'); // Corelog will be our default error handler set_error_handler(array('ICT\\Core\\Corelog', 'error_handler'), E_ALL); diff --git a/data/document/.gitignore b/data/document/.gitignore old mode 100644 new mode 100755 diff --git a/data/recording/.gitignore b/data/recording/.gitignore old mode 100644 new mode 100755 diff --git a/data/template/.gitignore b/data/template/.gitignore old mode 100644 new mode 100755 diff --git a/db/data/role_admin.sql b/db/data/role_admin.sql index 650e15d..238d692 100755 --- a/db/data/role_admin.sql +++ b/db/data/role_admin.sql @@ -1,8 +1,5 @@ INSERT INTO role(name, description) VALUES ('admin', 'system administrator'); - --- permissions for admin role SELECT @roleId := role_id FROM role WHERE name='admin'; --- provider permissions SELECT @permissionId := permission_id FROM permission WHERE name='api'; INSERT INTO role_permission VALUES (NULL, @roleId, @permissionId); /* api */ SELECT @permissionId := permission_id FROM permission WHERE name='statistic'; diff --git a/db/database.sql b/db/database.sql old mode 100644 new mode 100755 index 33c9120..85e19e5 --- a/db/database.sql +++ b/db/database.sql @@ -384,13 +384,13 @@ CREATE TABLE configuration /*==============================================================*/ CREATE TABLE configuration_data ( - configuration_id int(11) default NULL, + configuration_id int(11) NOT NULL, class int(11) default 1, node_id int(11) unsigned default 0, - campaign_id int(11) unsigned default NULL, + campaign_id int(11) unsigned NOT NULL, data varchar(255) default NULL, date_created int(11) default NULL, - created_by int(11) default NULL, + created_by int(11) NOT NULL, last_updated int(11) default NULL, updated_by int(11) unsigned default NULL, PRIMARY KEY (configuration_id, class, node_id, created_by, campaign_id) @@ -604,7 +604,7 @@ DELIMITER ; /*==============================================================*/ CREATE TABLE session ( - session_id varchar(80) default NULL, + session_id varchar(80) NOT NULL, time_start int(11) default 0, data text, PRIMARY KEY (session_id) diff --git a/db/email.sql b/db/email.sql old mode 100644 new mode 100755 index 26e539b..ff6e9a7 --- a/db/email.sql +++ b/db/email.sql @@ -32,7 +32,9 @@ CREATE INDEX template_created_by ON template (created_by); /* Desc: Dumping Default System configurations */ /*==============================================================*/ -- service -INSERT INTO configuration VALUES (NULL,'service','email_status','0',254); --ready +INSERT INTO configuration VALUES (NULL,'service','email_status','0',254); + +-- ready /*==============================================================*/ /* Table: insert email module permissions */ diff --git a/db/fax.sql b/db/fax.sql old mode 100644 new mode 100755 index 501e0d0..008c87e --- a/db/fax.sql +++ b/db/fax.sql @@ -33,8 +33,8 @@ CREATE INDEX document_created_by ON document (created_by); /*==============================================================*/ /* Desc: Dumping Default System configurations */ /*==============================================================*/ --- service -INSERT INTO configuration VALUES (NULL,'service','fax_status','0',254); --ready + +INSERT INTO configuration VALUES (NULL,'service','fax_status','0',254); /*==============================================================*/ /* Table: insert fax module permissions */ diff --git a/db/ictfax.sql b/db/ictfax.sql old mode 100644 new mode 100755 index 9b0d3b6..f13c8cf --- a/db/ictfax.sql +++ b/db/ictfax.sql @@ -1,16 +1,12 @@ DROP TRIGGER IF EXISTS usr_insert; -DELIMITER | CREATE TRIGGER usr_insert AFTER INSERT ON usr FOR EACH ROW BEGIN INSERT INTO account (account_id, type, username, passwd, passwd_pin, first_name, last_name, phone, email, address, active, date_created, created_by, last_updated, updated_by) SELECT NULL, 'eaddress', NEW.username, NEW.passwd, LEFT(RAND()*999999, 4), NEW.first_name, NEW.last_name, NEW.phone, NEW.email, NEW.address, NEW.active, NEW.date_created, NEW.usr_id, NULL, NULL; - END | | CREATE TRIGGER usr_update AFTER UPDATE ON usr FOR EACH ROW BEGIN UPDATE account SET email = NEW.email WHERE type = 'eaddress' AND created_by = NEW.usr_id limit 1; - END | -DELIMITER ; diff --git a/db/sms.sql b/db/sms.sql old mode 100644 new mode 100755 index 35c85f2..34cfdba --- a/db/sms.sql +++ b/db/sms.sql @@ -28,13 +28,11 @@ CREATE TABLE text /*==============================================================*/ /* Desc: Dumping Default System configurations */ /*==============================================================*/ --- service -INSERT INTO configuration VALUES (NULL,'service','sms_status','0',254); --ready +INSERT INTO configuration VALUES (NULL,'service','sms_status','0',254); /*==============================================================*/ /* Table: insert sms module permissions */ /*==============================================================*/ --- Text permissions INSERT INTO permission VALUES (NULL, 'text', ''); INSERT INTO permission VALUES (NULL, 'text_create', ''); INSERT INTO permission VALUES (NULL, 'text_list', ''); diff --git a/db/update/update_0.7.0-to-0.7.1.sql b/db/update/update_0.7.0-to-0.7.1.sql old mode 100644 new mode 100755 diff --git a/db/update/update_0.7.1-to-0.8.0.sql b/db/update/update_0.7.1-to-0.8.0.sql old mode 100644 new mode 100755 diff --git a/db/update/update_0.8.0-to-0.8.x.sql b/db/update/update_0.8.0-to-0.8.x.sql old mode 100644 new mode 100755 diff --git a/db/voice.sql b/db/voice.sql old mode 100644 new mode 100755 index a16b6cd..065249b --- a/db/voice.sql +++ b/db/voice.sql @@ -32,13 +32,12 @@ CREATE INDEX recording_created_by ON recording (created_by); /*==============================================================*/ /* Desc: Dumping Default System configurations */ /*==============================================================*/ --- service -INSERT INTO configuration VALUES (NULL,'service','voice_status','0',254); --ready + +INSERT INTO configuration VALUES (NULL,'service','voice_status','0',254); /*==============================================================*/ /* Table: insert voice module permissions */ /*==============================================================*/ --- Recording permissions INSERT INTO permission VALUES (NULL, 'recording', ''); INSERT INTO permission VALUES (NULL, 'recording_create', ''); INSERT INTO permission VALUES (NULL, 'recording_list', ''); diff --git a/docs/ApiGuide.md b/docs/ApiGuide.md old mode 100644 new mode 100755 diff --git a/docs/api.md b/docs/api.md old mode 100644 new mode 100755 diff --git a/docs/developer-guide/common.md b/docs/developer-guide/common.md old mode 100644 new mode 100755 diff --git a/docs/developer-guide/introduction.md b/docs/developer-guide/introduction.md old mode 100644 new mode 100755 diff --git a/docs/features.md b/docs/features.md old mode 100644 new mode 100755 diff --git a/docs/intro_components.md b/docs/intro_components.md old mode 100644 new mode 100755 diff --git a/etc/freeswitch/.gitignore b/etc/freeswitch/.gitignore old mode 100644 new mode 100755 diff --git a/etc/freeswitch/dialplan/provider/.gitkeep b/etc/freeswitch/dialplan/provider/.gitkeep old mode 100644 new mode 100755 diff --git a/etc/freeswitch/dialplan/user/.gitkeep b/etc/freeswitch/dialplan/user/.gitkeep old mode 100644 new mode 100755 diff --git a/etc/freeswitch/directory/account/.gitkeep b/etc/freeswitch/directory/account/.gitkeep old mode 100644 new mode 100755 diff --git a/etc/freeswitch/sip_profiles/provider/.gitkeep b/etc/freeswitch/sip_profiles/provider/.gitkeep old mode 100644 new mode 100755 diff --git a/etc/http/ictcore.conf b/etc/http/ictcore.conf old mode 100644 new mode 100755 diff --git a/etc/ictcore.conf b/etc/ictcore.conf index 86771e5..be8c148 100755 --- a/etc/ictcore.conf +++ b/etc/ictcore.conf @@ -36,8 +36,8 @@ node_id = 1 [db] host = localhost port = 3306 -user = myuser -pass = mypass +user = banna +pass = Alio@1610 name = ictcore type = mysql diff --git a/etc/kannel/.gitignore b/etc/kannel/.gitignore old mode 100644 new mode 100755 diff --git a/etc/kannel/provider/.gitkeep b/etc/kannel/provider/.gitkeep old mode 100644 new mode 100755 diff --git a/etc/postscript/rotate.ps b/etc/postscript/rotate.ps old mode 100644 new mode 100755 diff --git a/log/.gitignore b/log/.gitignore old mode 100644 new mode 100755 diff --git a/tests/bootstrap.php b/tests/bootstrap.php old mode 100644 new mode 100755 diff --git a/tests/client.php b/tests/client.php old mode 100644 new mode 100755 diff --git a/tests/configuration.xml b/tests/configuration.xml old mode 100644 new mode 100755 diff --git a/tests/core/ContactTest.php b/tests/core/ContactTest.php old mode 100644 new mode 100755 diff --git a/tests/core/lib/DataTest.php b/tests/core/lib/DataTest.php old mode 100644 new mode 100755 diff --git a/tests/core/lib/SessionTest.php b/tests/core/lib/SessionTest.php old mode 100644 new mode 100755 diff --git a/tests/core/lib/TokenTest.php b/tests/core/lib/TokenTest.php old mode 100644 new mode 100755 diff --git a/tests/get.php b/tests/get.php old mode 100644 new mode 100755 diff --git a/wwwroot/gateway.php b/wwwroot/gateway.php old mode 100644 new mode 100755