FileZ

FileZ est une application web développée par l’Université d’Avignon et des Pays de Vaucluse qui permet de déposer et gérer des fichiers destinés à être partagés grâce à une URL unique, sur le principe de l’application perl/mod_perl filex.

  • PHP/Mysql – Framework Limonade PHP
  • Authentification modulaire : CAS+LDAP, LDAP only, BDD, ou vos propres classes PHP
  • URL courtes (ex: filez.univ-avignon.fr/x42ni1)
  • Barre de progression d’upload (Utilisation non obstructive du javascript)
  • Formulaire d’installation
  • Internationnalisation
  • Protection des fichiers par mot de passe
  • Envoi d’emails
  • Tâches cron
  • Quota

https://github.com/FileZ/FileZ

doc http://pegasus45.free.fr/index.php?title=Ubuntu_10.04:_Installation_de_FileZ_2.0.2

Installation

on part d’une debian 6

apt-get install apache2 mysql-server php5-mysql php5-gd make unzip
apt-get install php5-dev php-pear
pecl install uploadprogress
echo "extension = uploadprogress.so" >> /etc/php5/apache2/conf.d/uploadprogress.ini
apache2ctl restart

vi /etc/apache2/sites-available/filez
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       ServerName srv-filez
       DocumentRoot /var/www/filez
       <Directory />
               Options FollowSymLinks
               AllowOverride All
       </Directory>

       ErrorLog /var/log/apache2/filez-error.log
       LogLevel warn
       CustomLog /var/log/apache2/filez-access.log combined
</VirtualHost>
vi /etc/apache2/sites-available/default
AllowOverride All
a2ensite filez
a2enmod rewrite
mkdir /var/www/filez
/etc/init.d/apache2 restart

vi /etc/php5/apache2/php.ini
#Taille max d'un fichier en upload
upload_max_filesize = 750M
#Taille max d'un fichier que PHP peut accepter
post_max_size = 750M
#Temps max qu'un script peut executer
max_execution_time = 1200
#Répertoire temporaire pour le transfert
upload_tmp_dir "/srv/filez-tmp"
mkdir /srv/filez-tmp
chown www-data.www-data /srv/filez-tmp
/etc/init.d/apache2 restart

wget https://download.github.com/UAPV-FileZ-2.0.2-14-g232f5be.tar.gz
tar zxvf UAPV-FileZ-2.0.2-14-g232f5be.tar.gz
mv FileZ-master/* /var/www/filez/
mv FileZ-master/.* /var/www/filez/
chown -R www-data.www-data /var/www/filez

mysql -u root -p

Note

le lien vers l’archive peut changer via la modification des sources il est donc préférable d’aller le télécharger manuellement sur le site git

create database filez;
use filez;
CREATE TABLE `filez`.`db_users` (
`uid` SERIAL NOT NULL ,
`login` VARCHAR( 20 ) NOT NULL ,
`password` VARCHAR( 40 ) NOT NULL ,
`givenname` VARCHAR( 255 ) NOT NULL ,
`sn` VARCHAR( 255 ) NOT NULL ,
`mail` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM ;

INSERT INTO `filez`.`db_users`
(`uid`, `login`, `password`, `givenname`, `sn`, `mail`)
VALUES (NULL, 'admin', MD5('admin'), 'Admin', 'Olympe', 'admin@olympe.local');
mkdir -p /var/filez/uploads
mkdir -p /var/log/filez
chown -R www-data.www-data /var/filez
chown www-data.www-data /var/log/filez

Paramétrage

Nous venons d’installer le serveur sur le lien http://myservdeb04/filez

Nous avons donc un utilisateur d’inscrit (admin/admin)

Il faut maintenant lancer votre naviguateur pour finir l’installation par le paramétrage

le fichier /var/www/filez/config/filez.ini est

[app]
use_url_rewriting = 1
log_dir = "/var/log/filez"
upload_dir = "/var/filez/uploads"
max_file_lifetime = 20
default_file_lifetime = 10
max_extend_count = 7
min_hash_size = 4
max_hash_size = 8
default_locale = "fr"
auth_handler_class = "Fz_Controller_Security_Internal"
user_factory_class = "Fz_User_Factory_Database"
user_quota = "2G"
https = "off"
progress_monitor = "Fz_UploadMonitor_ProgressUpload"
sharing_destinations[] = "email"
admin_email = "informatiquepz@myprop-group.com"

[db]
dsn = "mysql:host=localhost;dbname=filez"
user = "root"
password = "systemlx"

[cron]
days_before_expiration_mail = 2
frequency = "+1 day"

[email]
from_name = "Mysociety Filez"
from_email = "svcfilez@myprop-group.com"
host = "srvxxxx1"
name = "filez"
; si le serveur demande une authentification
; auth=login ; possible values = crammd5, login, plain
; port=25
; username=svcfilez
; password=myprop2012

[user_factory_options]
db_use_global_conf = 1
db_table = "db_users"
db_username_field = "login"
db_password_field = "password"
db_password_algorithm = "MD5"

[user_attributes_translation]
firstname = "givenname"
lastname = "sn"
email = "mail"
id = "uid"

[looknfeel]
show_credit = 1
help_url = "help"
_images/20130227_01.png
_images/20130227_02.png

on peut aussi gérer la suppression automatique des fichiers par une tache cron

vi /var/www/filez/scripts/cron.sh
LOG_DIR=/var/log/filez

# Url of filez web root
URL=http://myservdeb04/filez

LANG=fr

url_output="`wget --header=\"Accept-Language: $LANG\"  -q -O - $URL/admin/checkFiles`"

if test -n "$url_output"; then
   cd $LOG_DIR
   echo "[`date +'%FT%T%:z'`] [CRON] wget output: "$url_output >> "$LOG_DIR/filez-cron-error.log"
fi

Ensuite, on le place dans le cron. Important, le script doit être exécuté par l’utilisateur Apache:

crontab -e
0 0 * * * su www-data -c "sh /var/www/filez/scripts/cron.sh" 2>/dev/null

Un mail d’avertissement sera envoyé 2 jours avant l’expiration. Et le jour j, le fichier sera supprimé.

Dans le fichier /var/www/filez/config/filez.ini, on peut modifier certaines valeurs:

max_file_lifetime = nb de jours max que l'utilisateur peut choisir pour l'expiration
default_file_lifetime = nb de jours par défaut pour l'expiration
max_extend_count = nb max de fois que l'utilisateur peut étendre l'expiration
user_quota = la taille max de l'espace de stockage à chaque utilisateur
days_before_expiration_mail = nb de jour avant l'envoi d'un mail d'avertissement

concernant les utilisateurs, juste après l’installation j’ai lancé la commande suivante

update fz_user set is_admin=1

cela a permit de donner les droits d’administration à l’utilisateur admin

Pour que la base puisse être accessible depuis un autre poste

vi /etc/mysql/my.cnf
# Mettre ici l'adresse IP de votre serveur
bind-address            = XXX.XXX.XXX.XXX
# Cette ligne doit être commentée ou inexistante
# skip-networking
/etc/init.d/mysql restart

creation d’un compte “mysql” avec pour password “mysociety” pour un accès distant

mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'%' IDENTIFIED BY 'mysociety' WITH GRANT OPTION;

Invité

Il est parfois utile d’avoir un compte “invité” afin d’offrir la possibilité à une personne extérieur à pouvoir déposé un fichier.

création du compte guest (password initial guest)

mysql -u root -p
INSERT INTO `filez`.`db_users`
(`uid`, `login`, `password`, `givenname`, `sn`, `mail`)
VALUES (NULL, 'guest', MD5('guest'), 'guest', 'guest', 'guest@myprop-group.com');

ajout dans /var/www/filez/config/filez.ini des infos de password de guest

[guest]
password_guest = guest

modification du fichier /var/www/filez/app/views/layout afin:

  • d’avoir une charte d’utilisation
  • qu’un utilisateur authentifié puisse voir les informations de connexion du compte guest
  <footer>
    <?php if (is_array (option ('debug_msg'))): ?>
      <div class="debug"><h3>Logged messages :</h3>
      <?php foreach (option ('debug_msg') as $msg): ?>
        <pre><?php echo $msg ?></pre>
      <?php endforeach ?>
      </div>
    <?php endif ?>

    <?php if (isset ($fz_user)): ?>
      <p id="disk-usage"><?php echo __r('Using %space% of %quota%', array(
                 'space' => '<b id="disk-usage-value">'.$fz_user->getDiskUsage ().'</b>',
                 'quota' => fz_config_get('app', 'user_quota') )); ?>.
      </p>


    <?php if ($fz_user != 'guest guest'): ?>
    <div id="charte">
      Si vous souhaitez qu'un utilisateur extérieur puisse déposer un fichier, vous pouvez lui donner comme info de connexion
      <br/>login: guest
      <br/>password: <b><?php echo __(fz_config_get('guest', 'password_guest')) ?></b>
    </div>
    <?php endif ?>

    <?php else: ?>
 <div id="charte">
<dd>1 - L'usage de ce service ne peut se faire que dans le cadre professionnel.<br></dd>
<dd>2 - Seuls les fichiers ne contrevenant pas à la législation et notamment au respect des droits d'auteur peuvent y être déposés.<br></dd>
<dd>3 - Le déposant sera tenu responsable juridiquement des documents accessibles.<br></dd>
<dd>4 - La confidentialité des fichiers déposés n'est pas garantie.<br></dd>

<dd>5 - Toutes les opérations sont journalisées.</dd><p></p>
</div>
    <?php endif ?>

    <div id="support">
      <?php if (fz_config_get('looknfeel', 'help_url')): ?>
        <a href="<?php echo url_for (fz_config_get('looknfeel', 'help_url')) ?>" class="help" target="#_blank"><?php echo __('Find help') ?></a>
      <?php endif; ?>
      <?php if (fz_config_get('looknfeel', 'bug_report_href')): ?>
        <a href="<?php echo fz_config_get('looknfeel', 'bug_report_href') ?>" class="bug"><?php echo __('Report a bug') ?></a>
      <?php endif; ?>
    </div>

    <?php if (fz_config_get('looknfeel', 'show_credit')): ?>
      <a href="https://github.com/FileZ/FileZ" target="#_blank"><?php echo __('A free software from the University of Avignon and the FileZ community') ?></a>
    <?php endif ?>

    <?php echo check_cron();?>
  </footer>

j’ai aussi placé dans /var/www/filez/resource/css/custom.css des infos pour le div charte

div#charte {
        text-align: left;
        font-size:11px;
}

il faut maintenant faire un script qui va changer régulièrement:

  • le mot de passe de guest dans la base de donnée mysql
  • le mot de passe de guest dans le fichier var/www/filez/config/filez.ini

pour cela il faut installer su le serveur python et le module python-mysqldb

apt-get install python python-mysqldb

puis écrire le module suivant:

import _mysql
import string
from random import sample

f='/var/www/filez/config/filez.ini'

pop = string.ascii_letters + string.digits
k=8
passwd = ''.join(sample(pop, k))
print passwd

db=_mysql.connect(host="localhost",user="root", passwd="systemlx",db="filez")
db.query("update db_users set password=MD5('%s') where login='guest'" % passwd)
db.commit()
db.close()

fichier = open(f,'r')
txt=''
for i in fichier.readlines():
        if i[0:14] == 'password_guest':
                i =  'password_guest = %s' % passwd
        txt = txt + i
fichier.close()
result = open(f,'w')
result.write(txt)
result.close()

il faut maintenant ajouter une tâche dans crontab pour calculer régulièrement ce nouveau mot de passe

crontab -e
0 0 * * * /root/change_password_guest.sh