new way to generate database fromseparate schema.sql

php
Marc Wäckerlin 9 years ago
parent bd02ae565c
commit 4f8d997805
  1. 18
      ChangeLog
  2. 5
      ax_init_standard_project.m4
  3. 62
      bootstrap.sh
  4. 1
      configure.ac
  5. 2
      cordova/platforms/android/AndroidManifest.xml
  6. 2
      cordova/platforms/android/res/xml/config.xml
  7. 2
      html/checknewuser.php
  8. 5
      html/get.php
  9. 2
      html/login.php
  10. 32
      html/messagetable.php
  11. 20
      html/messagetable.sql
  12. 48
      html/opendb.php
  13. 10
      html/pubkey.php
  14. 15
      html/safechat.js
  15. 30
      html/schema.sql
  16. 3
      html/send.php
  17. 31
      html/usertable.php
  18. 5
      html/usertable.sql
  19. 15
      test/makefile.am
  20. 125
      test/runtests.sh

@ -1,3 +1,21 @@
2015-11-07 10:47 marc
* bootstrap.sh: there is no qt4-default
2015-11-07 09:23 marc
* bootstrap.sh: there is no qt4-default
2015-11-06 15:39 marc
* html/makefile.am, html/messagetable.php, html/messagetable.sql,
html/usertable.php, html/usertable.sql: split sql schema from php
2015-11-05 16:01 marc
* ChangeLog, html/messagetable.php, html/usertable.php:
documentation added to tables
2015-11-05 13:24 marc 2015-11-05 13:24 marc
* ChangeLog, bootstrap.sh, * ChangeLog, bootstrap.sh,

@ -13,6 +13,7 @@ m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break; break;
fi fi
done done
@ -22,6 +23,7 @@ m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break; break;
fi fi
done done
@ -36,6 +38,7 @@ m4_define(x_minor_diff, mrw_esyscmd_s([
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break; break;
fi; fi;
done done
@ -342,7 +345,7 @@ EOF
# use this in configure.ac to support debian packages # use this in configure.ac to support debian packages
AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [ AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [
README_DEB=$(tail -n +3 README | sed -e 's/^$/./g' -e 's/^/ /g') README_DEB=$(tail -n +3 README | sed -e 's/^ *$/./g' -e 's/^/ /g')
AC_SUBST(README_DEB) AC_SUBST(README_DEB)
_AM_SUBST_NOTMAKE([README_DEB]) _AM_SUBST_NOTMAKE([README_DEB])
AC_CONFIG_FILES([debian/changelog debian/control]) AC_CONFIG_FILES([debian/changelog debian/control])

@ -111,6 +111,7 @@ GENERATED FILES
* build-in-docker.sh - script to build the project encapsulated in a docker container * build-in-docker.sh - script to build the project encapsulated in a docker container
* build-resource-file.sh - build resource.qrc file from a resource directory * build-resource-file.sh - build resource.qrc file from a resource directory
* mac-create-app-bundle.sh - script to create apple mac os-x app-bundle * mac-create-app-bundle.sh - script to create apple mac os-x app-bundle
* test/runtests.sh - template file to run test scripts, i.e. docker based
* AUTHORS - replace your name in AUTHORS before first run * AUTHORS - replace your name in AUTHORS before first run
* NEWS - empty file add your project's news * NEWS - empty file add your project's news
* README - add project description (first line is header, followed by an empty line) * README - add project description (first line is header, followed by an empty line)
@ -120,7 +121,7 @@ GENERATED FILES
* src/version.hxx - if you enabled AX_USE_CXX * src/version.hxx - if you enabled AX_USE_CXX
* src/version.cxx - if you enabled AX_USE_CXX * src/version.cxx - if you enabled AX_USE_CXX
* html/makefile.am - if you enabled AX_BUILD_HTML * html/makefile.am - if you enabled AX_BUILD_HTML
* scripts/makefile.in - if you enabled AX_USE_SCRIPTS * scripts/makefile.am - if you enabled AX_USE_SCRIPTS
* doc/makefile.am - if you enabled AX_USE_DOXYGEN * doc/makefile.am - if you enabled AX_USE_DOXYGEN
* doc/doxyfile.in - if you enabled AX_USE_DOXYGEN * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN
* test/makefile.am - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT * test/makefile.am - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT
@ -196,7 +197,7 @@ FILES
<ou can access the readme by calling <ou can access the readme by calling
${DEFAULT_PROJECT_NAME}::description(). ${DEFAULT_PROJECT_NAME}::description().
* ChangeLog: Your changelog is automatically maintained from * ChangeLog: Your changelog is automatically maintained from
subversion history, using svn2cl | subversion-tools. You don't need to subversion history, using svn2cl. You don't need to
care about. care about.
* configure.ac: This file becomes very short and simple. You provide * configure.ac: This file becomes very short and simple. You provide
the project name, the major and minor version. The the project name, the major and minor version. The
@ -332,7 +333,7 @@ to() {
case "$1" in case "$1" in
(--condition) shift # test for a tag, abort if not set (--condition) shift # test for a tag, abort if not set
if ! testtag "$1"; then if ! testtag "$1"; then
return return 0
fi;; fi;;
(--mode) shift # test for a tag, abort if not set (--mode) shift # test for a tag, abort if not set
mode="$1";; mode="$1";;
@ -373,7 +374,14 @@ copy() {
# file already exists and must not be rebuilt # file already exists and must not be rebuilt
return return
fi fi
run cp "${0%/*}/$1" "$1" local source="${0%/*}/$1"
if ! test -r "${source}"; then
source="../${source}"
if ! test -r "${source}"; then
source="${0%/*}/$1"
fi
fi
run cp "${source}" "$1"
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add "$1" run svn add "$1"
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
@ -402,6 +410,12 @@ doxyadd() {
fi fi
} }
# Check if we are in subversion root, if so, create trunk, branches, tags:
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then
svn mkdir trunk branches tags
cd trunk
fi
# Initialize the environment: # Initialize the environment:
copy ${MY_NAME} copy ${MY_NAME}
copy ax_init_standard_project.m4 copy ax_init_standard_project.m4
@ -412,6 +426,7 @@ copy resolve-rpmbuilddeps.sh
copy build-in-docker.sh copy build-in-docker.sh
copy build-resource-file.sh copy build-resource-file.sh
copy mac-create-app-bundle.sh copy mac-create-app-bundle.sh
if testtag AX_BUILD_TEST; then copy test/runtests.sh; fi
AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1) AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1)
if test -z "${AUTHOR}"; then if test -z "${AUTHOR}"; then
AUTHOR="FIRSTNAME LASTNAME (URL) <EMAIL>" AUTHOR="FIRSTNAME LASTNAME (URL) <EMAIL>"
@ -427,8 +442,7 @@ ${DEFAULT_PROJECT_NAME}
add description for ${DEFAULT_PROJECT_NAME} add description for ${DEFAULT_PROJECT_NAME}
EOF EOF
to configure.ac <<EOF && \ to configure.ac <<EOF && notice "please edit configure.ac, then rerun $0" && exit 0
( notice "please edit configure.ac, then rerun $0"; exit 0 )
${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name ${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name
m4_define(x_major, 0) # project's major version m4_define(x_major, 0) # project's major version
m4_define(x_minor, 0) # project's minor version m4_define(x_minor, 0) # project's minor version
@ -700,7 +714,11 @@ namespace NAMESPACE {
const std::string IDENT("\$Id: " PACKAGE_STRING); const std::string IDENT("\$Id: " PACKAGE_STRING);
} }
EOF EOF
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_SCRIPTS scripts/makefile.am to --condition AX_USE_SCRIPTS scripts/makefile.am <<EOF
${HEADER}dist_bin_SCRIPTS =
MAINTAINERCLEANFILES = makefile.in
EOF
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am
to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am <<EOF to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am <<EOF
${HEADER}$(if testtag AX_USE_CXX; then ${HEADER}$(if testtag AX_USE_CXX; then
@ -819,12 +837,12 @@ if testtag AX_USE_DEBIAN_PACKAGING; then
-- @AUTHOR@ @BUILD_DATE@ -- @AUTHOR@ @BUILD_DATE@
EOF EOF
BUILD_DEPENDS="debhelper, subversion, pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)" BUILD_DEPENDS="debhelper, subversion, pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)"
to debian/control.in <<EOF to debian/control.in <<EOF
Source: @PACKAGE_NAME@ Source: @PACKAGE_NAME@
Priority: extra Priority: extra
Maintainer: @AUTHOR@ Maintainer: @AUTHOR@
Build-Depends: ${BUILD-DEPENDS} Build-Depends: ${BUILD_DEPENDS}
Package: @PACKAGE_NAME@ Package: @PACKAGE_NAME@
Section: $(if testtag AX_USE_LIBTOOL; then echo "libs"; fi) Section: $(if testtag AX_USE_LIBTOOL; then echo "libs"; fi)
@ -838,7 +856,7 @@ $( if testtag AX_USE_LIBTOOL; then
Package: @PACKAGE_NAME@-dev Package: @PACKAGE_NAME@-dev
Section: libdevel Section: libdevel
Architecture: any Architecture: any
Depends: @PACKAGE_NAME@ (= \${binary:Version}), ${BUILD-DEPENDS} Depends: @PACKAGE_NAME@ (= \${binary:Version}), ${BUILD_DEPENDS}
Description: @DESCRIPTION@ - Development Package Description: @DESCRIPTION@ - Development Package
@README_DEB@ @README_DEB@
EOF2 EOF2
@ -983,8 +1001,28 @@ fi)
EOF EOF
SUBDIRS="" SUBDIRS=""
if testtag AX_USE_CXX; then
SUBDIRS="${SUBDIRS} src"
fi
if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then
SUBDIRS="${SUBDIRS} test"
fi
if testtag AX_USE_SCRIPTS; then
SUBDIRS="${SUBDIRS} scripts"
fi
if testtag AX_USE_DOXYGEN; then
SUBDIRS="${SUBDIRS} doc"
fi
if testtag AX_BUILD_EXAMPLES; then
SUBDIRS="${SUBDIRS} examples"
fi
if testtag AX_BUILD_HTML; then
SUBDIRS="${SUBDIRS} html"
fi
for d in src test scripts doc examples html; do for d in src test scripts doc examples html; do
test -d $d && SUBDIRS="${SUBDIRS} $d" if test -d "$d" -a "${SUBDIRS//$d/}" = "${SUBDIRS}"; then
SUBDIRS="${SUBDIRS} $d"
fi
done done
to makefile.am<<EOF to makefile.am<<EOF
${HEADER}SUBDIRS =${SUBDIRS} ${HEADER}SUBDIRS =${SUBDIRS}
@ -1014,7 +1052,7 @@ if test -f makefile; then
fi fi
#### Bootstrap Before Configure #### #### Bootstrap Before Configure ####
run --no-check svn2cl | subversion-tools run --no-check svn2cl
run aclocal run aclocal
if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi
run automake -a run automake -a

@ -23,6 +23,7 @@ AX_USE_DEBIAN_PACKAGING
AX_BUILD_HTML AX_BUILD_HTML
AX_USE_RPM_PACKAGING AX_USE_RPM_PACKAGING
#AX_USE_CPPUNIT #AX_USE_CPPUNIT
AX_BUILD_TEST
#AX_BUILD_EXAMPLES #AX_BUILD_EXAMPLES
# qt features, uncomment, what you need: # qt features, uncomment, what you need:

@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="337" android:versionName="0.3.37" package="ch.safechat" xmlns:android="http://schemas.android.com/apk/res/android"> <manifest android:hardwareAccelerated="true" android:versionCode="344" android:versionName="0.3.44" package="ch.safechat" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<widget id="ch.safechat" version="0.3.37" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> <widget id="ch.safechat" version="0.3.44" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<preference name="loglevel" value="DEBUG" /> <preference name="loglevel" value="DEBUG" />
<feature name="Whitelist"> <feature name="Whitelist">
<param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin" /> <param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin" />

@ -23,8 +23,8 @@
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
require_once("usertable.php");
try { try {
require_once("opendb.php");
$user = $db->real_escape_string($_REQUEST['user']); $user = $db->real_escape_string($_REQUEST['user']);
$q = $db->query("select * from user where name='$user';"); $q = $db->query("select * from user where name='$user';");
if ($q->num_rows==0) { if ($q->num_rows==0) {

@ -28,11 +28,12 @@
*/ */
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
require_once("messagetable.php");
try { try {
require_once("opendb.php");
$start = $db->real_escape_string($_REQUEST['start']); $start = $db->real_escape_string($_REQUEST['start']);
$q = $db->query("select id, UNIX_TIMESTAMP(time) as time, user, msg from message where id>$start;"); $q = $db->query("select id, UNIX_TIMESTAMP(time) as time, user, msg from message where id>$start;");
echo json_encode($q->fetch_all(MYSQLI_ASSOC)); if ($q) echo json_encode($q->fetch_all(MYSQLI_ASSOC));
else echo json_encode(null);
} catch (Exception $e) { } catch (Exception $e) {
echo json_encode(null); echo json_encode(null);
} }

@ -25,7 +25,7 @@
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
try { try {
require_once("usertable.php"); require_once("opendb.php");
$user = $db->real_escape_string($_REQUEST['user']); $user = $db->real_escape_string($_REQUEST['user']);
$pubkey = $db->real_escape_string($_REQUEST['pubkey']); $pubkey = $db->real_escape_string($_REQUEST['pubkey']);
if ($user=="safechat") error("username safechat is reserved for server"); if ($user=="safechat") error("username safechat is reserved for server");

@ -1,32 +0,0 @@
<?php
/*! @file
@id $Id$
@see @ref messagetable for the database schema
@page database Database
@section messagetable Message Table
<table>
<caption>Table: message</caption>
<tr><th>Colum Name</th><th>SQL Type</th><th>Description</th></tr>
<tr><td>id</td><td>int, primary key</td><td>Incrementing message id starting at 1.</td></tr>
<tr><td>time</td><td>timestamp</td><td>Time when message has been stored in the database.</td></tr>
<tr><td>user</td><td>varchar(50), references \ref usertable "user (name)"</td><td>The sender's user name (pseudonym).</td></tr>
<tr><td>msg</td><td>longtext</td><td>The encryped and armored message text.</td></tr>
</table>
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
require_once("opendb.php");
try {
$db->query(file_get_contents("messagetable.sql"));
$db->query('set global max_allowed_packet=1000000000');
$db->query('set global net_buffer_length=1000000');
} catch (Exception $e) {
error('database error on server');
}
?>

@ -1,20 +0,0 @@
create table if not exists
'message' (
'id'
int primary key not null auto_increment
comment "id of the message, it is used in the client to check if a message has already been downloaded or not",
'time'
timestamp default current_timestamp
comment "time when the message has been stored on the server",
'user'
varchar(50) not null
comment "name of the user that sent the message",
'msg'
longtext not null
comment "message content, must be armored gnupg encrypted format",
foreign key ('user')
references 'user'('name')
on delete cascade
on update cascade
) character set utf8 engine=innodb
comment="table to hold all messages for later download by the receiver";

@ -0,0 +1,48 @@
<?php
/*! @file
@id $Id$
@see @ref usertable for the database schema
@page database Database
@tableofcontents
@section usertable User Table
<table>
<caption>Table: user</caption>
<tr><th>Colum Name</th><th>SQL Type</th><th>Description</th></tr>
<tr><td>name</td><td>varchar(50)</td><td>The user's name (pseudonym).</td></tr>
<tr><td>pubkey</td><td>text</td><td>The user's public key.</td></tr>
</table>
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
mysqli_report(MYSQLI_REPORT_STRICT);
require_once("functions.php");
try {
if (!isset($pgp)) {
$pgp = gnupg_init();
if (!$pgp) error("pgp on server failed");
}
} catch (Exception $e) {
error('cannot start pgp on server');
}
try {
if (!isset($db)) {
$db = new mysqli("mysql", "root", $_SERVER["MYSQL_ENV_MYSQL_ROOT_PASSWORD"]);
if (!$db) error("database connection failed on server");
$db->query("create database if not exists safechat;");
$db->select_db("safechat");
if (!$db) error("cannot create database for safechat");
$db->query(file_get_contents("schema.sql"));
if (!$db) error("cannot create database tables");
}
} catch (Exception $e) {
error('database error on server');
}
?>

@ -29,11 +29,11 @@ try {
require_once("usertable.php"); require_once("usertable.php");
$user = $db->real_escape_string($_REQUEST['user']); $user = $db->real_escape_string($_REQUEST['user']);
$q = $db->query("select pubkey from user where name='$user';"); $q = $db->query("select pubkey from user where name='$user';");
if ($q->num_rows!=1 && $user=="safechat") { /* if ($q->num_rows!=1 && $user=="safechat") { */
require_once("optionstable.php"); /* require_once("optionstable.php"); */
createSafechatUser(); /* createSafechatUser(); */
$q = $db->query("select pubkey from user where name='$user';"); /* $q = $db->query("select pubkey from user where name='$user';"); */
} /* } */
if ($q->num_rows==1) { if ($q->num_rows==1) {
echo json_encode($q->fetch_row()[0]); echo json_encode($q->fetch_row()[0]);
} else { } else {

@ -56,7 +56,7 @@ function error(data, stay) {
$("#status").html(data); $("#status").html(data);
console.log("error: "+data); console.log("error: "+data);
} else { } else {
$("#status").html('error'); $("#status").html('unknown error: '+JSON.stringify(data));
console.log("error: "+JSON.stringify(data)); console.log("error: "+JSON.stringify(data));
} }
} else { } else {
@ -686,13 +686,12 @@ function start() {
} }
/// On Load, Call @ref start /// On Load, Call @ref start
$( $(window.onbeforeunload = function() {
window.onbeforeunload = function() {
return "Are you sure you want to navigate away?"; return "Are you sure you want to navigate away?";
} });
window.onunload = function () { // you probably don't want to leave now... $(window.onunload = function() { // you probably don't want to leave now...
alert('You are trying to leave.'); alert('You are trying to leave.');
return false; return false;
} });
start(); $(start);
);

@ -0,0 +1,30 @@
CREATE TABLE IF NOT EXISTS `user` (
`name` varchar(50) NOT NULL UNIQUE COMMENT 'unique name of the user',
`pubkey` text NOT NULL COMMENT 'armored gnupg public key of the user',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='list of all registered users and their public keys';
create table if not exists `message` (
`id`
int not null auto_increment
comment "id of the message, it is used in the client to check if a message has already been downloaded or not",
`time`
timestamp default current_timestamp
comment "time when the message has been stored on the server",
`user`
varchar(50) not null
comment "name of the user that sent the message",
`msg`
longtext not null
comment "message content, must be armored gnupg encrypted format",
primary key (id),
foreign key (user)
references user(name)
on delete cascade
on update cascade
) character set utf8 engine=innodb
comment="table to hold all messages for later download by the receiver";
create table if not exists options (
name varchar(50) not null unique comment "option name",
value text not null comment "option value",
primary key (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment="table for system settings";

@ -26,7 +26,7 @@
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
try { try {
require_once("usertable.php"); require_once("opendb.php");
$user = $db->real_escape_string($_REQUEST['user']); $user = $db->real_escape_string($_REQUEST['user']);
$msg = $db->real_escape_string($_REQUEST['msg']); $msg = $db->real_escape_string($_REQUEST['msg']);
if (strlen($_REQUEST['msg'])>100000) error("message is too long"); if (strlen($_REQUEST['msg'])>100000) error("message is too long");
@ -34,7 +34,6 @@ try {
if (!$q || $q->num_rows!=1) error("user not found on server"); if (!$q || $q->num_rows!=1) error("user not found on server");
$pubkey = gnupg_import($pgp, $q->fetch_row()[0]); $pubkey = gnupg_import($pgp, $q->fetch_row()[0]);
if (!$pubkey) error("wrong identity"); if (!$pubkey) error("wrong identity");
require_once("messagetable.php");
$q = $db->query("insert into message (user, msg) values ('$user', '$msg');"); $q = $db->query("insert into message (user, msg) values ('$user', '$msg');");
if (!$q) { if (!$q) {
error_log("Error storing message: ".$db->error); error_log("Error storing message: ".$db->error);

@ -1,31 +0,0 @@
<?php
/*! @file
@id $Id$
@see @ref usertable for the database schema
@page database Database
@tableofcontents
@section usertable User Table
<table>
<caption>Table: user</caption>
<tr><th>Colum Name</th><th>SQL Type</th><th>Description</th></tr>
<tr><td>name</td><td>varchar(50), primary key</td><td>The user's name (pseudonym).</td></tr>
<tr><td>pubkey</td><td>text</td><td>The user's public key.</td></tr>
</table>
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
require_once("opendb.php");
try {
$db->query(file_get_contents("usertable.sql"));
} catch (Exception $e) {
error('database error on server');
}
?>

@ -1,5 +0,0 @@
CREATE TABLE IF NOT EXISTS `user` (
`name` varchar(50) NOT NULL COMMENT 'unique name of the user',
`pubkey` text NOT NULL COMMENT 'armored gnupg public key of the user',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='list of all registered users and their public keys';

@ -0,0 +1,15 @@
## @id $Id$
##
## This file has been added:
## - by bootstrap.sh
## - on Sat, 07 November 2015 16:02:44 +0100
## Feel free to change it or even remove and rebuild it, up to your needs
##
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
TESTS =
MAINTAINERCLEANFILES = makefile.in

@ -0,0 +1,125 @@
#!/bin/bash -e
#check for a text in a docker volume log
function check() {
if test $(docker inspect -f {{.State.Running}} $1) = "false"; then
echo
echo "**** ERROR: container $1 not running"
exit 1
fi
docker logs $1 2>&1 | grep -q "$2"
}
# call with volume name
function wait_for_mysql() {
check $1 "mysqld: ready for connections"
}
# run a countdown and call a check function
# $1: expected time in seconds
# $2-: check function
function countdown() {
set +x
expect=$1
shift
max=$1
shift
for ((i=0; i<$((expect+max)); ++i)); do
echo -en "\rPlease wait: $((expect-i))s "
$* && break || sleep 1
done
echo -e "\rdone in ${i}s: $* "
echo
set -x
}
# should not be called with sudo root
if test "$(whoami)" = "root"; then
echo "**** ERROR: call as non root user"
exit 1
fi
# option checks
NEED_XVFB=0
NEED_DOCKER=0
NEED_WEBTESTER=0
while test $# -gt 0; do
case "$1" in
(--help|-h)
echo "$0 [OPTIONS] [PORTS <port>]"
echo
echo "OPTIONS:"
echo
exit 0
;;
(*) echo "**** ERROR: unknown option '$1', try --help"; exit 1;;
esac
if test $# -eq 0; then
echo "**** ERROR: missing value, try --help"; exit 1;
fi
shift
done
error=0;
# test for xvfb (needed by webtester)
if test ${NEED_XVFB} -eq 1 -a \! -e "$(which xvfb-run)"; then
echo "**** ERROR: XVFB Not Installed"
echo "you need to install xvfb"
echo "please execute as root:"
echo " apt-get install xvfb"
error=1
fi
# test for docker if needed
if test ${NEED_DOCKER} -eq 1 -a \! -e "$(which docker)"; then
echo "**** ERROR: Docker Not Installed"
echo "you need to install the latest docker"
echo "please execute as root:"
echo " apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 \\"
echo " --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9"
echo " echo 'deb https://get.docker.io/ubuntu docker main' \\"
echo " > /etc/apt/sources.list.d/docker.list"
echo " apt-get update"
echo " apt-get install lxc-docker"
echo " adduser $(whoami) docker"
echo "you need to add the following line to /etc/default/docker:"
echo ' DOCKER_OPTS="--insecure-registry dev0004:5000"'
echo "logout $(whoami) and login again to run $(whoami) with group docker"
echo "additionals note:"
echo " if you run docker inside a VM (not recommended), you probably"
echo " need to foollow the instructions in chapter \"Changing Bridge"
echo " Subnetwork\" on https://marc.wäckerlin.ch/computer/docker-overview"
echo "introduction to docker, see:"
echo " https://marc.wäckerlin.ch/computer/docker-overview"
error=1
fi
# check for webtester
if test ${NEED_WEBTESTER} -eq 1 -a \! -e "$(which webrunner)"; then
echo "**** ERROR: Webtester Not Installed"
echo "you need to install webtester"
echo "please execute as root:"
echo " apt-get install -y wget software-properties-common apt-transport-https"
echo " apt-add-repository https://dev.marc.waeckerlin.org/repository"
echo " wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \\"
echo " | apt-key add -"
echo " apt-get update -y"
echo " apt-get install -y webtester"
echo "more information, see:"
echo " https://dev.marc.waeckerlin.org/redmine/projects/webtester"
error=1
fi
if test "$error" = "1"; then
exit 1
fi
set -x
# Add tests here
MYSQL=$(docker run -d -e MYSQL_ROOT_PASSWORD=TopSecretLOL mysql)
PHP=$(docker run -d --volume $(pwd)/../html:/usr/share/nginx/html:ro --link ${MYSQL}:mysql mwaeckerlin/php-fpm)
NGINX=$(docker run -d --volumes-from ${PHP} --link ${PHP}:php -p 8080:80 mwaeckerlin/nginx)
trap "docker rm -f ${NGINX} ${PHP} ${MYSQL}" INT TERM EXIT
sleep 60
Loading…
Cancel
Save