Skip to content
Snippets Groups Projects
Commit e1d9ac47 authored by Sibidharan's avatar Sibidharan :speech_balloon:
Browse files

Merge commit 'c9825926' into HEAD

parents 959292c9 c9825926
No related branches found
No related tags found
No related merge requests found
Showing
with 557 additions and 43 deletions
{ {
// See https://go.microsoft.com/fwlink/?LinkId=733558 // See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format // for the documentation about the tasks.json format
//
"version": "2.0.0", "version": "2.0.0",
"tasks": [ "tasks": [
{ {
"label": "Apache Error", "label": "Apache Error",
"type": "shell", "type": "shell",
"command": "tail -f /var/log/apache2/error.log" "command": "tail -f /var/log/apache2/error.log"
},
{
"label": "Grunt",
"type": "shell",
"command": "cd /home/sibidharan/htdocs/photogram/project/grunt && grunt --force"
} }
] ]
} }
\ No newline at end of file
<FilesMatch "\.(ico|pdf|jpg|jpeg|png|webp|gif|html|htm|xml|txt|xsl|css)$">
Header set Cache-Control "max-age=31536050"
</FilesMatch>
ErrorDocument 404 /error.php ErrorDocument 404 /error.php
ErrorDocument 500 "<H1>Some error, contact administrator</H1>" ErrorDocument 500 "<H1>Some error, contact administrator</H1>"
...@@ -6,5 +10,10 @@ RewriteBase / ...@@ -6,5 +10,10 @@ RewriteBase /
RewriteRule ^/?files/([^/]+)?$ files.php?name=$1 [L,QSA,NC] RewriteRule ^/?files/([^/]+)?$ files.php?name=$1 [L,QSA,NC]
RewriteRule ^/?api/([^/]+)?$ api.php?rquest=$1 [L,QSA,NC]
RewriteRule ^/?api/([^/]+)/(.+)?$ api.php?rquest=$2&namespace=$1 [L,QSA,NC]
RewriteCond %{REQUEST_FILENAME}\.php -f RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/.]+)$ $1.php [L] RewriteRule ^([^/.]+)$ $1.php [L]
\ No newline at end of file
...@@ -15,38 +15,46 @@ ...@@ -15,38 +15,46 @@
?> ?>
</main> </main>
<?php Session::loadTemplate('_footer'); ?> <?php Session::loadTemplate('_footer'); ?>
<div id="modalsGarbage">
<div class="modal fade animate__animated" id="dummy-dialog-modal" tabindex="-1" role="dialog" aria-labelledby=""
aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content blur" style="box-shadow: rgba(3, 102, 214, 0.3) 0px 0px 0px 3px">
<div class="modal-header">
<h4 class="modal-title"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</div>
<script <script
src="<?=get_config('base_path')?>assets/dist/js/bootstrap.bundle.min.js"> src="<?=get_config('base_path')?>assets/dist/js/bootstrap.bundle.min.js">
</script> </script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js" integrity="sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js"
integrity="sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D" crossorigin="anonymous">
</script>
<script src="https://unpkg.com/imagesloaded@5/imagesloaded.pkgd.min.js"></script> <script src="https://unpkg.com/imagesloaded@5/imagesloaded.pkgd.min.js"></script>
<script> <script src="/js/app.min.js"></script>
// Initialize the agent at application startup. <script>
const fpPromise = import('https://openfpcdn.io/fingerprintjs/v3') // Initialize the agent at application startup.
.then(FingerprintJS => FingerprintJS.load()) const fpPromise = import('https://openfpcdn.io/fingerprintjs/v3')
.then(FingerprintJS => FingerprintJS.load())
// Get the visitor identifier when you need it.
fpPromise
.then(fp => fp.get())
.then(result => {
// This is the visitor identifier:
const visitorId = result.visitorId
console.log(visitorId)
$('#fingerprint').val(visitorId);
})
// init Masonry // Get the visitor identifier when you need it.
var $grid = $('.row').masonry({ fpPromise
// itemSelector: '.col', .then(fp => fp.get())
// columnWidth: '.col', .then(result => {
percentPosition: true // This is the visitor identifier:
}); const visitorId = result.visitorId
// layout Masonry after each image loads console.log(visitorId)
$grid.imagesLoaded().progress( function() { $('#fingerprint').val(visitorId);
$grid.masonry('layout'); })
}); </script>
</script>
</body> </body>
......
<div class="album py-5 bg-light"> <div class="album py-5 bg-light">
<div class="container"> <div class="container">
<!-- data-masonry='{"percentPosition": true }' --> <h3 id="total-posts">Total Posts: N/A</h3>
<div class="row" > <!-- data-masonry='{"percentPosition": true }' -->
<div class="row" id="masonry-area">
<?php <?php
$posts = Post::getAllPosts(); $posts = Post::getAllPosts();
use Carbon\Carbon; use Carbon\Carbon;
foreach ($posts as $post) {
$p = new Post($post['id']); foreach ($posts as $post) {
$uploaded_time = Carbon::parse($p->getUploadedTime()); $p = new Post($post['id']);
$uploaded_time_str = $uploaded_time->diffForHumans(); $uploaded_time = Carbon::parse($p->getUploadedTime());
?> $uploaded_time_str = $uploaded_time->diffForHumans();
?>
<div class="col-lg-3 mb-4"> <div class="col-lg-3 mb-4">
<div class="card"> <div class="card">
<img class="bd-placeholder-img card-img-top" src="<?=$p->getImageUri()?>"> <img class="bd-placeholder-img card-img-top"
src="<?=$p->getImageUri()?>">
<div class="card-body"> <div class="card-body">
<p class="card-text"><?=$p->getPostText()?></p> <p class="card-text"><?=$p->getPostText()?>
</p>
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-primary">Like</button> <button type="button" class="btn btn-sm btn-outline-primary">Like</button>
<button type="button" class="btn btn-sm btn-outline-success">Share</button> <button type="button" class="btn btn-sm btn-outline-success">Share</button>
<?php <?php
$user = Session::getUser(); $user = Session::getUser();
if (Session::isOwnerOf($p->getOwner())) { if (Session::isOwnerOf($p->getOwner())) {
?> ?>
<button type="button" class="btn btn-sm btn-outline-danger">Delete</button> <button type="button" class="btn btn-sm btn-outline-danger">Delete</button>
<?}?> <?}?>
</div> </div>
<small class="text-muted"><?=$uploaded_time_str?></small> <small
class="text-muted"><?=$uploaded_time_str?></small>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php <?php
} }
?> ?>
</div> </div>
</div> </div>
</div> </div>
\ No newline at end of file
<?php
require_once 'libs/load.php';
$api = new API();
try {
$api->processApi();
} catch (Exception $e) {
$api->die($e);
}
File moved
<?php <?php
include 'libs/load.php'; include 'libs/load.php';
session_cache_limiter('none');
$upload_path = get_config('upload_path'); $upload_path = get_config('upload_path');
$fname = $_GET['name']; $fname = $_GET['name'];
$image_path = $upload_path . $fname; $image_path = $upload_path . $fname;
...@@ -11,7 +12,12 @@ $image_path = str_replace('..', '', $image_path); ...@@ -11,7 +12,12 @@ $image_path = str_replace('..', '', $image_path);
if (is_file($image_path)) { if (is_file($image_path)) {
//TODO: Lot of security things to think about here //TODO: Lot of security things to think about here
//TODO: Check why caching is not working on client side.
header("Content-Type:".mime_content_type($image_path)); header("Content-Type:".mime_content_type($image_path));
header("Content-Length:".filesize($image_path)); header("Content-Length:".filesize($image_path));
header('Cache-control: max-age='.(60*60*24*365));
header('Expires: '.gmdate(DATE_RFC1123, time()+60*60*24*365));
header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($path_to_image)));
header_remove('Pragma');
echo file_get_contents($image_path); echo file_get_contents($image_path);
} }
var CryptoJS=CryptoJS||function(r){function i(){}var t={},n=t.lib={},o=n.Base={extend:function(t){i.prototype=this;var n=new i;return t&&n.mixIn(t),n.hasOwnProperty("init")||(n.init=function(){n.$super.init.apply(this,arguments)}),(n.init.prototype=n).$super=this,n},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var n in t)t.hasOwnProperty(n)&&(this[n]=t[n]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},d=n.WordArray=o.extend({init:function(t,n){t=this.words=t||[],this.sigBytes=null!=n?n:4*t.length},toString:function(t){return(t||e).stringify(this)},concat:function(t){var n=this.words,i=t.words,o=this.sigBytes;if(t=t.sigBytes,this.clamp(),o%4)for(var s=0;s<t;s++)n[o+s>>>2]|=(i[s>>>2]>>>24-s%4*8&255)<<24-(o+s)%4*8;else if(65535<i.length)for(s=0;s<t;s+=4)n[o+s>>>2]=i[s>>>2];else n.push.apply(n,i);return this.sigBytes+=t,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=r.ceil(n/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var n=[],i=0;i<t;i+=4)n.push(4294967296*r.random()|0);return new d.init(n,t)}}),s=t.enc={},e=s.Hex={stringify:function(t){var n=t.words;t=t.sigBytes;for(var i=[],o=0;o<t;o++){var s=n[o>>>2]>>>24-o%4*8&255;i.push((s>>>4).toString(16)),i.push((15&s).toString(16))}return i.join("")},parse:function(t){for(var n=t.length,i=[],o=0;o<n;o+=2)i[o>>>3]|=parseInt(t.substr(o,2),16)<<24-o%8*4;return new d.init(i,n/2)}},a=s.Latin1={stringify:function(t){var n=t.words;t=t.sigBytes;for(var i=[],o=0;o<t;o++)i.push(String.fromCharCode(n[o>>>2]>>>24-o%4*8&255));return i.join("")},parse:function(t){for(var n=t.length,i=[],o=0;o<n;o++)i[o>>>2]|=(255&t.charCodeAt(o))<<24-o%4*8;return new d.init(i,n)}},l=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(a.stringify(t)))}catch(t){throw Error("Malformed UTF-8 data")}},parse:function(t){return a.parse(unescape(encodeURIComponent(t)))}},c=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new d.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=l.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var n=this._data,i=n.words,o=n.sigBytes,s=this.blockSize,e=o/(4*s),e=t?r.ceil(e):r.max((0|e)-this._minBufferSize,0),o=r.min(4*(t=e*s),o);if(t){for(var a=0;a<t;a+=s)this._doProcessBlock(i,a);a=i.splice(0,t),n.sigBytes-=o}return new d.init(a,o)},clone:function(){var t=o.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),h=(n.Hasher=c.extend({cfg:o.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){c.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(i){return function(t,n){return new i.init(n).finalize(t)}},_createHmacHelper:function(i){return function(t,n){return new h.HMAC.init(i,n).finalize(t)}}}),t.algo={});return t}(Math);!function(e){function C(t,n,i,o,s,e,a){return((t=t+(n&i|~n&o)+s+a)<<e|t>>>32-e)+n}function B(t,n,i,o,s,e,a){return((t=t+(n&o|i&~o)+s+a)<<e|t>>>32-e)+n}function I(t,n,i,o,s,e,a){return((t=t+(n^i^o)+s+a)<<e|t>>>32-e)+n}function S(t,n,i,o,s,e,a){return((t=t+(i^(n|~o))+s+a)<<e|t>>>32-e)+n}for(var t=CryptoJS,n=(o=t.lib).WordArray,i=o.Hasher,o=t.algo,z=[],s=0;s<64;s++)z[s]=4294967296*e.abs(e.sin(s+1))|0;o=o.MD5=i.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,n){for(var i=0;i<16;i++){var o=t[s=n+i];t[s]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8)}var i=this._hash.words,s=t[n+0],o=t[n+1],e=t[n+2],a=t[n+3],r=t[n+4],d=t[n+5],l=t[n+6],c=t[n+7],h=t[n+8],u=t[n+9],f=t[n+10],m=t[n+11],p=t[n+12],g=t[n+13],y=t[n+14],v=t[n+15],b=C(i[0],_=i[1],$=i[2],w=i[3],s,7,z[0]),w=C(w,b,_,$,o,12,z[1]),$=C($,w,b,_,e,17,z[2]),_=C(_,$,w,b,a,22,z[3]),b=C(b,_,$,w,r,7,z[4]),w=C(w,b,_,$,d,12,z[5]),$=C($,w,b,_,l,17,z[6]),_=C(_,$,w,b,c,22,z[7]),b=C(b,_,$,w,h,7,z[8]),w=C(w,b,_,$,u,12,z[9]),$=C($,w,b,_,f,17,z[10]),_=C(_,$,w,b,m,22,z[11]),b=C(b,_,$,w,p,7,z[12]),w=C(w,b,_,$,g,12,z[13]),$=C($,w,b,_,y,17,z[14]),b=B(b,_=C(_,$,w,b,v,22,z[15]),$,w,o,5,z[16]),w=B(w,b,_,$,l,9,z[17]),$=B($,w,b,_,m,14,z[18]),_=B(_,$,w,b,s,20,z[19]),b=B(b,_,$,w,d,5,z[20]),w=B(w,b,_,$,f,9,z[21]),$=B($,w,b,_,v,14,z[22]),_=B(_,$,w,b,r,20,z[23]),b=B(b,_,$,w,u,5,z[24]),w=B(w,b,_,$,y,9,z[25]),$=B($,w,b,_,a,14,z[26]),_=B(_,$,w,b,h,20,z[27]),b=B(b,_,$,w,g,5,z[28]),w=B(w,b,_,$,e,9,z[29]),$=B($,w,b,_,c,14,z[30]),b=I(b,_=B(_,$,w,b,p,20,z[31]),$,w,d,4,z[32]),w=I(w,b,_,$,h,11,z[33]),$=I($,w,b,_,m,16,z[34]),_=I(_,$,w,b,y,23,z[35]),b=I(b,_,$,w,o,4,z[36]),w=I(w,b,_,$,r,11,z[37]),$=I($,w,b,_,c,16,z[38]),_=I(_,$,w,b,f,23,z[39]),b=I(b,_,$,w,g,4,z[40]),w=I(w,b,_,$,s,11,z[41]),$=I($,w,b,_,a,16,z[42]),_=I(_,$,w,b,l,23,z[43]),b=I(b,_,$,w,u,4,z[44]),w=I(w,b,_,$,p,11,z[45]),$=I($,w,b,_,v,16,z[46]),b=S(b,_=I(_,$,w,b,e,23,z[47]),$,w,s,6,z[48]),w=S(w,b,_,$,c,10,z[49]),$=S($,w,b,_,y,15,z[50]),_=S(_,$,w,b,d,21,z[51]),b=S(b,_,$,w,p,6,z[52]),w=S(w,b,_,$,a,10,z[53]),$=S($,w,b,_,f,15,z[54]),_=S(_,$,w,b,o,21,z[55]),b=S(b,_,$,w,h,6,z[56]),w=S(w,b,_,$,v,10,z[57]),$=S($,w,b,_,l,15,z[58]),_=S(_,$,w,b,g,21,z[59]),b=S(b,_,$,w,r,6,z[60]),w=S(w,b,_,$,m,10,z[61]),$=S($,w,b,_,e,15,z[62]),_=S(_,$,w,b,u,21,z[63]);i[0]=i[0]+b|0,i[1]=i[1]+_|0,i[2]=i[2]+$|0,i[3]=i[3]+w|0},_doFinalize:function(){var t=this._data,n=t.words,i=8*this._nDataBytes,o=8*t.sigBytes,s=(n[o>>>5]|=128<<24-o%32,e.floor(i/4294967296));for(n[15+(64+o>>>9<<4)]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),n[14+(64+o>>>9<<4)]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8),t.sigBytes=4*(n.length+1),this._process(),n=(t=this._hash).words,i=0;i<4;i++)o=n[i],n[i]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8);return t},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}}),t.MD5=i._createHelper(o),t.HmacMD5=i._createHmacHelper(o)}(Math);class Dialog{constructor(t,n,i="undefined"){void 0===n&&(n=""),this.title=t=void 0===t?"":t,this.message=n,this.clone=$("#dummy-dialog-modal").clone(),this.cloneId=CryptoJS.MD5(Math.random()+"").toString(),this.buttons="default",this.inAnimationClass="zoomIn",this.outAnimationClass="zoomOut",this.size=i}setAnimationClass(t,n){this.inAnimationClass=t,this.outAnimationClass=n}setEvents(t){this.events=t}renderButtons(){for(var t in this.buttons){var n=document.createElement("button"),i=CryptoJS.MD5(Math.random()+"").toString();$(n).attr("id",i),$(n).prop("type","button"),$(n).addClass("btn"),void 0!==this.buttons[t].class?$(n).addClass(this.buttons[t].class):$(n).addClass("btn-primary"),void 0!==this.buttons[t].dismiss&&1==this.buttons[t].dismiss&&$(n).attr("data-coreui-dismiss","modal"),void 0!==this.buttons[t].name?$(n).html(this.buttons[t].name):$(n).html("Unnamed"),$("#"+this.cloneId+" .modal-footer").append(n.outerHTML+"&nbsp;"),"function"==typeof this.buttons[t].onClick&&$("button#"+i).click({modal:this.clone},this.buttons[t].onClick)}}assignEvents(t){if(void 0!==t)for(var n in t){if(!$.inArray(t[n].action,["show","shown","hide","hidden"]))return;var i=t[n].action+".coreui.modal";"function"==typeof t[n].callback&&(n=t[n].callback,$("#"+this.cloneId).on(i,{target:this,modal:this.clone},n))}}setButtons(t){this.buttons=t}show(t="warning"){this.clone.prop("id",this.cloneId),this.clone.appendTo("#modalsGarbage"),void 0!==this.size&&("large"===this.size?$("#"+this.cloneId+" .modal-dialog").addClass("modal-lg"):"small"===this.size?$("#"+this.cloneId+" .modal-dialog").addClass("modal-sm"):"xlarge"===this.size?$("#"+this.cloneId+" .modal-dialog").addClass("modal-xl"):"medium"===this.size&&$("#"+this.cloneId+" .modal-dialog").addClass("modal-md")),this.assignEvents(this.events),$("#"+this.cloneId).addClass(),$("#"+this.cloneId+" .modal-title").html(this.title),$("#"+this.cloneId+" .modal-body").html(this.message),$("#"+this.cloneId+" .modal-footer").html(""),"default"===this.buttons?$("#"+this.cloneId+" .modal-footer").html(`<button type="button" class="btn btn-${t}" data-coreui-dismiss="modal">Okay</button>`):this.renderButtons();t=new coreui.Modal(document.getElementById(this.cloneId),{keyboard:!1});return t.show(),$("#"+this.cloneId).on("hidden.coreui.modal",{target:this,modal:this.clone},function(t){$("#"+t.data.target.cloneId).remove()}),t}}function dialog(t,n){(d=new Dialog(t,n)).show()}const animateCSS=(s,e,a=null,r="animate__")=>new Promise((n,t)=>{const i=""+r+e;var o=null;"object"==typeof s?o=$(s)[0]:"string"==typeof s&&(o=document.querySelector(s)),o.classList.add(r+"animated",i),o.addEventListener("animationend",function(t){"function"==typeof a&&a(t),t.stopPropagation(),o.classList.remove(r+"animated",i),n("Animation ended")},{once:!0})});function display_dialog(t,n,i){(d=new Dialog(n)).setButtons([{name:"Cancel",class:"btn-secondary",onClick:function(t){$(t.data.modal).modal("hide")}},{name:t,class:"btn-danger btn-loading",onClick:function(t){i(),$(t.data.modal).modal("hide")}}]),d.show()}var $grid=$("#masonry-area").masonry({percentPosition:!0});$grid.imagesLoaded().progress(function(){$grid.masonry("layout")}),$.post("/api/posts/count",{id:10},function(t){console.log(t),$("#total-posts").html("Total posts: "+t.count)});
//# sourceMappingURL=app.min.js.map
\ No newline at end of file
{"version":3,"file":"app.min.js","sources":["../../project/grunt/dist/app.js"],"names":["CryptoJS","s","n","m","l","lib","r","Base","extend","b","prototype","this","h","mixIn","hasOwnProperty","init","$super","apply","arguments","create","toString","clone","q","WordArray","words","sigBytes","length","t","stringify","concat","a","j","clamp","g","push","ceil","call","slice","random","v","enc","Hex","k","join","parse","parseInt","substr","Latin1","String","fromCharCode","charCodeAt","u","Utf8","decodeURIComponent","escape","Error","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","blockSize","max","_minBufferSize","min","_doProcessBlock","splice","Hasher","cfg","_doReset","update","finalize","_doFinalize","_createHelper","_createHmacHelper","HMAC","algo","Math","p","abs","sin","MD5","_hash","w","x","y","z","A","B","C","D","c","d","e","f","floor","HmacMD5","Dialog","constructor","title","message","size","$","cloneId","buttons","inAnimationClass","outAnimationClass","setAnimationClass","inAnimation","outAnimation","setEvents","events","renderButtons","button","buttonElement","document","createElement","id","attr","prop","addClass","html","append","outerHTML","click","modal","assignEvents","event","inArray","action","callback","on","target","setButtons","show","theme","appendTo","dg","coreui","Modal","getElementById","keyboard","data","remove","dialog","animateCSS","element","animation","prefix","Promise","resolve","reject","animationName","node","querySelector","classList","add","addEventListener","stopPropagation","once","display_dialog","bt_name","content","func","name","class","onClick","$grid","masonry","percentPosition","imagesLoaded","progress","post","console","log","count"],"mappings":"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"}
\ No newline at end of file
This diff is collapsed.
<?php
// https://domain/api/posts/delete
${basename(__FILE__, '.php')} = function(){
$result = [
"success" => false,
"message" => "Downvoted the post"
];
$this->response($this->json($result), 200);
};
\ No newline at end of file
<?php
// https://domain/api/posts/delete
${basename(__FILE__, '.php')} = function(){
$result = [
"success" => false,
"auth" => $this->isAuthenticated(),
"message" => "Upvote the post"
];
$this->response($this->json($result), 200);
};
\ No newline at end of file
<?php
// https://domain/api/posts/delete
${basename(__FILE__, '.php')} = function () {
$this->response($this->json(Post::countAllPosts()[0]), 200);
};
<?php
// https://domain/api/posts/delete
${basename(__FILE__, '.php')} = function () {
$result = [
"success" => false,
"message" => "Invalid request",
"id" => $_POST['id']
];
$this->response($this->json($result), 200);
};
<?php
// https://domain/api/posts/delete
${basename(__FILE__, '.php')} = function(){
$result = [
"success" => true,
"message" => "Liked the post"
];
$this->response($this->json($result), 200);
};
\ No newline at end of file
...@@ -38,6 +38,14 @@ class Post ...@@ -38,6 +38,14 @@ class Post
return iterator_to_array($result); return iterator_to_array($result);
} }
public static function countAllPosts()
{
$db = Database::getConnection();
$sql = "SELECT COUNT(*) as count FROM `posts` ORDER BY `uploaded_time` DESC";
$result = $db->query($sql);
return iterator_to_array($result);
}
public function __construct($id) public function __construct($id)
{ {
$this->id = $id; $this->id = $id;
......
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
require_once 'REST.class.php';
class API extends REST
{
public $data = "";
private $current_call;
public function __construct()
{
parent::__construct(); // Init parent contructor
}
/*
* Public method for access api.
* This method dynmically call the method based on the query string
*
*/
public function processApi()
{
$request = strtolower(trim($_REQUEST['rquest'])); //TODO: Check for IDOR here.
$func = basename($request);
if (!isset($_GET['namespace']) and (int)method_exists($this, $func) > 0) {
$this->$func();
} else {
if (isset($_GET['namespace'])) {
$dir = $_SERVER['DOCUMENT_ROOT'].'/libs/api/'.$_GET['namespace'];
$file = $dir.'/'.$request.'.php';
if (file_exists($file)) {
include $file;
$this->current_call = Closure::bind(${$func}, $this, get_class());
$this->$func(); //dynamically calling the function
} else {
$this->response($this->json(['error'=>'method_not_found']), 404);
}
} else {
//we can even process functions without namespace here.
$this->response($this->json(['error'=>'method_not_found']), 404);
}
}
}
public function isAuthenticated()
{
return Session::isAuthenticated();
}
/**
* @param $param Http Parameters
* Checks if all supplied parameters exists
*/
public function paramsExists($parms = array())
{
$exists = true;
foreach ($parms as $param) {
if (!array_key_exists($param, $this->_request)) {
$exists = false;
}
}
return $exists;
}
public function isAuthenticatedFor(User $user)
{
return Session::getUser()->getEmail() == $user->getEmail();
}
public function getUsername()
{
return Session::getUser()->getUsername();
}
public function die($e)
{
$data = [
"error" => $e->getMessage(),
"type" => "death"
];
$response_code = 400;
if ($e->getMessage() == "Expired token" || $e->getMessage() == "Unauthorized") {
$response_code = 403;
}
if ($e->getMessage() == "Not found") {
$response_code = 404;
}
$data = $this->json($data);
$this->response($data, $response_code);
}
public function __call($method, $args)
{
if (is_callable($this->current_call)) {
return call_user_func_array($this->current_call, $args);
} else {
$error = ['error'=>'methood_not_callable', 'method'=>$method];
$this->response($this->json($error), 404);
}
}
/*************API SPACE START*******************/
private function test()
{
$data = $this->json(getallheaders());
$this->response($data, 200);
}
private function gen_hash()
{
$st = microtime(true);
if (isset($this->_request['pass'])) {
$cost = (int)$this->_request['cost'];
$options = [
"cost" => $cost
];
$hash = password_hash($this->_request['pass'], PASSWORD_BCRYPT, $options);
$data = [
"hash" => $hash,
"info" => password_get_info($hash),
"val" => $this->_request['pass'],
"verified" => password_verify($this->_request['pass'], $hash),
"time_in_ms" => microtime(true) - $st
];
$data = $this->json($data);
$this->response($data, 200);
}
}
private function verify_hash()
{
if (isset($this->_request['pass']) and isset($this->_request['hash'])) {
$hash = $this->_request['hash'];
$data = [
"hash" => $hash,
"info" => password_get_info($hash),
"val" => $this->_request['pass'],
"verified" => password_verify($this->_request['pass'], $hash),
];
$data = $this->json($data);
$this->response($data, 200);
}
}
/*************API SPACE END*********************/
/*
Encode array into JSON
*/
private function json($data)
{
if (is_array($data)) {
return json_encode($data, JSON_PRETTY_PRINT);
} else {
return "{}";
}
}
}
function startsWith($string, $startString)
{
$len = strlen($startString);
return (substr($string, 0, $len) === $startString);
}
<?php
class REST
{
public $_allow = array();
public $_content_type = "application/json";
public $_request = array();
private $_method = "";
private $_code = 200;
public function __construct()
{
$this->inputs();
}
public function get_referer()
{
return $_SERVER['HTTP_REFERER'];
}
public function response($data, $status)
{
$this->_code = ($status) ? $status : 200;
$this->setHeaders();
echo $data;
exit;
}
private function get_status_message()
{
$status = array(
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '(Unused)',
307 => 'Temporary Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported');
return ($status[$this->_code]) ? $status[$this->_code] : $status[500];
}
public function get_request_method()
{
return $_SERVER['REQUEST_METHOD'];
}
private function inputs()
{
switch($this->get_request_method()) {
case "POST":
//$this->_request = $this->cleanInputs($_POST);
$this->_request = $this->cleanInputs(array_merge($_GET, $_POST));
break;
case "GET":
$this->_request = $this->cleanInputs($_GET);
// no break
case "DELETE":
$this->_request = $this->cleanInputs($_GET);
break;
case "PUT":
parse_str(file_get_contents("php://input"), $this->_request);
$this->_request = $this->cleanInputs($this->_request);
break;
default:
$this->response('', 406);
break;
}
}
private function cleanInputs($data)
{
$clean_input = array();
if (is_array($data)) {
foreach ($data as $k => $v) {
$clean_input[$k] = $this->cleanInputs($v);
}
} else {
//$data = mysqli_real_escape_string(Database::getConnection(), $data);
//$data = trim(stripslashes($data)); //This reverses the effect of mysqli_real_escape_string so dont use this unless you know what you are doing.
$data = strip_tags($data);
$clean_input = trim($data);
}
return $clean_input;
}
private function setHeaders()
{
header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
header("Content-Type:".$this->_content_type);
}
public function setContentType($type)
{
$this->_content_type = $type;
}
}
...@@ -9,6 +9,8 @@ include_once 'includes/Database.class.php'; ...@@ -9,6 +9,8 @@ include_once 'includes/Database.class.php';
include_once 'includes/UserSession.class.php'; include_once 'includes/UserSession.class.php';
include_once 'includes/WebAPI.class.php'; include_once 'includes/WebAPI.class.php';
include_once 'app/Post.class.php'; include_once 'app/Post.class.php';
include_once 'includes/REST.class.php';
include_once 'includes/API.class.php';
global $__site_config; global $__site_config;
......
module.exports = function(grunt){
var currentdate = new Date();
var datetime = currentdate.getDate() + "/"
+ (currentdate.getMonth()+1) + "/"
+ currentdate.getFullYear() + " @ "
+ currentdate.getHours() + ":"
+ currentdate.getMinutes() + ":"
+ currentdate.getSeconds();
grunt.initConfig({
concat: {
options: {
separator: '\n',
sourceMap: true,
banner: "/*Processed by SNA Labs on "+datetime+"*/\n"
},
css: {
src: [
'../css/**/*.css'
],
dest: 'dist/style.css',
},
js: {
src: [
'../js/**/*.js'
],
dest: 'dist/app.js'
}
},
cssmin: {
options: {
mergeIntoShorthands: false,
roundingPrecision: -1
},
target: {
files: {
'../../htdocs/css/style.css': ['dist/style.css']
}
}
},
uglify: {
minify: {
options: {
sourceMap: true,
},
files: {
'../../htdocs/js/app.min.js': ['dist/app.js']
}
}
},
copy: {
jquery: {
files: [
// {
// expand: true,
// flatten: true,
// filter: 'isFile',
// src: ['bower_components/jquery/dist/*'],
// dest: '../../htdocs/js/jquery/'
// },
],
},
},
obfuscator: {
options: {
banner: '// obfuscated with grunt-contrib-obfuscator.\n',
debugProtection: true,
debugProtectionInterval: true,
domainLock: ['project.selfmade.lol']
},
task1: {
options: {
// options for each sub task
},
files: {
'../../htdocs/js/app.o.js': [
'dist/app.js',
]
}
}
},
watch: {
css: {
files: [
'../css/**/*.css',
],
tasks: ['concat:css', 'cssmin'],
options: {
spawn: false,
},
},
js: {
files: [
'../js/**/*.js'
],
tasks: ['concat:js', 'uglify', 'obfuscator'],
options: {
spawn: false,
},
},
},
});
grunt.loadNpmTasks('grunt-contrib-obfuscator');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', ['copy', 'concat', 'cssmin', 'uglify','obfuscator', 'watch']);
};
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment