From 563399081b51443092d82fa29043316df57f26d9 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Fri, 9 Jun 2017 03:33:56 -0600 Subject: [PATCH] Initial commit --- .gitignore | 5 ++ LICENSE | 9 +++ api.php | 90 ++++++++++++++++++++++ captcheck.js | 58 ++++++++++++++ composer.json | 5 ++ composer.lock | 77 +++++++++++++++++++ database.mwb | Bin 0 -> 8834 bytes images/bolt.png | Bin 0 -> 752 bytes images/building.png | Bin 0 -> 213 bytes images/camera.png | Bin 0 -> 904 bytes images/circle.png | Bin 0 -> 732 bytes images/cloud.png | Bin 0 -> 744 bytes images/cog.png | Bin 0 -> 981 bytes images/cube.png | Bin 0 -> 924 bytes images/envelope.png | Bin 0 -> 854 bytes images/female.png | Bin 0 -> 790 bytes images/file-o.png | Bin 0 -> 361 bytes images/flag.png | Bin 0 -> 660 bytes images/globe.png | Bin 0 -> 1315 bytes images/heart.png | Bin 0 -> 830 bytes images/male.png | Bin 0 -> 494 bytes images/mobile.png | Bin 0 -> 332 bytes images/moon-o.png | Bin 0 -> 1111 bytes images/paint-brush.png | Bin 0 -> 916 bytes images/pencil.png | Bin 0 -> 450 bytes images/picture-o.png | Bin 0 -> 531 bytes images/plane.png | Bin 0 -> 853 bytes images/print.png | Bin 0 -> 459 bytes images/puzzle-piece.png | Bin 0 -> 959 bytes images/shopping-basket.png | Bin 0 -> 971 bytes images/snowflake-o.png | Bin 0 -> 1108 bytes images/square.png | Bin 0 -> 378 bytes images/star.png | Bin 0 -> 858 bytes images/sun-o.png | Bin 0 -> 968 bytes images/tree.png | Bin 0 -> 497 bytes images/truck.png | Bin 0 -> 545 bytes images/umbrella.png | Bin 0 -> 859 bytes index.php | 2 + nbproject/project.properties | 7 ++ nbproject/project.xml | 9 +++ readme.md | 60 +++++++++++++++ required.php | 144 +++++++++++++++++++++++++++++++++++ settings.template.php | 14 ++++ test.html | 17 +++++ test.php | 6 ++ 45 files changed, 503 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 api.php create mode 100644 captcheck.js create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 database.mwb create mode 100644 images/bolt.png create mode 100644 images/building.png create mode 100644 images/camera.png create mode 100644 images/circle.png create mode 100644 images/cloud.png create mode 100644 images/cog.png create mode 100644 images/cube.png create mode 100644 images/envelope.png create mode 100644 images/female.png create mode 100644 images/file-o.png create mode 100644 images/flag.png create mode 100644 images/globe.png create mode 100644 images/heart.png create mode 100644 images/male.png create mode 100644 images/mobile.png create mode 100644 images/moon-o.png create mode 100644 images/paint-brush.png create mode 100644 images/pencil.png create mode 100644 images/picture-o.png create mode 100644 images/plane.png create mode 100644 images/print.png create mode 100644 images/puzzle-piece.png create mode 100644 images/shopping-basket.png create mode 100644 images/snowflake-o.png create mode 100644 images/square.png create mode 100644 images/star.png create mode 100644 images/sun-o.png create mode 100644 images/tree.png create mode 100644 images/truck.png create mode 100644 images/umbrella.png create mode 100644 index.php create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml create mode 100644 readme.md create mode 100644 required.php create mode 100644 settings.template.php create mode 100644 test.html create mode 100644 test.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f65e2ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +nbproject/private +settings.php +database.mwb.bak +debug +vendor \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..df0407f --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +Copyright (C) 2017 Netsyms Technologies. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL NETSYMS TECHNOLOGIES BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name and other identifying marks of Netsyms Technologies shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Netsyms Technologies. \ No newline at end of file diff --git a/api.php b/api.php new file mode 100644 index 0000000..ced2072 --- /dev/null +++ b/api.php @@ -0,0 +1,90 @@ + "OK", "pong" => true]; + exit(json_encode($out)); + case "new": + // generate unique session ID that has an essentially zero chance of being a duplicate. + // Contains a hash of a secure random number, a hash of the user's IP, and 23 uniqid() characters. + $skey = uniqid(substr(hash("md5", mt_rand()), 3, 5) . hash("md5", getUserIP()), true); + $answers = $database->select('answers', ['aid', 'aname']); + shuffle($answers); + $answers = array_slice($answers, 0, 5); + //var_dump($answers); + $correct_answer = $answers[mt_rand(0, count($answers) - 1)]; + $scrambled = ["real" => [], "fake" => []]; + foreach ($answers as $a) { + $scrambled["real"][] = $a['aid']; + $scrambled["fake"][] = substr(hash("md5", mt_rand()), 0, 20); + } + $database->insert("sessions", ["skey" => $skey, "aid" => $correct_answer['aid'], "expired" => 0, "#timestamp" => "NOW()"]); + $sid = $database->id(); + $scrambled_insert = []; + for ($i = 0; $i < count($scrambled['real']); $i++) { + $scrambled_insert[] = ["sid" => $sid, "aid" => $scrambled['real'][$i], "acode" => $scrambled['fake'][$i]]; + } + $database->insert("scrambled_answers", $scrambled_insert); + $resp = [ + "session" => $skey, + "question" => $correct_answer['aname'], + "answers" => $scrambled["fake"] + ]; + exit(json_encode($resp)); + case "img": + if (!$database->has('sessions', ['skey' => $VARS['s']])) { + sendError("Missing or invalid session ID.", "client"); + } + $sid = $database->get('sessions', 'sid', ['skey' => $VARS['s']]); + if (!$database->has("scrambled_answers", ["AND" => ["sid" => $sid, "acode" => $VARS['c']]])) { + sendError("Missing or invalid image code.", "client"); + } + $imgid = $database->get("scrambled_answers", ["[>]answers" => ["aid" => "aid"]], 'aimg', ["AND" => ["sid" => $sid, "acode" => $VARS['c']]]); + /* Load image, add some black/white noise, and send */ + header('Content-Type: image/png'); + $imgpath = __DIR__ . "/images/" . $imgid . ".png"; + if (DEBUG) { + file_put_contents("debug", $imgpath . "\n", FILE_APPEND); + } + $img = imagecreatefrompng($imgpath); + imageAlphaBlending($img, true); + imageSaveAlpha($img, true); + $black = imagecolorallocate($img, 0, 0, 0); + $white = imagecolorallocate($img, 255, 255, 255); + for ($i = 0; $i < 512; $i++) { + imagesetpixel($img, mt_rand(0, 63), mt_rand(0, 63), $black); + } + for ($i = 0; $i < 256; $i++) { + imagesetpixel($img, mt_rand(0, 63), mt_rand(0, 63), $white); + } + imagepng($img); + exit(); + case "verify": + if (!$database->has('sessions', ['skey' => $VARS['session_id']])) { + echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Session invalid."]); + exit(); + } + $sid = $database->get('sessions', 'sid', ['skey' => $VARS['session_id']]); + $expired = ($database->get('sessions', 'expired', ['skey' => $VARS['session_id']]) == 1 ? true : false); + if ($expired) { + echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Session key already used."]); + exit(); + } + if (!$database->has("scrambled_answers", ["AND" => ["sid" => $sid, "acode" => $VARS['answer_id']]])) { + echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Answer invalid."]); + exit(); + } + $aid = $database->get('scrambled_answers', 'aid', ["AND" => ["sid" => $sid, "acode" => $VARS['answer_id']]]); + if ($database->has('sessions', ["AND" => ["sid" => $sid, "aid" => $aid]])) { + echo json_encode(["session" => $VARS['session_id'], "result" => true]); + } else { + echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Answer incorrect."]); + } + $database->update("sessions", ['expired' => 1], ["sid" => $sid]); + exit(); + default: + sendError("Bad Request", "client"); +} \ No newline at end of file diff --git a/captcheck.js b/captcheck.js new file mode 100644 index 0000000..5a04c6c --- /dev/null +++ b/captcheck.js @@ -0,0 +1,58 @@ +window.onload = function () { + var api_url = "http://192.168.25.1/captcheck/api.php"; + var getJSON = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (this.readyState == 4) { + callback(this.status, this.responseText); + } + }; + xhr.send(); + }; + getJSON(api_url + "?action=new", function (status, json) { + /* Add custom styles */ + var styles = document.createElement('style'); + styles.innerHTML = ".captcheck_box {font-family: Ubuntu, Arial, sans-serif; border: 1px solid #e0e0e0; border-radius: 3px; display: inline-block; padding: 3px; margin: 5px 2px 5px 1px; background-color: #f5f5f5;} .captcheck_answer_label > input {visibility: hidden; position: absolute;} .captcheck_answer_label > input + img {cursor: pointer; border: 2px solid transparent; border-radius: 3px; min-width: 32px; width: 18%; max-width: 64px;} .captcheck_answer_label > input:checked + img {cursor: pointer; border: 2px solid #424242; border-radius: 3px;} .captcheck_error_message { color: red; }"; + document.body.appendChild(styles); + + /* Get captcha container div */ + var container = document.getElementById("captcheck_container"); + /* Create captcha div */ + var captcha = document.createElement("div"); + captcha.setAttribute("class", "captcheck_box"); + container.appendChild(captcha); + + if (status == 200) { + var data = JSON.parse(json); + /* Create answer buttons */ + var answers = ""; + for (var i = 0, len = data.answers.length; i < len; i++) { + var src = api_url + "?action=img&s=" + data.session + "&c=" + data.answers[i]; + answers += ""; + } + var answer_div = document.createElement("div"); + answer_div.innerHTML = answers; + /* Create question */ + var question_div = document.createElement("div"); + question_div.innerHTML = "Click on the " + data.question + ":"; + + /* Add question and answers */ + captcha.appendChild(question_div); + captcha.appendChild(answer_div); + + /* Add hidden session ID element */ + var skey_input = document.createElement("span"); + skey_input.innerHTML = ""; + captcha.appendChild(skey_input); + } else { + /* Add error message */ + captcha.innerHTML = "There was a problem loading the CAPTCHA."; + } + }); +} + +function chooseAnswer(ans) { + var box = document.getElementById("captcheck_answer_" + ans); + box.checked = true; +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..7e61998 --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "catfan/medoo": "^1.4" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..86b83e6 --- /dev/null +++ b/composer.lock @@ -0,0 +1,77 @@ +{ + "_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#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "3d60b6d6d1ba750afa45d307e067f006", + "packages": [ + { + "name": "catfan/medoo", + "version": "v1.4.4", + "source": { + "type": "git", + "url": "https://github.com/catfan/Medoo.git", + "reference": "bcabbef4d8355d52fc4d19f17463e5e816c9ef44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/catfan/Medoo/zipball/bcabbef4d8355d52fc4d19f17463e5e816c9ef44", + "reference": "bcabbef4d8355d52fc4d19f17463e5e816c9ef44", + "shasum": "" + }, + "require": { + "ext-pdo": "*", + "php": ">=5.4" + }, + "suggest": { + "ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform", + "ext-pdo_mysql": "For MySQL or MariaDB database", + "ext-pdo_oci": "For Oracle database", + "ext-pdo_oci8": "For Oracle version 8 database", + "ext-pdo_pqsql": "For PostgreSQL database", + "ext-pdo_sqlite": "For SQLite database", + "ext-pdo_sqlsrv": "For MSSQL database on Windows platform" + }, + "type": "framework", + "autoload": { + "psr-4": { + "Medoo\\": "/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Angel Lai", + "email": "angel@catfan.me" + } + ], + "description": "The lightest PHP database framework to accelerate development", + "homepage": "https://medoo.in", + "keywords": [ + "database", + "lightweight", + "mariadb", + "mssql", + "mysql", + "oracle", + "php framework", + "postgresql", + "sql", + "sqlite" + ], + "time": "2017-06-02T15:25:04+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/database.mwb b/database.mwb new file mode 100644 index 0000000000000000000000000000000000000000..43ba5558619082b5a7ad12d8b4d972a5c4f91357 GIT binary patch literal 8834 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 J>LxZQ{|3a;3{C(5 literal 0 HcmV?d00001 diff --git a/images/bolt.png b/images/bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..78795162eff189e6c40320d4ef45057cc43db477 GIT binary patch literal 752 zcmV3BUu!5cWFF==;zzxFB z?*lq5+dKq*2xv(~x&TK?w7KV8g-2duH~ilM9bS|Quo?J?T>-9pQ7Xi7?98tMyR}71 z&H;Uv_df?}5<>EjEI_~I{cSb*bpgv1AO1_2IYS+(5zq^CTipK`Qv`LS3Q+0c4=_dX z;a{V1M{EHGfE$0FeO^ShBQ|1}{)SVYu?;v0+yrK*&l8_T9W+TVcHjT~z;@siFp5c! zs}0(WtGOw`6^ff*242zFaPm5&=B5Nsu+RTC*OZqnggbmp2lLREOU@594QTWIHeb0000sk3?Kmo=iZ+92A#Izl?Ku)Zui(`n#@#F*v6$e!j?gFQv2VK6729ufs z)+A_X2_(22mEdwvF;a_Vbkue`oM<8gBtEn;^E}{TZ;2}s5!k|{!}!SH(MMLZdl!No oF3f&%TmdKI;Vst0O8F%ng9R* literal 0 HcmV?d00001 diff --git a/images/camera.png b/images/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..bdcda0220835366013256ddf23c60d01b9ec3c06 GIT binary patch literal 904 zcmV;319$w1P)@A^Vxz&2VB^{lmbG{@vdi8FGduUq%(8Qmo4_TUch8wOZ{8PV z$dDm}KCS?-fL}m0V*CVNdYq|87cfC|(YBcI+DI*);!eCDld-7@iA%T_@5jY>B!$Bi z@fk1`lcvDP0jtDkz^d0~WOQnf0Jn*EaO(2fObr%@@9F!o;96837y~{6Wzb;oZPEP)UIZt*BrgW_J+r#S|3mDvH~gFrI=UT}QztKF`kT_O_^aT7mk{;9c}S zi)ltDaHsYcAD82=B{BTh+EJ4%1HJLrk_i3+yP@8Is^dm0z&tPwlz?U6hxfOGUW@=Y zfV03Z$Mtk;+!8 zngMTs9tH6}dVpEw8XKV5?e}dVW)ye?e8PNr%HGcpf$LlRUk+GGy8#vK@BAR}E&xXf z7_e}hLT|R}#DK?^!Y=^7L-4F%K8X^Zq}6~m;E2FG7*c$#2~tluiq7Xz-GEt%6w{@f z<(x;DutemnGeC3k^Fqjt0_P%do&l~3`RNFpb0a4#6X(g$#nOYWjdlh(r*4O}97jkNKYZ`Ds$Z2#{i9=(J0q7dgC*(8+D~UsD zt0`z2APrW}6?i2M+bl5>q7Eu=ExdCPIBk=wAZv<1gP^7XwyE#{W?CDTZv{9m@b#0@ zsc;o@g+;Bw=bA=QX=sL!1;$i1slba#nUBLo7>vafxQL+|!%r(K5>tF zui0=B;ZG)*)S5j}`tJ)tvfe{l()S<2jE4yapyb##?a-coll1Qw+z^ zZ!1Ii041FP4;hZ5-(~_>3Aw=??2oFiwnBxUqrc~QYqfw`S2)Qja0|VaqmYb|uR`@i zQh>$5y_n(jKI#Qnat)9aU?zYOE1cdX1*p4+R2HXq$;GV+TpZks2~A+U*8s^3I1b~* z1gCdN0S*HgvEslrVAKoX^e!pDegGp@IK4{>uou9H6}zqhk^+1UV8n_b-beajNXm8v z0{QB*B$#wTQRQ&}P))68o@=ZiQuc!V;Wmc5_Jl5$cA< zWWRKnJOkFvSiiYJ9}eapiUnBOeJ|12onI6S(1>6p78CzG6$|h-f{|D(%P)!rcpbq= zEGA}qu>eC6jKpGMu!{w_8No;_UgQ_W0t^>#%yDityKzMPjY`#OV12U!^x|O+OjfBY z&BEub#rqlAbww)G@V56P$SY;ot&d(U|@_hatNTihQU zgy%W;p8uVh`wb3^E>cvFu{tF~!AaZ7i|uVqk{w26&%Xc9vO3 zxcDVt9!SNNRCz?@v;q%-!vQ`Gl4Vr@n*;uT1b7OxNS0@vK45|WPw*D7%Ezx8xi?@5 z*zXfx0o)}2O*s^y4lOPK8I}up3DoEKrGOD1zhZWk{Li2P829l@16@{>NpRjLp<#A56oqK`5r zXb(@u-lEsnlzXuzbwo=YTrq9{IHeeqWg2)5T=)J)N-bhKdk|eMlbkBg8ol3izWIx`MF!F8lTh4t z(7MVZR3SRZq#Ixc*kD#yI0oP0sJKSCthd^7;cfPu#eI@APBcIxNTXknnh4#1w*MNMP;RvEzTRX;k`Te-*7M!vSwz;Eg&R7O7C^S~hTEqSAH z-3BlZTnF|Pk(dhIzOLFDQlL>_m%`s8;H!qeVDrMHuPaC^OaOZgVzdL}z!P9yBaZiZ zVcORvq)2@^#O?xa0M9kz<~}b5fEn~Yg)(p-7|J7X217}VvWA{@q~-c;gY^STb%J~Y zCV|To+lMVl%*jN9O5+liMVQWTSYc}tcQ_=G7afR}c|=>9<|!M;wUfOB+yc6tCHtcr z(OBYN?aTEpY)*OaV9o0;;0$mIXmXP2kE1{jaH!_}+SgjB`syuk7l#3pBfZGfe~DVN zF*-}mCh!bdrmU)L$v(FFUU$1~jBWv{_7mB-j03G!X{l)eMv&d#cME;SmqXRsZO8(oeO1Sjzt=Rb zGij}cE`W*I4%Z!DfNHxOwh^D=&)Go{R^4C?*a)tp-`Rn0yI>>IK);f-y}eb{9LW3k zMXi3N|Fj=N{}r(Sp#_8{79g~M(8L0S77&_PfY1U$6AKVpKxonmuv)l^d>BOTA8f}e zm#jx)zRZ=k5bJMJ$n zb57&7cYv+-Qk_kj2hJ6dkS+BFRhC^to(p9CeGTD7$vSKvE yWcP(?#c0UM?u#KL*;QmOKZV~Twvk9AqU0~Bjh1YM*U#br0000TQ@L^`x}<+ngKd>lN#|ruL+m2&|4KVz<}a+8-RNr zm{iq6)R+7KFs&0n+UyeIX;4c9oCJP*U^uNmz$xStyXC;eim}=O#K3FB#7IUbFz$i* zSHM<<#x00PVC8tD0Ak=TVliQG4LMPspz+vY>&(FWM3IOfVUa7<`O`Rm_eRLOgw670)`MXv3h-`ld(;T zKIf8SW!0Hm0BKDCU5eh_%>Q;dhI-=FmGo{@U+w|Kh^gry@@4l3=ml;g?(CDv&%N`E zA541M&{jwQX^kRYpt7}y+3;Q>@$4Lusi?*Sgb(4YB|x3J~H7EpL6~Hw|@N2XvDf@<6QZI;(3wdGF7&st^R5e8>I g5C{YUfxzP7ADH-eT9uOy9{>OV07*qoM6N<$f(luGHUIzs literal 0 HcmV?d00001 diff --git a/images/female.png b/images/female.png new file mode 100644 index 0000000000000000000000000000000000000000..a59e303924e051d4347416f42f89208e857bedcd GIT binary patch literal 790 zcmV+x1L^#UP)d?%Up?dJBpJ9{?!NN;1!?aezkbGJSnL?V$$ zM3h-z8E68Bsha6;GXe7wVF73Z9gW&)%t&$vNYI_z?4-m= zfF)qkBK~Z8%*fEB_|?y}6(mzn9AaO9wnSo5BhV>vOyWF?9Ha`cBXo>4QU!P=bWCNL z!R|5m3z!O$sYmJ*-w53fl%sd*bT>JsD?hU4Gp2!ubf5F>RG-q{My~DuYsP_lz+0e& z{YI#j9(y-kYpA#cyuseIPOpKBq7DY&4DcRz<}BT33)1v@7AyMD41G50dA&owk83tp)YJ@M#0qj zjh?tN1pxC?CHN?qT7L&P*ArW|0F%HMO-#^HIIi{Ql=!j*fQpX7nkJzRu&Tt?46!=Z zlr>fjvErj()B0n;M@_6rTm1Vcs4}Bq+xm-|*dn^GtW}9ocxp&kZT%_Wzz~0&4(NYL zVj6`f&RiP!p*i_3-R|gR-H>citt)GqI`F$Qmj=G&oH(!bYq;4RCcqVCZQUsBJ9BB^ zan6YwO3XO0nG;u5oAkdGYUIQ%J9BAZ0(eBX+AZK2a9W8OE0*y)0`^t z!er1JpH4p+l22$};@-UOhFCc+TXCar^Xi)IF6>IGLTaDlS}mF~cV1VQ>zFW0 zOH4ws{2@ceE0%`pYik%T++x&H`zP(FVdQ&MBb@0P=lm^#A|> literal 0 HcmV?d00001 diff --git a/images/flag.png b/images/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..635d51f56da377f5ea47ed3ee8a42c674a9d635b GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lNlJ8JUv|; zLn`LHy=k8<5-8I4G5!y~m{{OO!5|IJ8y#k1T?!q&w<5C^HkLGPZGFJLVdIufn|$A} zxVrRqH7Ru|gbDU|nHUDPcwBjur*QMl8spuw_ez~-ZofNsX7#)3d)CI>-vwA4f#|{v z#-4;_VuxRxU$vr}CqZcct4EvvA88Tv?w;TOuxHn{dL%eG=GT>R$2>!^B`D#MoBlOkO!yB?Y9CAdd! zEL}5=OMdlf>o8SMdplDB^TxTX$=@DGrAhZ>o8~=~2%CCgkJ$1Lt33C4eKGa8aQ(rq z!#i#!HHN0%B^=Qe6Eo)=axPMum(|o65nk0PgLFP%ze_RosBrSmt|Y&#Cb{su=esps+4iipwrlMUO5So=W>QsOy!4Bi{gHQ$SLW!?-Z6LI z0l}D+zBQpyUsrAt-hRSr<iQ-rXMs?ypkIIo=?8@c%dS9W6M#;}uh!fAIV6 l)2b>QO$r=M3vT~mW7-|Gll9o%iNIvW;OXk;vd$@?2>>ZgA>jZ3 literal 0 HcmV?d00001 diff --git a/images/globe.png b/images/globe.png new file mode 100644 index 0000000000000000000000000000000000000000..9f55fc3836b9c3f9d905cd8ea4eaaf2b31f7b6e2 GIT binary patch literal 1315 zcmV+;1>E|HP)qqTdNV{)5)Z;G?=3TMO*P$l^pXMY9Nl87Bs@qJoVHSSfrW%_he|ENC*OXl5Dy%^$%n z7458-A51Ui;(lQsP$eg{JTZ0~p6v&5TSYsk;!pX3d|jv4g}p)te^H>H?Yx!_kv%z$ zE^WY0H(nK-F$<6^>oUomja94@WXgrwX zOZF{Dx`0|fLSsMU&XkR1m?De_oA53^8^M=)S(eg?uSy#G-0`)2O1f}8&T>3Q#LCuG zPE1$6o_`=!V+G6*rpr}2;3%e*86FkU_&nvAzAwT~Ba9c4?`~XJ@!l@M_YsNdfH@I5 z0}(n^8I8w;>GkLaZIt>RGi#b1p;I(&H_8m5W^iqjc4B-lWtZ~r?K_;FqOlrPzxN{f zwydF;Par0{UxX(j^kVrwk)0$X(_!&hcb%}%X_Qg8$MB_gqjIs%_ebbt=@E*bPv!h~g-{O5a)U&}Rvr6N7y?;P>(zj>qmf-3pZ5K(@ zVknj>)!97h6AB$ei>i4-d20;bXi*1ji3u#bqf^9q+!U#s#{?l4%*R+-pRSXM`InoCUx-S zm&H@bMm!>Hb{-QZMH6wpaGd6CY!>zm%51f)EKdH$NGjQh8*9N9O})qBl@dFv(uF&m zysfd+vbn^Eu|kmha_-%x4W~zD%HPsTB{9|9`-DkU{eAty=1N;wDBYSpE9*+yUTOHm zY*6*x>84pMeek{V4^$A6;RglxJ(N1QSQbnBCcKu@#uz*-)E2V(gZ{(dhgcw8PI#-% z?o>Q2Y`x{__WKWB`yysaGdgS%Hb}oI(c7kt2``p*9h6+P)Y4yO(OO#x=6>Nm_2U7~wf*wibWXsGBqPeo6Y#Qai%sj~G`T+q1p zfG#|c>>qnBF^XP1pL+0vn1TJ?z3{LY8(I&>HDFWmUVAZBJ-SDtlwu#WHXcTMHGyt|$AV5}qoi==vKPnI+tp=rA{F%lgT&h5rc6CWK zyOj&8@OK45CDkn~&ntYBPjR~f;ohdZSd(}7CadMUa+A02h%Qv2^x|5;khAFqJ}EHw zGlM0Z=I>BR5y4?if{P%$Uyz|Zmve?{e+b~W5cX(4{DB}&3*>uDN)~=!AdiK!OSC{STkuJI7tCEr>=56C zNqig7SE+0@eG~Kqz6|Op0GsiTXs&T{U@tW_H8nLgHSZy>0XZ~^lB1~Z;{X5v07*qo IM6N<$g2MWSkN^Mx literal 0 HcmV?d00001 diff --git a/images/male.png b/images/male.png new file mode 100644 index 0000000000000000000000000000000000000000..ece914b8d8e5adb352e2f1876371d04a9b73e852 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!N&|dCT!A#5!TOOtu?8Qr$uRMGH>GPMbKmV;d>{kKQz?kIi z?xGgOF=H!`^Uc%6F(l&f+bOs64jJ$`?A#ob7i)dWi+jnJKmYaLwKm=Kx*WmWGUap1 z$xog#H(!3W=}#4Uo;ve*a_-+d3=K11zY-TsUlmYVf4KFrhoXl-jTXyJkrXaRO;$HW zgP?*6SMH4>E?fsAz7$Agu_^B1yX0fu_3&fOKcC$^i#3d&Sxebfce1~JdsZN}O*58v z*A@TrJF2tGEcP#zGx{xiZOf)DT-)9@_1+dT+p{FJp*5ZJU)MTG{SQss1>P`rsX5Nw z_<>cxoby#rYh93t=YG$CbgNIROXt{^>wjR<|Dk@6vtcraj3=Xq>w^>StO6YerYe}u eexUZ@&O`QNC6kP;+%HZB#hRz9pUXO@geCx}3ZK>h literal 0 HcmV?d00001 diff --git a/images/mobile.png b/images/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c98183d1fd8cd179331d764727da28c025c2c6 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!TmyVUT!A!&;Q#;scS6oQ1)3sS z666=mAg`dLtYTw3ea6f+YuBxR{r1^yE*-IpvAT$uef9Q*#9@EgYXb6dfU?ij~5-Q#nLWGbA-4ONI z5F*4Ybc5JoAx*j<9tj&;??&h*~7=iC|GUvd_A=6vV- zpF8(_=bP^yh=_=Yh=_>zU+ET-pAuji5C_HsWk4+9e=l%2Bpsnr46Fri0&PG?iuMC_ zGyWL{0|$Z6q@HwgYX{1+qSP=2z;>VoZxioqyRsqHG~<8=r2mzFxO~1p8)8kf0{DXa z#9sotf$6|^@!cuH3&Pgeg8Rfj0_%XhM8A6R{WG9<*kVny4fn~Pz!}xYpzi{+!W3$Q zrKokCJgJ|+W|zJPMZc>dX|%=!;2X|KwE$Hvee-~KqVL>rWZI!8@DTl%Uy!2zRMGb} z(8Ib)i|j;S^EGMu%OH8ovOcQ}Mc?jDc42c?^j~gMply!eoJ!X|E0piN@v zDefu{cCUraKwAQBvmQN|<$JLED(nhu3A9ZE&WUXGXeVz#krj28DZ@F5R#bt*3vY$( zU>gF1(A`6yDdPGr(CBgeW^rBW(JnN++<;1PeZ|N4kHz%_AGV?3`xNk*c_gyhzU zDx$7J?INY9I8umuDkmkrt4Gf^uLsno(HHn6oNO>KZV_sCkXvNX_QrrVjlIH2GhG)& zy%I+~zA|IXwAC8Y-tTNi^DY*{Nw{OPzNr~0gq7S zwXdih=i2=t}ULbxwI=b~4fn}A_q z37C%_xm!`E!fdm~#djN7cVT8{yHNWCmFX`fL~MsbMq2uxpK zHR?@Ly2H}xmd#~gB^HY%VU?m{r~^}#z-Uy=C_x>TY(pKa{D=yg4XAi>3zhyxL_|bH dL_|bb;TI;~D43A{ddmO+002ovPDHLkV1gv#4W0l1 literal 0 HcmV?d00001 diff --git a/images/paint-brush.png b/images/paint-brush.png new file mode 100644 index 0000000000000000000000000000000000000000..263219f73c9be8c199391156d6801d70595d50c7 GIT binary patch literal 916 zcmV;F18e+=P)pilRhN z^x$#{cyR#_9t8CwVo*eb8-jR^2QfrNj|LZns2DP?!H^&fMnlHL_E3q$H*cKxs;mCp zBkv2v9Nu*I?^{*fwRAIK!h{L`AI`^C{DeP`{oRTSx(pS?T{whhNcjV|be1fD#|#%g zvCQG}t^(F#3R^5Lf4scaP0Tth$J<7iZ}43gL2IxQJB%maU~d;;OEZm6jW6HeqYm;G zWj%JwlW*{7eB^RmERE~A@^d&RJar+i!>oMyB|QS%XyFOYsO1PQiVj|a2XIt7`35gV z2QR@x+KV^RGYS4l;_)J;( zJyMVAJ?G(DW#t>(7AcX-2JBN_ekV=}^vGf(ep6olFI*Gok;RobsJwiG*8@GWSfx(4 zZ=@d8`vuR_>c}^EB+w&^Dg2_2{BBEN*xR69>)#OQkOjcDm=Pd5a zJvh1o4pcbjgVI*nlHfvRyZ*bDz>IH@8D->Wu`W1!5k`5BH%hrPI(R8o;AidRUn~`- z#{F|TE|cELPvfj(E-@-Rb8+f+|@$rFkoQ!*<-ZMAwzh6qbx@#(X zWU)#9Lu?C98*& zf#0uCPX5Hwo1L8FPvs+c()@e%O?4`uH`CgW&A(SSVKr`-DyBvSOh?F#!gJ~fE>?18 zg{>L3AFwk#MVjc$b#UFG74S)TigcTG!mtY1g|CBi>C@vFM6KV$f!s5jiJp8R249jB7dE6U3s#T}6n zZCHj^m6Jb&TO$QZaliIobbO9Wql1^^Y&>uLir9s_rQXyla(81^O1n85aS6`F8Pc$N qKpNX;@S*hWU-Zm!!h{JEM&fTY@S7Q4LBhoV0000}%W5^?zLm6JkE1|lvO-41fHKVs1O^8f!bZrA1(t=~&e@$M0wT`cUxl`t!F$xK~w z&z^Yml)W2&>v~Q)?vbze=EuCrN8g`Z;dFfR^BWBM|8*_c57df=HK{YVRxABTPzv2Ape_gtta^QcA z#FuZMXa9LoBl+Rf-}KO9KiV1v|LC60tf{xLogi)NVZ_?doce$LfzO)T*Su%{bLjm& z{u-_(_v}ASk9Ie1nRsr!_>B0cU#%G@w}1V|!Tl+XjNz{*g1g(VTr|pL-q`hbAGnv>6OmNF;Rl4-#H`BFKp64p}ac=oJFX6Y5V||-JI73@- z$4*9rdC6y38FGX+X*!hZKG-~ECgatu3uYfX!{SiR{^I#g#)fy2ZF?94VzW=ZX58?{ z^Ah8>O4)?D*BQQ5$`qV<-0K#zIJARD2+Ui9yY-#m(rDot?SQnT5R{oNniw z-*4vLbLZY!@OV5PkH^!hwB;?pkWOGPunkxZd;zWjck>jL1zo@hFay+LVrPER+_MY# zM7;4ZZsn%VF-L(plFiqEdszu80b{^>;0AC6*a);cs1=ZIJdEoO>eo>MCK?F%hG;}5 zfz3dNVXdG+oknrcuwE)Xz$*nozkp}JS;QRfRHzjw)Tsf}K+(WkDoIaXHhu$7fQ!H$ zL|2a^(8ztkp4E89G(@FE6&MGu0Q-S8=$ZcrEO+L7o(GyHUB?`--J$P)v;%{P&Y!pG zXdH8CI*tOO%YQc%ZX<>rdrhPZxQu9QEoVMTFL09l=*M|4X`R#H91fK9wAPUOrE^QfUka@X=$ZPM~J05^XVE6R4aq$=lsU zWeeNSnLy5MPZ!6Kh{JEM-xg|85MWDKVKXJo%RPAWpZou1cNcup(WwaL{r|R4p6|_r zQ!{$cYS?HROnt5zGr56fbL9__1q~|IObnSyQVNZWmo`KNFrKOnVEQnf>FF_!7c%)7 zEG1HJa#%iC+I`JCE(bz4~^B zT@2gyI&oFCyyjxKE*Fr=pqDJyF#TAm9p?cFfqCj;jFV^QHtuI$!F*ymqk8RwjQ!kh z&C9ALKV6(R_fE-;e@_(Tzu%6`Nc%hE_I#z;h4%z!tzz6FUYHDu5>Hn@mvv4FO#pv4 BldAv# literal 0 HcmV?d00001 diff --git a/images/puzzle-piece.png b/images/puzzle-piece.png new file mode 100644 index 0000000000000000000000000000000000000000..7426bdb8608287289e700287ea3eaebfa29fc091 GIT binary patch literal 959 zcmV;w13>(VP)hp z%jukKbjlr)IUgWTNp(JEx?_ao0SJK2`Ixy7n|-lf^Zw-)+cw5#016uS7J&haZ5v}V z06iM_J_3GPY`ZKtO0vE`4eZXzMyFH(FNhDog}e;Rg6+T*(aygDYICzLBd!n~fIT_d zl^Ly+cD^h|{l&PLlMewiB|iV^psm!n2ta#;ZmXmA%8Iqf6A(29oHW#RHgGOcd^Zfd z1A2iz;8S@0jLiCidH1dW4g;5gO)+gg0B!+qk@Z7;Siccy0$Rdrb66U~wwjZ>Wrw); z`8d+Azaf(worREYdE&~+niO^G!jc8Ou7oRPQ0j9f>;vFR*fRfp0G!PtRjQua3#(-&HCGgvYcqKdmHOM+6iYjD3@-8wp z|AS1=ZzI_%V_eSdb<2BXrMZ|LsP`c!k$h#v2OvOx-45iH*a}=le(kt=-+|TtLIBc~ zGf_^u7y}BxMW78>h4kTOpc8oPpuHq?m{c-}^h4x;go+c$#3supz$go)+sGSWSwihg z83$l0ivS$c&~Cu}F4Fw+CCU(+W5835dkervgEmHh=fI$5J)Oku9J*0ns;U24Lwg)J zxTyYK;AO)4`!#I?4dZ4@lZJLR@IyoUe1uLdl5ACVr|TMaEkHK_of_Khn%cW!^xA-K z76xJz=psco*A2k^gu2y8Ki1JMH4QFBJ(8i`f`vm^x&bH>|4RX!Gtl0U))^CYjSP_d zzbe7-4>M)Ydj^di3?hKC37OOTz*CCPLh`ff@hu0QlF*CpJ z1hN$F0zSmFc?38PYz5XJGr|eve+veXdHx`B4xvB%dn~z2dZgKMu0wWfi^$@}S@Oc; h@pwEQkH_P&&tET;*u=!9hMxcc002ovPDHLkV1gd3wE+MC literal 0 HcmV?d00001 diff --git a/images/shopping-basket.png b/images/shopping-basket.png new file mode 100644 index 0000000000000000000000000000000000000000..ad318e87fab4b99d18033bd47398bcf430030438 GIT binary patch literal 971 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 j`_9&0zy3!zX_bP0l+XkKI|_LD literal 0 HcmV?d00001 diff --git a/images/star.png b/images/star.png new file mode 100644 index 0000000000000000000000000000000000000000..555fe91579a51a8438fa87ae8cd1d9baf7eb935d GIT binary patch literal 858 zcmV-g1Eu_lP)CCPAA`AwED<1QEePK_n1C zFk0G(b~bA510|xERpwI z&%HBq@0|sQ!{KmPVIA-h81a5DI);FX7ekh{7^ed$@xK9Opwp@%!vsg)kLNZ8nPdlZ zM?W|Vc3RYBjAzU@@5fV%x{R<5m?pddMPR!%bq07sxOqPYt*O(@R_c#_%g=(xG&b+Y zBTE{!u>~j)y#Yn!dC@XFB)WM&9#~PTfsMc<@f%P8He1lEocqK#@5en0dX=()WTWrL z6tGFBz@-{;wgG#ABfw3dD@Cql$R;TRtV9|zl~!PoB?+%vfvoAffc8LiBlo;cegI#q zVgwile#K4Jr~$iy9%Pf!0qpXAua8^E5Z{1N;4?7h{T>EBB}w**v(=iR4(PiG}B(fZ}ZMHfJz-f)X=Wv2_n;g~g z7dWofaSaXwzf%fVW&WsUub~`7HXydl|3P-0R>=e3F>n4Su-|~cNaT^xFgfyh6~dFA z2UL?mo(HQG^24d_vn$9PTG02N7)vp~}*sk!K9 zfQq+37I`f#SCA_XC15qOLrsi|8PJJ&^B|2+{g)aQ4X`o&mDN_!fHV)IBI%}ZQ#2rn zh*{*Uz8jgwgUGpKTx`63<}pURb^IG(UyVF_fEP$}qUIXa(v+!)V-mxUPIb|JHP<)Kr}@TxPpxS kT7z{R4u`|xa5!3re_{^qT}q*8SpWb407*qoM6N<$g0>ZeUjP6A literal 0 HcmV?d00001 diff --git a/images/sun-o.png b/images/sun-o.png new file mode 100644 index 0000000000000000000000000000000000000000..07a4eb5f28bc2c5aeb47db509603c4f8d747ff00 GIT binary patch literal 968 zcmV;(12_DMP)Wuzdo40>{&n zl?;uDHSZ1HY43r(si}*>Brpry1UeM^`vvc`Nd-F{(&sEN5m~iCN^A-L2h0Pvfvy^T z2Z0U3CtySN_0lD6&r4rU|B|t2Vo=6EkVW7wa2{v@mIC^E+c%&UC;)eW4*`A4wu1~J zXacI+nqt2=W3(n7ya4&}qscB4VG|Ew69C(fY z9ofd34`bLz%cj&ij?f;9L%=Oy4tL(|cehWApxvQ@&_0KVr6r2t>eHIAecr@Y7ndHw z^8}|wI&~USG&*e{2wjS(X&s7c_<@4aer@^s3=*#MejLLGfQ0~~i$qIrZP5UH!C&VB zB9>SbsGWUPfGG{prg=zhjemhty2eL+j9=9?Y>;cz);Ma)!P6SXPn$AsfIhbCdxpU! z+6pXt9JHD;Zh*tMwJl>oUq9~jcb{no8tliNn_N&GnADNjjwka=Ak#O&OmBmkPK3fz z;S#$%70&d-km}=bQCq$~Pf*hu>2Wy9fk?qX5OL|n(t$_|>PKQT`fXpz$w*S1MQm}7f2+shet7>FStSF1jCd*IzWi1Zzm6@= z;SRn+o&7iHEQcEwe2w6~?CW*{s&|JT13r2QzT4OB1UPr(A}~Po0*L`cl4G?%LN}K$ zqh8&)1UyHS$b6EY*W`E2h}yqyMBo=ut2+eo9FST$P1qHXMANzgk~$LmozR%b*qne8 za1Zgs*p8?QQ{_8iY4spVVLzG{XNt_1%1$7*yR?d>XAq^dJBD3XE+2jX?f`rN_#SHj@MPK%F@NEYO2U8eM{sJQi9odtUdd?mcW|*Ym2@kV9x%v)wLtY zeL!bevwzF&yV?;PIt5NW=)#P~((s`qXu+2f+|B~pgOFc_8zer&tx*0jB0)Wdy$za!D$Jh00000NkvXXu0mjfZ9&|? literal 0 HcmV?d00001 diff --git a/images/truck.png b/images/truck.png new file mode 100644 index 0000000000000000000000000000000000000000..835d32e1365fd9a7b68556a3652f2f8ce49457a2 GIT binary patch literal 545 zcmV++0^a?JP)wEndptEEDjxp-{b~dk`Gjm5neakTh1r(4+Z|S^7U` z2^`lz&xuh;%w-H~q?gD6@RY*LquHk}dd{XsL{HD~X*l#`rffZDx@;~~&%lovWAj-N jzrnKg6h%=KMQJF1G86yfid8Sy00000NkvXXu0mjf1s3e? literal 0 HcmV?d00001 diff --git a/images/umbrella.png b/images/umbrella.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ba0ae9e5c11023733804c78141366e6e908d42 GIT binary patch literal 859 zcmV-h1ElK~#90?b^?)7F8U_@mG4|Zql?xM3x2W!nXZd7-$ek32tgpi@<*% zCoS8G{Ib<@KOeT|p{g{ujKe3i1%ws9WTq+Tdr0Q5O-cJ%O8&Y)ICI0sb zNXeD~pIfDkarXrF;AQN>4m^d&un9Bx6L*E1;T(R!C7j2d7Bo(soj59(cwpsjKWg-F z4jnkgcYGd?aar%>ew2!F9|D7 zBlD@Ss#7&giad{Bm76ajg2ykpYUBpnPCzD-^aEZnUCbZ#!__JC2|5% z3rI~)KxzT0$q7g;AT>DwsRg7aCt!+g<$ZrvUTlWh_c!dz(3)YtB1=HzG+EgqrBkZO%u29zAzj%3#+w7 z^F8cNptljeH2NPGUnEi55F2sY@a9j)I_rv!!j;f7*mzGk^XtxhKf8sS+ZAEE>m6K< lzpa}wpUGr0nM`Kw@*h`H + + org.netbeans.modules.php.project + + + Captcheck + + + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..9618f53 --- /dev/null +++ b/readme.md @@ -0,0 +1,60 @@ +Captcheck +========= + +Easy, light, self-hostable CAPTCHA service. Works on all modern browsers and +IE9+. Uses icons from Font-Awesome. + +How to use +---------- + +In your form, put an empty div with the ID "captcheck_container". +Add `captcheck.js` into your page. + + + + + Captcheck Sample Form + + + + + +
+ +
+
+ +
+ + + +When the form is submitted, your server will receive two extra form fields: +`captcheck_session_code` and `captcheck_selected_answer`. +In your form handling code, send a request to `http(s)://captcheck-url/api.php`. +Pass the variables `session_id` and `answer_id` with the values sent with the form, +and also pass the variable `action` with the value `verify`. +You will receive a JSON response with (among other things) `"result": true` or +`"result": false`. If result is false, the user failed the test, and another +variable `msg` is available with an explanation. + +Example URL: +`http(s)://captcheck-url/api.php?action=verify&session_id=&answer_id=` + +Example responses: +`{"session":"some_session_id","result":true}` +`{"session":"some_session_id","result":false,"msg":"Answer incorrect."}` + + +Execution Flow +-------------- + + JS = captcheck.js, API = api.php, FORM = parent form, + SITE = form processing code, -> = some action taken on the right by the left + + JS -> API: Request session ID, question, and answers (with scrambled random codes) + API -> JS: Sends info, saves session ID, correct answer, and scrambled answer codes in DB + JS -> API: Requests answer images by sending scrambled value and session ID + JS -> FORM: Adds hidden field with value=session ID, displays question and images + [USER SUBMITS FORM] + SITE -> API: Sends session ID and scrambled answer + API -> SITE: Responds with true/false to indicate if the answer is valid, marks session as expired to prevent CAPTCHA reuse diff --git a/required.php b/required.php new file mode 100644 index 0000000..557625e --- /dev/null +++ b/required.php @@ -0,0 +1,144 @@ + $error, "code" => $code])); +} + +// Database settings +// Also inits database and stuff +use Medoo\Medoo; + +$database; +try { + $database = new Medoo([ + 'database_type' => DB_TYPE, + 'database_name' => DB_NAME, + 'server' => DB_SERVER, + 'username' => DB_USER, + 'password' => DB_PASS, + 'charset' => DB_CHARSET + ]); +} catch (Exception $ex) { + sendError("Database error. Try again later."); +} + + +if (!DEBUG) { + error_reporting(0); +} else { + error_reporting(E_ALL); + ini_set('display_errors', 'On'); +} + + +$VARS; +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $VARS = $_POST; + define("GET", false); +} else { + $VARS = $_GET; + define("GET", true); +} + +/** + * Checks if a string or whatever is empty. + * @param $str The thingy to check + * @return boolean True if it's empty or whatever. + */ +function is_empty($str) { + return (is_null($str) || !isset($str) || $str == ''); +} + +/* + * http://stackoverflow.com/a/20075147/2534036 + */ +if (!function_exists('base_url')) { + + function base_url($atRoot = FALSE, $atCore = FALSE, $parse = FALSE) { + if (isset($_SERVER['HTTP_HOST'])) { + $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http'; + $hostname = $_SERVER['HTTP_HOST']; + $dir = str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']); + + $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY); + $core = $core[0]; + + $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s"); + $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir); + $base_url = sprintf($tmplt, $http, $hostname, $end); + } else + $base_url = 'http://localhost/'; + + if ($parse) { + $base_url = parse_url($base_url); + if (isset($base_url['path'])) + if ($base_url['path'] == '/') + $base_url['path'] = ''; + } + + return $base_url; + } + +} + + +/** + * Attempts to discover the user's IP address. + * @return string IP string or "NOT FOUND". + */ +function getUserIP() { + $ip = ""; + if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) { + $ip = $_SERVER["HTTP_CF_CONNECTING_IP"]; + } else if (isset($_SERVER["HTTP_CLIENT_IP"])) { + $ip = $_SERVER["HTTP_CLIENT_IP"]; + } else if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { + $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; + } else if (isset($_SERVER["HTTP_X_FORWARDED"])) { + $ip = $_SERVER["HTTP_X_FORWARDED"]; + } else if (isset($_SERVER["HTTP_FORWARDED_FOR"])) { + $ip = $_SERVER["HTTP_FORWARDED_FOR"]; + } else if (isset($_SERVER["HTTP_FORWARDED"])) { + $ip = $_SERVER["HTTP_FORWARDED"]; + } else if (isset($_SERVER["REMOTE_ADDR"])) { + $ip = $_SERVER["REMOTE_ADDR"]; + } else { + $ip = "NOT FOUND"; + } + return $ip; +} \ No newline at end of file diff --git a/settings.template.php b/settings.template.php new file mode 100644 index 0000000..5653230 --- /dev/null +++ b/settings.template.php @@ -0,0 +1,14 @@ + + + + Captcheck Test Page + + + + + +
+ +
+
+ +
+ + diff --git a/test.php b/test.php new file mode 100644 index 0000000..6952c66 --- /dev/null +++ b/test.php @@ -0,0 +1,6 @@ + $_GET, "api" => json_decode(file_get_contents("http://localhost/captcheck/api.php?action=verify&session_id=" . $_GET["captcheck_session_code"] . "&answer_id=".$_GET["captcheck_selected_answer"]), true)]); \ No newline at end of file