Skip to content

Commit

Permalink
Initial check-in
Browse files Browse the repository at this point in the history
  • Loading branch information
Brandon Dove committed Jul 17, 2019
0 parents commit 39bde69
Show file tree
Hide file tree
Showing 10 changed files with 431 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# OS File
.DS_Store

# Npm
node_modules
8 changes: 8 additions & 0 deletions DeserializePHP.tableplusplugin/deserializephp.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

272 changes: 272 additions & 0 deletions DeserializePHP.tableplusplugin/library/helper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
// Wrapper for nodejs/browser compat
(function (window, exports) {

// Public API
exports.unserialize = unserialize;
exports.unserializeSession = unserializeSession;

/**
* Unserialize data taken from PHP's serialize() output
*
* Taken from https://github.com/kvz/phpjs/blob/master/functions/var/unserialize.js
* Fixed window reference to make it nodejs-compatible
*
* @param string serialized data
* @return unserialized data
* @throws
*/
function unserialize (data) {
// http://kevin.vanzonneveld.net
// + original by: Arpad Ray (mailto:[email protected])
// + improved by: Pedro Tainha (http://www.pedrotainha.com)
// + bugfixed by: dptr1988
// + revised by: d3x
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + input by: Brett Zamir (http://brett-zamir.me)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Chris
// + improved by: James
// + input by: Martin (http://www.erlenwiese.de/)
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Le Torbi
// + input by: kilops
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// + input by: Jaroslaw Czarniak
// % note: We feel the main purpose of this function should be to ease the transport of data between php & js
// % note: Aiming for PHP-compatibility, we have to translate objects to arrays
// * example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
// * returns 1: ['Kevin', 'van', 'Zonneveld']
// * example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
// * returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}
var that = this,
utf8Overhead = function (chr) {
// http://phpjs.org/functions/unserialize:571#comment_95906
var code = chr.charCodeAt(0);
if (code < 0x0080) {
return 0;
}
if (code < 0x0800) {
return 1;
}
return 2;
},
error = function (type, msg, filename, line) {
throw new window[type](msg, filename, line);
},
read_until = function (data, offset, stopchr) {
var i = 2, buf = [], chr = data.slice(offset, offset + 1);

while (chr != stopchr) {
if ((i + offset) > data.length) {
error('Error', 'Invalid');
}
buf.push(chr);
chr = data.slice(offset + (i - 1), offset + i);
i += 1;
}
return [buf.length, buf.join('')];
},
read_chrs = function (data, offset, length) {
var i, chr, buf;

buf = [];
for (i = 0; i < length; i++) {
chr = data.slice(offset + (i - 1), offset + i);
buf.push(chr);
length -= utf8Overhead(chr);
}
return [buf.length, buf.join('')];
},
_unserialize = function (data, offset) {
var dtype, dataoffset, keyandchrs, keys,
readdata, readData, ccount, stringlength,
i, key, kprops, kchrs, vprops, vchrs, value,
chrs = 0,
typeconvert = function (x) {
return x;
},
readArray = function () {
readdata = {};

keyandchrs = read_until(data, dataoffset, ':');
chrs = keyandchrs[0];
keys = keyandchrs[1];
dataoffset += chrs + 2;

for (i = 0; i < parseInt(keys, 10); i++) {
kprops = _unserialize(data, dataoffset);
kchrs = kprops[1];
key = kprops[2];
dataoffset += kchrs;

vprops = _unserialize(data, dataoffset);
vchrs = vprops[1];
value = vprops[2];
dataoffset += vchrs;

readdata[key] = value;
}
};

if (!offset) {
offset = 0;
}
dtype = (data.slice(offset, offset + 1)).toLowerCase();

dataoffset = offset + 2;

switch (dtype) {
case 'i':
typeconvert = function (x) {
return parseInt(x, 10);
};
readData = read_until(data, dataoffset, ';');
chrs = readData[0];
readdata = readData[1];
dataoffset += chrs + 1;
break;
case 'b':
typeconvert = function (x) {
return parseInt(x, 10) !== 0;
};
readData = read_until(data, dataoffset, ';');
chrs = readData[0];
readdata = readData[1];
dataoffset += chrs + 1;
break;
case 'd':
typeconvert = function (x) {
return parseFloat(x);
};
readData = read_until(data, dataoffset, ';');
chrs = readData[0];
readdata = readData[1];
dataoffset += chrs + 1;
break;
case 'n':
readdata = null;
break;
case 's':
ccount = read_until(data, dataoffset, ':');
chrs = ccount[0];
stringlength = ccount[1];
dataoffset += chrs + 2;

readData = read_chrs(data, dataoffset + 1, parseInt(stringlength, 10));
chrs = readData[0];
readdata = readData[1];
dataoffset += chrs + 2;
if (chrs != parseInt(stringlength, 10) && chrs != readdata.length) {
error('SyntaxError', 'String length mismatch');
}
break;
case 'a':
readArray();
dataoffset += 1;
break;
case 'o':
ccount = read_until(data, dataoffset, ':');
dataoffset += ccount[0] + 2;

ccount = read_until(data, dataoffset, '"');
dataoffset += ccount[0] + 2;

readArray();
dataoffset += 1;
break;
default:
error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
break;
}
return [dtype, dataoffset - offset, typeconvert(readdata)];
}
;

return _unserialize((data + ''), 0)[2];
}

/**
* Parse PHP-serialized session data
*
* @param string serialized session
* @return unserialized data
* @throws
*/
function unserializeSession (input) {
return input.split(/\|/).reduce(function (output, part, index, parts) {
// First part = $key
if (index === 0) {
output._currKey = part;
}
// Last part = $someSerializedStuff
else if (index === parts.length - 1) {
output[output._currKey] = unserialize(part);
delete output._currKey;
}
// Other output = $someSerializedStuff$key
else {
var repper = part.replace(/(\n|\r)/g," ");
var match = repper.match(/^((?:.*?[;\}])+)([^;\}]+?)$/);
if (match) {
output[output._currKey] = unserialize(match[1]);
output._currKey = match[2];
} else {
throw new Error('Parse error on part "' + part + '"');
}
}
return output;
}, {});
}

// /Wrapper
})((typeof window === 'undefined') ? global : window, (typeof exports === 'undefined') ? (window.PHPUnserialize = {}) : exports);

/**
* PHP-like print_r() & var_dump() equivalent for JavaScript Object
*
* @author Faisalman <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php
* @link http://gist.github.com/879208
*/
var print_r = function(obj,t){

// define tab spacing
var tab = t || '';

// check if it's array
var isArr = Object.prototype.toString.call(obj) === '[object Array]' ? true : false;

// use {} for object, [] for array
var str = isArr ? ('Array\n' + tab + '[\n') : ('Object\n' + tab + '{\n');

// walk through it's properties
for(var prop in obj){
if (obj.hasOwnProperty(prop)) {
var val1 = obj[prop];
var val2 = '';
var type = Object.prototype.toString.call(val1);
switch(type){

// recursive if object/array
case '[object Array]':
case '[object Object]':
val2 = print_r(val1, (tab + '\t'));
break;

case '[object String]':
val2 = '\'' + val1 + '\'';
break;

default:
val2 = val1;
}
str += tab + '\t' + prop + ' => ' + val2 + ',\n';
}
}

// remove extra comma for last property
str = str.substring(0, str.length-2) + '\n' + tab;

return isArr ? (str + ']') : (str + '}');
};
exports.print_r = print_r;
24 changes: 24 additions & 0 deletions DeserializePHP.tableplusplugin/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
'use strict';

import { unserialize, print_r } from './library/helper';

var onRun = function(context) {
// Get table in opening tab
var value = context.clickedRowValue();
if (value == null) {
context.alert('Error', 'Data is null');
return;
}
let output = unserialize(value);
if (output == null) {
context.alert('Error', 'Data is not serialized.');
return;
}
SystemService.insertToClipboard(print_r(output));
SystemService.notify(
"Deserialize PHP",
"Your data has been copied to your clipboard!"
);
};

global.onRun = onRun;
20 changes: 20 additions & 0 deletions DeserializePHP.tableplusplugin/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "Deserialize PHP",
"identifier": "com.pixeljar.DeserializePHP",
"version": "1.0",
"detail": "This plugin helps you view PHP serialized data",
"author": "Pixel Jar",
"authorEmail": "[email protected]",
"scripts": [
{
"location": "data",
"type": "separator"
},
{
"location": "data",
"type": "action",
"script": "deserializephp.js",
"name": "Deserialize PHP"
}
]
}
21 changes: 21 additions & 0 deletions DeserializePHP.tableplusplugin/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "com.pixeljar.DeserializePHP.tableplusplugin",
"version": "1.0.0",
"description": "This plugin helps you view PHP serialized data",
"main": "main.js",
"dependencies": {
"webpack": "^3.4.1"
},
"devDependencies": {
"babel-core": "^6.25.0",
"babel-loader": "^7.1.1",
"babel-preset-es2015": "^6.24.1",
"webpack": "^3.4.1"
},
"scripts": {
"build": "webpack"
},
"keywords": [],
"author": "https://pixeljar.com",
"license": "MIT"
}
26 changes: 26 additions & 0 deletions DeserializePHP.tableplusplugin/webpack.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const webpack = require('webpack');
const path = require('path');

const config = {
entry: './main.js',
output: {
filename: 'deserializephp.js'
},
module: {
loaders: [{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015']
}
}]
},
stats: {
colors: true
},
plugins: [
new webpack.optimize.UglifyJsPlugin()
]
};

module.exports = config;
Loading

0 comments on commit 39bde69

Please sign in to comment.