initial commit

This commit is contained in:
Matthieu Bessat 2024-01-19 16:39:49 +01:00
commit 5ebc506921
975 changed files with 154341 additions and 0 deletions

View file

@ -0,0 +1,141 @@
<?php
namespace Paheko;
const SQLITE_JOURNAL_MODE = 'WAL';
const ENABLE_UPGRADES = false;
if (shell_exec('which pdftotext')) {
define('Paheko\PDFTOTEXT_COMMAND', 'pdftotext');
}
if (shell_exec('which ssconvert')) {
define('Paheko\CALC_CONVERT_COMMAND', 'ssconvert');
}
elseif (shell_exec('which unoconv')) {
define('Paheko\CALC_CONVERT_COMMAND', 'unoconv');
}
if (!empty($_ENV['PAHEKO_STANDALONE']))
{
$home = $_ENV['HOME'];
// Config directory
if (empty($_ENV['XDG_CONFIG_HOME']))
{
$_ENV['XDG_CONFIG_HOME'] = $home . '/.config';
}
// Rename Garradin to Paheko
if (file_exists($_ENV['XDG_CONFIG_HOME'] . '/garradin')) {
rename($_ENV['XDG_CONFIG_HOME'] . '/garradin', $_ENV['XDG_CONFIG_HOME'] . '/paheko');
}
if (!file_exists($_ENV['XDG_CONFIG_HOME'] . '/paheko'))
{
mkdir($_ENV['XDG_CONFIG_HOME'] . '/paheko', 0700, true);
}
if (file_exists($_ENV['XDG_CONFIG_HOME'] . '/paheko/config.local.php')) {
require_once $_ENV['XDG_CONFIG_HOME'] . '/paheko/config.local.php';
}
// Data directory: where the data will go
if (empty($_ENV['XDG_DATA_HOME']))
{
$_ENV['XDG_DATA_HOME'] = $home . '/.local/share';
}
if (file_exists($_ENV['XDG_DATA_HOME'] . '/garradin')) {
rename($_ENV['XDG_DATA_HOME'] . '/garradin', $_ENV['XDG_DATA_HOME'] . '/paheko');
}
if (!file_exists($_ENV['XDG_DATA_HOME'] . '/paheko')) {
mkdir($_ENV['XDG_DATA_HOME'] . '/paheko', 0700, true);
}
if (!defined('Paheko\DATA_ROOT')) {
define('Paheko\DATA_ROOT', $_ENV['XDG_DATA_HOME'] . '/paheko');
}
// Cache directory: temporary stuff
if (empty($_ENV['XDG_CACHE_HOME']))
{
$_ENV['XDG_CACHE_HOME'] = $home . '/.cache';
}
if (file_exists($_ENV['XDG_CACHE_HOME'] . '/garradin')) {
rename($_ENV['XDG_CACHE_HOME'] . '/garradin', $_ENV['XDG_CACHE_HOME'] . '/paheko');
}
if (!file_exists($_ENV['XDG_CACHE_HOME'] . '/paheko'))
{
mkdir($_ENV['XDG_CACHE_HOME'] . '/paheko', 0700, true);
}
if (!defined('Paheko\CACHE_ROOT')) {
define('Paheko\CACHE_ROOT', $_ENV['XDG_CACHE_HOME'] . '/paheko');
}
if (!defined('Paheko\DB_FILE')) {
$last_file = $_ENV['XDG_CONFIG_HOME'] . '/paheko/last';
if ($_ENV['PAHEKO_STANDALONE'] != 1)
{
$last_sqlite = trim($_ENV['PAHEKO_STANDALONE']);
}
else if (file_exists($last_file))
{
$last_sqlite = trim(file_get_contents($last_file));
$last_sqlite = str_replace('.local/share/garradin', '.local/share/paheko', $last_sqlite);
}
else
{
$last_sqlite = $_ENV['XDG_DATA_HOME'] . '/paheko/association.sqlite';
}
file_put_contents($last_file, $last_sqlite);
define('Paheko\DB_FILE', $last_sqlite);
}
if (!defined('Paheko\LOCAL_LOGIN')) {
define('Paheko\LOCAL_LOGIN', -1);
}
}
else {
if (file_exists('/etc/paheko/config.php')) {
require_once '/etc/paheko/config.php';
}
if (!defined('Paheko\DATA_ROOT')) {
define('Paheko\DATA_ROOT', '/var/lib/paheko');
}
if (!defined('Paheko\CACHE_ROOT')) {
define('Paheko\CACHE_ROOT', '/var/cache/paheko');
}
}
if (file_exists(DATA_ROOT . '/plugins')) {
define('Paheko\PLUGINS_ROOT', DATA_ROOT . '/plugins');
}
else {
define('Paheko\PLUGINS_ROOT', __DIR__ . '/plugins');
}
if (!defined('Paheko\SECRET_KEY')) {
if (file_exists(CACHE_ROOT . '/key')) {
define('Paheko\SECRET_KEY', trim(file_get_contents(CACHE_ROOT . '/key')));
}
else {
define('Paheko\SECRET_KEY', base64_encode(random_bytes(64)));
file_put_contents(CACHE_ROOT . '/key', SECRET_KEY);
}
}
// Disable PDF for CLI server
if (PHP_SAPI == 'cli-server' && !defined('Paheko\PDF_COMMAND') && !file_exists(PLUGINS_ROOT . '/dompdf')) {
define('Paheko\PDF_COMMAND', null);
}

174
build/debian/makedeb.sh Executable file
View file

@ -0,0 +1,174 @@
#!/bin/bash
# Ripped from fossil makdedeb.sh
DEB_REV=${1-1} # .deb package build/revision number.
PACKAGE_DEBNAME=paheko
THISDIR=${PWD}
DEB_ARCH_NAME=all
PACKAGE_VERSION=`cat ../../src/VERSION`
[ ! -f ../paheko-${PACKAGE_VERSION}.tar.gz ] && (cd ../../src; make release)
tar xzvf ../paheko-${PACKAGE_VERSION}.tar.gz -C /tmp
SRCDIR="/tmp/paheko-${PACKAGE_VERSION}"
test -e ${SRCDIR} || {
echo "This script must be run from a BUILT copy of the source tree."
exit 1
}
DEBROOT=$PWD/deb.tmp
test -d ${DEBROOT} && rm -fr ${DEBROOT}
DEBLOCALPREFIX=${DEBROOT}/usr
BINDIR=${DEBLOCALPREFIX}/bin
mkdir -p ${BINDIR}
mkdir -p ${DEBLOCALPREFIX}/share/doc/${PACKAGE_DEBNAME}
cp ${THISDIR}/paheko ${BINDIR}
mkdir -p "${DEBLOCALPREFIX}/share/menu"
cp ${THISDIR}/paheko.menu "${DEBLOCALPREFIX}/share/menu/paheko"
mkdir -p "${DEBLOCALPREFIX}/share/applications"
cp ${THISDIR}/paheko.desktop "${DEBLOCALPREFIX}/share/applications/"
CODEDIR=${DEBLOCALPREFIX}/share/${PACKAGE_DEBNAME}
mkdir -p ${CODEDIR}
cp -r ${SRCDIR}/* ${CODEDIR}
cp ${THISDIR}/config.debian.php ${CODEDIR}/config.local.php
mv ${CODEDIR}/data/plugins ${CODEDIR}/plugins
rm -rf ${CODEDIR}/*.sqlite ${CODEDIR}/data
cp ${THISDIR}/paheko.png "${CODEDIR}"
mkdir -p "${DEBROOT}/var/lib/${PACKAGE_DEBNAME}"
mkdir -p "${DEBROOT}/var/cache/${PACKAGE_DEBNAME}"
mkdir -p "${DEBROOT}/etc/${PACKAGE_DEBNAME}"
# Cleaning files that will be copied to /usr/share/doc
#rm -f ${CODEDIR}/../{README.md,COPYING}
cd $DEBROOT || {
echo "Debian dest dir [$DEBROOT] not found. :("
exit 2
}
rm -fr DEBIAN
mkdir DEBIAN
PACKAGE_DEB_VERSION=${PACKAGE_VERSION}
DEBFILE=${THISDIR}/${PACKAGE_DEBNAME}-${PACKAGE_DEB_VERSION}.deb
PACKAGE_TIME=$(/bin/date)
rm -f ${DEBFILE}
echo "Creating .deb package [${DEBFILE}]..."
echo "Generating md5 sums..."
find ${DEBLOCALPREFIX} -type f -exec md5sum {} \; > DEBIAN/md5sums
true && {
echo "Generating Debian-specific files..."
cp ${THISDIR}/../../COPYING ${DEBLOCALPREFIX}/share/doc/${PACKAGE_DEBNAME}/copyright
} || {
echo "Fail."
exit 1
}
true && {
cat <<EOF > DEBIAN/postinst
#!/bin/sh
chown www-data:www-data /var/lib/paheko /var/cache/paheko
chown root:www-data /etc/paheko
chmod g=rX,o= /etc/paheko
chmod ug=rwX,o= /var/lib/paheko /var/cache/paheko
EOF
chmod +x DEBIAN/postinst
}
true && {
CHANGELOG=${DEBLOCALPREFIX}/share/doc/${PACKAGE_DEBNAME}/changelog.gz
cat <<EOF | gzip -c > ${CHANGELOG}
${PACKAGE_DEBNAME} ${PACKAGE_DEB_VERSION}; urgency=low
This release has no changes over the core source distribution. It has
simply been Debianized.
Packaged by ${USER} <http://dev.kd2.org/paheko/> on
${PACKAGE_TIME}.
EOF
}
# doc.
DOCDIR=${DEBLOCALPREFIX}/share/doc/${PACKAGE_DEBNAME}
true && {
echo "Generating doc..."
cp ${THISDIR}/../../README.md ${DOCDIR}
a2x --doctype manpage --format manpage ${THISDIR}/manpage.txt
mkdir -p ${DEBLOCALPREFIX}/share/man/man1
gzip -c ${THISDIR}/paheko.1 > ${DEBLOCALPREFIX}/share/man/man1/${PACKAGE_DEBNAME}.1.gz
rm -f ${THISDIR}/paheko.1
} || {
echo "Fail."
exit 1
}
true && {
CONTROL=DEBIAN/control
echo "Generating ${CONTROL}..."
cat <<EOF > ${CONTROL}
Package: ${PACKAGE_DEBNAME}
Section: web
Priority: optional
Maintainer: Paheko <paheko@paheko.eu>
Architecture: ${DEB_ARCH_NAME}
Depends: dash | bash, php-cli (>=7.4), php-sqlite3, php-intl, php-mbstring, sensible-utils
Version: ${PACKAGE_DEB_VERSION}
Suggests: php-imagick
Replaces: garradin (<< 1.2.3~)
Breaks: garradin (<< 1.2.3~)
Homepage: https://fossil.kd2.org/paheko/
Description: Paheko is a tool to manage non-profit organizations.
It's only available in french.
Description-fr: Gestionnaire d'association en interface web ou CLI.
Paheko est un gestionnaire d'association à but non lucratif.
Il permet de gérer les membres, leur adhésion et leurs contributions financières.
Les membres peuvent se connecter eux-même et modifier leurs informations
ou communiquer entre eux par e-mail. Une gestion précise des droits et
autorisations est possible. Il est également possible de faire des
envois de mails en groupe.
.
Un module de comptabilité à double entrée assure une gestion financière
complète digne d'un vrai logiciel de comptabilité : suivi des opérations,
graphiques, bilan annuel, compte de résultat, exercices, etc.
.
Il y a également la possibilité de publier un site web simple,
et un gestionnaire de documents permettant de gérer les fichiers de
l'association.
EOF
}
true && {
fakeroot dpkg-deb -b ${DEBROOT} ${DEBFILE}
echo "Package file created:"
ls -la ${DEBFILE}
dpkg-deb --info ${DEBFILE}
}
cd - >/dev/null
true && {
echo "Cleaning up..."
rm -fr ${DEBROOT}
rm -rf ${SRCDIR}
}
echo "Done :)"

106
build/debian/manpage.txt Normal file
View file

@ -0,0 +1,106 @@
PAHEKO(1)
=========
:doctype: manpage
NAME
----
paheko - Gestionnaire d'association à but non lucratif
SYNOPSIS
--------
*paheko* ['OPTIONS'] ['COMMANDE'] ['BASE']
DESCRIPTION
-----------
Lancer paheko(1) sans argument lance le serveur web intégré sur
l'adresse localhost:8081 et le navigateur web par défaut.
*BASE* défini le chemin de la base de données (fichier .sqlite) à
utiliser. Par défaut, si aucune base n'est spécifiée, c'est le fichier
'association.sqlite' situé dans le répertoire des données qui est
utilisé.
OPTIONS
-------
*-p, --port*='PORT'::
Défini le port utilisé par le serveur web.
Par défaut c'est le port 8081 qui est utilisé.
*-b, --bind*='IP'::
Adresse IP où sera exposé le serveur web.
Par défaut c'est 127.0.0.1 qui est utilisé.
Utiliser 0.0.0.0 pour que le serveur web soit accessible d'autres
machines. (Attention cela peut présenter un risque de sécurité.)
*-v, --verbose*::
Affiche les messages du serveur web.
*-h, --help*::
Affiche un message d'aide sur l'utilisation de la commande.
COMMANDES
---------
*server*::
Lance le serveur web autonome de Paheko sans lancer de navigateur
web.
*ui*::
Lance le serveur web autonome et le navigateur par défaut.
EXIT STATUS
-----------
*0*::
Succès
*1*::
Erreur
EMPLACEMENTS DE STOCKAGE
------------------------
Les données sont stockées dans $XDG_DATA_HOME/paheko.
Généralement c'est ~/.local/share/paheko
CONFIGURATION
-------------
Il est possible de créer un fichier de configuration dans
$XDG_CONFIG_HOME/paheko/config.local.php
Voir la documentation pour plus de détails sur les constantes
de configuration acceptées.
INSTALLATION SERVEUR WEB
------------------------
Il est possible d'utiliser ce package avec Apache pour héberger
une instance Paheko.
La procédure est détaillée ici :
https://fossil.kd2.org/paheko/wiki?name=Installation%20sous%20Debian-Ubuntu
Les données et plugins seront stockés dans le répertoire
/var/lib/paheko
BUGS
----
Voir https://fossil.kd2.org/paheko/ pour un accès au bugtracker.
AUTEUR
------
Paheko est développé par bohwaz et d'autres contributeurs.
RESSOURCES
----------
Site principal : <https://fossil.kd2.org/paheko/>
COPYING
-------
Copyright \(C) 2011-2023 BohwaZ. Free use of this software is
granted under the terms of the GNU Affero General Public License v3
(AGPL).

123
build/debian/paheko Executable file
View file

@ -0,0 +1,123 @@
#!/bin/sh
ROOT=/usr/share/paheko/www
#ROOT=~/fossil/paheko/src/www
ROUTER=${ROOT}/_route.php
PORT=8081
ADDRESS="127.0.0.1"
VERBOSE=0
PID_FILE="${XDG_RUNTIME_DIR}/paheko/pid"
[ ! -d `dirname $PID_FILE` ] && mkdir -p `dirname $PID_FILE`
# Execute getopt
ARGS=`getopt -o "pb:vh" -l "port:,bind:,verbose,help" -n "paheko" -- "$@"`
# Bad arguments
if [ $? -ne 0 ];
then
exit 1
fi
# A little magic
eval set -- "$ARGS"
# Now go through all the options
while true;
do
case "$1" in
-p|--port)
PORT=$2
shift;;
-b|--bind)
ADDRESS=$2
shift;;
-v|--verbose)
VERBOSE=1
shift;;
-h|--help)
cat <<EOF
Usage : $0 [COMMANDE] [PROJET]
Où COMMANDE peut être :
server [-p|--port PORT] [-b|--bind IP]
Démarre un serveur web Paheko sur le port spécifié
(8081 par défaut) et l'IP spécifiée (127.0.0.1 par défaut)
ui [-p|--port PORT] [-b|--bind IP]
Idem que 'server' mais démarre ensuite le navigateur web par défaut
et connecte automatiquement avec le premier administrateur
de l'association.
Si aucune COMMANDE n'est donnée, Paheko utilisera 'ui' par défaut.
PROJET est le chemin menant à un projet Paheko précis
(fichier .sqlite). Si aucun projet n'est indiqué, le
dernier projet ouvert sera rouvert. Si aucun projet n'a jamais été
ouvert un nouveau projet sera créé.
Options :
-p|--port PORT
Spécifie le port pour le mode ui ou le mode serveur.
-b|--bind IP
Spécifie l'adresse IP du serveur web.
-v|--verbose
Affiche les requêtes reçues sur le serveur web.
-h|--help
Affiche ce message.
EOF
exit
shift;;
--)
shift
break;;
esac
done
CMD="$1"
[ "$CMD" = "" ] && {
CMD="ui"
}
PROJECT="$2"
[ "$PROJECT" = "" ] && PROJECT="1"
export PAHEKO_STANDALONE="$PROJECT"
[ -f $PID_FILE ] && kill `cat $PID_FILE` > /dev/null 2>&1 && rm -f $PID_FILE
PHP_CLI_SERVER_WORKER=2
[ $VERBOSE = 1 ] && {
php -S ${ADDRESS}:${PORT} -t ${ROOT} -d variables_order=EGPCS ${ROUTER} &
} || {
php -S ${ADDRESS}:${PORT} -t ${ROOT} -d variables_order=EGPCS ${ROUTER} > /dev/null 2>&1 &
}
php_pid=$!
echo $php_pid > $PID_FILE
sleep .5
[ "$CMD" = "ui" ] && {
URL="http://${ADDRESS}:${PORT}/admin/"
[ "$DISPLAY" != "" ] && {
sensible-browser ${URL} &
} || {
www-browser ${URL} &
}
} || {
wait $php_pid
}

View file

@ -0,0 +1,6 @@
[Desktop Entry]
Name=Paheko
Exec=paheko
Icon=paheko
Type=Application
Categories=Office;Finance;Database

3
build/debian/paheko.menu Normal file
View file

@ -0,0 +1,3 @@
?package(paheko):needs="X11" section="Applications/Office"\
title="Paheko" command="/usr/bin/paheko"\
icon="/usr/share/paheko/paheko.png"

BIN
build/debian/paheko.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB