From 4d19eedc24ade99df1f4b0ca514c57c921950f29 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Fri, 24 Jan 2020 22:37:00 +0100 Subject: [PATCH] A little bit of cleanup --- www/index.php | 161 ++++++++++++++++++++++++-------------------------- www/logo.png | Bin 0 -> 13356 bytes 2 files changed, 78 insertions(+), 83 deletions(-) create mode 100644 www/logo.png diff --git a/www/index.php b/www/index.php index 2777d52..29c4228 100755 --- a/www/index.php +++ b/www/index.php @@ -6,101 +6,95 @@ $code = 200; $body = json_decode(file_get_contents('php://input')); //Fake API -$result = 'UNDEFINED'; +$result = null; if(isset($_GET['path'])) { + //Any notification/[version] will be answered here if(preg_match('/notification.*/', $_GET['path'])) { $result = new stdClass; - $result->message = 'Fake API endpoint active and reachable under ' . $_SERVER['HTTP_HOST'] . ' (checked at ' . date('r') . ').'; - $result->vpn = false; - $result->www = false; - } else if(preg_match('/subscription.*/', $_GET['path'])) { + $result->message = 'Fake API endpoint active and reachable under ' . $_SERVER['HTTP_HOST'] . ' (contacted at ' . date('r') . ').'; + $result->vpn = false; //Idk + $result->www = false; //Idk + } else if(isset($body->license) && preg_match('/subscription.*/', $_GET['path'])) { + //The following only works with the body containing the desired license $result = new stdClass; - if(isset($body->license)) { - //premium - //enterprise - //enterprise plus - $license = null; - $stylesheet = '* { color: rgb(20, 150, 20); } .dark * { color: rgb(40, 180, 40); }'; - if(preg_match('/.*premium/', $body->license)) { - $license = 'premium'; - } else if(preg_match('/.*enterprise[^\w]/', $body->license)) { - $license = 'enterprise'; - $stylesheet .= file_get_contents('enterprise.css'); - } else if(preg_match('/.*enterpriseplus/', $body->license)) { - $license = 'enterprise_plus'; - $stylesheet .= file_get_contents('enterprise_plus.css'); - $stylesheet = preg_replace('/(.*display:.?)none.*/', '$1inline-block', $stylesheet); - } - $stylesheet .= '/* Generated for ' . $license . ' license */'; + $license = null; + //The stylesheet determines what is shown on the dashboard (and by the plan). As default we change the colors of any text. + $stylesheet = '* { color: rgb(20, 150, 20); } .dark * { color: rgb(40, 180, 40); }'; + if(preg_match('/.*premium/', $body->license)) { + $license = 'premium'; + } else if(preg_match('/.*enterprise[^\w]/', $body->license)) { + $license = 'enterprise'; + $stylesheet .= file_get_contents('enterprise.css'); + } else if(preg_match('/.*enterpriseplus/', $body->license)) { + $license = 'enterprise_plus'; + //Load the new css file and change all invisible blocks to visible (this will show a little bit too much, but whatever...) + $stylesheet .= file_get_contents('enterprise_plus.css'); + $stylesheet = preg_replace('/(.*display:.?)none.*/', '$1inline-block', $stylesheet); + } + $stylesheet .= '/* Generated for ' . $license . ' license */'; - $state = null; - if($license) { //The following only makes sense if you selected a license - if(strpos($body->license, 'bad') !== false) { - $state = 'Bad'; - } else if(strpos($body->license, 'canceled') !== false) { - $state = 'canceled'; - } else if(strpos($body->license, 'active') !== false) { - $state = 'Active'; - } + $state = null; + if($license) { //The following only makes sense if you selected any license + if(strpos($body->license, 'bad') !== false) { + $state = 'Bad'; + } else if(strpos($body->license, 'canceled') !== false) { + $state = 'canceled'; + } else if(strpos($body->license, 'active') !== false) { + $state = 'Active'; } + } - - if($state == 'Active') { - $result->active = $license != 'premium'; //if true the stylesheet ↓ will be activated. This will also hide some elements, so don't use it on premium users (which will have the minimal stylesheet)... - $result->status = $state; - $result->plan = $license; - $result->quantity = 42; - $result->amount = 42; - $result->period_end = false; - $result->trial_end = false; - $result->cancel_at_period_end = false; - $result->styles = new stdClass; - $result->styles->etag = 42; - $result->styles->last_modified = time(); - $result->styles->data = $stylesheet; - } - if($state == 'Canceled') { - $result->active = false; - $result->status = $state; - $result->plan = $license; - $result->quantity = 42; - $result->amount = 42; - $result->period_end = false; - $result->trial_end = false; - $result->cancel_at_period_end = false; - $result->styles = new stdClass; - $result->styles->etag = 42; - $result->styles->last_modified = time(); - $result->styles->data = $stylesheet; - } - if($state == 'Bad' || $state == null) { - $code = 470; //-> bad license - $result->error_msg = 'As you wish.'; - $result->error = 'license_invalid'; - $result->active = false; - $result->status = false; - $result->plan = null; - $result->quantity = 0; - $result->amount = 0; - $result->period_end = true; - $result->trial_end = true; - $result->cancel_at_period_end = null; - $result->styles = new stdClass; - } - if($state == null) { - $result->error_msg = 'Unknown command. Use ["bad" | "canceled" | "active"] ["premium" | "enterprise" | "enterpriseplus"].'; - } - } else { - $result = new stdClass; - $result->ERROR = 'BAD REQUEST'; - $code = 400; + if($state == 'Active') { + $result->active = $license != 'premium'; //If true the stylesheet from below will be activated. This will also hide some elements, so don't use it on premium users (which will have the minimal stylesheet and so the subscription info will be empty)... + $result->status = $state; + $result->plan = $license; + $result->quantity = 42; + $result->amount = 42; + $result->period_end = false; + $result->trial_end = false; + $result->cancel_at_period_end = false; + $result->styles = new stdClass; + $result->styles->etag = 42; + $result->styles->last_modified = time(); + $result->styles->data = $stylesheet; + } + if($state == 'Canceled') { + $result->active = false; //Here we can savely disable any styles + $result->status = $state; + $result->plan = $license; + $result->quantity = 42; + $result->amount = 42; + $result->period_end = false; + $result->trial_end = false; + $result->cancel_at_period_end = false; + $result->styles = new stdClass; + $result->styles->etag = 42; + $result->styles->last_modified = time(); + $result->styles->data = $stylesheet; + } + if($state == 'Bad' || $state == null) { + $code = 470; //-> bad license + $result->error_msg = 'As you wish.'; + $result->error = 'license_invalid'; + $result->active = false; + $result->status = false; + $result->plan = null; + $result->quantity = 0; + $result->amount = 0; + $result->period_end = true; + $result->trial_end = true; + $result->cancel_at_period_end = null; + $result->styles = new stdClass; + } + if($state == null) { + $result->error_msg = 'Unknown command. Use ["bad" | "canceled" | "active"] ["premium" | "enterprise" | "enterpriseplus"].'; } } else if(preg_match('/checkout.*/', $_GET['path'])) { $result = array(); $result['zipCode'] = false; $result['allowRememberMe'] = false; - $result['image'] = 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/pritunl8472/b/pritunl-static/o/logo_stripe.png'; - $result['key'] = 'pk_live_plmoOl3lS3k5dMNQViZWGfVR'; //Stolen store key from official API + $result['image'] = $_SERVER['HTTP_HOST'] . '/logo.png'; + $result['key'] = 'pk_live_*****l3lS******QViZ*****'; //Insert here a key to unlock the store. And buy the subsciption... $result['plans'] = array(); $result['plans']['premium'] = array(); $result['plans']['premium']['amount'] = 42; @@ -115,6 +109,7 @@ header('Content-Type: application/json'); http_response_code($code); echo json_encode($result); +//Should we log any request? Used for the development and debugging of this API if(false) { //Log request file_put_contents('access.log', "\n" . date('r') . ":\t" . json_encode(array('head' => getallheaders(), 'body' => file_get_contents('php://input'), 'get' => $_GET, 'post' => $_POST, 'answer_code' => $code, 'answer' => $result)) . "\n", FILE_APPEND); diff --git a/www/logo.png b/www/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..43cd61798d0ff354aa38de8dd950114d9e9de3ed GIT binary patch literal 13356 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