From 9a9c62f3cfe087da29da32cf4281c3021533db72 Mon Sep 17 00:00:00 2001 From: Alexandre Anriot Date: Mon, 12 Sep 2005 19:51:19 +0000 Subject: [PATCH] Initial revision --- AUTHORS | 7 + LICENSE | 340 ++++++++++++++++ Makefile | 60 +++ README | 84 ++++ TODO | 9 + admin/Changes | 6 + admin/Evoauth.pl | 44 +++ admin/MANIFEST | 9 + admin/META.yml | 10 + admin/Makefile.PL | 20 + admin/README | 33 ++ admin/lib/Evoauth/Admin.pm | 62 +++ admin/lib/Evoauth/Functions.pm | 106 +++++ admin/lib/Evoauth/Iptables.pm | 241 ++++++++++++ admin/t/Evoauth-Admin.t | 15 + evoauth.conf | 16 + htdocs/accueil.txt | 10 + htdocs/activation.php | 69 ++++ htdocs/edit.php | 553 +++++++++++++++++++++++++++ htdocs/evoauth.txt | 1 + htdocs/favicon.ico | 0 htdocs/fin.php | 34 ++ htdocs/images/accueil-evolix.jpg | Bin 0 -> 3196 bytes htdocs/images/accueil-numnet.jpg | Bin 0 -> 27856 bytes htdocs/images/accueil-shaktiware.jpg | Bin 0 -> 7438 bytes htdocs/images/accueil.jpg | Bin 0 -> 3196 bytes htdocs/images/accueil.png | Bin 0 -> 1656 bytes htdocs/images/fin.png | Bin 0 -> 2012 bytes htdocs/images/logo.gif | Bin 0 -> 14163 bytes htdocs/images/popup.jpg | Bin 0 -> 6571 bytes htdocs/includes/config.php | 22 ++ htdocs/includes/database.php | 241 ++++++++++++ htdocs/includes/fonctions.php | 17 + htdocs/index.php | 53 +++ htdocs/login.php | 68 ++++ htdocs/membre.php | 139 +++++++ htdocs/popup_debut.php | 119 ++++++ htdocs/popup_fin.php | 39 ++ htdocs/style.css | 11 + install/crontab.sample | 2 + install/database.sql | 25 ++ install/evoauth.log | 1 + install/http-evoauth.conf | 6 + 43 files changed, 2472 insertions(+) create mode 100644 AUTHORS create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README create mode 100644 TODO create mode 100644 admin/Changes create mode 100644 admin/Evoauth.pl create mode 100644 admin/MANIFEST create mode 100644 admin/META.yml create mode 100644 admin/Makefile.PL create mode 100644 admin/README create mode 100644 admin/lib/Evoauth/Admin.pm create mode 100644 admin/lib/Evoauth/Functions.pm create mode 100644 admin/lib/Evoauth/Iptables.pm create mode 100644 admin/t/Evoauth-Admin.t create mode 100644 evoauth.conf create mode 100644 htdocs/accueil.txt create mode 100644 htdocs/activation.php create mode 100644 htdocs/edit.php create mode 100644 htdocs/evoauth.txt create mode 100644 htdocs/favicon.ico create mode 100644 htdocs/fin.php create mode 100644 htdocs/images/accueil-evolix.jpg create mode 100644 htdocs/images/accueil-numnet.jpg create mode 100644 htdocs/images/accueil-shaktiware.jpg create mode 100644 htdocs/images/accueil.jpg create mode 100644 htdocs/images/accueil.png create mode 100644 htdocs/images/fin.png create mode 100644 htdocs/images/logo.gif create mode 100644 htdocs/images/popup.jpg create mode 100644 htdocs/includes/config.php create mode 100644 htdocs/includes/database.php create mode 100644 htdocs/includes/fonctions.php create mode 100644 htdocs/index.php create mode 100644 htdocs/login.php create mode 100644 htdocs/membre.php create mode 100644 htdocs/popup_debut.php create mode 100644 htdocs/popup_fin.php create mode 100644 htdocs/style.css create mode 100644 install/crontab.sample create mode 100644 install/database.sql create mode 100644 install/evoauth.log create mode 100644 install/http-evoauth.conf diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..488e4ec --- /dev/null +++ b/AUTHORS @@ -0,0 +1,7 @@ +Credits +------- + + Anriot Alexandre http://www.atlantilde.com/ + Colpart Gregory http://www.gcolpart.com/ + Dubois Sébastien http://morpheus.evolix.net/ + Evolix http://www.evolix.fr/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..aa8c9c5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..41ba133 --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ +# $Id$ +# +# Makefile pour Evoauth + +VERSION= 0.5 +SRC= ./ +WWWDIR= /var/www/htdocs +BINDIR= /usr/local/share +DOCDIR= /usr/local/share/doc +NAME= evoauth +TAR= tar + +install:all +all: web tools help msg + +web: + $(INSTALL) -d -m 0755 $(WWWDIR)/$(NAME)/{,includes,images} + $(INSTALL) -m 0644 htdocs/*.php $(WWWDIR)/$(NAME) + $(INSTALL) -m 0644 htdocs/includes/*.php $(WWWDIR)/$(NAME)/includes + $(INSTALL) -m 0664 htdocs/accueil.txt $(WWWDIR)/$(NAME)/htdocs + $(INSTALL) -m 0644 htdocs/images/*.* $(WWWDIR)/$(NAME)/images + $(INSTALL) -m 0644 htdocs/favicon.ico $(WWWDIR)/$(NAME) + +tools: module + $(INSTALL) -d -m 0755 $(BINDIR)/$(NAME) + $(INSTALL) -d -m 0774 /etc/evoauth + $(INSTALL) -m 0770 admin/Evoauth.pl $(BINDIR)/$(NAME) + $(INSTALL) -m 0644 evoauth.conf /etc/evoauth + +module: + cd admin/ && \ + perl Makefile.PL && \ + make && \ + make test && \ + make install && \ + make clean + +help: + $(INSTALL) -d -m 0755 $(DOCDIR)/$(NAME) + $(INSTALL) -m 0644 AUTHORS LICENSE README TODO $(DOCDIR)/$(NAME) + $(INSTALL) -d -m 0755 $(DOCDIR)/$(NAME)/install + $(INSTALL) -m 0644 install/* $(DOCDIR)/$(NAME)/install + $(INSTALL) -m 0664 install/evoauth.log $(BINDIR)/$(NAME) + +msg: + @echo + @echo Felicitations. Evoauth est a present installe. + @echo ---------------------------------------------- + @echo + @echo Consultez $(DOCDIR)/$(NAME) et $(DOCDIR)/$(NAME)/install + @echo pour plus d'informations. + @echo + +deinstall: + rm -rf $(BINDIR)/$(NAME) + rm -rf $(DOCDIR)/$(NAME) + rm -rf $(WWWDIR)/$(NAME) + + rm -rf /usr/libdata/perl5/Evoauth/ + cat /usr/local/libdata/perl5/site_perl/i386-openbsd/auto/Evoauth/.packlist | xargs sudo rm -rf diff --git a/README b/README new file mode 100644 index 0000000..74e3b0d --- /dev/null +++ b/README @@ -0,0 +1,84 @@ +Fonctionnement d'EvoAuth +------------------------ + +1 - Partie WEB et utilisateur +----------------------------- + +Voici le déroulement d'une connexion authentifiée sur le logiciel +Evoauth. + +L'utilisateur saisit ses identifiants (login et mot de passe) et +parvient à une page sur laquelle il est authentifié. Il peut : + + - activer son accès : son adresse ip est récupérée et indexée dans + un fichier historique. une règle d'autorisation est chargée dans le + firewall et l'utilisateur reste connecté jusqu'à ce que la pop-up + soit fermée ou que sa connexion se termine (un script annexe + supprimera des connexions actives). + l'utilisateur peut consulter son crédit restant, celui-ci est + mis à jour chaque minute. + + - changer son mot de passe : l'utilisateur est invité à saisir + à deux reprises son nouveau mot de passe, sur une page dédiée + + - se déconnecter + + +2 - Partie WEB et administrateur +-------------------------------- + +Celui-ci possède toutes les possibilités précédemment évoquées, mais +peut également procéder à l'administration du logiciel : + +- ajout d'un compte utilisateur + + Le compte d'administration par défaut est : + + login : admin + pass : ... + +- suppression d'un ou plusieurs compte(s) utilisateur + +- déconnexion d'utilisateurs + +- désactivation d'utilisateurs + +- expulsion d'un utilisateur, et ce de façon provisoire + +- changement du texte de bienvenue de l'utilisateur + + +3 - Suivis de l'activité +------------------------ + +Lorsqu'une personne se connecte, se déconnecte ou est automatiquement +supprimée, un email est envoyé à l'administrateur evoauth (email +précisée dans le fichier de configuration). Il est ainsi possible +d'avoir un contrôle complet de l'activité. + +Un journal de l'activité (connexion, déconnexion, suppression d'ip) est +également disponible dans /usr/local/share/evoauth/evoauth.log. + + +4 - Maintenance +--------------- + +Le script perl "Evoauth.pl" doit être ajouté à la crontab (vous +pouvez pour celà vous inspirer du fichier crontab.sample) et permet de +supprimer du fichier de status les adresses ip des utilisateurs qui ne +sont plus connectées. + +Il travaille par défaut sur une durée de 2 minutes. + +Ce script gère également l'initialisation du firewall, lors de +l'installation du logiciel, ainsi que la réinitialisation et l'arrêt. + + +5 - Arborescence par defaut +--------------------------- + +/etc/evoauth/evoauth.conf : fichier de configuration (regles) +/var/www/evoauth/{,images,includes} : interface web +/var/www/evoauth/accueil.txt : texte d'accueil +/usr/local/share/evoauth : interface d'administration +/usr/local/share/doc/evoauth : documentation, licence diff --git a/TODO b/TODO new file mode 100644 index 0000000..0c77f0b --- /dev/null +++ b/TODO @@ -0,0 +1,9 @@ +Todo +---- + +* gestion des groupes +* filtre : voir les utilisateurs connectés +* durée de validité pour les tickets (date de création) +* adresses MAC (spoofing, une seule connexion etc.) +* interception http +* securite : solution plus elegante et sure que de lancer un "sudo" pour executer le script diff --git a/admin/Changes b/admin/Changes new file mode 100644 index 0000000..c10f2f9 --- /dev/null +++ b/admin/Changes @@ -0,0 +1,6 @@ +Revision history for Perl extension Evoauth::Admin. + +0.01 Sat Sep 10 23:50:18 2005 + - original version; created by h2xs 1.9 with options + -X -n Evoauth::Admin + diff --git a/admin/Evoauth.pl b/admin/Evoauth.pl new file mode 100644 index 0000000..c451d54 --- /dev/null +++ b/admin/Evoauth.pl @@ -0,0 +1,44 @@ +#!/usr/bin/perl + +package main; + +use strict; +use warnings; +use Getopt::Std; + +use Evoauth::Admin; +use Evoauth::Functions; +use Evoauth::Iptables; + +$SIG{INT} = $SIG{TERM} = $SIG{KILL} = ""; + +# choix des options +my %options=(); +getopts("icsrd:a:",\%options); + +if (defined $options{a}) + { &Evoauth::Iptables::Alter(1, $options{a}); } +elsif (defined $options{d}) + { &Evoauth::Iptables::Alter(3, $options{d});} +elsif (defined $options{c}) + { &Evoauth::Iptables::Alter(2); } +elsif (defined $options{i}) + { &Evoauth::Iptables::Control(1); } +elsif (defined $options{s}) + { &Evoauth::Iptables::Control(2); } +elsif (defined $options{r}) + { &Evoauth::Iptables::Control(3); } +else + { &Usage; } + +sub Usage() { + print "\nusage :\n"; + print "-i : initialisation du logiciel\n"; + print "-s : arrêt du logiciel\n"; + print "-r : redémarrage du logiciel\n"; + print "-a ip : ajout d'une ip a la base\n"; + print "-d ip : suppression d'une ip a la base\n"; + print "-c : vérification des bases de connexion\n"; + print "-h : aide\n"; + exit; +} diff --git a/admin/MANIFEST b/admin/MANIFEST new file mode 100644 index 0000000..bf34f08 --- /dev/null +++ b/admin/MANIFEST @@ -0,0 +1,9 @@ +Changes +Makefile.PL +MANIFEST +README +t/Evoauth-Admin.t +lib/Evoauth/Admin.pm +lib/Evoauth/Functions.pm +lib/Evoauth/Iptables.pm +META.yml Module meta-data (added by MakeMaker) diff --git a/admin/META.yml b/admin/META.yml new file mode 100644 index 0000000..07e3f5e --- /dev/null +++ b/admin/META.yml @@ -0,0 +1,10 @@ +# http://module-build.sourceforge.net/META-spec.html +#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# +name: evoauth +version: 0.5 +version_from: +installdirs: site +requires: + +distribution_type: module +generated_by: ExtUtils::MakeMaker version 6.17 diff --git a/admin/Makefile.PL b/admin/Makefile.PL new file mode 100644 index 0000000..69e14f7 --- /dev/null +++ b/admin/Makefile.PL @@ -0,0 +1,20 @@ +use ExtUtils::MakeMaker; + +$NAME = "Evoauth"; +$DISTNAME = "evoauth"; + +my @clean = qw( *~ *.old ); + +WriteMakefile( + VERSION => "0.5", + DISTNAME => $DISTNAME, + NAME => $NAME, + dist => { + COMPRESS => 'gzip -9f', + SUFFIX => '.tar.gz', + DIST_DEFAULT => 'all tardist', + }, + clean => { + FILES => join( " ", @clean ) + } +); diff --git a/admin/README b/admin/README new file mode 100644 index 0000000..2b4689d --- /dev/null +++ b/admin/README @@ -0,0 +1,33 @@ +Evoauth-Admin version 0.04 +========================== + +Evoauth::Admin est utilise afin de gerer la liste des personnes connectees au logiciel. + +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +This module requires these other modules and libraries: + + DBI + DBD::Mysql + MIME::Lite + +COPYRIGHT AND LICENCE + +Licence GPL + +Copyright (C) 2005 by Evolix + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.6 or, +at your option, any later version of Perl 5 you may have available. + + diff --git a/admin/lib/Evoauth/Admin.pm b/admin/lib/Evoauth/Admin.pm new file mode 100644 index 0000000..6e1e352 --- /dev/null +++ b/admin/lib/Evoauth/Admin.pm @@ -0,0 +1,62 @@ +package Evoauth::Admin; + +use 5.008006; +use strict; +use warnings; + +require Exporter; +use AutoLoader qw(AUTOLOAD); + +our @ISA = qw(Exporter); + +our %EXPORT_TAGS = ( 'all' => [ qw( + +) ] ); + +our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); + +our @EXPORT = qw( + +); + +our $VERSION = '0.4'; + + +1; +__END__ + +=head1 NAME + +Evoauth::Admin - Admin + +=head1 SYNOPSIS + + use Evoauth::Admin; + +=head1 DESCRIPTION + +Fonctions d'administration d'Evoauth. + +=head2 EXPORT + +... + +=head1 SEE ALSO + +... + +=head1 AUTHOR + +Alexandre Anriot, Eaanriot@evolix.fr + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Alexandre Anriot + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.6 or, +at your option, any later version of Perl 5 you may have available. + + +=cut + diff --git a/admin/lib/Evoauth/Functions.pm b/admin/lib/Evoauth/Functions.pm new file mode 100644 index 0000000..165a88f --- /dev/null +++ b/admin/lib/Evoauth/Functions.pm @@ -0,0 +1,106 @@ +package Evoauth::Functions; + +use strict; +use warnings; +use Config::Tiny; +use DBI; +use MIME::Lite; + +# Renvoit la date courrante +sub Date() { + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + localtime(time); + + $year += 1900; + my $temps = "$mday/$mon/$year - $hour:$min:$sec"; + + return $temps; +} + +# Envoit un mail +sub Mail() { + my ($event, $ip) = @_; + my $temps = Date(); + + # paramètres de connexion + my $Config = Config::Tiny->read( '/etc/evoauth/evoauth.conf' ); + my $db = $Config->{bdd}->{db}; + my $username = $Config->{bdd}->{username}; + my $userpass = $Config->{bdd}->{userpass}; + + # connexion + my $dbh = DBI->connect( $db, $username, $userpass ) + && &Log("La connexion a réussie.") || + &Log("La connexion a échoué : $DBI::errstr"); + + # récupération du login correspondant à l'ip + my $sql = "SELECT login FROM users where ip = '".$ip."'"; + + my $sth = $dbh->prepare($sql);; + $sth->execute(); + + my $login; + $sth->bind_columns(undef, \$login) && $sth->fetch(); + + my $msg = new MIME::Lite + From => 'evoauth@shaktiware.fr', + To => 'aanriot@nerim.net', + Subject => $event, + Type => 'TEXT', + Data => "$temps : $event de $login ($ip)."; + + $msg -> send && &Log("Un mail a été envoyé."); + $dbh->disconnect(); +} + +# Ecrit dans le journal +sub Log() { + my $file = "/usr/local/share/evoauth/evoauth.log"; + my $message = shift; + my $temps = &Date; + + open(LOG, ">> $file") or + die "L'ouverture du journal evoauth.log a échoué: $!.\n"; + + print LOG "$temps $message\n"; + + close(LOG); +} + +1; +__END__ + +=head1 NAME + +Evoauth::Functions - Fonctions + +=head1 SYNOPSIS + + use Evoauth::Functions; + +=head1 DESCRIPTION + +Fonctions d'administration d'Evoauth. + +=head2 EXPORT + +... + +=head1 SEE ALSO + +... + +=head1 AUTHOR + +Alexandre Anriot, Eaanriot@evolix.fr + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Alexandre Anriot + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.6 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/admin/lib/Evoauth/Iptables.pm b/admin/lib/Evoauth/Iptables.pm new file mode 100644 index 0000000..ad322a7 --- /dev/null +++ b/admin/lib/Evoauth/Iptables.pm @@ -0,0 +1,241 @@ +package Evoauth::Iptables; + +use strict; +use warnings; +use Config::Tiny; +use Evoauth::Functions; + +my $Config = Config::Tiny->read( '/etc/evoauth/evoauth.conf' ); + +# Paramètres de configuration +my $activation = $Config->{control}->{enable}; +my $timetorem = $Config->{control}->{timetorem}; + +# Connexion à la base de données +my $db = $Config->{bdd}->{db}; +my $username = $Config->{bdd}->{username}; +my $userpass = $Config->{bdd}->{userpass}; + +my $dbh = DBI->connect( $db, $username, $userpass ) + && &Evoauth::Functions::Log("La connexion a réussie.") || + &Evoauth::Functions::Log("La connexion a échoué : $DBI::errstr"); + +# Règles +our %conf; +my $cpt = 1; + +while ($cpt <= 4) { + $conf{"rule".$cpt} = $Config->{rules}->{"rule".$cpt}; + $cpt++; +} + +sub Alter() { + my $action = shift; + my $ip = shift; + + # ajout + if ($action == 1) { + system("/sbin/iptables -I EVOAUTH -s $ip -j ACCEPT > /dev/null") && + &Evoauth::Functions::Log("Ajout de $ip aux connectés.") && + &Evoauth::Functions::Mail("Connexion", $ip); + } + + # verification + elsif ($action == 2) { + &check_iptables; + &check_timestamp; + } + + # suppression + else { + my $sql = qq{ UPDATE users set statut = 0 where ip = '$ip' }; + my $sth = $dbh->prepare($sql); + + system("/sbin/iptables -D EVOAUTH -s $ip -j ACCEPT") && + $sth->execute() && + $sth->finish() && + &Evoauth::Functions::Log("$ip [supprimee]") && + &Evoauth::Functions::Mail("Déconnexion", $ip); + } + + return 0; +} + + +sub check_iptables() { + my ($ip, @ips); + + &Evoauth::Functions::Log("Suppression des règles obsolètes dans iptables."); + + # obtention de la liste des ips + system("/sbin/iptables -L EVOAUTH -n |grep ACCEPT |awk '{ print \$4 }' > /tmp/ips.txt"); + + # on ouvre le fichier des ips + open(IPS, "/tmp/ips.txt") || &ecriture("L'ouverture des IPs a échoué."); + @ips = ; + close(IPS); + + foreach $ip (@ips) + { + chomp $ip; + + my $sql = "SELECT statut FROM users where ip = '".$ip."'"; + my $sth = $dbh->prepare( $sql ); + $sth->execute(); + + my $statut; + $sth->bind_columns(undef, \$statut); + + $sth->fetch(); + + if ($statut != 1) { + &Evoauth::Functions::Log("$ip [supprimée]\n"); + &Evoauth::Functions::Mail("Suppression", $ip); + &delet($ip); + } + } +} + +sub check_timestamp() { + &Evoauth::Functions::Log("Suppression des règles obsolètes dans iptables."); + + # on travaille sur tous les utilisateurs présents + my $sql = "SELECT * FROM users"; + my $sth = $dbh->prepare($sql); + $sth->execute(); + + my($id, $login, $pass, $groupe, $utype, $credit, $ip, $statut, + $actif, $firstcon, $lastupdate, $kick); + + $sth->bind_columns(undef, \$id, \$login, \$pass, \$groupe, + \$utype, \$credit, \$ip, \$statut, \$actif, \$firstcon, + \$lastupdate, \$kick); + + my ($newtime, $oldtime); + + &Evoauth::Functions::Log("Vérification de la base."); + + my $cpt; #compteur + while ($sth->fetch() && $sth != 0) + { + if ($statut == 1) + { + $newtime = time(); + $oldtime = $lastupdate; + + my $timestamp = $newtime - $oldtime; + if ($timestamp > $conf{timetorem}) + { + # dernière connexion est < 1 min -> suppresion + &delet($ip) && &Evoauth::Functions::Log("$ip [supprimée]") && + &Evoauth::Functions::Mail("Suppression", $ip); + } + + else + { + # sinon conservation + &Evoauth::Functions::Log("$ip [conservée]"); + } + } + } + + $sth->finish(); + return 0; +} + +sub Control() { + my $action = shift; + my ( @tmp1, @tmp2, $key, $value ); + + # start + if ($action == 1) { + while ( ($key, $value) = each(%conf) ) { + @tmp1 = split (/\t/, $value); + system("/sbin/iptables -t nat -A PREROUTING -p $tmp1[2] -i ppp0 --dport $tmp1[1] -j DNAT --to $tmp1[0]:$tmp1[1]"); + } + + &Evoauth::Functions::Log("1 - Regles de PREROUTING charges"); + + system("/sbin/iptables -N EVOAUTH") && + system("/sbin/iptables -A EVOAUTH -j DROP"); + + &Evoauth::Functions::Log("2 - Tables crées"); + + while ( ($key, $value) = each(%conf) ) { + @tmp2 = split (/\t/, $value); + system("/sbin/iptables -A FORWARD -p $tmp2[2] -i ppp0 -o eth0 --dport $tmp2[1] -j EVOAUTH"); + } + + &Evoauth::Functions::Log("3 - Règles chargées"); + + &Evoauth::Functions::Log("Evoauth vient de démarrer."); + } + + # arret + elsif ($action == 2) { + system("/sbin/iptables -F EVOAUTH") && + &Evoauth::Functions::Log("1 - Flush de la table EVOAUTH"); + + my @tmp3; + + while ( ($key, $value) = each(%conf) ) { + @tmp3 = split $value; + system("/sbin/iptables -D FORWARD -p $tmp3[2] -i ppp0 -o eth0 --dport $tmp3[1] -j EVOAUTH"); + system("/sbin/iptables -t nat -D PREROUTING -p $tmp3[2] -i ppp0 --dport $tmp3[1] -j DNAT --to $tmp3[0]:$tmp3[1]"); + } + + &Evoauth::Functions::Log("2 - Annulation FORWARD + PREROUTING"); + + system("/sbin/iptables -X EVOAUTH") && + &Evoauth::Functions::Log("3 - Suppression de la table EVOAUTH"); + + &Evoauth::Functions::Log("Evoauth vient de s'arreter."); + } + + # restart + else { + &stop() && + &start() && + &Evoauth::Functions::Log("Evoauth vient de redémarrer."); + } + + return 0; +} + +1; +__END__ + +=head1 NAME + +Evoauth::Iptables - Firewall + +=head1 SYNOPSIS + + use Evoauth::Iptables; + +=head1 DESCRIPTION + +Fonctions d'administration d'Evoauth. + +=head2 EXPORT + +... + +=head1 SEE ALSO + +... + +=head1 AUTHOR + +Alexandre Anriot, Eaanriot@evolix.fr + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Alexandre Anriot + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.6 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/admin/t/Evoauth-Admin.t b/admin/t/Evoauth-Admin.t new file mode 100644 index 0000000..5c83a4d --- /dev/null +++ b/admin/t/Evoauth-Admin.t @@ -0,0 +1,15 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl Evoauth-Admin.t' + +######################### + +# change 'tests => 1' to 'tests => last_test_to_print'; + +use Test::More tests => 1; +BEGIN { use_ok('Evoauth::Admin') }; + +######################### + +# Insert your test code below, the Test::More module is use()ed here so read +# its man page ( perldoc Test::More ) for help writing this test script. + diff --git a/evoauth.conf b/evoauth.conf new file mode 100644 index 0000000..e1ae917 --- /dev/null +++ b/evoauth.conf @@ -0,0 +1,16 @@ +[control] +# Crontab activée ? +enable = 1 +timetorem = 70 + +[rules] +rule1 = 192.168.1.104 1494 tcp +rule2 = 192.168.1.110 3000 tcp +rule3 = 192.168.1.4 5631 tcp +rule4 = 192.168.1.4 5632 udp + +[bdd] +bddtype = mysql +db = DBI:mysql:evoauth032005:localhost +username = evoauth_user +userpass = DofWebr2 diff --git a/htdocs/accueil.txt b/htdocs/accueil.txt new file mode 100644 index 0000000..3185c8a --- /dev/null +++ b/htdocs/accueil.txt @@ -0,0 +1,10 @@ +Vous avez accès aux services suivants : + +
    +
  • CITRIX +
  • PCAnywhere +
  • Mantis +
+ +Pour activer votre accès, vérifier que votre navigateur autorise les pop-ups +pour cette adresse et cliquer sur Activation de votre accès. diff --git a/htdocs/activation.php b/htdocs/activation.php new file mode 100644 index 0000000..66baf55 --- /dev/null +++ b/htdocs/activation.php @@ -0,0 +1,69 @@ +'; +// echo ''; + echo ''; + echo '

Vous êtes connecté...'; + echo '

Pour revenir à l\'accueil tout en restant connecté, cliquez ici.'; +// echo '

Pour vous déconnecter, cliquez ici.'; + echo ''; +} + +// accès non autorisé +else +{ + kick("Accès non autorisé."); +} + +// chargement des règles concernées +function loadrules() +{ + // activation des règles de firewall + // system("sudo /usr/local/evoauth/bin/evoauth_fw.pl -a ".$_SESSION['ip']." -m".$_SESSION['mac']); + system("sudo /usr/local/evoauth/bin/evoauth_fw.pl -a ".$_SESSION['ip']); + + // verrouillage + update_statut($_SESSION['login'], "1"); + + // lancement de la popup + popup(); +} + +// lancement de la popup de connexion +function popup() +{ + global $height; + global $width; +?> + + + + + +

Vous êtes connecté.

+

Pour revenir à l'accueil tout en restant connecté, cliquez ici. + + + diff --git a/htdocs/edit.php b/htdocs/edit.php new file mode 100644 index 0000000..7010ce3 --- /dev/null +++ b/htdocs/edit.php @@ -0,0 +1,553 @@ +'; + echo 'Le changement de mot de passe a été effectué.'; + } + + else + { + // le changement a échoué + echo ''; + echo 'Le changement a échoué.'; + } + } /* fin mode changement du mot de passe utilisateur */ + + + + /* mode ajout d'un utilisateur */ + + elseif ($mode == "add" && $flag == 1 && $_SESSION['login'] == "admin") + { + // l'utilisateur a créer existe déjà + $resultat = seek_for_user($_POST['newlogin']); + + if ($resultat == 1) + { + echo ''; + echo 'L\'utilisateur existe déjà.'; + } + + // les 2 mots de passe saisis sont différents + elseif ($_POST['pass1'] != $_POST['pass2']) + { + echo ''; + echo 'Les mots de passe sont différents.'; + } + + // le nouvel utilisateur a un crédit nul + elseif ($_POST['utype'] == 1 && $_POST['credit'] == 0) + { + echo ''; + echo 'Crédit nul impossible.'; + } + + // tout est OK, on peut ajouter l'utilisateur + else + { + // création des paramètres + $newlogin = $_POST['newlogin']; + $newpass = md5($_POST['pass1']); + (defined($_POST['newgroup'])) ? $newgroup=$_POST['newgroup'] : $newgroup="general"; + + if ($_POST['utype'] == 0) + $newutype="0"; + elseif ($_POST['utype'] == 1) + $newutype="1"; + else + $newutype="0"; + + $newcredit = $_POST['credit']; + + // ajout proprement dit + $resultat = add_user($newlogin, $newpass, $newgroup, $newutype, $newcredit); + + if ($resultat) + { + echo ''; + echo 'L\'ajout de l\'utilisateur a réussi.'; + } + + else + { + echo ''; + echo 'L\'Ajout de l\'utilisateur a échoué.'; + } + } + } /* fin mode ajout d'un utilisateur */ + + + + /* mode suppression */ + + elseif ($mode == "suppression" && $flag == 1 && $_SESSION['login'] == "admin") + { + if (!empty($_POST['coche'])) + { + foreach ($_POST['coche'] as $coche) + { + $connexion = connexion(); + + $requete= "delete from users where id='$coche'"; + $resultat =mysql_query($requete, $connexion); + + if ($resultat == 1) + { + echo ''; + echo "La suppression a été correctement effectuée.
"; + } + + else + { + echo ''; + echo "La suppression a échouée: ".mysql_error()."
"; + } + + } + } + + else + { + echo ''; + echo "Aucun utilisateur à supprimer.
"; + } + } /* mode suppresion */ + + + + /* mode activation */ + + elseif ($mode == "activation" && $flag == 1 && $_SESSION['login'] == "admin") + { + if (!empty($_POST['coche'])) + { + foreach ($_POST['coche'] as $coche) + { + $connexion = connexion(); + + $requete= "update users set actif = 1 where id='$coche'"; + $resultat =mysql_query($requete, $connexion); + + if ($resultat == 1) + { + echo ''; + echo "L'activation a été correctement effectuée.
"; + } + + else + { + echo ''; + echo "L'activation a échouée: ".mysql_error()."
"; + } + } + } + + else + { + echo ''; + echo "Aucun utilisateur à activer.
"; + } + } /* fin mode activation */ + + + + /* mode desactivation */ + + elseif ($mode == "desactivation" && $flag == 1 && $_SESSION['login'] == "admin") + { + if (!empty($_POST['coche'])) + { + foreach ($_POST['coche'] as $coche) + { + $connexion = connexion(); + + $requete= "update users set actif = 0 where id='$coche'"; + $resultat =mysql_query($requete, $connexion); + + if ($resultat == 1) + { + echo ''; + echo "La désactivation a été correctement effectuée.
"; + } + + else + { + echo ''; + echo "La désactivation a échouée: ".mysql_error()."
"; + } + } + } + + else + { + echo ''; + echo "Aucun utilisateur à désactiver.
"; + } + } /* fin mode desactivation */ + + + + /* mode kick */ + + elseif ($mode == "kick" && $flag == 1 && $_SESSION['login'] == "admin") + { + if (!empty($_POST['coche'])) + { + foreach ($_POST['coche'] as $coche) + { + $connexion = connexion(); + + $requete= "select ip from users where id='$coche' and statut='1'"; + $resultat = mysql_fetch_row(mysql_query ($requete, $connexion)); + + // l'utilisateur + if ($resultat == 0) + { + echo ''; + echo "L'utilisateur n'est pas connecté.
"; + } + + else + { + $ip = current($resultat); + + // désactivation de l'utilisateur dans le firewall + system("/usr/bin/sudo /usr/local/evoauth/bin/evoauth_fw.pl -d $ip"); + + // variable nécessaire pour interdir le prochain refresh + setkick($ip, "1"); + + echo ''; + echo "L'utilisateur a été kické.
"; + } + } + } + + else + { + echo ''; + echo "Aucun utilisateur à kicker.
"; + } + } /* fin mode kick */ + + + /* mode accueil */ + + elseif ($mode == accueil) + { +?> + + + + Intranet <?=$title;?> + + +

+
+ +

Modifier le texte d'accueil

+
+ + + + + + + + +
Votre texte : + +
+
+



+ Accueil + Déconnexion + + + + + + + Intranet <?=$title;?> + + +

+
+ +

Changer votre mot de passe

+
+ + + + + + + + + + + + + + + + + + + + +

Ajouter un utilisateur

+ +
Login :
Nouveau mot de passe :
Confirmation :
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Login :
Groupe :
Mot de passe :
Confirmation :
Type : + Permanent + Crédité +
Crédit (utile si utilisateur crédité) :
 
+ + + + + + + + + + + + +lastupdate != 0) + { + $horodatage = date("d/m/Y, H:i:s", $byblos->lastupdate); + } + + else { $horodatage = "Aucune"; } +?> + + + + + + + + + + +utype == 0) + { +?> + + + + + + + + + + + +
 LoginGroupeStatutDernière connexionCompteTypeCrédit restant
id?>>id?>login?>groupe?>statut==1)?"Connecté":"Non connecté"?>actif==1)?"Activé":"Désactivé"?>utype==0)?"Permanent":"Crédité"?>credit?> minutes
+ + + + + +
+



+ Accueil + Déconnexion + + + diff --git a/htdocs/evoauth.txt b/htdocs/evoauth.txt new file mode 100644 index 0000000..7798423 --- /dev/null +++ b/htdocs/evoauth.txt @@ -0,0 +1 @@ +Premier démarrage. diff --git a/htdocs/favicon.ico b/htdocs/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/htdocs/fin.php b/htdocs/fin.php new file mode 100644 index 0000000..5d756a8 --- /dev/null +++ b/htdocs/fin.php @@ -0,0 +1,34 @@ + /dev/null"); + update_statut($_SESSION['login'], "0"); +} + +session_unset(EVOAUTH_PHPSESSION); +session_destroy(); + +?> + + + + + + + + + + +
À bientôt.
+ + diff --git a/htdocs/images/accueil-evolix.jpg b/htdocs/images/accueil-evolix.jpg new file mode 100644 index 0000000000000000000000000000000000000000..132bd0cffbca80a8e4b4beaedb233ddf68e696b4 GIT binary patch literal 3196 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 literal 0 HcmV?d00001 diff --git a/htdocs/images/accueil-numnet.jpg b/htdocs/images/accueil-numnet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f0d818dd31c8a2ce184bf1998ec4e1cfa4a08fd GIT binary patch literal 27856 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 BLVo}N literal 0 HcmV?d00001 diff --git a/htdocs/images/accueil.jpg b/htdocs/images/accueil.jpg new file mode 100644 index 0000000000000000000000000000000000000000..132bd0cffbca80a8e4b4beaedb233ddf68e696b4 GIT binary patch literal 3196 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 literal 0 HcmV?d00001 diff --git a/htdocs/images/accueil.png b/htdocs/images/accueil.png new file mode 100644 index 0000000000000000000000000000000000000000..aad12e1505cb20d8efd8b834fb34116dc0c7c11b GIT binary patch literal 1656 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 G==c|5ULVN- literal 0 HcmV?d00001 diff --git a/htdocs/images/logo.gif b/htdocs/images/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d52a02898fc1c7bd94518b3ced720b115dd33ec8 GIT binary patch literal 14163 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 literal 0 HcmV?d00001 diff --git a/htdocs/images/popup.jpg b/htdocs/images/popup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8da329ed51852b8f96c2931a1712e7bea2fa00cb GIT binary patch literal 6571 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 bp_EV16^yO;_ULhpoy;ZqmWDmXZw&tjD;Fi} literal 0 HcmV?d00001 diff --git a/htdocs/includes/config.php b/htdocs/includes/config.php new file mode 100644 index 0000000..4cfa175 --- /dev/null +++ b/htdocs/includes/config.php @@ -0,0 +1,22 @@ + diff --git a/htdocs/includes/database.php b/htdocs/includes/database.php new file mode 100644 index 0000000..eb0e2e1 --- /dev/null +++ b/htdocs/includes/database.php @@ -0,0 +1,241 @@ +pass; +} + + +# sélection du groupe en fonction du login +function getgroup($login) +{ + $connexion = connexion(); + + $query= 'select groupe from users where login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur getgroup: ".mysql_error()); + $valeur = mysql_fetch_object($resultat); + mysql_close ($connexion); + + return $valeur->group; +} + + +# renvoie le crédit restant de l'utilisateur passé en paramètre +function getcredit($login) +{ + $connexion = connexion(); + + $query= 'select credit from users where login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur getcredit: ".mysql_error()); + $valeur = mysql_fetch_object($resultat); + mysql_close ($connexion); + + return $valeur->credit; +} + + +# indique si l'utilisateur est activé ou désactivé +function getactif($login) +{ + $connexion = connexion(); + + $query= 'select actif from users where login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur getactif: ".mysql_error()); + $valeur = mysql_fetch_object($resultat); + mysql_close ($connexion); + + return $valeur->actif; +} + + +# renvoit le type de l'utilisateur passé en paramètre +function getutype($login) +{ + $connexion = connexion(); + + $query= 'select utype from users where login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur getutype: ".mysql_error()); + $valeur = mysql_fetch_object($resultat); + mysql_close ($connexion); + + return $valeur->utype; +} + + +# renvoit le statut de l'utilisateur passé en paramètre +function getstatut($login) +{ + $connexion = connexion(); + + $query= 'select statut from users where login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur getstatut: ".mysql_error()); + $valeur = mysql_fetch_object($resultat); + mysql_close ($connexion); + + return $valeur->statut; +} + + +# mise à jour du crédit de l'utilisateur +function setcredit($login, $credit) +{ + $connexion = connexion(); + + $query = 'update users set credit = \''.$credit.'\' where + login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur setcredit: ".mysql_error()); + mysql_close ($connexion); + + return 1; +} + + +# mise à jour du mot de passe +function update_pass($newpass) +{ + $connexion = connexion(); + + $query = 'update users set pass = \''.$newpass.'\' where + login = \''.$_SESSION['login'].'\''; + + $resultat = mysql_query($query) or die("Erreur update_pass: ".mysql_error()); + mysql_close ($connexion); + + return 1; +} + + +# mise à jour de l'adresse ip du client +function update_ip($log, $ip) +{ + $connexion = connexion(); + + $query = 'update users set ip = \''.$ip.'\' where + login = \''.$log.'\''; + + $resultat = mysql_query($query) or die("Erreur update_ip: ".mysql_error()); + mysql_close ($connexion); + + return 1; +} + + +# mise à jour du statut du client +function update_statut($log, $statut) +{ + $connexion = connexion(); + + $query = 'update users set statut = \''.$statut.'\' where + login = \''.$log.'\''; + + $resultat = mysql_query($query) or die("Erreur update_statut: ".mysql_error()); + mysql_close ($connexion); + + return 1; +} + + +# mise à jour de lastupdate +function update_lastupdate($log, $lastupdate) +{ + $connexion = connexion(); + + $query = 'update users set lastupdate = \''.$lastupdate.'\' where + login = \''.$log.'\''; + + $resultat = mysql_query($query) or die("Erreur update_lastupdate: ".mysql_error()); + mysql_close ($connexion); + + return 1; +} + + +# recherche d'un utilisateur du même nom +function seek_for_user($newlogin) +{ + $connexion = connexion(); + + $query = 'select login from users where login = \''.$newlogin.'\''; + + $resultat = mysql_query($query); + $nombre = mysql_num_rows($resultat); + mysql_close ($connexion); + + if ($nombre) { return 1; } + else { return 0; } +} + + +# mise à jour du mot de passe +function add_user($newlogin, $pass, $newgroup, $utype, $credit) +{ + $connexion = connexion(); + + $query = 'insert into users (login, pass, groupe, utype, credit, actif) VALUES(\''.$newlogin.'\', + \''.$pass. '\', \''.$newgroup.'\', \''.$utype.'\', \''.$credit.'\', "1")'; + + $resultat = mysql_query($query) or die("Erreur add_user: ".mysql_error()); + + return 1; +} + + +# mise à jour de la variable kick +function setkick($ip, $value) +{ + $connexion = connexion(); + + $query = 'update users set kick = \''.$value.'\' where + ip = \''.$ip.'\''; + + $resultat = mysql_query($query) or die("Erreur setkick: ".mysql_error()); + mysql_close ($connexion); + + return 1; +} + + +# renvoit la valeur de kick de l'utilisateur passé en paramètre +function getkick($login) +{ + $connexion = connexion(); + + $query= 'select kick from users where login = \''.$login.'\''; + + $resultat = mysql_query($query) or die("Erreur getkick: ".mysql_error()); + $valeur = mysql_fetch_object($resultat); + mysql_close ($connexion); + + return $valeur->kick; +} +?> diff --git a/htdocs/includes/fonctions.php b/htdocs/includes/fonctions.php new file mode 100644 index 0000000..7f3631b --- /dev/null +++ b/htdocs/includes/fonctions.php @@ -0,0 +1,17 @@ + '; + echo ''; +} + +# récupération de l'adresse MAC +function getmac($ip) +{ + //$mac = system('cat /proc/net/arp |grep '.$ip.' | awk \'{ print $4 }\'', $tmp); + $mac = exec("cat /proc/net/arp |grep $ip | awk '{ print $4 }'"); + + return $mac; +} +?> diff --git a/htdocs/index.php b/htdocs/index.php new file mode 100644 index 0000000..6d97956 --- /dev/null +++ b/htdocs/index.php @@ -0,0 +1,53 @@ + + + + + +<?=$website;?> + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
 
 
Login
Mot de passe
 
+
+ +

+


Evoauth version 0.4.1 +

+ + diff --git a/htdocs/login.php b/htdocs/login.php new file mode 100644 index 0000000..c64aa70 --- /dev/null +++ b/htdocs/login.php @@ -0,0 +1,68 @@ + diff --git a/htdocs/membre.php b/htdocs/membre.php new file mode 100644 index 0000000..bf123fc --- /dev/null +++ b/htdocs/membre.php @@ -0,0 +1,139 @@ + + + + + <?=$title;?> + + + + +

+

+ + + + + + + + + + 0 && $utype = 0) + { +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
 
+

+ Votre crédit est épuisé. +

+
+

+ Il vous reste minutes. +

+
Activation de votre accès
 
Activation de votre accès
 
Changement de votre mot de passe
Gestion des utilisateurs
 
Modification du texte d'accueil
 
Déconnexion
+ +
+ + + + diff --git a/htdocs/popup_debut.php b/htdocs/popup_debut.php new file mode 100644 index 0000000..1b830af --- /dev/null +++ b/htdocs/popup_debut.php @@ -0,0 +1,119 @@ +'; +} + +else +{ + // données à insérer + $temps = time(); + $ligne = $temps." ".$_SESSION['ip']; + + if ($prepaid == 1 && getutype($_SESSION['login']) == "1") + { + // on récupère le crédit restant de l'utilisateur + $credit = getcredit($_SESSION['login']); + + $credit--; + + // actualisation de la base de données + setcredit($_SESSION['login'], $credit); + } + + update_statut($_SESSION['login'], "1"); + + $newt = time(); + update_lastupdate($_SESSION['login'], $newt); + + // crédit épuisé + if (getutype($_SESSION['login']) == "1" && $prepaid == 1 && $credit <= 0) + { + echo ''; + } + + // il reste du crédit + else + { +?> + + + + + + + + + + + + 0) + { +?> + + + + + + + + + + + + + + +
+ Attention, dernière minute de connexion... + + Vous êtes connecté et il vous reste minutes. + + Vous êtes connecté. +
+ + + +
AccueilDéconnexion
+ + + diff --git a/htdocs/popup_fin.php b/htdocs/popup_fin.php new file mode 100644 index 0000000..97ee579 --- /dev/null +++ b/htdocs/popup_fin.php @@ -0,0 +1,39 @@ + /dev/null"); + update_statut($_SESSION['login'], "0"); +} + +session_unset(EVOAUTH_PHPSESSION); +session_destroy(); + +?> + + + + + + + + + + + + + + + +
A bientôt.
Fermer
+ + diff --git a/htdocs/style.css b/htdocs/style.css new file mode 100644 index 0000000..1abc44b --- /dev/null +++ b/htdocs/style.css @@ -0,0 +1,11 @@ +body {background-color: #FFFFFF; font-family: Arial; font-size: 14px;} + +h1 { border-left: solid; border-right: solid; border-top: solid; border-bottom: solid; border-width: 1px; color: #000; font-size: 20px; font-weight: bold; text-align: center;} + +.header{color:#000000; font-weight:bold;font-size:17px;} + +.size15 {font-size:15px;} + +img {border: 0;} + +/* Copyright (c) 2004-2005 Evolix - Tous droits reserves */ diff --git a/install/crontab.sample b/install/crontab.sample new file mode 100644 index 0000000..ae8ae45 --- /dev/null +++ b/install/crontab.sample @@ -0,0 +1,2 @@ +#minute hour day_of_month month day_of_week command +* * * * * /usr/local/share/evoauth/bin/evoauth.pl -c diff --git a/install/database.sql b/install/database.sql new file mode 100644 index 0000000..2248ab2 --- /dev/null +++ b/install/database.sql @@ -0,0 +1,25 @@ +DROP DATABASE IF EXISTS evoauth032005; +CREATE DATABASE evoauth032005; +USE evoauth032005; + +GRANT ALL PRIVILEGES ON evoauth032005.* to evoauth_user@localhost identified by ''; +GRANT ALL PRIVILEGES ON evoauth032005.* to evoauth_user identified by ''; + +CREATE TABLE users ( +id BIGINT NOT NULL AUTO_INCREMENT, +login VARCHAR(20) NOT NULL, +pass VARCHAR(255) NOT NULL, +groupe VARCHAR(20) NOT NULL, +utype INT(10) NOT NULL, +credit INT(10) NOT NULL, +ip VARCHAR(20) NOT NULL, +statut INT(1) NOT NULL, +actif INT(1) NOT NULL, +firstcon VARCHAR(30) NOT NULL, +lastupdate VARCHAR(30) NOT NULL, +kick INT(1) NOT NULL, +PRIMARY KEY (id) ); + +INSERT INTO users (login, pass, groupe, actif, utype) VALUES ("daphnee", "098f6bcdr4621d373cade4e832627b4f6", "general", "1", "0"); +INSERT INTO users (login, pass, groupe, actif, utype, credit) VALUES ("pierre", "098f6bcdr4621d373cade4e832627b4f6", "general", "1", "1", "60"); +INSERT INTO users (login, pass, groupe, actif, utype) VALUES ("paul", "098f6bcdr4621d373cade4e832627b4f6", "general", "1", "0"); diff --git a/install/evoauth.log b/install/evoauth.log new file mode 100644 index 0000000..7798423 --- /dev/null +++ b/install/evoauth.log @@ -0,0 +1 @@ +Premier démarrage. diff --git a/install/http-evoauth.conf b/install/http-evoauth.conf new file mode 100644 index 0000000..7a31281 --- /dev/null +++ b/install/http-evoauth.conf @@ -0,0 +1,6 @@ +Alias /evoauth /var/www/evoauth/htdocs/ + + + AllowOverride All + Allow from all +