diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/conf/config.inc.php b/conf/config.inc.php new file mode 100644 index 0000000..f87d9af --- /dev/null +++ b/conf/config.inc.php @@ -0,0 +1,166 @@ +. + * + * @package PhpMyAdmin + */ + +$ynh_admin_user = 'YNH_ADMIN_USER'; +if ($_SERVER['PHP_AUTH_USER'] != $ynh_admin_user) +{ + header('Location: https://YNH_DOMAIN/ynhsso'); + exit; +} + +/* + * This is needed for cookie based authentication to encrypt password in + * cookie + */ +$cfg['blowfish_secret'] = 'a8b7c6d'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ + +/* + * Servers configuration + */ +$i = 0; + +/* + * First server + */ +$i++; +/* Authentication type */ +$cfg['Servers'][$i]['auth_type'] = 'config'; +$cfg['Servers'][$i]['user'] = 'root'; +$cfg['Servers'][$i]['password'] = 'YNH_MYSQL_ROOT_PASSWORD'; +/* Server parameters */ + +/* +$cfg['Servers'][$i]['host'] = 'localhost'; +$cfg['Servers'][$i]['connect_type'] = 'tcp'; +$cfg['Servers'][$i]['compress'] = false; +*/ + +/* Select mysql if your server does not have mysqli */ +$cfg['Servers'][$i]['extension'] = 'mysqli'; +$cfg['Servers'][$i]['AllowNoPassword'] = false; + +/* + * phpMyAdmin configuration storage settings. + */ + +/* User used to manipulate with storage */ +// $cfg['Servers'][$i]['controlhost'] = ''; +// $cfg['Servers'][$i]['controlport'] = ''; +$cfg['Servers'][$i]['controluser'] = 'YNH_PMA_USER'; +$cfg['Servers'][$i]['controlpass'] = 'YNH_PMA_PASSWORD'; + +/* Storage database and tables */ +$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; +$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark'; +$cfg['Servers'][$i]['relation'] = 'pma__relation'; +$cfg['Servers'][$i]['table_info'] = 'pma__table_info'; +$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords'; +$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages'; +$cfg['Servers'][$i]['column_info'] = 'pma__column_info'; +$cfg['Servers'][$i]['history'] = 'pma__history'; +$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs'; +$cfg['Servers'][$i]['tracking'] = 'pma__tracking'; +$cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords'; +$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig'; +$cfg['Servers'][$i]['recent'] = 'pma__recent'; +$cfg['Servers'][$i]['users'] = 'pma__users'; +$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups'; +$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding'; + +/* Contrib / Swekey authentication */ +// $cfg['Servers'][$i]['auth_swekey_config'] = '/etc/swekey-pma.conf'; + +/* + * End of servers configuration + */ + +/* + * Directories for saving/loading files from server + */ +$cfg['UploadDir'] = ''; +$cfg['SaveDir'] = ''; + +/** + * Defines whether a user should be displayed a "show all (records)" + * button in browse mode or not. + * default = false + */ +//$cfg['ShowAll'] = true; + +/** + * Number of rows displayed when browsing a result set. If the result + * set contains more rows, "Previous" and "Next". + * default = 30 + */ +//$cfg['MaxRows'] = 50; + +/** + * disallow editing of binary fields + * valid values are: + * false allow editing + * 'blob' allow editing except for BLOB fields + * 'noblob' disallow editing except for BLOB fields + * 'all' disallow editing + * default = blob + */ +//$cfg['ProtectBinary'] = 'false'; + +/** + * Default language to use, if not browser-defined or user-defined + * (you find all languages in the locale folder) + * uncomment the desired line: + * default = 'en' + */ +//$cfg['DefaultLang'] = 'en'; +//$cfg['DefaultLang'] = 'de'; + +/** + * default display direction (horizontal|vertical|horizontalflipped) + */ +//$cfg['DefaultDisplay'] = 'vertical'; + + +/** + * How many columns should be used for table display of a database? + * (a value larger than 1 results in some information being hidden) + * default = 1 + */ +//$cfg['PropertiesNumColumns'] = 2; + +/** + * Set to true if you want DB-based query history.If false, this utilizes + * JS-routines to display query history (lost by window close) + * + * This requires configuration storage enabled, see above. + * default = false + */ +//$cfg['QueryHistoryDB'] = true; + +/** + * When using DB-based query history, how many entries should be kept? + * + * default = 25 + */ +//$cfg['QueryHistoryMax'] = 100; + +/** + * Should error reporting be enabled for JavaScript errors + * + * default = 'ask' + */ +//$cfg['SendErrorReports'] = 'ask'; + +/* + * You can find more configuration options in the documentation + * in the doc/ folder or at . + */ +?> diff --git a/conf/create_db.sql b/conf/create_db.sql new file mode 100644 index 0000000..aaf4d14 --- /dev/null +++ b/conf/create_db.sql @@ -0,0 +1,27 @@ +-- -------------------------------------------------------- +-- SQL Commands to set up the pmadb as described in the documentation. +-- +-- This file is meant for use with MySQL 5 and above! +-- +-- This script expects the user pma to already be existing. If we would put a +-- line here to create him too many users might just use this script and end +-- up with having the same password for the controluser. +-- +-- This user "pma" must be defined in config.inc.php (controluser/controlpass) +-- +-- Please don't forget to set up the tablenames in config.inc.php +-- + +-- -------------------------------------------------------- + +DROP DATABASE `phpmyadmin`; + +-- +-- Database : `phpmyadmin` +-- +CREATE DATABASE IF NOT EXISTS `phpmyadmin` + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; +USE phpmyadmin; + +GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO + 'YNH_PMA_USER'@localhost; diff --git a/conf/create_tables.sql b/conf/create_tables.sql new file mode 100644 index 0000000..0ac5654 --- /dev/null +++ b/conf/create_tables.sql @@ -0,0 +1,287 @@ +-- -------------------------------------------------------- +-- SQL Commands to set up the pmadb as described in the documentation. +-- +-- This file is meant for use with MySQL 5 and above! +-- +-- This script expects the user pma to already be existing. If we would put a +-- line here to create him too many users might just use this script and end +-- up with having the same password for the controluser. +-- +-- This user "pma" must be defined in config.inc.php (controluser/controlpass) +-- +-- Please don't forget to set up the tablenames in config.inc.php +-- + +-- -------------------------------------------------------- + +-- +-- Database : `phpmyadmin` +-- +CREATE DATABASE IF NOT EXISTS `phpmyadmin` + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; +USE phpmyadmin; + +-- -------------------------------------------------------- + +-- +-- Privileges +-- +-- (activate this statement if necessary) +-- GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO +-- 'pma'@localhost; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__bookmark` +-- + +CREATE TABLE IF NOT EXISTS `pma__bookmark` ( + `id` int(11) NOT NULL auto_increment, + `dbase` varchar(255) NOT NULL default '', + `user` varchar(255) NOT NULL default '', + `label` varchar(255) COLLATE utf8_general_ci NOT NULL default '', + `query` text NOT NULL, + PRIMARY KEY (`id`) +) + COMMENT='Bookmarks' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__column_info` +-- + +CREATE TABLE IF NOT EXISTS `pma__column_info` ( + `id` int(5) unsigned NOT NULL auto_increment, + `db_name` varchar(64) NOT NULL default '', + `table_name` varchar(64) NOT NULL default '', + `column_name` varchar(64) NOT NULL default '', + `comment` varchar(255) COLLATE utf8_general_ci NOT NULL default '', + `mimetype` varchar(255) COLLATE utf8_general_ci NOT NULL default '', + `transformation` varchar(255) NOT NULL default '', + `transformation_options` varchar(255) NOT NULL default '', + PRIMARY KEY (`id`), + UNIQUE KEY `db_name` (`db_name`,`table_name`,`column_name`) +) + COMMENT='Column information for phpMyAdmin' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__history` +-- + +CREATE TABLE IF NOT EXISTS `pma__history` ( + `id` bigint(20) unsigned NOT NULL auto_increment, + `username` varchar(64) NOT NULL default '', + `db` varchar(64) NOT NULL default '', + `table` varchar(64) NOT NULL default '', + `timevalue` timestamp NOT NULL, + `sqlquery` text NOT NULL, + PRIMARY KEY (`id`), + KEY `username` (`username`,`db`,`table`,`timevalue`) +) + COMMENT='SQL history for phpMyAdmin' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__pdf_pages` +-- + +CREATE TABLE IF NOT EXISTS `pma__pdf_pages` ( + `db_name` varchar(64) NOT NULL default '', + `page_nr` int(10) unsigned NOT NULL auto_increment, + `page_descr` varchar(50) COLLATE utf8_general_ci NOT NULL default '', + PRIMARY KEY (`page_nr`), + KEY `db_name` (`db_name`) +) + COMMENT='PDF relation pages for phpMyAdmin' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__recent` +-- + +CREATE TABLE IF NOT EXISTS `pma__recent` ( + `username` varchar(64) NOT NULL, + `tables` text NOT NULL, + PRIMARY KEY (`username`) +) + COMMENT='Recently accessed tables' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__table_uiprefs` +-- + +CREATE TABLE IF NOT EXISTS `pma__table_uiprefs` ( + `username` varchar(64) NOT NULL, + `db_name` varchar(64) NOT NULL, + `table_name` varchar(64) NOT NULL, + `prefs` text NOT NULL, + `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`username`,`db_name`,`table_name`) +) + COMMENT='Tables'' UI preferences' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__relation` +-- + +CREATE TABLE IF NOT EXISTS `pma__relation` ( + `master_db` varchar(64) NOT NULL default '', + `master_table` varchar(64) NOT NULL default '', + `master_field` varchar(64) NOT NULL default '', + `foreign_db` varchar(64) NOT NULL default '', + `foreign_table` varchar(64) NOT NULL default '', + `foreign_field` varchar(64) NOT NULL default '', + PRIMARY KEY (`master_db`,`master_table`,`master_field`), + KEY `foreign_field` (`foreign_db`,`foreign_table`) +) + COMMENT='Relation table' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__table_coords` +-- + +CREATE TABLE IF NOT EXISTS `pma__table_coords` ( + `db_name` varchar(64) NOT NULL default '', + `table_name` varchar(64) NOT NULL default '', + `pdf_page_number` int(11) NOT NULL default '0', + `x` float unsigned NOT NULL default '0', + `y` float unsigned NOT NULL default '0', + PRIMARY KEY (`db_name`,`table_name`,`pdf_page_number`) +) + COMMENT='Table coordinates for phpMyAdmin PDF output' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__table_info` +-- + +CREATE TABLE IF NOT EXISTS `pma__table_info` ( + `db_name` varchar(64) NOT NULL default '', + `table_name` varchar(64) NOT NULL default '', + `display_field` varchar(64) NOT NULL default '', + PRIMARY KEY (`db_name`,`table_name`) +) + COMMENT='Table information for phpMyAdmin' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__designer_coords` +-- + +CREATE TABLE IF NOT EXISTS `pma__designer_coords` ( + `db_name` varchar(64) NOT NULL default '', + `table_name` varchar(64) NOT NULL default '', + `x` INT, + `y` INT, + `v` TINYINT, + `h` TINYINT, + PRIMARY KEY (`db_name`,`table_name`) +) + COMMENT='Table coordinates for Designer' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__tracking` +-- + +CREATE TABLE IF NOT EXISTS `pma__tracking` ( + `db_name` varchar(64) NOT NULL, + `table_name` varchar(64) NOT NULL, + `version` int(10) unsigned NOT NULL, + `date_created` datetime NOT NULL, + `date_updated` datetime NOT NULL, + `schema_snapshot` text NOT NULL, + `schema_sql` text, + `data_sql` longtext, + `tracking` set('UPDATE','REPLACE','INSERT','DELETE','TRUNCATE','CREATE DATABASE','ALTER DATABASE','DROP DATABASE','CREATE TABLE','ALTER TABLE','RENAME TABLE','DROP TABLE','CREATE INDEX','DROP INDEX','CREATE VIEW','ALTER VIEW','DROP VIEW') default NULL, + `tracking_active` int(1) unsigned NOT NULL default '1', + PRIMARY KEY (`db_name`,`table_name`,`version`) +) + COMMENT='Database changes tracking for phpMyAdmin' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__userconfig` +-- + +CREATE TABLE IF NOT EXISTS `pma__userconfig` ( + `username` varchar(64) NOT NULL, + `timevalue` timestamp NOT NULL, + `config_data` text NOT NULL, + PRIMARY KEY (`username`) +) + COMMENT='User preferences storage for phpMyAdmin' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__users` +-- + +CREATE TABLE IF NOT EXISTS `pma__users` ( + `username` varchar(64) NOT NULL, + `usergroup` varchar(64) NOT NULL, + PRIMARY KEY (`username`,`usergroup`) +) + COMMENT='Users and their assignments to user groups' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__usergroups` +-- + +CREATE TABLE IF NOT EXISTS `pma__usergroups` ( + `usergroup` varchar(64) NOT NULL, + `tab` varchar(64) NOT NULL, + `allowed` enum('Y','N') NOT NULL DEFAULT 'N', + PRIMARY KEY (`usergroup`,`tab`,`allowed`) +) + COMMENT='User groups with configured menu items' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__navigationhiding` +-- + +CREATE TABLE IF NOT EXISTS `pma__navigationhiding` ( + `username` varchar(64) NOT NULL, + `item_name` varchar(64) NOT NULL, + `item_type` varchar(64) NOT NULL, + `db_name` varchar(64) NOT NULL, + `table_name` varchar(64) NOT NULL, + PRIMARY KEY (`username`,`item_name`,`item_type`,`db_name`,`table_name`) +) + COMMENT='Hidden items of navigation tree' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..1fd4492 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,16 @@ +location YNH_WWW_PATH { + alias YNH_WWW_ALIAS ; + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + index index.php; + try_files $uri $uri/ index.php; + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + fastcgi_pass unix:/var/run/php5-fpm.sock; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; + } +} diff --git a/conf/user_list.py b/conf/user_list.py new file mode 100644 index 0000000..52994aa --- /dev/null +++ b/conf/user_list.py @@ -0,0 +1,3 @@ +import sys, json +userlist=json.loads(sys.stdin.readlines()[0])["Users"] +print "{0}".format("\n".join(i["Username"] for i in userlist)) diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..602ab0f --- /dev/null +++ b/manifest.json @@ -0,0 +1,39 @@ +{ + "name": "phpMyAdmin", + "id": "phpmyadmin", + "description": { + "en": "Manage MySQL databases over the web" + }, + "developer": { + "name": "julien", + "email": "julien.malik@paraiso.me", + "url": "http://www.phpmyadmin.net" + }, + "multi_instance": "false", + "arguments": { + "install" : [ + { + "name": "domain", + "ask": { + "en": "Choose a domain for phpMyAdmin" + }, + "example": "domain.org" + }, + { + "name": "path", + "ask": { + "en": "Choose a path for phpMyAdmin" + }, + "example": "/phpmyadmin", + "default": "/phpmyadmin" + }, + { + "name": "admin_user", + "ask": { + "en": "Choose the only allowed admin user" + }, + "example": "johndoe" + } + ] + } +} diff --git a/scripts/install b/scripts/install new file mode 100755 index 0000000..a3d5676 --- /dev/null +++ b/scripts/install @@ -0,0 +1,56 @@ +#!/bin/bash + +# Retrieve arguments +domain=$1 +path=$2 +admin_user=$3 + +# Check domain/path availability +sudo yunohost app checkurl $domain$path -a phpmyadmin +if [[ ! $? -eq 0 ]]; then + exit 1 +fi + +# Check that admin user is an existing account +sudo yunohost user list | python ../conf/user_list.py | grep "^$admin_user$" >/dev/null +if [[ ! $? -eq 0 ]]; then + echo "Error : the chosen admin user does not exist" + exit 1 +fi + +db_user=phpmyadmin +db_pwd=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d 'A-Za-z0-9' | sed -n 's/\(.\{24\}\).*/\1/p') +sed -i "s@YNH_PMA_USER@$db_user@g" ../conf/create_db.sql +sudo yunohost app initdb $db_user -p $db_pwd +mysql -u root -p$(sudo cat /etc/yunohost/mysql) < ../conf/create_db.sql +mysql -u $db_user -p$db_pwd < ../conf/create_tables.sql +#mysql -u root -p$(sudo cat /etc/yunohost/mysql) < ../conf/create_tables.sql +sudo yunohost app setting phpmyadmin mysqlpwd -v $db_pwd + +final_path=/var/www/phpmyadmin + +# Copy files to the right place +sudo mkdir -p $final_path +sudo cp -r ../sources/* $final_path +sed -i "s@YNH_DOMAIN@$domain@g" ../conf/config.inc.php +sed -i "s@YNH_ADMIN_USER@$admin_user@g" ../conf/config.inc.php +sed -i "s@YNH_PMA_USER@$db_user@g" ../conf/config.inc.php +sed -i "s@YNH_PMA_PASSWORD@$db_pwd@g" ../conf/config.inc.php +sed -i "s@YNH_MYSQL_ROOT_PASSWORD@$(sudo cat /etc/yunohost/mysql)@g" ../conf/config.inc.php +sudo cp ../conf/config.inc.php $final_path + +# Files owned by root, www-data can just read +sudo chown -R root: $final_path +sudo find $final_path -type f | xargs sudo chmod 644 +sudo find $final_path -type d | xargs sudo chmod 755 + +# Modify Nginx configuration file and copy it to Nginx conf directory +sed -i "s@YNH_WWW_PATH@$path@g" ../conf/nginx.conf +sed -i "s@YNH_WWW_ALIAS@$final_path/@g" ../conf/nginx.conf +nginxconf=/etc/nginx/conf.d/$domain.d/phpmyadmin.conf +sudo cp ../conf/nginx.conf $nginxconf +sudo chown root: $nginxconf +sudo chmod 600 $nginxconf + +sudo service nginx reload +sudo yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove new file mode 100755 index 0000000..e43e1a9 --- /dev/null +++ b/scripts/remove @@ -0,0 +1,13 @@ +#!/bin/bash + +domain=$(sudo yunohost app setting phpmyadmin domain) + +sudo rm -rf /var/www/phpmyadmin +sudo rm -f /etc/nginx/conf.d/$domain.d/phpmyadmin.conf + +sudo service nginx reload + +db_user=phpmyadmin +db_name=phpmyadmin +root_pwd=$(sudo cat /etc/yunohost/mysql) +mysql -u root -p$root_pwd -e "DROP DATABASE $db_name ; DROP USER $db_user@localhost ;" diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..bcb234b --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,34 @@ +#!/bin/bash + +domain=$(sudo yunohost app setting phpmyadmin domain) +path=$(sudo yunohost app setting phpmyadmin path) + +# Remove trailing "/" for next commands +path=${path%/} + +# Copy files to the right place +final_path=/var/www/phpmyadmin +sudo mkdir -p $final_path +sudo cp -r ../sources/* $final_path + +# Files owned by root, www-data can just read +sudo find $final_path -type f | xargs sudo chmod 644 +sudo find $final_path -type d | xargs sudo chmod 755 +sudo chown -R root: $final_path + +# except for data and tmp subdir, where www-data must have write permissions +sudo chown www-data:root $final_path/{data,tmp} +sudo chmod 700 $final_path/{data,tmp} + +# Modify Nginx configuration file and copy it to Nginx conf directory +sed -i "s@YNH_WWW_PATH@$path@g" ../conf/nginx.conf +sed -i "s@YNH_WWW_ALIAS@$final_path/@g" ../conf/nginx.conf +sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/phpmyadmin.conf + +if [ $is_public = "Yes" ]; +then + sudo yunohost app setting phpmyadmin skipped_uris -v "/" +fi + +sudo service nginx reload +sudo yunohost app ssowatconf