From b77392b6393ba93fc9e1883831498df979d1c4c2 Mon Sep 17 00:00:00 2001 From: administrator Date: Thu, 9 Jul 2026 08:02:27 +0000 Subject: [PATCH] =?UTF-8?q?chore:=20initial=20commit=20=E2=80=94=20Jumio?= =?UTF-8?q?=20IDV=20demo=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 ++ AGENTS.md | 48 ++++++++ html/app/controler/dev.php | 61 ++++++++++ html/app/controler/request.php | 116 +++++++++++++++++++ html/app/controler/start.php | 87 +++++++++++++++ html/app/model/M01.php | 120 ++++++++++++++++++++ html/app/model/M04.php | 120 ++++++++++++++++++++ html/app/model/docv.php | 90 +++++++++++++++ html/app/model/retrival_1.php | 46 ++++++++ html/app/model/retrival_2.php | 47 ++++++++ html/app/model/success.php | 19 ++++ html/app/model/success.php.old | 52 +++++++++ html/app/view/_footer.phtml | 40 +++++++ html/app/view/_header.phtml | 49 +++++++++ html/app/view/dev_demo.html | 30 +++++ html/app/view/dev_test.html | 45 ++++++++ html/app/view/loader.phtml | 9 ++ html/app/view/page_00.phtml | 10 ++ html/app/view/page_01.phtml | 196 +++++++++++++++++++++++++++++++++ html/app/view/page_02.phtml | 10 ++ html/app/view/page_03.phtml | 10 ++ html/app/view/page_04.phtml | 196 +++++++++++++++++++++++++++++++++ html/app/view/results.phtml | 3 + html/cdn/css/default.css | 129 ++++++++++++++++++++++ html/cdn/js/config.js | 23 ++++ html/class/config.php | 38 +++++++ html/class/functions.php | 43 ++++++++ html/class/site.php | 52 +++++++++ html/img/logo.png | Bin 0 -> 26409 bytes html/index.php | 41 +++++++ html/lng/de/default.php | 63 +++++++++++ html/lng/en/default.php | 59 ++++++++++ nginx/default.bak.3.conf | 35 ++++++ nginx/default.conf | 34 ++++++ 34 files changed, 1930 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 html/app/controler/dev.php create mode 100644 html/app/controler/request.php create mode 100644 html/app/controler/start.php create mode 100644 html/app/model/M01.php create mode 100644 html/app/model/M04.php create mode 100644 html/app/model/docv.php create mode 100644 html/app/model/retrival_1.php create mode 100644 html/app/model/retrival_2.php create mode 100644 html/app/model/success.php create mode 100644 html/app/model/success.php.old create mode 100644 html/app/view/_footer.phtml create mode 100644 html/app/view/_header.phtml create mode 100644 html/app/view/dev_demo.html create mode 100644 html/app/view/dev_test.html create mode 100644 html/app/view/loader.phtml create mode 100644 html/app/view/page_00.phtml create mode 100644 html/app/view/page_01.phtml create mode 100644 html/app/view/page_02.phtml create mode 100644 html/app/view/page_03.phtml create mode 100644 html/app/view/page_04.phtml create mode 100644 html/app/view/results.phtml create mode 100644 html/cdn/css/default.css create mode 100644 html/cdn/js/config.js create mode 100644 html/class/config.php create mode 100644 html/class/functions.php create mode 100644 html/class/site.php create mode 100644 html/img/logo.png create mode 100644 html/index.php create mode 100644 html/lng/de/default.php create mode 100644 html/lng/en/default.php create mode 100644 nginx/default.bak.3.conf create mode 100644 nginx/default.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..445ce6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# macOS artifacts +.DS_Store + +# Debug logs (generated at runtime when DEBUG=true) +html/log/ + +# Nginx backup configs +nginx/*.bak +nginx/*_old.conf diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..fa28630 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,48 @@ +# AGENTS.md + +## Project identity +- **Name**: idv-demo — Jumio identity verification (KYC/KYB) demo app +- **Stack**: vanilla PHP (no framework, no Composer), nginx + PHP-FPM +- **Owner**: customer-engineering / Sechpoint + +## Repo setup +- **Git remote**: `https://git.sechpoint.app/customer-engineering/idv-demo.git` +- **Credentials**: source `~/bin/.gitenv` for `GIT_USER_NAME`, `GIT_USER_EMAIL`, `GIT_TOKEN` +- **Default branch**: `main` +- **Commit prefix convention**: `chore:` + +## Architecture (non-obvious) + +``` +html/ → web root (deploys as /var/www/html/public — see nginx config) + index.php → single entry point (front controller) + class/ → core: config.php, site.php (session init), functions.php + app/ + controler/ → routing: start.php (GET pages), request.php (POST actions) + model/ → Jumio API calls: M01.php, M04.php, docv.php, retrival_1.php, retrival_2.php, success.php + view/ → .phtml templates (header, footer, pages 00–04, loader, results) + cdn/ → static assets (JS includes iovation/IGLOO blackbox) + lng/ → language strings: en/ (default), de/ +nginx/ → nginx site config (serves from /var/www/html/public, PHP-FPM via socket) +``` + +- **No build tools, no tests, no CI/CD, no package manager** — it's raw PHP. +- Routing: URL segments drive pages (`$PARAMS[1]` in start.php); POST/GET `do` parameter drives actions (request.php). +- Jumio workflow: M01 (ID verification) → docv (document verification) → retrival → results. + +## Dev mode +- Hostname starting with `dev` sets `DEBUG = TRUE` (`html/class/config.php` line 28). +- When DEBUG is true, `debug_log()` writes to `html/log/YYYYMM.log`. The `log/` directory must exist and be writable. + +## Secrets warning +- `html/class/config.php` contains hardcoded Jumio API credentials. **Do not commit to public repos.** + +## Nginx +- Active config: `nginx/default.conf` +- PHP-FPM socket: `unix:/run/php-fpm.sock` +- Clean URLs via `try_files $uri $uri/ /index.php?$args` +- Stale backup files in `nginx/`: `default_old.conf`, `default.conf.bak`, `default.bak.3.conf` + +## Gotchas +- Filename `retrival` is intentionally misspelled (not "retrieval") — used consistently in `retrival_1.php`, `retrival_2.php`, and session keys. +- `html/` contains `.DS_Store` (macOS artifact) — should be gitignored. diff --git a/html/app/controler/dev.php b/html/app/controler/dev.php new file mode 100644 index 0000000..0c3c283 --- /dev/null +++ b/html/app/controler/dev.php @@ -0,0 +1,61 @@ +> + case 'workbanch': + include(__ROOT__.'/app/model/workbanch.php'); + break; + //==========>> + case 'test': + include(__ROOT__.'/app/view/test.html'); + break; + //==========>> + case 'clear': + session_unset(); + session_destroy(); + $_SESSION = array(); + echo 'session clear success!
';echo json_encode($_SESSION, JSON_PRETTY_PRINT); + break; + //==========>> + default: + debug_log("URI WRONG",$_SERVER['REQUEST_URI']); + $error_msg=ERROR_404; + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_error.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + } + } else { + $_SESSION=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_home.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + } + +} else { + $_SESSION=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_home.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); +} diff --git a/html/app/controler/request.php b/html/app/controler/request.php new file mode 100644 index 0000000..aeb1156 --- /dev/null +++ b/html/app/controler/request.php @@ -0,0 +1,116 @@ +> + default: + echo "oh shit"; + #debug_log("Request Wrong",$HTML_REQUEST); + #session_unset(); + #session_destroy(); + #$_SESSION = array(); + #header('Location: '.$url_basic); + exit; + } +} else { + debug_log("Request Error",$HTML_REQUEST); + session_unset(); + session_destroy(); + $_SESSION = array(); + header('Location: '.$url_basic); + exit; +} +#echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
';exit; + +?> diff --git a/html/app/controler/start.php b/html/app/controler/start.php new file mode 100644 index 0000000..df4d641 --- /dev/null +++ b/html/app/controler/start.php @@ -0,0 +1,87 @@ +> MENUE OPTIONS + case 'home': + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_00.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; + case 'one': + $_SESSION['TRANSACTION']=array(); + $_SESSION['TRANSACTION']["RETURN_1"]=array(); + $_SESSION['TRANSACTION']["RETURN_2"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_1"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_2"]=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_01.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; + case 'two': + $_SESSION['TRANSACTION']=array(); + $_SESSION['TRANSACTION']['status']=''; + $_SESSION['TRANSACTION']["RETURN_1"]=array(); + $_SESSION['TRANSACTION']["RETURN_2"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_1"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_2"]=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_02.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; + case 'three': + $_SESSION['TRANSACTION']=array(); + $_SESSION['TRANSACTION']['status']=''; + $_SESSION['TRANSACTION']["RETURN_1"]=array(); + $_SESSION['TRANSACTION']["RETURN_2"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_1"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_2"]=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_03.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; + case 'four': + $_SESSION['TRANSACTION']=array(); + $_SESSION['TRANSACTION']['status']=''; + $_SESSION['TRANSACTION']["RETURN_1"]=array(); + $_SESSION['TRANSACTION']["RETURN_2"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_1"]=array(); + $_SESSION['TRANSACTION']["RETRIVAL_2"]=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_04.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; + case 'results': + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/results.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; +//==========>> FUNCTIONAL OPTIONS + case 'dev': + include(__ROOT__.'/app/controler/development.php'); + break; + + case 'q5b35W4M3cWt': + include(__ROOT__.'/app/view/dev_demo.html'); + break; + + case 'clear': + $url_basic=$_SESSION['SITE']['site_url']; + $_SESSION=array(); + header('Location: '.$url_basic); + + break; +//==========>> + default: + debug_log("URI WRONG",$_SERVER['REQUEST_URI']); + $error_msg=ERROR_404; + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_error.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + } + +} else { + $_SESSION=array(); + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_home.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); +} diff --git a/html/app/model/M01.php b/html/app/model/M01.php new file mode 100644 index 0000000..8550fe1 --- /dev/null +++ b/html/app/model/M01.php @@ -0,0 +1,120 @@ +format('Y-m-d\TH:i:s'); +$consentTimeNow = $time . '.000Z'; +$access_token = oAuth(); + +# === iniciate the transaction +# -- prepare the API request +$request_body ='{ + "workflowDefinition": { + "key": "32003" + }, + "customerInternalReference": "'.$guid.'", + "userReference": "'.$guid.'", + "reportingCriteria":"Jumio Web App", + "callbackUrl": "'.$_SESSION['SITE']['site_url'].'?do=callback", + "tokenLifetime": "90m", + "web":{ + "successUrl":"'.$_SESSION['SITE']['site_url'].'?do=success", + "errorUrl":"'.$_SESSION['SITE']['site_url'].'?do=error" + }, + "userConsent": { + "userIp": "'.$_SERVER['REMOTE_ADDR'].'", + "userLocation": { + "country": "GBR", + "state": "" + }, + "consent": { + "obtained": "yes", + "obtainedAt": "'.$consentTimeNow.'" + }, + "privacyPolicy": { + "read": "yes", + "readAt": "'.$consentTimeNow.'" + } + } +}'; + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => "https://account.".$_SESSION['SITE']['datacenter']."/api/v1/accounts", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => $request_body, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + $response_json = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + if ($err) { + $_SESSION['SITE']['ERROR']="cURL Error #:" . $err; + $_SESSION['SITE']['ERROR']['API']=array(); + $_SESSION['SITE']['ERROR']['API']=$response_json; + debug_log("API ERROR",json_encode($_SESSION, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )); + $error_msg=ERROR_501; + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_error.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + } else { + $iniciate=array(); + $iniciate=json_decode($response_json,TRUE); + } + $prepared_data_url = $iniciate["workflowExecution"]["credentials"]["3"]["api"]["parts"]["prepared_data"]; + $redirect_url = $iniciate["web"]["href"]; + # ==== Prepare data + $request_body ='{ + "firstName": "'.$_SESSION['TRANSACTION']["FORM"]['firstName'].'", + "lastName": "'.$_SESSION['TRANSACTION']["FORM"]['lastName'].'", + "dateOfBirth":"'.$_SESSION['TRANSACTION']["FORM"]['dateOfBirth'].'", + "email": "'.$_SESSION['TRANSACTION']["FORM"]['email'].'", + "phoneNumber": "'.$_SESSION['TRANSACTION']["FORM"]['phone'].'", + "address": { + "line1": "'.$_SESSION['TRANSACTION']["FORM"]['street'].'", + "postalCode": "'.$_SESSION['TRANSACTION']["FORM"]['postcode'].'", + "city": "'.$_SESSION['TRANSACTION']["FORM"]['city'].'", + "country": "'.$_SESSION['TRANSACTION']["FORM"]['country'].'" + } + }'; + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $prepared_data_url , + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => $request_body, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + + curl_close($curl); + + if ($err) { + echo "cURL Error #:" . $err; + } else { + echo $response; + } + header("Location:".$redirect_url); + //==================================================== + #echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
'; + exit; diff --git a/html/app/model/M04.php b/html/app/model/M04.php new file mode 100644 index 0000000..8550fe1 --- /dev/null +++ b/html/app/model/M04.php @@ -0,0 +1,120 @@ +format('Y-m-d\TH:i:s'); +$consentTimeNow = $time . '.000Z'; +$access_token = oAuth(); + +# === iniciate the transaction +# -- prepare the API request +$request_body ='{ + "workflowDefinition": { + "key": "32003" + }, + "customerInternalReference": "'.$guid.'", + "userReference": "'.$guid.'", + "reportingCriteria":"Jumio Web App", + "callbackUrl": "'.$_SESSION['SITE']['site_url'].'?do=callback", + "tokenLifetime": "90m", + "web":{ + "successUrl":"'.$_SESSION['SITE']['site_url'].'?do=success", + "errorUrl":"'.$_SESSION['SITE']['site_url'].'?do=error" + }, + "userConsent": { + "userIp": "'.$_SERVER['REMOTE_ADDR'].'", + "userLocation": { + "country": "GBR", + "state": "" + }, + "consent": { + "obtained": "yes", + "obtainedAt": "'.$consentTimeNow.'" + }, + "privacyPolicy": { + "read": "yes", + "readAt": "'.$consentTimeNow.'" + } + } +}'; + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => "https://account.".$_SESSION['SITE']['datacenter']."/api/v1/accounts", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => $request_body, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + $response_json = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + if ($err) { + $_SESSION['SITE']['ERROR']="cURL Error #:" . $err; + $_SESSION['SITE']['ERROR']['API']=array(); + $_SESSION['SITE']['ERROR']['API']=$response_json; + debug_log("API ERROR",json_encode($_SESSION, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )); + $error_msg=ERROR_501; + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_error.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + } else { + $iniciate=array(); + $iniciate=json_decode($response_json,TRUE); + } + $prepared_data_url = $iniciate["workflowExecution"]["credentials"]["3"]["api"]["parts"]["prepared_data"]; + $redirect_url = $iniciate["web"]["href"]; + # ==== Prepare data + $request_body ='{ + "firstName": "'.$_SESSION['TRANSACTION']["FORM"]['firstName'].'", + "lastName": "'.$_SESSION['TRANSACTION']["FORM"]['lastName'].'", + "dateOfBirth":"'.$_SESSION['TRANSACTION']["FORM"]['dateOfBirth'].'", + "email": "'.$_SESSION['TRANSACTION']["FORM"]['email'].'", + "phoneNumber": "'.$_SESSION['TRANSACTION']["FORM"]['phone'].'", + "address": { + "line1": "'.$_SESSION['TRANSACTION']["FORM"]['street'].'", + "postalCode": "'.$_SESSION['TRANSACTION']["FORM"]['postcode'].'", + "city": "'.$_SESSION['TRANSACTION']["FORM"]['city'].'", + "country": "'.$_SESSION['TRANSACTION']["FORM"]['country'].'" + } + }'; + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $prepared_data_url , + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => $request_body, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + + curl_close($curl); + + if ($err) { + echo "cURL Error #:" . $err; + } else { + echo $response; + } + header("Location:".$redirect_url); + //==================================================== + #echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
'; + exit; diff --git a/html/app/model/docv.php b/html/app/model/docv.php new file mode 100644 index 0000000..d9342ce --- /dev/null +++ b/html/app/model/docv.php @@ -0,0 +1,90 @@ +format('Y-m-d\TH:i:s'); +$consentTimeNow = $time . '.000Z'; +$access_token = oAuth(); + +# === iniciate the transaction +# -- prepare the API request +$request_body ='{ + "workflowDefinition": { + "key": "10055", + "credentials": [{ + "category": "DOCUMENT", + "country": { + "predefinedType": "DEFINED", + "values": ["GBR"] + }, + "type": { + "predefinedType": "DEFINED", + "values": ["UB"] + } + }] + }, + "customerInternalReference": "'.$guid.'", + "userReference": "'.$guid.'", + "reportingCriteria":"Jumio Web App", + "callbackUrl": "'.$_SESSION['SITE']['site_url'].'?do=callback", + "tokenLifetime": "90m", + "web":{ + "successUrl":"'.$_SESSION['SITE']['site_url'].'?do=success", + "errorUrl":"'.$_SESSION['SITE']['site_url'].'?do=error" + }, + "userConsent": { + "userIp": "'.$_SERVER['REMOTE_ADDR'].'", + "userLocation": { + "country": "GBR", + "state": "" + }, + "consent": { + "obtained": "yes", + "obtainedAt": "'.$consentTimeNow.'" + }, + "privacyPolicy": { + "read": "yes", + "readAt": "'.$consentTimeNow.'" + } + } +}'; + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => "https://account.".$_SESSION['SITE']['datacenter']."/api/v1/accounts", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => $request_body, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + $response_json = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); +echo $response_json; + if ($err) { + $_SESSION['SITE']['ERROR']="cURL Error #:" . $err; + $_SESSION['SITE']['ERROR']['API']=array(); + $_SESSION['SITE']['ERROR']['API']=$response_json; + debug_log("API ERROR",json_encode($_SESSION, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )); + $error_msg=ERROR_501; + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_error.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + } else { + $iniciate=array(); + $iniciate=json_decode($response_json,TRUE); + } + $redirect_url = $iniciate["web"]["href"]; + header("Location:".$redirect_url); + //==================================================== + #echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
'; + exit; diff --git a/html/app/model/retrival_1.php b/html/app/model/retrival_1.php new file mode 100644 index 0000000..c050f6f --- /dev/null +++ b/html/app/model/retrival_1.php @@ -0,0 +1,46 @@ + "https://retrieval.".$_SESSION['SITE']['datacenter']."/api/v1/accounts/".$_SESSION['TRANSACTION']["RETURN"]['accountId']."/workflow-executions/".$_SESSION['TRANSACTION']["RETURN"]['workflowExecutionId']."/status", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "GET", + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + while ($retry_count <= $max_retries) { + $response = curl_exec($curl); + $retrival_status=json_decode($response,TRUE); + if($retrival_status["workflowExecution"]["status"] === "PROCESSED"){break;} + time_sleep_until(time() + 5); + $retry_count++; + } + curl_setopt_array($curl, [ + CURLOPT_URL => "https://retrieval.".$_SESSION['SITE']['datacenter']."/api/v1/accounts/".$_SESSION['TRANSACTION']["RETURN"]['accountId']."/workflow-executions/".$_SESSION['TRANSACTION']["RETURN"]['workflowExecutionId'], + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "GET", + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + $response = curl_exec($curl); + $_SESSION['TRANSACTION']["RETRIVAL_1"]=json_decode($response,TRUE); +//==================================================== +#echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
';exit; diff --git a/html/app/model/retrival_2.php b/html/app/model/retrival_2.php new file mode 100644 index 0000000..ffb328c --- /dev/null +++ b/html/app/model/retrival_2.php @@ -0,0 +1,47 @@ + "https://retrieval.".$_SESSION['SITE']['datacenter']."/api/v1/accounts/".$_SESSION['TRANSACTION']["RETURN"]['accountId']."/workflow-executions/".$_SESSION['TRANSACTION']["RETURN"]['workflowExecutionId']."/status", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "GET", + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + while ($retry_count <= $max_retries) { + $response = curl_exec($curl); + $retrival_status=json_decode($response,TRUE); + if($retrival_status["workflowExecution"]["status"] === "PROCESSED"){break;} + time_sleep_until(time() + 5); + $retry_count++; + } + curl_setopt_array($curl, [ + CURLOPT_URL => "https://retrieval.".$_SESSION['SITE']['datacenter']."/api/v1/accounts/".$_SESSION['TRANSACTION']["RETURN"]['accountId']."/workflow-executions/".$_SESSION['TRANSACTION']["RETURN"]['workflowExecutionId'], + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "GET", + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + $response = curl_exec($curl); + $_SESSION['TRANSACTION']["RETRIVAL"]=json_decode($response,TRUE); + +//==================================================== +#echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
';exit; diff --git a/html/app/model/success.php b/html/app/model/success.php new file mode 100644 index 0000000..887d04f --- /dev/null +++ b/html/app/model/success.php @@ -0,0 +1,19 @@ + window.location.href = "'.$url_basic.'results"; '; + exit; + break; +} +//==================================================== +#echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
';exit; diff --git a/html/app/model/success.php.old b/html/app/model/success.php.old new file mode 100644 index 0000000..a11afba --- /dev/null +++ b/html/app/model/success.php.old @@ -0,0 +1,52 @@ + "https://retrieval.".$_SESSION['SITE']['datacenter']."/api/v1/accounts/".$_SESSION['TRANSACTION']["RETURN"]['accountId']."/workflow-executions/".$_SESSION['TRANSACTION']["RETURN"]['workflowExecutionId']."/status", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "GET", + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer ". $access_token , + "Content-Type: application/json", + "User-Agent: Jumio SE Testing" + ], + ]); + // Look to check Jumio Result. + do { + $response = curl_exec($curl); + $err = curl_error($curl); + if ($err) { + $_SESSION['SITE']['ERROR']="cURL Error #:" . $err; + $_SESSION['SITE']['ERROR']['API']=array(); + $_SESSION['SITE']['ERROR']['API']=$response_json; + debug_log("API ERROR",json_encode($_SESSION, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )); + $error_msg=ERROR_501; + include(__ROOT__.'/app/view/_header.phtml'); + include(__ROOT__.'/app/view/page_error.phtml'); + include(__ROOT__.'/app/view/_footer.phtml'); + break; + } else { + $retrival_status=array(); + $retrival_status=json_decode($response,TRUE); + } + print_r($retrival_status); + if ($retrival_status["workflowExecution"]["status"] === "PROCESSED") { break; } + sleep(10); + $retry_count++; + } while ($retry_count < $max_retries); + break; +} +//==================================================== +echo '
'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
';exit; diff --git a/html/app/view/_footer.phtml b/html/app/view/_footer.phtml new file mode 100644 index 0000000..456b690 --- /dev/null +++ b/html/app/view/_footer.phtml @@ -0,0 +1,40 @@ + + + + + + + +'; +}?> + + + + + diff --git a/html/app/view/_header.phtml b/html/app/view/_header.phtml new file mode 100644 index 0000000..ca87767 --- /dev/null +++ b/html/app/view/_header.phtml @@ -0,0 +1,49 @@ +'.$url_txt_0.''; +if ($_SESSION['SITE']['access']=='true'){ + $url_txt_1 = MENUE_ONE; + $url_link_1 = $url_basis.'one'; + $menue.= ''.$url_txt_1.''; + $url_txt_2 = MENUE_TWO; + $url_link_2 = $url_basis.'two'; + $menue.= ''.$url_txt_2.''; + $url_txt_3 = MENUE_THREE; + $url_link_3 = $url_basis.'three'; + $menue.= ''.$url_txt_3.''; + $url_txt_4 = MENUE_FOUR; + $url_link_4 = $url_basis.'four'; + $menue.= ''.$url_txt_4.''; +} +?> + + + + + + + + + + <?php echo SITE_NAME; ?> + + + + + + + + + + + + +
+ +
+ +
diff --git a/html/app/view/dev_demo.html b/html/app/view/dev_demo.html new file mode 100644 index 0000000..53bf955 --- /dev/null +++ b/html/app/view/dev_demo.html @@ -0,0 +1,30 @@ + + + + + + Start Jumio Demo + + + + + +
+

Please click to initiate your Demo!

+
+ + diff --git a/html/app/view/dev_test.html b/html/app/view/dev_test.html new file mode 100644 index 0000000..c4b723d --- /dev/null +++ b/html/app/view/dev_test.html @@ -0,0 +1,45 @@ + + + + + + Nav Menu + + + + + + + + + + + + diff --git a/html/app/view/loader.phtml b/html/app/view/loader.phtml new file mode 100644 index 0000000..bb16bd3 --- /dev/null +++ b/html/app/view/loader.phtml @@ -0,0 +1,9 @@ + +
+
+
+
+
+

Loading...

+
diff --git a/html/app/view/page_00.phtml b/html/app/view/page_00.phtml new file mode 100644 index 0000000..105c397 --- /dev/null +++ b/html/app/view/page_00.phtml @@ -0,0 +1,10 @@ + +
+
+
+
+
+
+
+
diff --git a/html/app/view/page_01.phtml b/html/app/view/page_01.phtml new file mode 100644 index 0000000..05522d5 --- /dev/null +++ b/html/app/view/page_01.phtml @@ -0,0 +1,196 @@ + +
+
+
+
+
+
+
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+ diff --git a/html/app/view/page_02.phtml b/html/app/view/page_02.phtml new file mode 100644 index 0000000..012bba7 --- /dev/null +++ b/html/app/view/page_02.phtml @@ -0,0 +1,10 @@ + +
+
+
+
+
+
+
+
diff --git a/html/app/view/page_03.phtml b/html/app/view/page_03.phtml new file mode 100644 index 0000000..cecf0c9 --- /dev/null +++ b/html/app/view/page_03.phtml @@ -0,0 +1,10 @@ + +
+
+
+
+
+
+
+
diff --git a/html/app/view/page_04.phtml b/html/app/view/page_04.phtml new file mode 100644 index 0000000..11be53b --- /dev/null +++ b/html/app/view/page_04.phtml @@ -0,0 +1,196 @@ + +
+
+
+
+
+
+
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + diff --git a/html/app/view/results.phtml b/html/app/view/results.phtml new file mode 100644 index 0000000..e0053cc --- /dev/null +++ b/html/app/view/results.phtml @@ -0,0 +1,3 @@ + {console.error(`iovation called an error ${msg}`);}, + }, +}; + +function getBB(){ + var bb = ""; + try { + bb = window.IGLOO.getBlackbox(); + return( bb ); + } catch (e) { + return(e); + } + } diff --git a/html/class/config.php b/html/class/config.php new file mode 100644 index 0000000..4f9b7d7 --- /dev/null +++ b/html/class/config.php @@ -0,0 +1,38 @@ +'.json_encode($_SESSION, JSON_PRETTY_PRINT).'
';exit; +/// Set default timezone + date_default_timezone_set('UCT'); + +//============================================================================== + $tmp=explode('.', $_SERVER['HTTP_HOST']); + $modus = array_shift(($tmp)); + if($modus == 'dev'){define('DEBUG',TRUE);}else{define('DEBUG',FALSE);} + define('__ROOT__', dirname(dirname(__FILE__))); + + +// API Credentials for IDV + $api_key = '2b2i83jup3eu2tr3tn581kl2dc'; + $api_secret = '1vat6laeka5gv8riltk1j0hqlguo80bue3q6gvrnk9u3f2adl39i'; + $api_token = base64_encode($api_key . ":" . $api_secret); + define( 'API_URL' , 'emea-1.jumio.ai'); + define( 'API_TOKEN' , $api_token); diff --git a/html/class/functions.php b/html/class/functions.php new file mode 100644 index 0000000..21f8fdf --- /dev/null +++ b/html/class/functions.php @@ -0,0 +1,43 @@ + "https://auth.".$_SESSION['SITE']['datacenter']."/oauth2/token", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => "grant_type=client_credentials", + CURLOPT_HTTPHEADER => [ + "Authorization: Basic ".$_SESSION['SITE']['apiToken'], + "Content-Type: application/x-www-form-urlencoded", + "User-Agent: ACME Payments testing" + ], + ]); + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if ($err) { + $result='error'; + $_SESSION['SITE']['ERROR']="cURL Error #:" . $err; + $_SESSION['SITE']['ERROR']['API']=array(); + $_SESSION['SITE']['ERROR']['API']=$response; + } else { + $oAuth = array(); + $oAuth = json_decode($response,TRUE); + } + return $oAuth["access_token"]; +} diff --git a/html/class/site.php b/html/class/site.php new file mode 100644 index 0000000..56c3e5c --- /dev/null +++ b/html/class/site.php @@ -0,0 +1,52 @@ + 86400,]); +if(empty($_SESSION)){ + $_SESSION['SITE']=array(); + $_SESSION['SITE']['ERROR']=array(); + $_SESSION['SITE']['arrived']=gmdate(DATE_ATOM); + $_SESSION['SITE']['client_ip']=''; + $_SESSION['SITE']['site_url'] = 'https://'.$_SERVER["HTTP_HOST"].'/'; + $_SESSION['SITE']['apiToken']=''; + $_SESSION['SITE']['datacenter']=''; + $_SESSION['SITE']['language']=''; + $_SESSION['SITE']['access']='false'; +// check if language is suppoted + $activeLanguage=substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); + switch ($activeLanguage) { + case 'de': + $_SESSION['SITE']['language']='de'; + break; + + default: + $_SESSION['SITE']['language']='en'; + break; + } +// -------- GET CLIENT IP ----------------------------------------------------------------- + if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { //to check ip is pass from proxy + $_SESSION['SITE']['client_ip']=$_SERVER['HTTP_X_FORWARDED_FOR']; + } else { + $_SESSION['SITE']['client_ip']=$_SERVER['REMOTE_ADDR']; + } + } diff --git a/html/img/logo.png b/html/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8651eb8010d45b3ac582300d89637d468cdf55d9 GIT binary patch literal 26409 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 literal 0 HcmV?d00001 diff --git a/html/index.php b/html/index.php new file mode 100644 index 0000000..b0ab521 --- /dev/null +++ b/html/index.php @@ -0,0 +1,41 @@ +';echo json_encode($_SESSION, JSON_PRETTY_PRINT);//exit; diff --git a/html/lng/de/default.php b/html/lng/de/default.php new file mode 100644 index 0000000..a07a253 --- /dev/null +++ b/html/lng/de/default.php @@ -0,0 +1,63 @@ +> +// == PAGES +// == HOME +define('HOME_TITLE', 'HOME_TITLE'); +define('HOME_CONTENT', 'HOME_CONTENT'); +// == PAGE_LINK +define('PAGE_LINK_TITLE', 'PAGE_LINK_TITLE'); +define('PAGE_LINK_CONTENT', 'PAGE_LINK_CONTENT'); +//==========>> + +define('WALLET_TOP_UP_TITLE','Your e-wallet by iovation'); +define('WALLET_TOP_UP_CONTENT_1','Provide your login credential and the amount you wish to top-up.'); +define('WALLET_TOP_UP_CONTENT_2', ' +

You need to provide mock-up login credentials. You can use your email or invent an email but please ensue that you can remember the email and use the same email during testing. The email provide is converted in to a GDPR compliant fingerprint and stored on iovations servers. We use the email only as an account identifier. +You can invent a password and don`t need to remember this, we are not useing password verification for this mock-up demonstration.

+

+

You can controle the result of the fraud screening.

+Any amount below 100.00 will result in ALLOWED.
+Any amount between 100.01 and 199.99 will result in REVIEW
+Any amount over 200.00 will result in DENIED
+

+'); +//==========>> + +define('WALLET_CHECKOUT_A_TITLE','Card Payment'); +define('WALLET_CHECKOUT_A_CONTENT_1','This was a low risk transaction, therefore no liability shift through 3D secure is required.'); +define('WALLET_CHECKOUT_A_CONTENT_2',' +

Please provide a credit card number for testing. This can be any random number of 16 digits.For the card expiry date, +take any date from 2019 to 2029 and 4 random digits for the CVV number.

' +); +define('WALLET_CHECKOUT_AMT_FINAL', 'You will top up '); +define('WALLET_CHECKOUT_SUBMIT', 'execute top up'); + +//==========>> + +define('WALLET_CHECKOUT_D_TITLE', 'SEPA Instant Bank Payment'); +define('WALLET_CHECKOUT_D_CONTENT_1','This was a high risk transaction, therefore only SEPA instant bank payment is offerd.'); +define('WALLET_CHECKOUT_D_CONTENT_2',' +

Please provide a IBAN number for testing. This can be any random number of 16 digits.

' +); +//==========>> + +define('WALLET_CHECKOUT_R_TITLE', 'Card Payment'); +define('WALLET_CHECKOUT_R_CONTENT_1','This was a medium risk transaction, therefore a liability shift through 3D secure is initiated.'); +define('WALLET_CHECKOUT_R_CONTENT_2',' +

Please provide a credit card number for testing. This can be any random number of 16 digits.For the card expiry date, +take any date from 2019 to 2029 and 4 random digits for the CVV number.

' +); +//==========>> diff --git a/html/lng/en/default.php b/html/lng/en/default.php new file mode 100644 index 0000000..23d78a8 --- /dev/null +++ b/html/lng/en/default.php @@ -0,0 +1,59 @@ +> First Level Pages +// =========>> PAGE_PAGE_HOME + define('PAGE_HOME_TITLE','Jumio KYX Platform Use-Case Demo'); + define('PAGE_HOME_CONTENT_1',''); + define('PAGE_HOME_CONTENT_2',''); + define('PAGE_HOME_CONTENT_3',''); + define('PAGE_HOME_CONTENT_4',''); + define('PAGE_HOME_CONTENT_5',''); + +// =========>> PAGE_ONE + define('PAGE_ONE_TITLE','ACME Holiday Homes'); + define('PAGE_ONE_CONTENT_1','Please fill out the form to register on our platform'); + define('PAGE_ONE_CONTENT_2',''); + define('PAGE_ONE_CONTENT_3',''); + define('PAGE_ONE_CONTENT_4',''); + define('PAGE_ONE_CONTENT_5',''); + + define('PAGE_TWO_TITLE','ACME Rent a Bike'); + define('PAGE_TWO_CONTENT_1',''); + define('PAGE_TWO_CONTENT_2',''); + define('PAGE_TWO_CONTENT_3',''); + define('PAGE_TWO_CONTENT_4',''); + define('PAGE_TWO_CONTENT_5',''); + + define('PAGE_THREE_TITLE','ACME Games'); + define('PAGE_THREE_CONTENT_1',''); + define('PAGE_THREE_CONTENT_2',''); + define('PAGE_THREE_CONTENT_3',''); + define('PAGE_THREE_CONTENT_4',''); + define('PAGE_THREE_CONTENT_5',''); + + define('PAGE_FOUR_TITLE','ACME Bank'); + define('PAGE_FOUR_CONTENT_1','Apply for your new ACME Account today'); + define('PAGE_FOUR_CONTENT_2','
'); + define('PAGE_FOUR_CONTENT_3',''); + define('PAGE_FOUR_CONTENT_4',''); + define('PAGE_FOUR_CONTENT_5',''); +// =========>> Second Level Pages <<======= + + +// == PAGE_ERRORS +define('ERROR_404', '

404 Not Found

The requested resource could not be found but may be available in the future.

'); +define('ERROR_501', '

500 Internal Server Error

A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.

'); diff --git a/nginx/default.bak.3.conf b/nginx/default.bak.3.conf new file mode 100644 index 0000000..9eac48b --- /dev/null +++ b/nginx/default.bak.3.conf @@ -0,0 +1,35 @@ +server { + listen [::]:80 default_server; + + root /var/www/html/public; + index index.php index.html; + charset utf-8; + server_name _; + +#Logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log notice; + +#handling Static files +# location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ { +# access_log off; +# expires max; +# } + +# Support Clean (aka Search Engine Friendly) URLs +# location / { +# try_files $uri $uri/ /index.php?$args ; +# } + +# Handling .php files + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + if (!-f $document_root$fastcgi_script_name) { + return 404; + } + include fastcgi_params; + fastcgi_pass unix:/run/php-fpm.sock; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } +} diff --git a/nginx/default.conf b/nginx/default.conf new file mode 100644 index 0000000..c6702dd --- /dev/null +++ b/nginx/default.conf @@ -0,0 +1,34 @@ +server { + listen 80 default_server; + root /var/www/html/public; + index index.php index.html; + charset utf-8; + server_name _; + +#Logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log notice; + +#handling Static files + location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ { + access_log off; + expires max; + } + +# Support Clean (aka Search Engine Friendly) URLs + location / { + try_files $uri $uri/ /index.php?$args ; + } + +# Handling .php files + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + if (!-f $document_root$fastcgi_script_name) { + return 404; + } + include fastcgi_params; + fastcgi_pass unix:/run/php-fpm.sock; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } +}