From 342c0128119367392072760ef14a1a5f4443e905 Mon Sep 17 00:00:00 2001 From: Eliot Whalan Date: Tue, 21 Jun 2016 19:34:28 +1000 Subject: Reintroduce moe panel support --- php/upload.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/php/upload.php b/php/upload.php index 9b58ba4..b9e5f55 100644 --- a/php/upload.php +++ b/php/upload.php @@ -1,4 +1,5 @@ prepare('INSERT INTO files (hash, originalname, filename, size, date, '. - 'expire, delid) VALUES (:hash, :orig, :name, :size, :date, '. - ':exp, :del)'); + if (empty($_SESSION['id'])) { + // Query if user is NOT logged in + $q = $db->prepare('INSERT INTO files (hash, originalname, filename, size, date, ' . + 'expire, delid) VALUES (:hash, :orig, :name, :size, :date, ' . + ':exp, :del)'); + } else { + // Query if user is logged in (insert user id together with other data) + $q = $db->prepare('INSERT INTO files (hash, originalname, filename, size, date, ' . + 'expire, delid, user) VALUES (:hash, :orig, :name, :size, :date, ' . + ':exp, :del, :user)'); + $q->bindValue(':user', $_SESSION['id'], PDO::PARAM_INT); + } // Common parameters binding $q->bindValue(':hash', $file->getSha1(), PDO::PARAM_STR); @@ -144,7 +154,7 @@ function uploadFile($file) $q->bindValue(':name', $newname, PDO::PARAM_STR); $q->bindValue(':size', $file->size, PDO::PARAM_INT); $q->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR); - $q->bindValue(':exp', null, PDO::PARAM_STR); // Deprecated since version 2.1.0 + $q->bindValue(':exp', null, PDO::PARAM_STR); $q->bindValue(':del', sha1($file->tempfile), PDO::PARAM_STR); $q->execute(); -- cgit v1.2.3 From e0717d467120f25c007bf6a80eb26091ce878d56 Mon Sep 17 00:00:00 2001 From: Eliot Whalan Date: Wed, 22 Jun 2016 07:40:58 +1000 Subject: Replaced tabs and make filter array empty --- php/includes/settings.inc.php | 2 +- php/upload.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/php/includes/settings.inc.php b/php/includes/settings.inc.php index 6e70569..4468669 100644 --- a/php/includes/settings.inc.php +++ b/php/includes/settings.inc.php @@ -93,7 +93,7 @@ define('ID_CHARSET', 'abcdefghijklmnopqrstuvwxyz'); * Filtered mime types * @param string[] $FILTER_MIME allowed/blocked mime types */ -$FILTER_MIME = array(""); +$FILTER_MIME = array(); /** * Filter mode: whitelist (true) or blacklist (false) * @param bool $FILTER_MODE mime type filter mode diff --git a/php/upload.php b/php/upload.php index d63ee5e..ec7968e 100644 --- a/php/upload.php +++ b/php/upload.php @@ -87,11 +87,11 @@ function uploadFile($file) if (!empty($FILTER_MIME)) { if ($FILTER_MODE == true) { //whitelist mode if (!in_array($file->mime, $FILTER_MIME)) { - throw new UploadException(UPLOAD_ERR_EXTENSION); - } + throw new UploadException(UPLOAD_ERR_EXTENSION); + } } else { //blacklist mode if (in_array($file->mime, $FILTER_MIME)) { - throw new UploadException(UPLOAD_ERR_EXTENSION); + throw new UploadException(UPLOAD_ERR_EXTENSION); } } } -- cgit v1.2.3 From 0d539ff4af4bb62d783d1920abb4158655645398 Mon Sep 17 00:00:00 2001 From: akpu1 Date: Wed, 22 Jun 2016 15:23:29 +1000 Subject: Significant Makefile improvements (#21) * Refactored makefile Fixed min-js error; renamed routines inline with make conventions Previously min-js would continually append to the file with `@echo "// @source https://github.com/pomf/pomf/tree/master/static/js" >> ./dist/pomf.min.js`. Fixed so that it overwrites the file whenever it is run now. mkdirs was renamed to installdirs as per makefile conwentions copy was renamed to install for the same reasons Added clean rule Removed install from default target Added DESTDIR,uninstall support Added dist support Replaced static program paths; misc improvements Added missing installdirs target to default target Added npm_dependencies target Properly separated "build" and install targets Modified readme to reflect make install and DESTDIR Modified .travis.yml to reflect make npm_dependencies Reverted to cp for install target, temporarily Ideally this target would use install, but need to work out how to do that properly, For the meantime, cp works. Added missing * to install target Update .travis.yml Fixed bad markdown * Update Makefile * Removed @s cuz ??? --- .travis.yml | 1 - Makefile | 75 +++++++++++++++++++++++++++++++++++++++++++------------------ README.md | 18 +++++++++------ 3 files changed, 64 insertions(+), 30 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73bf6c4..d851b4e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ install: - nvm ls-remote - nvm install stable - nvm use stable -- npm install script: - make diff --git a/Makefile b/Makefile index 2addcd5..96b3118 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,62 @@ -all: mkdirs swig htmlmin min-css min-js copy +INSTALL="install" +TAR="tar" +GREP="grep" +NODE="node" +NPM="npm" +DESTDIR="./dist" +PKG_VERSION := $( $(GREP) -Po '(?<="version": ")[^"]*' ) +TMPDIR := $(shell mktemp -d) + +all: builddirs npm_dependencies swig htmlmin min-css min-js copy-img copy-php swig: - @node node_modules/swig/bin/swig.js render -j dist.json templates/faq.swig > dist/faq.html - @node node_modules/swig/bin/swig.js render -j dist.json templates/index.swig > dist/index.html - @node node_modules/swig/bin/swig.js render -j dist.json templates/tools.swig > dist/tools.html + $(NODE) node_modules/swig/bin/swig.js render -j dist.json templates/faq.swig > $(CURDIR)/build/faq.html + $(NODE) node_modules/swig/bin/swig.js render -j dist.json templates/index.swig > $(CURDIR)/build/index.html + $(NODE) node_modules/swig/bin/swig.js render -j dist.json templates/tools.swig > $(CURDIR)/build/tools.html htmlmin: - @node node_modules/htmlmin/bin/htmlmin dist/index.html -o dist/index.html - @node node_modules/htmlmin/bin/htmlmin dist/faq.html -o dist/faq.html - @node node_modules/htmlmin/bin/htmlmin dist/tools.html -o dist/tools.html - - -mkdirs: - @mkdir -p ./dist/img + $(NODE) node_modules/htmlmin/bin/htmlmin $(CURDIR)/build/index.html -o $(CURDIR)/build/index.html + $(NODE) node_modules/htmlmin/bin/htmlmin $(CURDIR)/build/faq.html -o $(CURDIR)/build/faq.html + $(NODE) node_modules/htmlmin/bin/htmlmin $(CURDIR)/build/tools.html -o $(CURDIR)/build/tools.html +installdirs: + mkdir -p $(DESTDIR)/ $(DESTDIR)/img $(DESTDIR)/classes $(DESTDIR)/includes + min-css: - @node ./node_modules/.bin/cleancss --s0 ./static/css/pomf.css > ./dist/pomf.min.css + $(NODE) ./node_modules/.bin/cleancss --s0 ./static/css/pomf.css > $(CURDIR)/build/pomf.min.css min-js: - @echo "// @source https://github.com/pomf/pomf/tree/master/static/js" >> ./dist/pomf.min.js - @echo "// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat" >> ./dist/pomf.min.js - @node ./node_modules/.bin/uglifyjs --screw-ie8 ./static/js/app.js >> ./dist/pomf.min.js - @echo "// @license-end" >> ./dist/pomf.min.js - -copy: - @cp -r ./php/* ./dist/ - @cp ./static/img/*.png ./dist/img - @cp ./static/img/favicon.ico ./dist/favicon.ico - + echo "// @source https://github.com/pomf/pomf/tree/master/static/js" > $(CURDIR)/build/pomf.min.js + echo "// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat" >> $(CURDIR)/build/pomf.min.js + $(NODE) ./node_modules/.bin/uglifyjs --screw-ie8 ./static/js/app.js >> $(CURDIR)/build/pomf.min.js + echo "// @license-end" >> $(CURDIR)/build/pomf.min.js + +copy-img: + cp -v ./static/img/*.png $(CURDIR)/build/img/ + cp -vT ./static/img/favicon.ico $(CURDIR)/build/favicon.ico + +copy-php: + cp -rv ./php/* $(CURDIR)/build/ + +install: installdirs + cp -rv $(CURDIR)/build/* $(DESTDIR)/ + +dist: + DESTDIR=$(TMPDIR)/pomf-$(PKGVERSION) + export DESTDIR + install + $(TAR) cJf pomf-$(PKG_VERSION).tar.xz $(DESTDIR) + rm -rf $(TMPDIR) + +clean: + rm -rvf $(CURDIR)/node_modules + rm -rvf $(CURDIR)/build + +uninstall: + rm -rvf $(DESTDIR)/ + +npm_dependencies: + $(NPM) install +builddirs: + mkdir -p $(CURDIR)/build $(CURDIR)/build/img $(CURDIR)/build/classes $(CURDIR)/build/includes diff --git a/README.md b/README.md index df781f5..6e43462 100644 --- a/README.md +++ b/README.md @@ -41,13 +41,17 @@ Node, or NPM. So we'll just assume you already have them all running well. Assuming you already have Node and NPM working, compilation is easy. Use the following shell code: - - git clone https://github.com/pomf/pomf - cd pomf/ - npm install - make - -After this, the pomf site is now compressed and set up inside `dist/`. +```bash +git clone https://github.com/pomf/pomf +cd pomf/ +make +make install +``` +OR +```bash +make install DESTDIR=/desired/path/for/site +``` +After this, the pomf site is now compressed and set up inside `dist/`, or, if specified, `DESTDIR`. ## Configuring -- cgit v1.2.3 From 424eea4f630d25158ec033a004666ecd0107f8b8 Mon Sep 17 00:00:00 2001 From: akpu1 Date: Wed, 22 Jun 2016 15:58:15 +1000 Subject: Added instructions and schema to use or migrate to SQLite (#17) * Added MySQL to SQLite migration instructions; SQLite setup instructions * Renamed schema.sql to mysql_schema.sql * Produced modified schema suitable for SQLite * Added SQLite setup and migration instructions --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ mysql_schema.sql | 27 +++++++++++++++++++++++++++ schema.sql | 27 --------------------------- sqlite_schema.sql | 16 ++++++++++++++++ 4 files changed, 98 insertions(+), 27 deletions(-) create mode 100644 mysql_schema.sql delete mode 100644 schema.sql create mode 100644 sqlite_schema.sql diff --git a/README.md b/README.md index 6e43462..ec2101b 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,29 @@ option for nginx webserver is `client_max_body_size`. Example nginx configs can be found in confs/. +## Using SQLite as DB engine + +We need to create the SQLite database before it may be used by pomf. +Fortunately, this is incredibly simple. + +First create a directory for the database, e.g. `mkdir /var/db/pomf`. +Then, create a new SQLite database from the schema, e.g. `sqlite3 /var/db/pomf/pomf.sq3 -init /home/pomf/sqlite_schema.sql`. +Then, finally, ensure the permissions are correct, e.g. +```bash +chown nginx:nginx /var/db/pomf +chmod 0750 /var/db/pomf +chmod 0640 /var/db/pomf/pomf.sq3 +``` + +Finally, edit `php/includes/settings.inc.php` to indicate this is the database engine you would like to use. Make the changes outlined below +```php +define('POMF_DB_CONN', '[stuff]'); ---> define('POMF_DB_CONN', 'sqlite:/var/db/pomf/pomf.sq3');` +define('POMF_DB_USER', '[stuff]'); ---> define('POMF_DB_USER', null); +define('POMF_DB_PASS', '[stuff]'); ---> define('POMF_DB_PASS', null); +``` + +*NOTE: The directory where the SQLite database is stored, must be writable by the web server user* + ### Apache If you are running Apache and want to compress your output when serving files, @@ -79,6 +102,38 @@ add to your `.htaccess` file: Remember to enable `deflate_module` and `filter_module` modules in your Apache configuration file. +### Migrating from MySQL to SQLite + +MySQL is relatively complicated to administer, brings in many unneeded dependencies, and consumes +more resources than SQLite would, and result in worse performance for pomf. Additonally, poorly configured installations have the potential +to pose a security risk. + +Fortunately, it is incredibly simple to migrate your database. This may be done on a live server, and should require +zero downtime. + +_If doing this on a live server, you way wish to work in a subdirectory (or vhost, or equivelant), so that any complications or mistakes do not affect your main site. +If you choose not to do so, know that mistakes in the changes outlined below, will only temporarily impact **uploading**, causing **Server error** to be displayed. None of these steps are destructive, and are easily reverted._ + +Run the following commands as root, to dump your database, and make a SQLite database with the contents. +```bash +mkdir /var/db/pomf +wget -O /tmp/m2s https://github.com/dumblob/mysql2sqlite/raw/master/mysql2sqlite.sh +mysqldump -u OLD_DB_USER -p OLD_DB_PASS pomf | sh /tmp/m2s | sqlite3 /var/db/pomf/sq3 +rm /tmp/m2s +chown -R nginx:nginx /var/db/pomf #replace user as appropriate +chmod 0750 /var/db/pomf && chmod 0640 /var/db/pomf/sq3 +``` +Edit the file `php/includes/settings.inc.php`, in the subdirectory you just made, making the changes outlined below. +```php +define('POMF_DB_CONN', '[stuff]'); ---> define('POMF_DB_CONN', 'sqlite:/var/db/pomf/pomf.sq3');` +define('POMF_DB_USER', '[stuff]'); ---> define('POMF_DB_USER', null); +define('POMF_DB_PASS', '[stuff]'); ---> define('POMF_DB_PASS', null); +``` + +Then, run `make` to rebuild the website pages, and copy the new `settings.inc.php` file into place. + +All done! You may disable or uninstall MySQL if you wish. + ## Getting help The Pomf community gathers on IRC. You can also email the maintainer for help. diff --git a/mysql_schema.sql b/mysql_schema.sql new file mode 100644 index 0000000..154f095 --- /dev/null +++ b/mysql_schema.sql @@ -0,0 +1,27 @@ +-- MySQL dump 10.13 Distrib 5.6.21-70.1, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: pomf + +-- +-- Table structure for table `files` +-- + +CREATE TABLE `files` ( + `id` int(10) unsigned NOT NULL auto_increment, + `hash` char(40) default NULL, + `originalname` varchar(255) default NULL, + `filename` varchar(30) default NULL, + `size` int(10) unsigned default NULL, + `date` date default NULL, + `expire` date default NULL, -- Deprecated since version 2.1.0 + `delid` char(40) default NULL, + `user` int(10) unsigned default '0', + `dir` int(2) default '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB; +-- `filename` length (30) may be a bit excessive, since the average length would be smaller +-- [6 for the name + the file extension length], but since there is no limit for the file +-- extension length (at the moment, at least) let's keep it high in order to avoid problems + + +-- Dump completed on 2014-12-07 19:30:13 diff --git a/schema.sql b/schema.sql deleted file mode 100644 index 154f095..0000000 --- a/schema.sql +++ /dev/null @@ -1,27 +0,0 @@ --- MySQL dump 10.13 Distrib 5.6.21-70.1, for debian-linux-gnu (x86_64) --- --- Host: localhost Database: pomf - --- --- Table structure for table `files` --- - -CREATE TABLE `files` ( - `id` int(10) unsigned NOT NULL auto_increment, - `hash` char(40) default NULL, - `originalname` varchar(255) default NULL, - `filename` varchar(30) default NULL, - `size` int(10) unsigned default NULL, - `date` date default NULL, - `expire` date default NULL, -- Deprecated since version 2.1.0 - `delid` char(40) default NULL, - `user` int(10) unsigned default '0', - `dir` int(2) default '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB; --- `filename` length (30) may be a bit excessive, since the average length would be smaller --- [6 for the name + the file extension length], but since there is no limit for the file --- extension length (at the moment, at least) let's keep it high in order to avoid problems - - --- Dump completed on 2014-12-07 19:30:13 diff --git a/sqlite_schema.sql b/sqlite_schema.sql new file mode 100644 index 0000000..414719c --- /dev/null +++ b/sqlite_schema.sql @@ -0,0 +1,16 @@ +PRAGMA synchronous = OFF; +PRAGMA journal_mode = MEMORY; +BEGIN TRANSACTION; +CREATE TABLE `files` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT +, `hash` char(40) default NULL +, `originalname` varchar(255) default NULL +, `filename` varchar(30) default NULL +, `size` integer default NULL +, `date` date default NULL +, `expire` date default NULL +, `delid` char(40) default NULL +, `user` integer default '0' +, `dir` integer default '0' +); +END TRANSACTION; -- cgit v1.2.3 From aa07992962df07c3f5d5f95b780453cb35f993c1 Mon Sep 17 00:00:00 2001 From: Eliot Whalan Date: Fri, 24 Jun 2016 19:27:33 +1000 Subject: Run phpcbf --standard=psr2 to fix up styling violations --- php/includes/settings.inc.php | 2 +- php/upload.php | 36 +++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/php/includes/settings.inc.php b/php/includes/settings.inc.php index 4468669..c984c69 100644 --- a/php/includes/settings.inc.php +++ b/php/includes/settings.inc.php @@ -82,7 +82,7 @@ define('POMF_FILES_LENGTH', 6); define('POMF_URL', 'https://i.pantsu.cat/'); /** - * URI for filename generation + * URI for filename generation * * @param string characters to be used in generateName() */ diff --git a/php/upload.php b/php/upload.php index ec7968e..f14a4d3 100644 --- a/php/upload.php +++ b/php/upload.php @@ -39,14 +39,16 @@ function generateName($file) do { // Iterate until we reach the maximum number of retries if ($tries-- === 0) { - throw new Exception('Gave up trying to find an unused name', - 500); // HTTP status code "500 Internal Server Error" + throw new Exception( + 'Gave up trying to find an unused name', + 500 + ); // HTTP status code "500 Internal Server Error" } - $chars = ID_CHARSET; + $chars = ID_CHARSET; $name = ''; for ($i = 0; $i < $length; ++$i) { - $name .= $chars[mt_rand(0, strlen($chars))]; + $name .= $chars[mt_rand(0, strlen($chars))]; } // Add the extension to the file name @@ -103,7 +105,7 @@ function uploadFile($file) $q = $db->prepare('SELECT filename, COUNT(*) AS count FROM files WHERE hash = (:hash) '. 'AND size = (:size)'); $q->bindValue(':hash', $file->getSha1(), PDO::PARAM_STR); - $q->bindValue(':size', $file->size, PDO::PARAM_INT); + $q->bindValue(':size', $file->size, PDO::PARAM_INT); $q->execute(); $result = $q->fetch(); if ($result['count'] > 0) { @@ -123,14 +125,18 @@ function uploadFile($file) // Attempt to move it to the static directory if (!move_uploaded_file($file->tempfile, $uploadFile)) { - throw new Exception('Failed to move file to destination', - 500); // HTTP status code "500 Internal Server Error" + throw new Exception( + 'Failed to move file to destination', + 500 + ); // HTTP status code "500 Internal Server Error" } // Need to change permissions for the new file to make it world readable if (!chmod($uploadFile, 0644)) { - throw new Exception('Failed to change file permissions', - 500); // HTTP status code "500 Internal Server Error" + throw new Exception( + 'Failed to change file permissions', + 500 + ); // HTTP status code "500 Internal Server Error" } // Add it to the database @@ -150,13 +156,13 @@ function uploadFile($file) } // Common parameters binding - $q->bindValue(':hash', $file->getSha1(), PDO::PARAM_STR); + $q->bindValue(':hash', $file->getSha1(), PDO::PARAM_STR); $q->bindValue(':orig', strip_tags($file->name), PDO::PARAM_STR); - $q->bindValue(':name', $newname, PDO::PARAM_STR); - $q->bindValue(':size', $file->size, PDO::PARAM_INT); - $q->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR); - $q->bindValue(':exp', null, PDO::PARAM_STR); - $q->bindValue(':del', sha1($file->tempfile), PDO::PARAM_STR); + $q->bindValue(':name', $newname, PDO::PARAM_STR); + $q->bindValue(':size', $file->size, PDO::PARAM_INT); + $q->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR); + $q->bindValue(':exp', null, PDO::PARAM_STR); + $q->bindValue(':del', sha1($file->tempfile), PDO::PARAM_STR); $q->execute(); return array( -- cgit v1.2.3 From 242f2ecdd719715290e03b9091f1eb4cbd5950b3 Mon Sep 17 00:00:00 2001 From: Eliot Whalan Date: Fri, 24 Jun 2016 19:49:23 +1000 Subject: Begin formatting fixup of js code --- static/js/app.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/static/js/app.js b/static/js/app.js index 1b65fc0..e9e755a 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -20,7 +20,7 @@ * SOFTWARE. */ -document.addEventListener('DOMContentLoaded', function() { +document.addEventListener('DOMContentLoaded', function () { function addRow(file) { var row = document.createElement('li'); @@ -35,8 +35,8 @@ document.addEventListener('DOMContentLoaded', function() { var progressBar = document.createElement('progress'); progressBar.className = 'file-progress'; - progressBar.setAttribute("max", "100"); - progressBar.setAttribute("value", "0"); + progressBar.setAttribute('max', '100'); + progressBar.setAttribute('value', '0'); row.appendChild(name); row.appendChild(progressBar); @@ -53,7 +53,7 @@ document.addEventListener('DOMContentLoaded', function() { if (evt.lengthComputable) { var progressPercent = Math.floor((evt.loaded / evt.total) * 100); - bar.setAttribute("value", progressPercent); + bar.setAttribute('value', progressPercent); percentIndicator.textContent = progressPercent + '%'; } } @@ -64,8 +64,8 @@ document.addEventListener('DOMContentLoaded', function() { var row = xhr.row; var percentIndicator = xhr.percent; - percentIndicator.style.visibility = "hidden"; - bar.style.visibility = "hidden"; + percentIndicator.style.visibility = 'hidden'; + bar.style.visibility = 'hidden'; row.removeChild(bar); row.removeChild(percentIndicator); var respStatus = xhr.status; @@ -78,7 +78,7 @@ document.addEventListener('DOMContentLoaded', function() { if (respStatus === 200) { var response = JSON.parse(xhr.responseText); if (response.success) { - link.textContent = response.files[0].url.replace(/.*?:\/\//g, ""); + link.textContent = response.files[0].url.replace(/.*?:\/\//g, ''); link.href = response.files[0].url; url.appendChild(link); } else { @@ -99,11 +99,11 @@ document.addEventListener('DOMContentLoaded', function() { var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload.php'); - xhr["row"] = row; - xhr["bar"] = bar; - xhr["percent"] = percentIndicator; - xhr.upload["bar"] = bar; - xhr.upload["percent"] = percentIndicator; + xhr['row'] = row; + xhr['bar'] = bar; + xhr['percent'] = percentIndicator; + xhr.upload['bar'] = bar; + xhr.upload['percent'] = percentIndicator; xhr.addEventListener('load', handleUploadComplete, false); xhr.upload.onprogress = handleUploadProgress; @@ -121,8 +121,9 @@ document.addEventListener('DOMContentLoaded', function() { function handleDrag(state, element, evt) { stopDefaultEvent(evt); if (state.dragCount == 1) { - element.textContent = "Drop it here~"; + element.textContent = 'Drop it here~'; } + state.dragCount += 1; } @@ -130,7 +131,7 @@ document.addEventListener('DOMContentLoaded', function() { stopDefaultEvent(evt); state.dragCount -= 1; if (state.dragCount == 0) { - element.textContent = "Select or drop file(s)"; + element.textContent = 'Select or drop file(s)'; } } -- cgit v1.2.3 From bd02fbc3fcf51cf946f3479fc06fb2034d2567bc Mon Sep 17 00:00:00 2001 From: Austin Date: Sun, 26 Jun 2016 01:30:52 -0500 Subject: Update package version to 2.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5635692..d0d0c6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pomf", - "version": "2.0.2", + "version": "2.1.0", "description": "Kawaii file host", "homepage": "https://pantsu.cat/", "repository": { -- cgit v1.2.3 From 77022be248c5ce3e2a92022271277b046130f1ae Mon Sep 17 00:00:00 2001 From: Austin Date: Sun, 26 Jun 2016 01:34:31 -0500 Subject: Reword SQLite migration That was bad --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index ec2101b..8b4a2e6 100644 --- a/README.md +++ b/README.md @@ -104,12 +104,7 @@ configuration file. ### Migrating from MySQL to SQLite -MySQL is relatively complicated to administer, brings in many unneeded dependencies, and consumes -more resources than SQLite would, and result in worse performance for pomf. Additonally, poorly configured installations have the potential -to pose a security risk. - -Fortunately, it is incredibly simple to migrate your database. This may be done on a live server, and should require -zero downtime. +For older versions of Pomf you may want to migrate to SQLite. Fortunately, it is incredibly simple to migrate your database. This may be done on a live server, and should require zero downtime. _If doing this on a live server, you way wish to work in a subdirectory (or vhost, or equivelant), so that any complications or mistakes do not affect your main site. If you choose not to do so, know that mistakes in the changes outlined below, will only temporarily impact **uploading**, causing **Server error** to be displayed. None of these steps are destructive, and are easily reverted._ -- cgit v1.2.3 From 756ebfd6729e36c1ed21a5d2ed9f11fdb31d6a57 Mon Sep 17 00:00:00 2001 From: Eliot Whalan Date: Sun, 26 Jun 2016 16:59:09 +1000 Subject: Make moe a submodule --- .gitmodules | 3 +++ moe | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 moe diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..595f516 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "moe"] + path = moe + url = https://github.com/pomf/moe diff --git a/moe b/moe new file mode 160000 index 0000000..922e803 --- /dev/null +++ b/moe @@ -0,0 +1 @@ +Subproject commit 922e8031f2d424bc3f4a25a4a3dafde32ec46e3e -- cgit v1.2.3 From 29e83a9b9d99b18017d60fad84be9ce702995479 Mon Sep 17 00:00:00 2001 From: Eliot Whalan Date: Sun, 26 Jun 2016 17:06:55 +1000 Subject: Remove server side and client side and add submodule --- .gitmodules | 3 + php | 1 + php/classes/Response.class.php | 242 ---------------------------------- php/classes/UploadException.class.php | 63 --------- php/classes/UploadedFile.class.php | 33 ----- php/grill.php | 17 --- php/includes/database.inc.php | 30 ----- php/includes/settings.inc.php | 118 ----------------- php/upload.php | 240 --------------------------------- 9 files changed, 4 insertions(+), 743 deletions(-) create mode 160000 php delete mode 100755 php/classes/Response.class.php delete mode 100755 php/classes/UploadException.class.php delete mode 100644 php/classes/UploadedFile.class.php delete mode 100644 php/grill.php delete mode 100644 php/includes/database.inc.php delete mode 100644 php/includes/settings.inc.php delete mode 100644 php/upload.php diff --git a/.gitmodules b/.gitmodules index 595f516..1c43324 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "moe"] path = moe url = https://github.com/pomf/moe +[submodule "php"] + path = php + url = https://github.com/pomf/pomf-php diff --git a/php b/php new file mode 160000 index 0000000..5abbc32 --- /dev/null +++ b/php @@ -0,0 +1 @@ +Subproject commit 5abbc323d7f64df5fcf16255db79de339dc72567 diff --git a/php/classes/Response.class.php b/php/classes/Response.class.php deleted file mode 100755 index fac7db5..0000000 --- a/php/classes/Response.class.php +++ /dev/null @@ -1,242 +0,0 @@ -type = $response_type; - break; - case 'html': - header('Content-Type: text/html; charset=UTF-8'); - $this->type = $response_type; - break; - case 'json': - header('Content-Type: application/json; charset=UTF-8'); - $this->type = $response_type; - break; - case 'gyazo': - // Deprecated API since version 2.0.0, fallback to similar text API - header('Content-Type: text/plain; charset=UTF-8'); - $this->type = 'text'; - break; - case 'text': - header('Content-Type: text/plain; charset=UTF-8'); - $this->type = $response_type; - break; - default: - header('Content-Type: application/json; charset=UTF-8'); - $this->type = 'json'; - $this->error(400, 'Invalid response type. Valid options are: csv, html, json, text.'); - break; - } - } - - /** - * Routes error messages depending on response type. - * - * @param int $code HTTP status code number. - * @param int $desc Descriptive error message. - * @return void - */ - public function error($code, $desc) - { - $response = null; - - switch ($this->type) { - case 'csv': - $response = $this->csvError($desc); - break; - case 'html': - $response = $this->htmlError($code, $desc); - break; - case 'json': - $response = $this->jsonError($code, $desc); - break; - case 'text': - $response = $this->textError($code, $desc); - break; - } - - http_response_code(500); // "500 Internal Server Error" - echo $response; - } - - /** - * Routes success messages depending on response type. - * - * @param mixed[] $files - * @return void - */ - public function send($files) - { - $response = null; - - switch ($this->type) { - case 'csv': - $response = $this->csvSuccess($files); - break; - case 'html': - $response = $this->htmlSuccess($files); - break; - case 'json': - $response = $this->jsonSuccess($files); - break; - case 'text': - $response = $this->textSuccess($files); - break; - } - - http_response_code(200); // "200 OK". Success. - echo $response; - } - - /** - * Indicates with CSV body the request was invalid. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param int $description Descriptive error message. - * @return string Error message in CSV format. - */ - private static function csvError($description) - { - return '"error"'."\r\n"."\"$description\""."\r\n"; - } - - /** - * Indicates with CSV body the request was successful. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param mixed[] $files - * @return string Success message in CSV format. - */ - private static function csvSuccess($files) - { - $result = '"name","url","hash","size"'."\r\n"; - foreach ($files as $file) { - $result .= '"'.$file['name'].'"'.','. - '"'.$file['url'].'"'.','. - '"'.$file['hash'].'"'.','. - '"'.$file['size'].'"'."\r\n"; - } - - return $result; - } - - /** - * Indicates with HTML body the request was invalid. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param int $code HTTP status code number. - * @param int $description Descriptive error message. - * @return string Error message in HTML format. - */ - private static function htmlError($code, $description) - { - return '

ERROR: ('.$code.') '.$description.'

'; - } - - /** - * Indicates with HTML body the request was successful. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param mixed[] $files - * @return string Success message in HTML format. - */ - private static function htmlSuccess($files) - { - $result = ''; - - foreach ($files as $file) { - $result .= ''.$file['url'].'
'; - } - - return $result; - } - - /** - * Indicates with JSON body the request was invalid. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param int $code HTTP status code number. - * @param int $description Descriptive error message. - * @return string Error message in pretty-printed JSON format. - */ - private static function jsonError($code, $description) - { - return json_encode(array( - 'success' => false, - 'errorcode' => $code, - 'description' => $description, - ), JSON_PRETTY_PRINT); - } - - /** - * Indicates with JSON body the request was successful. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param mixed[] $files - * @return string Success message in pretty-printed JSON format. - */ - private static function jsonSuccess($files) - { - return json_encode(array( - 'success' => true, - 'files' => $files, - ), JSON_PRETTY_PRINT); - } - - /** - * Indicates with plain text body the request was invalid. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param int $code HTTP status code number. - * @param int $description Descriptive error message. - * @return string Error message in plain text format. - */ - private static function text_error($code, $description) - { - return 'ERROR: ('.$code.') '.$description; - } - - /** - * Indicates with plain text body the request was successful. - * - * @deprecated 2.1.0 Will be renamed to camelCase format. - * @param mixed[] $files - * @return string Success message in plain text format. - */ - private static function text_success($files) - { - $result = ''; - - foreach ($files as $file) { - $result .= $file['url']."\n"; - } - - return $result; - } -} diff --git a/php/classes/UploadException.class.php b/php/classes/UploadException.class.php deleted file mode 100755 index 8c9e4f6..0000000 --- a/php/classes/UploadException.class.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @author Michiel Thalen - * @copyright Copyright © 1997 - 2016 by the PHP Documentation Group - * @license - * UploadException is licensed under a Creative Commons Attribution 3.0 License - * or later. - * - * Based on a work at - * https://secure.php.net/manual/en/features.file-upload.errors.php#89374. - * - * You should have received a copy of the Creative Commons Attribution 3.0 - * License with this program. If not, see - * . - */ - - -class UploadException extends Exception -{ - public function __construct($code) - { - $message = $this->codeToMessage($code); - parent::__construct($message, 500); - } - - private function codeToMessage($code) - { - switch ($code) { - case UPLOAD_ERR_INI_SIZE: - $message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini'; - break; - case UPLOAD_ERR_FORM_SIZE: - $message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was '. - 'specified in the HTML form'; - break; - case UPLOAD_ERR_PARTIAL: - $message = 'The uploaded file was only partially uploaded'; - break; - case UPLOAD_ERR_NO_FILE: - $message = 'No file was uploaded'; - break; - case UPLOAD_ERR_NO_TMP_DIR: - $message = 'Missing a temporary folder'; - break; - case UPLOAD_ERR_CANT_WRITE: - $message = 'Failed to write file to disk'; - break; - case UPLOAD_ERR_EXTENSION: - $message = 'File upload stopped by extension'; - break; - - default: - $message = 'Unknown upload error'; - break; - } - - return $message; - } -} diff --git a/php/classes/UploadedFile.class.php b/php/classes/UploadedFile.class.php deleted file mode 100644 index 03b7429..0000000 --- a/php/classes/UploadedFile.class.php +++ /dev/null @@ -1,33 +0,0 @@ -sha1) { - $this->sha1 = sha1_file($this->tempfile); - } - - return $this->sha1; - } -} diff --git a/php/grill.php b/php/grill.php deleted file mode 100644 index 5984b12..0000000 --- a/php/grill.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * 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 THE - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -require_once 'settings.inc.php'; - -/* NOTE: we don't have to unref the PDO because we're not long-running */ -$db = new PDO(POMF_DB_CONN, POMF_DB_USER, POMF_DB_PASS); diff --git a/php/includes/settings.inc.php b/php/includes/settings.inc.php deleted file mode 100644 index c984c69..0000000 --- a/php/includes/settings.inc.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @copyright Copyright (c) 2015 cenci0 - * @copyright Copyright (c) 2015, 2016 the Pantsu.cat developers - * - * - * 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 THE - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -/** - * PDO connection socket - * - * Database connection to use for communication. Currently, MySQL is the only - * DSN prefix supported. - * - * @see http://php.net/manual/en/ref.pdo-mysql.connection.php PHP manual for - * PDO_MYSQL DSN. - * @param string POMF_DB_CONN DSN:host|unix_socket=hostname|path;dbname=database - */ -define('POMF_DB_CONN', 'mysql:unix_socket=/tmp/mysql.sock;dbname=pomf'); - -/** - * PDO database login credentials - */ - -/** @param string POMF_DB_NAME Database username */ -define('POMF_DB_USER', 'pomf'); -/** @param string POMF_DB_PASS Database password */ -define('POMF_DB_PASS', '***'); - -/** - * File system location where to store uploaded files - * - * @param string Path to directory with trailing delimiter - */ -define('POMF_FILES_ROOT', '/mnt/pantsu/http/files/'); - -/** - * Maximum number of iterations while generating a new filename - * - * Pomf uses an algorithm to generate random filenames. Sometimes a file may - * exist under a randomly generated filename, so we count tries and keep trying. - * If this value is exceeded, we give up trying to generate a new filename. - * - * @param int POMF_FILES_RETRIES Number of attempts to retry - */ -define('POMF_FILES_RETRIES', 15); - -/** - * The length of generated filename (without file extension) - * - * @param int POMF_FILES_LENGTH Number of random alphabetical ASCII characters - * to use - */ -define('POMF_FILES_LENGTH', 6); - -/** - * URI to prepend to links for uploaded files - * - * @param string POMF_URL URI with trailing delimiter - */ -define('POMF_URL', 'https://i.pantsu.cat/'); - -/** - * URI for filename generation - * - * @param string characters to be used in generateName() - */ -define('ID_CHARSET', 'abcdefghijklmnopqrstuvwxyz'); - - -/** - * Filtered mime types - * @param string[] $FILTER_MIME allowed/blocked mime types - */ -$FILTER_MIME = array(); -/** - * Filter mode: whitelist (true) or blacklist (false) - * @param bool $FILTER_MODE mime type filter mode - */ -$FILTER_MODE = false; -/** - * Double dot file extensions - * - * Pomf keeps the last file extension for the uploaded file. In other words, an - * uploaded file with `.tar.gz` extension will be given a random filename which - * ends in `.gz` unless configured here to ignore discards for `.tar.gz`. - * - * @param string[] $doubledots Array of double dot file extensions strings - * without the first prefixing dot - */ -$doubledots = array_map('strrev', array( - 'tar.gz', - 'tar.bz', - 'tar.bz2', - 'tar.xz', - 'user.js', -)); diff --git a/php/upload.php b/php/upload.php deleted file mode 100644 index f14a4d3..0000000 --- a/php/upload.php +++ /dev/null @@ -1,240 +0,0 @@ -name, PATHINFO_EXTENSION); - - // Check if extension is a double-dot extension and, if true, override $ext - $revname = strrev($file->name); - foreach ($doubledots as $ddot) { - if (stripos($revname, $ddot) === 0) { - $ext = strrev($ddot); - } - } - - do { - // Iterate until we reach the maximum number of retries - if ($tries-- === 0) { - throw new Exception( - 'Gave up trying to find an unused name', - 500 - ); // HTTP status code "500 Internal Server Error" - } - - $chars = ID_CHARSET; - $name = ''; - for ($i = 0; $i < $length; ++$i) { - $name .= $chars[mt_rand(0, strlen($chars))]; - } - - // Add the extension to the file name - if (isset($ext) && $ext !== '') { - $name .= '.'.strip_tags($ext); - } - - // Check if a file with the same name does already exist in the database - $q = $db->prepare('SELECT COUNT(filename) FROM files WHERE filename = (:name)'); - $q->bindValue(':name', $name, PDO::PARAM_STR); - $q->execute(); - $result = $q->fetchColumn(); - // If it does, generate a new name - } while ($result > 0); - - return $name; -} - -/** - * Handles the uploading and db entry for a file. - * - * @param UploadedFile $file - * - * @return array - */ -function uploadFile($file) -{ - global $db; - global $FILTER_MODE; - global $FILTER_MIME; - - // Handle file errors - if ($file->error) { - throw new UploadException($file->error); - } - - // Check if mime type is blocked - if (!empty($FILTER_MIME)) { - if ($FILTER_MODE == true) { //whitelist mode - if (!in_array($file->mime, $FILTER_MIME)) { - throw new UploadException(UPLOAD_ERR_EXTENSION); - } - } else { //blacklist mode - if (in_array($file->mime, $FILTER_MIME)) { - throw new UploadException(UPLOAD_ERR_EXTENSION); - } - } - } - - - // Check if a file with the same hash and size (a file which is the same) - // does already exist in the database; if it does, return the proper link - // and data. PHP deletes the temporary file just uploaded automatically. - $q = $db->prepare('SELECT filename, COUNT(*) AS count FROM files WHERE hash = (:hash) '. - 'AND size = (:size)'); - $q->bindValue(':hash', $file->getSha1(), PDO::PARAM_STR); - $q->bindValue(':size', $file->size, PDO::PARAM_INT); - $q->execute(); - $result = $q->fetch(); - if ($result['count'] > 0) { - return array( - 'hash' => $file->getSha1(), - 'name' => $file->name, - 'url' => POMF_URL.$result['filename'], - 'size' => $file->size, - ); - } - - // Generate a name for the file - $newname = generateName($file); - - // Store the file's full file path in memory - $uploadFile = POMF_FILES_ROOT . $newname; - - // Attempt to move it to the static directory - if (!move_uploaded_file($file->tempfile, $uploadFile)) { - throw new Exception( - 'Failed to move file to destination', - 500 - ); // HTTP status code "500 Internal Server Error" - } - - // Need to change permissions for the new file to make it world readable - if (!chmod($uploadFile, 0644)) { - throw new Exception( - 'Failed to change file permissions', - 500 - ); // HTTP status code "500 Internal Server Error" - } - - // Add it to the database - // 'expire' support is deprecated since version 2.1.0. It may be - // removed in a future release. - if (empty($_SESSION['id'])) { - // Query if user is NOT logged in - $q = $db->prepare('INSERT INTO files (hash, originalname, filename, size, date, ' . - 'expire, delid) VALUES (:hash, :orig, :name, :size, :date, ' . - ':exp, :del)'); - } else { - // Query if user is logged in (insert user id together with other data) - $q = $db->prepare('INSERT INTO files (hash, originalname, filename, size, date, ' . - 'expire, delid, user) VALUES (:hash, :orig, :name, :size, :date, ' . - ':exp, :del, :user)'); - $q->bindValue(':user', $_SESSION['id'], PDO::PARAM_INT); - } - - // Common parameters binding - $q->bindValue(':hash', $file->getSha1(), PDO::PARAM_STR); - $q->bindValue(':orig', strip_tags($file->name), PDO::PARAM_STR); - $q->bindValue(':name', $newname, PDO::PARAM_STR); - $q->bindValue(':size', $file->size, PDO::PARAM_INT); - $q->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR); - $q->bindValue(':exp', null, PDO::PARAM_STR); - $q->bindValue(':del', sha1($file->tempfile), PDO::PARAM_STR); - $q->execute(); - - return array( - 'hash' => $file->getSha1(), - 'name' => $file->name, - 'url' => POMF_URL.$newname, - 'size' => $file->size, - ); -} - -/** - * Reorder files array by file. - * - * @param $_FILES - * - * @return array - */ -function diverseArray($files) -{ - $result = array(); - - foreach ($files as $key1 => $value1) { - foreach ($value1 as $key2 => $value2) { - $result[$key2][$key1] = $value2; - } - } - - return $result; -} - -/** - * Reorganize the $_FILES array into something saner. - * - * @param $_FILES - * - * @return array - */ -function refiles($files) -{ - $result = array(); - $files = diverseArray($files); - - foreach ($files as $file) { - $f = new UploadedFile(); - $f->name = $file['name']; - $f->mime = $file['type']; - $f->size = $file['size']; - $f->tempfile = $file['tmp_name']; - $f->error = $file['error']; - // 'expire' doesn't exist neither in $_FILES nor in UploadedFile; - // it was never implemented and has been deprecated since version 2.1.0. - //$f->expire = $file['expire']; - $result[] = $f; - } - - return $result; -} - -$type = isset($_GET['output']) ? $_GET['output'] : 'json'; -$response = new Response($type); - -if (isset($_FILES['files'])) { - $uploads = refiles($_FILES['files']); - - try { - foreach ($uploads as $upload) { - $res[] = uploadFile($upload); - } - $response->send($res); - } catch (Exception $e) { - $response->error($e->getCode(), $e->getMessage()); - } -} else { - $response->error(400, 'No input file(s)'); -} -- cgit v1.2.3 From 3028e13607d82b9d979f017eaddd0243878e5394 Mon Sep 17 00:00:00 2001 From: Austin Date: Sun, 26 Jun 2016 02:09:38 -0500 Subject: Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b4a2e6..0220a53 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Node, or NPM. So we'll just assume you already have them all running well. Assuming you already have Node and NPM working, compilation is easy. Use the following shell code: ```bash -git clone https://github.com/pomf/pomf +git clone --recursive https://github.com/pomf/pomf cd pomf/ make make install -- cgit v1.2.3 From d6406d4d65bee9ba392d6010b2251509421ae837 Mon Sep 17 00:00:00 2001 From: ileyd Date: Mon, 27 Jun 2016 12:05:46 +1000 Subject: Improved MySQL to SQLite migration instructions (#38) The initial paragraph explaining why you may prefer to use SQLite was made more brief, and rephrased to sound more neutral (note that it already was neutral). The clarifying section prior to the actual migration instructions was rewritten to better convey that the changes are non-destructive, and that they do not affect the user's main site until the final command (whose purpose is made clear), after verifying there are no issues. The instructions themselves have been modified to clarify where some commands are run from, their purpose, and also made more brief (the section itself is very slightly longer, but something happened to or I forgot to commit an important paragraph that was initially there). --- README.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0220a53..2b06d60 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Node, or NPM. So we'll just assume you already have them all running well. Assuming you already have Node and NPM working, compilation is easy. Use the following shell code: ```bash -git clone --recursive https://github.com/pomf/pomf +git clone https://github.com/pomf/pomf cd pomf/ make make install @@ -103,11 +103,17 @@ Remember to enable `deflate_module` and `filter_module` modules in your Apache configuration file. ### Migrating from MySQL to SQLite + , +Compared to SQLite, MySQL is relatively complicated to administer, brings in many unneeded dependencies, and consumes more resources. Additonally, as a network service, poorly configured installations have the potential +to pose a security risk. -For older versions of Pomf you may want to migrate to SQLite. Fortunately, it is incredibly simple to migrate your database. This may be done on a live server, and should require zero downtime. +For these reasons, you may wish to use SQLite rather than MySQL. -_If doing this on a live server, you way wish to work in a subdirectory (or vhost, or equivelant), so that any complications or mistakes do not affect your main site. -If you choose not to do so, know that mistakes in the changes outlined below, will only temporarily impact **uploading**, causing **Server error** to be displayed. None of these steps are destructive, and are easily reverted._ +Fortunately, it is incredibly simple to migrate your database. This may be done on a live server, if you desire, and requires zero downtime. + +The process described below involves running these commands on a live server. Nothing done here affects your main site, until running the very last command, which is done after verifying there are no issues. + +No changes described here are destructive, and are easily reverted. They only have the potential to cause uploading to fail gracefully, and will not affect downloading. Run the following commands as root, to dump your database, and make a SQLite database with the contents. ```bash @@ -118,14 +124,15 @@ rm /tmp/m2s chown -R nginx:nginx /var/db/pomf #replace user as appropriate chmod 0750 /var/db/pomf && chmod 0640 /var/db/pomf/sq3 ``` -Edit the file `php/includes/settings.inc.php`, in the subdirectory you just made, making the changes outlined below. +Edit the file `php/includes/settings.inc.php`, in your **source directory**, making the changes outlined below. Note, changing the second two lines is optional, as they are simply ignored when using SQLite. ```php define('POMF_DB_CONN', '[stuff]'); ---> define('POMF_DB_CONN', 'sqlite:/var/db/pomf/pomf.sq3');` define('POMF_DB_USER', '[stuff]'); ---> define('POMF_DB_USER', null); define('POMF_DB_PASS', '[stuff]'); ---> define('POMF_DB_PASS', null); ``` +Then, run `make DESTDIR=/path/to/main_site/testing_dir` (note the *testing_dir* component) to rebuild the website, and copy it into place, in a new testing subdirectory. -Then, run `make` to rebuild the website pages, and copy the new `settings.inc.php` file into place. +Now, navigate to this subdirectory in your web browser, e.g. https://try.pantsu.cat/testing_dir, and verify that uploading works fine. If so, excellent! You may rerun `make DESTDIR=/path/to/main_site` to update your main site. All done! You may disable or uninstall MySQL if you wish. -- cgit v1.2.3 From 186b9bf0aed3638845544c1dad9f54297cc23413 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 27 Jun 2016 16:09:19 -0500 Subject: Fix cloning instructions (again..) caused by commit 7ea276bbdf881905c1e2ad42ea0501de623da223 in PR #38 author being ileyd --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b06d60..0b7d9a3 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Node, or NPM. So we'll just assume you already have them all running well. Assuming you already have Node and NPM working, compilation is easy. Use the following shell code: ```bash -git clone https://github.com/pomf/pomf +git clone --recursive https://github.com/pomf/pomf cd pomf/ make make install -- cgit v1.2.3